";
$loadStyle = \defined('XPROBER_IS_DEV') && XPROBER_IS_DEV ? '' : "";
$globalConfig = WindowConfigApi::getGlobalConfig();
echo <<
{$appName} {$version}
{$globalConfig}
{$loadScript}
{$loadStyle}
Loading...
HTML;
}
}
namespace InnStudio\Prober\Components\Bootstrap;
class BootstrapConstants
{
const ID = 'bootstrap';
}
namespace InnStudio\Prober\Components\Bootstrap;
use InnStudio\Prober\Components\Action\Action;
use InnStudio\Prober\Components\Timezone\Timezone;
final class Bootstrap
{
public static $dir;
public function __construct($dir)
{
error_reporting(\E_ALL);
self::$dir = $dir;
new Timezone();
new Action();
new Render();
}
}
namespace InnStudio\Prober\Components\Style;
use InnStudio\Prober\Components\Utils\UtilsApi;
final class StyleAction
{
public function render($action)
{
if ('style' !== $action) {
return;
}
$this->output();
}
private function output()
{
UtilsApi::setFileCacheHeader();
header('Content-type: text/css');
echo <<<'CODE'
@charset "UTF-8";:root{--x-max-width: 1680px;--x-radius: .5rem;--x-fg: hsl(0, 0%, 20%);--x-bg: hsl(0, 0%, 97%);--x-text-font-family: Verdana, Geneva, Tahoma, sans-serif;--x-code-font-family: monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New";--x-app-border-color: var(--x-fg);--x-app-bg: var(--x-bg);--x-star-me-fg: var(--x-bg);--x-star-me-bg: var(--x-fg);--x-star-me-hover-fg: hsl(0, 0%, 100%);--x-star-me-hover-bg: var(--x-fg);--x-star-me-border-color: linear-gradient(90deg, transparent, hsl(0, 0%, 100%), transparent);--x-status-ok-fg: hsl(0, 0%, 100%);--x-status-ok-bg: linear-gradient(hsl(120, 100%, 30%), hsl(120, 100%, 45%));--x-status-error-fg: hsl(0, 0%, 100%);--x-status-error-bg: linear-gradient(hsl(0, 0%, 50%), hsl(0, 0%, 73%));--x-network-node-fg: var(--x-fg);--x-network-node-bg: hsla(132, 4%, 23%, .1);--x-network-node-border-color: var(--x-card-split-color);--x-network-node-row-bg: linear-gradient(to right, transparent, hsla(0, 0%, 100%, .5), transparent)}:root{--x-gutter: 1rem;--x-gutter-sm: .5rem}@media(prefers-color-scheme:dark){:root{--x-fg: hsl(0, 0%, 80%);--x-bg: hsl(0, 0%, 0%);--x-app-border-color: var(--x-bg);--x-app-bg: hsl(0, 0%, 13%);--x-star-me-fg: var(--x-fg);--x-star-me-bg: var(--x-bg);--x-star-me-hover-fg: hsl(0, 0%, 100%);--x-star-me-hover-bg: var(--x-bg);--x-star-me-border-color: linear-gradient(90deg, transparent, hsl(0, 0%, 100%), transparent);--x-status-ok-fg: hsl(0, 0%, 100%);--x-status-ok-bg: linear-gradient(hsl(120, 100%, 20%), hsl(120, 100%, 25%));--x-status-error-fg: hsl(0, 0%, 100%);--x-status-error-bg: linear-gradient(hsl(0, 0%, 27%), hsl(0, 0%, 33%));--x-network-node-fg: var(--x-fg);--x-network-node-bg: hsla(0, 0%, 100%, .05);--x-network-node-border-color: var(--x-card-split-color);--x-network-node-row-bg: var(--x-card-bg-hover)}}:root{--x-footer-bg: hsl(0 0% 0% / .05);--x-footer-fg: hsl(0 0% 0% / .5)}@media(prefers-color-scheme:dark){:root{--x-footer-bg: hsl(0 0% 100% / .1);--x-footer-fg: hsl(0 0% 100% / .5)}}._main_17cch_12{width:100%;color:var(--x-footer-fg);text-align:center;word-break:normal}._main_17cch_12 a,._main_17cch_12 a:hover{color:var(--x-footer-fg)}:root{--x-header-fg: hsl(0 0% 0% / .9);--x-header-bg: transparent;--x-header-link-bg: hsl(0 0% 0% / .1);--x-header-link-bg-hover: hsl(0 0% 0% / .15)}@media(prefers-color-scheme:dark){:root{--x-header-fg: hsl(0 0% 100% / .9);--x-header-bg: hsl(0 0% 100% / .1);--x-header-link-bg: hsl(0 0% 100% / .1);--x-header-link-bg-hover: hsl(0 0% 100% / .15)}}._main_1jpdc_16{display:flex;justify-content:center;padding-top:var(--x-gutter)}:root{--x-link-fg: hsl(0 0% 95% / .95);--x-link-bg: hsl(0 0% 15% / .95);--x-link-bg-hover: hsl(0 0% 20% / .95);--x-link-bg-active: hsl(0 0% 25% / .95)}@media(prefers-color-scheme:dark){:root{--x-link-fg: hsl(0 0% 100% / .95);--x-link-bg: hsl(0 0% 10% / .95);--x-link-bg-hover: hsl(0 0% 15% / .95);--x-link-bg-active: hsl(0 0% 20% / .95)}}._main_p5526_16{display:flex;align-items:center;gap:var(--x-gutter-sm);cursor:pointer;border:none;border-radius:10rem;background:var(--x-link-bg);padding:var(--x-gutter-sm) var(--x-gutter);color:var(--x-link-fg);text-decoration:none}._main_p5526_16:hover{background:var(--x-link-bg-hover);color:var(--x-link-fg);text-decoration:none}._main_p5526_16:active{background:var(--x-link-bg-active);color:var(--x-link-fg);text-decoration:none}._main_1k8xz_1{font-weight:400;font-size:1rem}._name_1k8xz_6{font-weight:700}._version_1k8xz_10{opacity:.75;font-weight:400;font-size:.8em}:root{--x-toast-fg: hsl(0 0% 100% / .95);--x-toast-bg: hsl(0 0% 0% / .75)}@media(prefers-color-scheme:dark){:root{--x-toast-fg: hsl(0 0% 100% / .95);--x-toast-bg: hsl(0 0% 100% / .15)}}._main_17sik_12{position:fixed;bottom:4rem;left:50%;transform:translate(-50%);z-index:20;backdrop-filter:blur(5px);cursor:pointer;border:none;border-radius:var(--x-gutter);background:var(--x-toast-bg);padding:var(--x-gutter);max-width:80vw;color:var(--x-toast-fg);text-align:justify}:root{--x-fg: hsl(0 0% 10%);--x-body-fg: hsl(0 0% 10%);--x-body-bg: hsl(0 0% 90%)}@media(prefers-color-scheme:dark){:root{--x-fg: hsl(0 0% 90%);--x-body-fg: hsl(0 0% 90%);--x-body-bg: hsl(0 0% 0%)}}*{box-sizing:border-box;margin:0;padding:0;word-break:break-word}html{scroll-behavior:smooth;font-size:85%}body{display:grid;place-content:safe center;vertical-align:middle;gap:var(--x-gutter);margin:0;background:var(--x-body-bg);padding:0;color:var(--x-body-fg);line-height:1.5;font-family:var(--x-code-font-family)}a{cursor:pointer;color:var(--x-fg);text-decoration:none}a:hover,a:active{color:var(--x-fg);text-decoration:underline}._container_30sck_1{display:grid;gap:var(--x-gutter);max-width:1200px}:root{--x-card-legend-arrow-fg: var(--x-card-legend-fg);--x-card-legend-arrow-bg-hover: hsl(0 0% 0% / .05);--x-card-legend-arrow-bg-active: hsl(0 0% 0% / .1)}@media(prefers-color-scheme:dark){:root{--x-card-legend-arrow-fg: var(--x-card-legend-fg);--x-card-legend-arrow-bg-hover: hsl(0 0% 100% / .05);--x-card-legend-arrow-bg-active: hsl(0 0% 100% / .1)}}._arrow_1qtu9_14{display:flex;align-items:center;cursor:pointer;border:none;border-radius:var(--x-radius);background:transparent;padding:var(--x-gutter-sm);color:var(--x-card-legend-arrow-fg)}._arrow_1qtu9_14:hover{background:var(--x-card-legend-arrow-bg-hover);color:var(--x-card-legend-arrow-fg)}._arrow_1qtu9_14:active{background:var(--x-card-legend-arrow-bg-active);color:var(--x-card-legend-arrow-fg)}._arrow_1qtu9_14[data-disabled],._arrow_1qtu9_14[data-disabled]:hover{opacity:.5;cursor:not-allowed}._arrow_1qtu9_14 svg{width:1rem;height:1rem}:root{--x-module-bg: hsl(0 0% 0% / .95);--x-module-header-bg: hsl(0 0% 100% / .75);--x-module-header-fg: hsl(0 0% 0%);--x-module-header-title-fg: hsl(0 0% 0% / .7);--x-module-header-title-bg: hsl(0 0% 0% / .1);--x-module-body-bg: var(--x-module-header-bg);--x-module-box-shadow: hsla(0 0% 20% .3) 0px -1px 0px hsl(0 0% 100%) 0px 1px 0px inset, hsla(0 0% 20% .3) 0px -1px 0px inset hsl(0 0% 100%) 0px 1px 0px}@media(prefers-color-scheme:dark){:root{--x-module-bg: hsl(0 0% 15% / .95);--x-module-header-bg: hsl(0 0% 100% / .1);--x-module-header-fg: hsl(0 0% 100% / .7);--x-module-header-title-fg: hsl(0 0% 100% / .7);--x-module-header-title-bg: hsl(0 0% 100% / .1);--x-module-body-bg: var(--x-module-header-bg);--x-module-box-shadow: 0px 0px 0px 1px hsl(0 0% 0%) inset}}._main_60fl9_23{position:relative;flex-grow:1;scroll-margin-top:0}._header_60fl9_29{display:flex;align-items:center;border-radius:var(--x-radius) var(--x-radius) 0 0;background:var(--x-module-header-bg);padding:1px;width:fit-content;color:var(--x-module-header-fg);font-size:1rem;white-space:nowrap}._title_60fl9_41{font-weight:400}._body_60fl9_45{display:grid;gap:var(--x-gutter-sm);border-radius:0 var(--x-radius) var(--x-radius) var(--x-radius);background:var(--x-module-body-bg);padding:var(--x-gutter)}:root{--x-card-des-fg: var(--x-fg);--x-card-des-bg: hsl(0 0% 100% / .1);--x-card-des-accent: hsl(0 0% 0% / .5)}@media(prefers-color-scheme:dark){:root{--x-card-des-fg: var(--x-fg);--x-card-des-bg: hsl(0 0% 100% / .1);--x-card-des-accent: hsl(209, 100%, 63%)}}._main_1hf64_14{display:grid;border-radius:var(--x-radius);color:var(--x-card-des-fg);font-family:var(--x-text-font-family);list-style-type:none}._item_1hf64_22{display:flex;align-items:center;gap:var(--x-gutter-sm)}._item_1hf64_22:before{border-radius:var(--x-radius);background:var(--x-card-des-accent);width:2px;height:50%;content:""}:root{--x-placeholder-bg: linear-gradient(to right, hsl(0 0% 0% / .1) 46%, hsl(0 0% 0% / .15) 50%, hsl(0 0% 0% / .1) 54%) 50% 50%}@media(prefers-color-scheme:dark){:root{--x-placeholder-bg: linear-gradient( to right, hsl(0 0% 100% / .1) 46%, hsl(0 0% 100% / .15) 50%, hsl(0 0% 100% / .1) 54% ) 50% 50%}}@keyframes _animation_vvbro_1{0%{transform:translate3d(-30%,0,0)}to{transform:translate3d(30%,0,0)}}._main_vvbro_25{position:relative;border-radius:var(--x-radius);overflow:hidden}._main_vvbro_25:before{position:absolute;inset:0 0 0 50%;z-index:1;animation:_animation_vvbro_1 1s linear infinite;margin-left:-250%;background:var(--x-placeholder-bg);width:500%;pointer-events:none;content:" "}:root{--x-error-fg: hsl(0 100% 50%);--x-error-bg: hsl(0 100% 30%);--x-error-icon-fg: hsl(0 100% 50%);--x-error-icon-bg: hsl(0 100% 97%)}@media(prefers-color-scheme:dark){:root{--x-error-fg: hsl(0 0% 100% / .9);--x-error-bg: hsl(0, 100%, 50%);--x-error-icon-fg: var(--x-error-bg);--x-error-icon-bg: hsl(0 0% 100% / .5)}}._main_1ogv8_16{display:flex;position:relative;align-items:center;gap:var(--x-gutter-sm);border-radius:var(--x-radius);color:var(--x-error-fg);font-family:var(--x-text-font-family)}._main_1ogv8_16:before{border-radius:var(--x-radius);background:var(--x-error-bg);width:2px;height:50%;content:""}:root{--x-benchmark-ruby-bg: hsl(0 0% 0% / .05);--x-benchmark-ruby-bg-hover: hsl(0 0% 0% / .05)}@media(prefers-color-scheme:dark){:root{--x-benchmark-ruby-bg: hsl(0 0% 100% / .05);--x-benchmark-ruby-bg-hover: hsl(0 0% 100% / .1)}}._main_1j8ow_12 rt{opacity:.5;font-weight:400;font-size:1rem}._main_1j8ow_12[data-is-result]{font-weight:700}._main_1p71d_13{display:grid;gap:var(--x-gutter-sm);border-radius:var(--x-radius);background:var(--x-server-benchmark-bg);padding:var(--x-gutter-sm);text-align:center}._header_1p71d_22{display:flex;justify-content:center;align-items:center}._link_1p71d_28{opacity:.75;cursor:pointer;border:none;border-radius:var(--x-radius);background:none;padding:0 var(--x-gutter-sm)}._link_1p71d_28:hover,._link_1p71d_28:active{opacity:1;background:var(--x-server-benchmark-link-bg);text-decoration:none}._link_1p71d_28 svg{width:1rem;height:1rem}._marks_1p71d_46{display:flex;justify-content:center;align-items:center;gap:var(--x-gutter-sm);cursor:pointer;border:none;border-radius:var(--x-radius);background:transparent;color:var(--x-server-benchmark-link-fg);font-size:1.25rem}._marks_1p71d_46:hover{background:var(--x-server-benchmark-link-bg)}._sign_1p71d_62{opacity:.5}:root{--x-meter-height: 2px;--x-meter-bar-bg: hsl(0 0% 0% / .1);--x-meter-value-bg: hsl(120 100% 40%);--x-meter-value-optimum-bg: hsl(120 100% 30%);--x-meter-value-suboptimum-bg: hsl(36 77% 64%);--x-meter-value-even-less-good-bg: hsl(12 100% 39%)}@media(prefers-color-scheme:dark){:root{--x-meter-bar-bg: hsl(0 0% 100% / .1);--x-meter-value-optimum-bg: hsl(120 100% 30%);--x-meter-value-suboptimum-bg: hsl(36 77% 54%);--x-meter-value-even-less-good-bg: hsl(12 100% 39%)}}._main_1isor_18{display:grid;grid-template-columns:1fr auto;grid-template-areas:"x-meter-name x-meter-percent" "x-meter-name x-meter-overview" "x-meter-core x-meter-core ";gap:var(--x-gutter-sm)}._percent_1isor_25{grid-area:x-meter-percent;text-align:right}._name_1isor_30{display:flex;grid-area:x-meter-name;align-items:center;border:none;background:none;color:var(--x-bg-fg);font-weight:700;text-align:center}._nameText_1isor_41{display:-webkit-box;-webkit-box-orient:vertical;max-width:15rem;-webkit-line-clamp:2;overflow:hidden}._overview_1isor_49{grid-area:x-meter-overview}._core_1isor_53{grid-area:x-meter-core;background:none;width:100%;height:var(--x-meter-height)}._core_1isor_53::-webkit-meter-bar{border-radius:10rem;background:var(--x-meter-bar-bg);height:var(--x-meter-height)}._core_1isor_53::-webkit-meter-optimum-value{border-radius:10rem;background:var(--x-meter-value-optimum-bg)}._core_1isor_53::-webkit-meter-suboptimum-value{border-radius:10rem;background:var(--x-meter-value-suboptimum-bg)}._core_1isor_53::-webkit-meter-even-less-good-value{border-radius:10rem;background:var(--x-meter-value-even-less-good-bg)}._btn_9r2wb_1{display:block}._browsersLoading_9r2wb_5{display:grid;justify-content:center;align-items:center;height:5rem}._browsers_9r2wb_5{display:grid;grid-template-columns:repeat(auto-fill,minmax(25rem,1fr));gap:var(--x-gutter-sm)}:root{--x-button-fg: var(--x-fg);--x-button-bg: hsl(0 0% 0% / .1);--x-button-fg-hover: var(--x-fg);--x-button-bg-hover: hsl(0 0% 0% / .15);--x-button-fg-active: var(--x-fg);--x-button-bg-active: hsl(0 0% 0% / .2)}@media(prefers-color-scheme:dark){:root{--x-button-fg: var(--x-fg);--x-button-bg: hsl(0 0% 100% / .1);--x-button-fg-hover: var(--x-fg);--x-button-bg-hover: hsl(0 0% 100% / .15);--x-button-fg-active: var(--x-fg);--x-button-bg-active: hsl(0 0% 100% / .2)}}@keyframes _spin_1shxn_1{to{transform:rotate(360deg)}}._button_1shxn_25{display:flex;align-items:center;gap:.25em;cursor:pointer;border:none;border-radius:var(--x-radius);background:var(--x-button-bg);padding:0 var(--x-gutter-sm);color:var(--x-button-fg);font-family:var(--x-text-font-family);text-decoration:none}._button_1shxn_25:hover{background:var(--x-button-bg-hover);color:var(--x-button-fg-hover);text-decoration:none}._button_1shxn_25:active{background:var(--x-button-bg-active);color:var(--x-button-fg-active);text-decoration:none}._icon_1shxn_49{display:grid;place-content:center;aspect-ratio:1/1;width:1rem}._icon_1shxn_49 svg{width:1rem;height:1rem}._icon_1shxn_49[data-status=loading]{animation:_spin_1shxn_1 1s linear infinite}:root{--x-nav-fg: hsl(0 0% 100% / .9);--x-nav-bg: hsl(0 0% 15% / .95);--x-nav-bg-hover: hsl(0 0% 100% / .05);--x-nav-bg-active: hsl(0 0% 100% / .1);--x-nav-border-color: hsl(0 0% 100% / .05)}@media(prefers-color-scheme:dark){:root{--x-nav-fg: hsl(0 0% 95% / .95);--x-nav-bg: hsl(0 0% 20% / .95);--x-nav-bg-hover: hsl(0 0% 25% / .95);--x-nav-bg-active: hsl(0 0% 30% / .95);--x-nav-border-color: hsl(0 0% 100% / .05)}}._main_1ygx7_18{display:flex;position:sticky;bottom:0;justify-content:flex-start;align-items:center;z-index:10;background:var(--x-nav-bg);overflow-x:auto}@media(min-width:768px){._main_1ygx7_18{justify-content:center;border-radius:var(--x-radius) var(--x-radius) 0 0}}._link_1ygx7_35{position:relative;border-right:1px solid var(--x-nav-border-color);padding:var(--x-gutter);color:var(--x-nav-fg);white-space:nowrap}._link_1ygx7_35:hover{background:var(--x-nav-bg-hover);color:var(--x-nav-fg);text-decoration:none}._link_1ygx7_35:focus,._link_1ygx7_35:active,._link_1ygx7_35[data-active]{background:var(--x-nav-bg-active);color:var(--x-nav-fg);text-decoration:none}._link_1ygx7_35:last-child{border-right:0}:root{--x-card-group-label-fg: var(--x-fg);--x-card-group-split-color: hsl(0 0% 0% / .1);--x-card-group-bg-hover: hsl(0 0% 0% / .05)}@media(prefers-color-scheme:dark){:root{--x-card-group-label-fg: var(--x-fg);--x-card-group-split-color: hsl(0 0% 100% / .1);--x-card-group-bg-hover: hsl(0 0% 100% / .05)}}._main_11zmy_14{display:grid;grid-template-columns:minmax(var(--min-width),var(--max-width)) 1fr;gap:var(--x-gutter-sm);border-radius:var(--x-radius)}._main_11zmy_14:hover{background:var(--x-card-group-bg-hover)}._label_11zmy_24{color:var(--x-card-group-label-fg);font-family:var(--x-text-font-family);text-align:right;word-break:normal}._label_11zmy_24:after{content:":"}._content_11zmy_34{display:flex;flex-wrap:wrap;align-items:flex-start;gap:var(--x-gutter-sm)}._main_z8p86_1{display:grid;grid-template-columns:repeat(auto-fill,minmax(var(--min-width),1fr));gap:var(--x-gutter-sm)}._main_xo4z4_2{display:inline-flex;border-radius:var(--x-radius);align-items:center;justify-content:center;font-family:Arial Black,sans-serif;font-weight:bolder;min-width:2em;padding:0 .5rem;white-space:nowrap;cursor:pointer;text-shadow:0 1px 1px #000}._main_xo4z4_2:active{transform:scale3d(.95,.95,1)}._main_xo4z4_2[data-ok]{background:var(--x-status-ok-bg);color:var(--x-status-ok-fg)}._main_xo4z4_2[data-error]{background:var(--x-status-error-bg);color:var(--x-status-error-fg)}._main_xo4z4_2[data-ok][data-icon]:before{content:"✓"}._main_xo4z4_2[data-error][data-icon]:before{content:"×"}._main_b4lx8_1{display:grid;grid-template-columns:repeat(auto-fill,minmax(25rem,1fr));gap:var(--x-gutter)}._main_mc2kq_1{display:grid;gap:var(--x-gutter-sm)}._container_1i47d_2{display:grid;grid-template-columns:repeat(auto-fill,minmax(25rem,1fr));gap:var(--x-gutter)}._item_1i47d_8{display:grid}._id_1i47d_12{text-align:center;text-decoration:underline}._idRow_1i47d_17{display:grid;align-items:center}._dataContainer_1i47d_22{display:flex;justify-content:center;align-items:center;text-align:center}._data_1i47d_22{flex:0 0 50%}._data_1i47d_22[data-rx]{color:var(--x-network-stats-rx-fg)}._data_1i47d_22[data-tx]{color:var(--x-network-stats-tx-fg)}._rate_1i47d_39{font-family:Arial Black,sans-serif}._rate_1i47d_39:before{margin-right:.5rem}._rateRx_1i47d_46:before{content:"▼"}._rateTx_1i47d_50:before{content:"▲"}:root{--x-network-stats-tx-fg: hsl(23 100% 38%);--x-network-stats-tx-bg: hsl(23 100% 38% / .1);--x-network-stats-rx-fg: hsl(120 100% 23%);--x-network-stats-rx-bg: hsl(120 100% 23% / .1)}@media(prefers-color-scheme:dark){:root{--x-network-stats-tx-fg: hsl(23 100% 58%);--x-network-stats-tx-bg: hsl(23 100% 58% /.15);--x-network-stats-rx-fg: hsl(120 100% 43%);--x-network-stats-rx-bg: hsl(120 100% 43% / .15)}}._main_1cyw0_17{display:grid;grid-template-areas:"network-stats-item-id network-stats-item-id" "network-stats-item-rx network-stats-item-tx";gap:1px;font-family:Arial Black,sans-serif}._id_1cyw0_24{grid-area:network-stats-item-id;text-align:center}._type_1cyw0_29:before{opacity:.5;content:"▼";font-size:1rem}._rx_1cyw0_35,._tx_1cyw0_36{display:grid;position:relative;grid-area:network-stats-item-rx;border-radius:var(--x-radius) 0 0 var(--x-radius);background:var(--x-network-stats-rx-bg);padding:var(--x-gutter-sm);color:var(--x-network-stats-rx-fg);text-align:center}._tx_1cyw0_36{grid-area:network-stats-item-tx;border-radius:0 var(--x-radius) var(--x-radius) 0;background:var(--x-network-stats-tx-bg);color:var(--x-network-stats-tx-fg)}._tx_1cyw0_36 ._type_1cyw0_29:before{content:"▲"}._rateRx_1cyw0_57,._rateTx_1cyw0_58{font-weight:700;font-size:1.5rem}._main_zmhfm_1{display:grid;grid-template-columns:repeat(auto-fill,minmax(20rem,1fr));gap:var(--x-gutter)}._groupId_zmhfm_7{display:block;margin-bottom:calc(var(--x-gutter) * .5);text-align:center;text-decoration:underline}._groupId_zmhfm_7:hover{text-decoration:none}._group_zmhfm_7{margin-bottom:calc(var(--x-gutter) * .5)}._groupMsg_zmhfm_21{display:flex;justify-content:center}._groupNetworks_zmhfm_26{margin-bottom:var(--x-gutter);border-radius:var(--x-radius);background:var(--x-network-node-bg);padding:var(--x-gutter);color:var(--x-network-node-fg)}._groupNetwork_zmhfm_26{margin-bottom:calc(var(--x-gutter) * .5);border-bottom:1px dashed var(--x-network-node-border-color);padding-bottom:calc(var(--x-gutter) * .5)}._groupNetwork_zmhfm_26:last-child{margin-bottom:0;border-bottom:0;padding-bottom:0}._groupNetwork_zmhfm_26:hover{background:var(--x-network-node-row-bg)}:root{--x-sys-load-fg: var(--x-fg);--x-sys-load-bg: transparent;--x-sys-load-interval-bg: hsl(0 0% 0% / .1)}@media(prefers-color-scheme:dark){:root{--x-sys-load-fg: var(--x-fg);--x-sys-load-interval-bg: hsl(0 0% 100% / .1)}}._main_1xqpo_13{display:grid;grid-template-columns:1fr auto;grid-template-areas:"x-server-stats-system-load-label x-server-stats-system-load-usage" "x-server-stats-system-load-label x-server-stats-system-load-group" "x-server-stats-system-load-meter x-server-stats-system-load-meter";gap:var(--x-gutter-sm)}._label_1xqpo_20{display:grid;grid-area:x-server-stats-system-load-label;align-items:center;font-weight:700}._meter_1xqpo_27{display:grid;grid-template-areas:"x-meter-core";grid-area:x-server-stats-system-load-meter}._usage_1xqpo_33{grid-area:x-server-stats-system-load-usage;text-align:right}._group_1xqpo_38{display:flex;grid-area:x-server-stats-system-load-group;align-items:center;gap:var(--x-gutter-sm)}._groupItem_1xqpo_45{border-radius:var(--x-radius);background:var(--x-sys-load-interval-bg);padding:0 var(--x-gutter);color:var(--x-sys-load-fg);font-weight:700;font-family:Arial Black,sans-serif,monospace}._sysLoad_mqy5s_1{display:flex;gap:var(--x-gutter-sm)}._main_66xvd_1{display:grid;grid-template-columns:1fr auto;grid-template-areas:"x-nodes-usage-label x-nodes-usage-label" "x-nodes-usage-overview x-nodes-usage-percent" "x-nodes-usage-meter x-nodes-usage-meter";column-gap:var(--x-gutter-sm);row-gap:0;gap:var(--x-gutter-sm)}._meter_66xvd_10{display:flex;grid-area:x-nodes-usage-meter;height:var(--x-meter-height)}._label_66xvd_16{grid-area:x-nodes-usage-label}._overview_66xvd_20{display:flex;grid-area:x-nodes-usage-overview;gap:var(--x-gutter-sm)}._chart_66xvd_26{display:none;grid-area:x-nodes-usage-chart}._percent_66xvd_31{grid-area:x-nodes-usage-percent}._main_1gdd5_1{display:grid;gap:var(--x-gutter-sm);container-type:inline-size;max-height:calc(100px + var(--x-gutter-sm));overflow-y:auto;overscroll-behavior:contain;scroll-snap-type:y mandatory;scrollbar-color:hsla(0,0%,50%,.5) transparent}._item_1gdd5_12{scroll-snap-align:start}._main_mc2kq_1,._main_18siw_1{display:grid;gap:var(--x-gutter-sm)}._name_18siw_6{text-align:center}._loading_18siw_10{display:grid;place-content:center center;height:10rem}:root{--x-search-fg: var(--x-fg);--x-search-bg: hsl(0 0% 0% / .1);--x-search-bg-hover: hsl(0 0% 0% / .15);--x-search-bg-active: hsl(0 0% 0% / .2)}@media(prefers-color-scheme:dark){:root{--x-search-fg: var(--x-fg);--x-search-bg: hsl(0 0% 100% / .1);--x-search-bg-hover: hsl(0 0% 100% / .15);--x-search-bg-active: hsl(0 0% 100% / .2)}}._main_uj7jp_16{border-radius:var(--x-radius);background:var(--x-search-bg);padding:calc(var(--x-gutter-sm) * .5) var(--x-gutter-sm);color:var(--x-search-fg);font-family:monospace}._main_uj7jp_16:hover{background:var(--x-search-bg-hover);text-decoration:none}._main_uj7jp_16:active{background:var(--x-search-bg-active)}:root{--x-ping-result-scrollbar-bg: hsl(0 0% 0% / .5);--x-ping-item-bg: hsl(0 0% 0% / .1)}@media(prefers-color-scheme:dark){:root{--x-ping-result-scrollbar-bg: hsl(0 0% 100% / .5);--x-ping-item-bg: hsl(0 0% 100% / .1)}}._itemContainer_y6c35_12{display:grid;grid-template-columns:repeat(auto-fill,minmax(5rem,1fr));grid-auto-flow:row;flex-grow:1;gap:.15em;border-radius:var(--x-radius);background:var(--x-ping-item-bg);padding:var(--x-gutter-sm) var(--x-gutter);height:7rem;overflow-y:auto;scrollbar-color:var(--x-ping-result-scrollbar-bg) transparent;list-style-type:none}._resultContainer_y6c35_27{display:grid;flex-grow:1;gap:var(--x-gutter-sm)}._result_y6c35_27{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center}._btn_1dtle_1{display:block}._serversLoading_1dtle_5{display:grid;justify-content:center;align-items:center;height:5rem}._servers_1dtle_5{display:grid;grid-template-columns:repeat(auto-fill,minmax(25rem,1fr));gap:var(--x-gutter-sm)}._main_fajqi_1{display:flex}:root{--x-server-benchmark-bg: transparent;--x-server-benchmark-link-bg: hsl(0 0% 0% / .05);--x-server-benchmark-link-fg: hsl(0 0% 0% / .95)}@media(prefers-color-scheme:dark){:root{--x-server-benchmark-link-fg: hsl(0 0% 100% / .95);--x-server-benchmark-link-bg: hsl(0 0% 100% / .05)}}._main_1e6oe_13{display:grid;gap:var(--x-gutter-sm);border-radius:var(--x-radius);background:var(--x-server-benchmark-bg);padding:var(--x-gutter-sm);text-align:center}._header_1e6oe_22{display:flex;justify-content:center;align-items:center}._link_1e6oe_28{opacity:.75;cursor:pointer;border:none;border-radius:var(--x-radius);background:none;padding:0 var(--x-gutter-sm)}._link_1e6oe_28:hover,._link_1e6oe_28:active{opacity:1;background:var(--x-server-benchmark-link-bg);text-decoration:none}._link_1e6oe_28 svg{width:1rem;height:1rem}._marks_1e6oe_46{display:flex;justify-content:center;align-items:center;gap:var(--x-gutter-sm);cursor:pointer;border:none;border-radius:var(--x-radius);background-color:transparent;color:var(--x-server-benchmark-link-fg);font-size:1.25rem}._marks_1e6oe_46:hover{background:var(--x-server-benchmark-link-bg)}._sign_1e6oe_62{opacity:.5}._main_raw5t_1{display:grid;gap:var(--x-gutter-sm)}._modules_raw5t_6{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:var(--x-gutter)}@keyframes _spin_nuyl9_1{to{transform:rotate(360deg)}}._main_nuyl9_6{display:flex;flex-wrap:wrap;justify-content:center;align-items:center;gap:.5em;height:100svh}._main_nuyl9_6:before{animation:_spin_nuyl9_1 1s linear infinite;box-sizing:border-box;border:1px solid var(--x-button-bg);border-top-color:var(--x-button-fg);border-radius:50%;width:16px;height:16px;content:""}
CODE;
exit;
}
}
namespace InnStudio\Prober\Components\ServerStatus;
use InnStudio\Prober\Components\UserConfig\UserConfigApi;
use InnStudio\Prober\Components\Utils\UtilsCpu;
use InnStudio\Prober\Components\Utils\UtilsMemory;
final class ServerStatusPoll
{
public function render()
{
$id = ServerStatusConstants::ID;
if (UserConfigApi::isDisabled($id)) {
return [
$id => null,
];
}
return [
$id => [
'sysLoad' => UtilsCpu::getLoadAvg(),
'cpuUsage' => UtilsCpu::getUsage(),
'memRealUsage' => [
'value' => UtilsMemory::getMemoryUsage('MemRealUsage'),
'max' => UtilsMemory::getMemoryUsage('MemTotal'),
],
'memBuffers' => [
'value' => UtilsMemory::getMemoryUsage('Buffers'),
'max' => UtilsMemory::getMemoryUsage('MemUsage'),
],
'memCached' => [
'value' => UtilsMemory::getMemoryUsage('Cached'),
'max' => UtilsMemory::getMemoryUsage('MemUsage'),
],
'swapUsage' => [
'value' => UtilsMemory::getMemoryUsage('SwapUsage'),
'max' => UtilsMemory::getMemoryUsage('SwapTotal'),
],
'swapCached' => [
'value' => UtilsMemory::getMemoryUsage('SwapCached'),
'max' => UtilsMemory::getMemoryUsage('SwapUsage'),
],
],
];
}
}
namespace InnStudio\Prober\Components\ServerStatus;
class ServerStatusConstants
{
const ID = 'serverStatus';
}
namespace InnStudio\Prober\Components\DiskUsage;
class DiskUsageConstants
{
const ID = 'diskUsage';
}
namespace InnStudio\Prober\Components\DiskUsage;
use InnStudio\Prober\Components\UserConfig\UserConfigApi;
use InnStudio\Prober\Components\Utils\UtilsDisk;
final class DiskUsagePoll
{
public function render()
{
$id = DiskUsageConstants::ID;
if (UserConfigApi::isDisabled($id)) {
return [
$id => null,
];
}
return [
$id => [
'items' => UtilsDisk::getItems(),
],
];
}
}
namespace InnStudio\Prober\Components\PhpInfoDetail;
use InnStudio\Prober\Components\Rest\RestResponse;
use InnStudio\Prober\Components\Rest\StatusCode;
use InnStudio\Prober\Components\UserConfig\UserConfigApi;
final class PhpInfoDetailAction
{
public function render($action)
{
$id = PhpInfoDetailConstants::ID;
if ($action !== $id) {
return;
}
if (UserConfigApi::isDisabled($id)) {
(new RestResponse())
->setStatus(StatusCode::FORBIDDEN)
->end();
}
phpinfo();
exit;
}
}
namespace InnStudio\Prober\Components\PhpInfoDetail;
class PhpInfoDetailConstants
{
const ID = 'phpInfoDetail';
}
namespace InnStudio\Prober\Components\Rest;
final class RestResponse
{
private $data;
private $headers = [];
private $status = StatusCode::OK;
public function __construct($data = null, $status = StatusCode::OK, array $headers = [])
{
$this->setData($data);
$this->setStatus($status);
$this->setHeaders($headers);
}
public function setHeader($key, $value, $replace = true)
{
if ($replace || ! isset($this->headers[$key])) {
$this->headers[$key] = $value;
} else {
$this->headers[$key] .= ", {$value}";
}
}
public function setHeaders(array $headers)
{
$this->headers = $headers;
}
public function getHeaders()
{
return $this->headers;
}
public function setStatus($status)
{
$this->status = $status;
return $this;
}
public function getStatus()
{
return $this->status;
}
public function setData($data)
{
$this->data = $data;
return $this;
}
public function getData()
{
return $this->data;
}
public function json()
{
// header('Content-Type: application/json');
// header('Expires: 0');
// header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
// header('Cache-Control: no-store, no-cache, must-revalidate');
// header('Pragma: no-cache');
// echo $this->toJson();
return $this;
}
public function end()
{
$this->httpResponseCode($this->status);
header('Content-Type: application/json');
header('Expires: 0');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Pragma: no-cache');
if (null !== $this->data) {
echo $this->toJson();
}
exit;
}
private function toJson()
{
$data = $this->getData();
if (null === $data) {
return '';
}
return json_encode($data, \JSON_UNESCAPED_UNICODE | \JSON_UNESCAPED_SLASHES);
}
private function httpResponseCode($code)
{
if (\function_exists('http_response_code')) {
return http_response_code($code);
}
$statusCode = [
100 => 'Continue',
101 => 'Switching Protocols',
102 => 'Processing',
200 => 'OK',
201 => 'Created',
202 => 'Accepted',
203 => 'Non-Authoritative Information',
204 => 'No Content',
205 => 'Reset Content',
206 => 'Partial Content',
207 => 'Multi-Status',
300 => 'Multiple Choices',
301 => 'Moved Permanently',
302 => 'Found',
303 => 'See Other',
304 => 'Not Modified',
305 => 'Use Proxy',
306 => '(Unused)',
307 => 'Temporary Redirect',
308 => 'Permanent Redirect',
400 => 'Bad Request',
401 => 'Unauthorized',
402 => 'Payment Required',
403 => 'Forbidden',
404 => 'Not Found',
405 => 'Method Not Allowed',
406 => 'Not Acceptable',
407 => 'Proxy Authentication Required',
408 => 'Request Timeout',
409 => 'Conflict',
410 => 'Gone',
411 => 'Length Required',
412 => 'Precondition Failed',
413 => 'Request Entity Too Large',
414 => 'Request-URI Too Long',
415 => 'Unsupported Media Type',
416 => 'Requested Range Not Satisfiable',
417 => 'Expectation Failed',
418 => "I'm a teapot",
419 => 'Authentication Timeout',
420 => 'Enhance Your Calm',
422 => 'Unprocessable Entity',
423 => 'Locked',
424 => 'Failed Dependency',
424 => 'Method Failure',
425 => 'Unordered Collection',
426 => 'Upgrade Required',
428 => 'Precondition Required',
429 => 'Too Many Requests',
431 => 'Request Header Fields Too Large',
444 => 'No Response',
449 => 'Retry With',
450 => 'Blocked by Windows Parental Controls',
451 => 'Unavailable For Legal Reasons',
494 => 'Request Header Too Large',
495 => 'Cert Error',
496 => 'No Cert',
497 => 'HTTP to HTTPS',
499 => 'Client Closed Request',
500 => 'Internal Server Error',
501 => 'Not Implemented',
502 => 'Bad Gateway',
503 => 'Service Unavailable',
504 => 'Gateway Timeout',
505 => 'HTTP Version Not Supported',
506 => 'Variant Also Negotiates',
507 => 'Insufficient Storage',
508 => 'Loop Detected',
509 => 'Bandwidth Limit Exceeded',
510 => 'Not Extended',
511 => 'Network Authentication Required',
598 => 'Network read timeout error',
599 => 'Network connect timeout error',
];
$msg = isset($statusCode[$code]) ? $statusCode[$code] : 'Unknow error';
$protocol = (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0');
header("{$protocol} {$code} {$msg}");
}
}
namespace InnStudio\Prober\Components\Rest;
final class StatusCode
{
const CONTINUE = 100;
const SWITCHING_PROTOCOLS = 101;
const PROCESSING = 102; // WEBDAV;_RFC_2518
const OK = 200;
const CREATED = 201;
const ACCEPTED = 202;
const NON_AUTHORITATIVE_INFORMATION = 203; // SINCE_HTTP/1.1
const NO_CONTENT = 204;
const RESET_CONTENT = 205;
const PARTIAL_CONTENT = 206;
const MULTI_STATUS = 207; // WEBDAV;_RFC_4918
const ALREADY_REPORTED = 208; // WEBDAV;_RFC_5842
const IM_USED = 226; // RFC_3229
const MULTIPLE_CHOICES = 300;
const MOVED_PERMANENTLY = 301;
const FOUND = 302;
const SEE_OTHER = 303; // SINCE_HTTP/1.1
const NOT_MODIFIED = 304;
const USE_PROXY = 305; // SINCE_HTTP/1.1
const SWITCH_PROXY = 306;
const TEMPORARY_REDIRECT = 307; // SINCE_HTTP/1.1
const PERMANENT_REDIRECT = 308; // APPROVED_AS_EXPERIMENTAL_RFC
const BAD_REQUEST = 400;
const UNAUTHORIZED = 401;
const PAYMENT_REQUIRED = 402;
const FORBIDDEN = 403;
const NOT_FOUND = 404;
const METHOD_NOT_ALLOWED = 405;
const NOT_ACCEPTABLE = 406;
const PROXY_AUTHENTICATION_REQUIRED = 407;
const REQUEST_TIMEOUT = 408;
const CONFLICT = 409;
const GONE = 410;
const LENGTH_REQUIRED = 411;
const PRECONDITION_FAILED = 412;
const REQUEST_ENTITY_TOO_LARGE = 413;
const REQUEST_URI_TOO_LONG = 414;
const UNSUPPORTED_MEDIA_TYPE = 415;
const REQUESTED_RANGE_NOT_SATISFIABLE = 416;
const EXPECTATION_FAILED = 417;
const I_AM_A_TEAPOT = 418;
const AUTHENTICATION_TIMEOUT = 419; // NOT_IN_RFC_2616
const ENHANCE_YOUR_CALM = 420; // TWITTER
const METHOD_FAILURE = 420; // SPRING_FRAMEWORK
const UNPROCESSABLE_ENTITY = 422; // WEBDAV;_RFC_4918
const LOCKED = 423; // WEBDAV;_RFC_4918
const FAILED_DEPENDENCY = 424; // WEBDAV
const UNORDERED_COLLECTION = 425; // INTERNET_DRAFT
const UPGRADE_REQUIRED = 426; // RFC_2817
const PRECONDITION_REQUIRED = 428; // RFC_6585
const TOO_MANY_REQUESTS = 429; // RFC_6585
const REQUEST_HEADER_FIELDS_TOO_LARGE = 431; // RFC_6585
const NO_RESPONSE = 444; // NGINX
const RETRY_WITH = 449; // MICROSOFT
const BLOCKED_BY_WINDOWS_PARENTAL_CONTROLS = 450; // MICROSOFT
const REDIRECT = 451; // MICROSOFT
const UNAVAILABLE_FOR_LEGAL_REASONS = 451; // INTERNET_DRAFT
const REQUEST_HEADER_TOO_LARGE = 494; // NGINX
const CERT_ERROR = 495; // NGINX
const NO_CERT = 496; // NGINX
const HTTP_TO_HTTPS = 497; // NGINX
const CLIENT_CLOSED_REQUEST = 499; // NGINX
const INTERNAL_SERVER_ERROR = 500;
const NOT_IMPLEMENTED = 501;
const BAD_GATEWAY = 502;
const SERVICE_UNAVAILABLE = 503;
const GATEWAY_TIMEOUT = 504;
const HTTP_VERSION_NOT_SUPPORTED = 505;
const VARIANT_ALSO_NEGOTIATES = 506; // RFC_2295
const INSUFFICIENT_STORAGE = 507; // WEBDAV;_RFC_4918
const LOOP_DETECTED = 508; // WEBDAV;_RFC_5842
const BANDWIDTH_LIMIT_EXCEEDED = 509; // APACHE_BW/LIMITED_EXTENSION
const NOT_EXTENDED = 510; // RFC_2774
const NETWORK_AUTHENTICATION_REQUIRED = 511; // RFC_6585
const NETWORK_READ_TIMEOUT_ERROR = 598; // UNKNOWN
const NETWORK_CONNECT_TIMEOUT_ERROR = 599; // Unknown
}
namespace InnStudio\Prober\Components\Ping;
class PingConstants
{
const ID = 'ping';
}
namespace InnStudio\Prober\Components\Ping;
use InnStudio\Prober\Components\UserConfig\UserConfigApi;
final class PingPoll
{
public function render()
{
$id = PingConstants::ID;
if (UserConfigApi::isDisabled($id)) {
return [
$id => null,
];
}
return [
$id => true,
];
}
}
namespace InnStudio\Prober\Components\Ping;
use InnStudio\Prober\Components\Rest\RestResponse;
use InnStudio\Prober\Components\Rest\StatusCode;
use InnStudio\Prober\Components\UserConfig\UserConfigApi;
final class PingAction
{
public function render($action)
{
$id = PingConstants::ID;
if ($action !== $id) {
return;
}
$response = new RestResponse();
if (UserConfigApi::isDisabled($id)) {
$response
->setStatus(StatusCode::NOT_IMPLEMENTED)
->end();
}
$response
->setData([
'id' => (string) microtime(true),
'time' => \defined('XPROBER_TIMER') ? microtime(true) - XPROBER_TIMER : 0,
])
->end();
}
}
namespace InnStudio\Prober\Components\BrowserBenchmark;
use InnStudio\Prober\Components\Bootstrap\Bootstrap;
use InnStudio\Prober\Components\Config\ConfigApi;
use InnStudio\Prober\Components\Rest\RestResponse;
use InnStudio\Prober\Components\Rest\StatusCode;
final class BrowserBenchmarkBrowsersAction
{
public function render($action)
{
if ('browserBenchmarks' !== $action) {
return;
}
$reponse = new RestResponse();
if (\defined('XPROBER_IS_DEV') && XPROBER_IS_DEV) {
$reponse
->setData($this->getDevItems())
->end();
}
foreach (ConfigApi::$config['BROWSER_BENCHMARKS_URLS'] as $url) {
$curl = curl_init($url);
curl_setopt($curl, \CURLOPT_RETURNTRANSFER, true);
$data = (string) curl_exec($curl);
curl_close($curl);
if ( ! $data) {
continue;
}
$json = json_decode($data, true);
if ( ! $json) {
continue;
}
$reponse
->setData($json)
->end();
}
$reponse
->setStatus(StatusCode::NO_CONTENT)
->end();
}
private function getDevItems()
{
$path = Bootstrap::$dir . '/browser-benchmarks.json';
if ( ! file_exists($path)) {
return [];
}
$data = file_get_contents($path);
if ( ! $data) {
return [];
}
$items = json_decode($data, true);
if ( ! $items) {
return [];
}
return $items;
}
}
namespace InnStudio\Prober\Components\BrowserBenchmark;
use InnStudio\Prober\Components\UserConfig\UserConfigApi;
final class BrowserBenchmarkPoll
{
public function render()
{
$id = BrowserBenchmarkConstants::ID;
if (UserConfigApi::isDisabled($id)) {
return [
$id => null,
];
}
return [
$id => true,
];
}
}
namespace InnStudio\Prober\Components\BrowserBenchmark;
class BrowserBenchmarkConstants
{
const ID = 'browserBenchmark';
}
namespace InnStudio\Prober\Components\PhpInfo;
use InnStudio\Prober\Components\UserConfig\UserConfigApi;
final class PhpInfoPoll
{
public function render()
{
$id = PhpInfoConstants::ID;
if (UserConfigApi::isDisabled($id)) {
return [
$id => null,
];
}
return [
$id => [
'phpVersion' => \PHP_VERSION,
'sapi' => \PHP_SAPI,
'displayErrors' => (bool) \ini_get('display_errors'),
'errorReporting' => (int) \ini_get('error_reporting'),
'memoryLimit' => (string) \ini_get('memory_limit'),
'postMaxSize' => (string) \ini_get('post_max_size'),
'uploadMaxFilesize' => (string) \ini_get('upload_max_filesize'),
'maxInputVars' => (int) \ini_get('max_input_vars'),
'maxExecutionTime' => (int) \ini_get('max_execution_time'),
'defaultSocketTimeout' => (int) \ini_get('default_socket_timeout'),
'allowUrlFopen' => (bool) \ini_get('allow_url_fopen'),
'smtp' => (bool) \ini_get('SMTP'),
'disableFunctions' => UserConfigApi::isDisabled('phpDisabledFunctions') ? [] : array_filter(explode(',', (string) \ini_get('disable_functions'))),
'disableClasses' => UserConfigApi::isDisabled('phpDisabledClasses') ? [] : array_filter(explode(',', (string) \ini_get('disable_classes'))),
],
];
}
}
namespace InnStudio\Prober\Components\PhpInfo;
class PhpInfoConstants
{
const ID = 'phpInfo';
}
namespace InnStudio\Prober\Components\PhpInfo;
use InnStudio\Prober\Components\Config\ConfigApi;
use InnStudio\Prober\Components\Rest\RestResponse;
use InnStudio\Prober\Components\Rest\StatusCode;
use InnStudio\Prober\Components\UserConfig\UserConfigApi;
final class PhpInfoLatestPhpVersionAction
{
public function render($action)
{
$id = PhpInfoConstants::ID;
if ('latestPhpVersion' !== $action) {
return;
}
$response = new RestResponse();
if (UserConfigApi::isDisabled($id)) {
$response
->setStatus(StatusCode::FORBIDDEN)
->end();
}
$content = file_get_contents('https://www.php.net/releases/?json');
if ( ! $content) {
$response
->setStatus(StatusCode::NO_CONTENT)
->end();
}
$versions = json_decode($content, true);
if ( ! $versions) {
$response
->setStatus(StatusCode::NO_CONTENT)
->end();
}
$version = isset($versions[ConfigApi::$config['LATEST_PHP_STABLE_VERSION']]['version']) ? $versions[ConfigApi::$config['LATEST_PHP_STABLE_VERSION']]['version'] : '';
if ( ! $version) {
$response
->setStatus(StatusCode::NO_CONTENT)
->end();
}
$response
->setData([
'version' => $version,
'date' => $versions[ConfigApi::$config['LATEST_PHP_STABLE_VERSION']]['date'],
])
->end();
}
}
namespace InnStudio\Prober\Components\Poll;
use InnStudio\Prober\Components\Rest\RestResponse;
final class PollAction extends PoolConstants
{
public function render($action)
{
if (PoolConstants::ID !== $action) {
return;
}
$data = [];
foreach ([
'Config\\ConfigPoll',
'UserConfig\\UserConfigPoll',
'PhpInfo\\PhpInfoPoll',
'Database\\DatabasePoll',
'MyInfo\\MyInfoPoll',
'DiskUsage\\DiskUsagePoll',
'PhpExtensions\\PhpExtensionsPoll',
'NetworkStats\\NetworkStatsPoll',
'ServerStatus\\ServerStatusPoll',
'ServerInfo\\ServerInfoPoll',
'Nodes\\NodesPoll',
'TemperatureSensor\\TemperatureSensorPoll',
'ServerBenchmark\\ServerBenchmarkPoll',
'BrowserBenchmark\\BrowserBenchmarkPoll',
'Ping\\PingPoll',
] as $fn) {
$class = "\\InnStudio\\Prober\\Components\\{$fn}";
$data = array_merge($data, (new $class())->render());
}
(new RestResponse())
->setData($data)
->end();
}
}
namespace InnStudio\Prober\Components\Poll;
class PoolConstants
{
const ID = 'poll';
}
namespace InnStudio\Prober\Components\Footer;
use InnStudio\Prober\Components\Events\EventsApi;
final class Footer
{
private $ID = 'footer';
public function __construct()
{
EventsApi::on('conf', function (array $conf) {
$conf[$this->ID] = [
'memUsage' => memory_get_usage(),
'time' => microtime(true) - (\defined('XPROBER_TIMER') ? XPROBER_TIMER : 0),
];
return $conf;
}, \PHP_INT_MAX);
}
}
namespace InnStudio\Prober\Components\ServerBenchmark;
use InnStudio\Prober\Components\UserConfig\UserConfigApi;
final class ServerBenchmarkPoll
{
public function render()
{
$id = ServerBenchmarkConstants::ID;
if (UserConfigApi::isDisabled($id)) {
return [
$id => null,
];
}
return [
$id => true,
];
}
}
namespace InnStudio\Prober\Components\ServerBenchmark;
use InnStudio\Prober\Components\UserConfig\UserConfigApi;
class ServerBenchmarkApi
{
public static function getTmpRecorderPath()
{
return sys_get_temp_dir() . \DIRECTORY_SEPARATOR . 'xproberBenchmarkCool';
}
public static function setRecorder(array $data)
{
return (bool) file_put_contents(self::getTmpRecorderPath(), json_encode(array_merge(self::getRecorder(), $data)));
}
public static function setExpired()
{
return (bool) self::setRecorder([
'expired' => (int) $_SERVER['REQUEST_TIME'] + self::cooldown(),
]);
}
public static function setIsRunning($isRunning)
{
return (bool) self::setRecorder([
'isRunning' => true === (bool) $isRunning ? 1 : 0,
]);
}
public static function isRunning()
{
$recorder = self::getRecorder();
return isset($recorder['isRunning']) ? 1 === (int) $recorder['isRunning'] : false;
}
public static function getRemainingSeconds()
{
$recorder = self::getRecorder();
$expired = isset($recorder['expired']) ? (int) $recorder['expired'] : 0;
if ( ! $expired) {
return 0;
}
return $expired > (int) $_SERVER['REQUEST_TIME'] ? $expired - (int) $_SERVER['REQUEST_TIME'] : 0;
}
public static function getPointsByTime($time)
{
return pow(10, 3) - (int) ($time * pow(10, 3));
}
public static function getCpuPoints()
{
$data = 'inn-studio.com';
$hash = ['md5', 'sha512', 'sha256', 'crc32'];
$start = microtime(true);
$i = 0;
while (microtime(true) - $start < .5) {
foreach ($hash as $v) {
hash($v, $data);
}
++$i;
}
return $i;
}
public static function getWritePoints()
{
$tmpDir = sys_get_temp_dir();
if ( ! is_writable($tmpDir)) {
return 0;
}
$i = 0;
$start = microtime(true);
while (microtime(true) - $start < .5) {
$filePath = "{$tmpDir}/innStudioWriteBenchmark:{$i}";
clearstatcache(true, $filePath);
file_put_contents($filePath, $filePath);
unlink($filePath);
++$i;
}
return $i;
}
public static function getReadPoints()
{
$tmpDir = sys_get_temp_dir();
error_reporting(0);
if ( ! is_readable($tmpDir)) {
error_reporting(\E_ALL);
return 0;
}
$i = 0;
$start = microtime(true);
$filePath = "{$tmpDir}/innStudioIoBenchmark";
if ( ! file_exists($filePath)) {
file_put_contents($filePath, 'innStudioReadBenchmark');
}
while (microtime(true) - $start < .5) {
clearstatcache(true, $filePath);
file_get_contents($filePath);
++$i;
}
return $i;
}
public static function getPoints()
{
return [
'cpu' => self::getMedian([
self::getCpuPoints(),
self::getCpuPoints(),
self::getCpuPoints(),
]),
'write' => self::getMedian([
self::getWritePoints(),
self::getWritePoints(),
self::getWritePoints(),
]),
'read' => self::getMedian([
self::getReadPoints(),
self::getReadPoints(),
self::getReadPoints(),
]),
];
}
private static function cooldown()
{
return (int) UserConfigApi::get('serverBenchmarkCd') ?: 60;
}
private static function getRecorder()
{
$path = self::getTmpRecorderPath();
$defaults = [
'expired' => 0,
'running' => 0,
];
error_reporting(0);
if ( ! is_readable($path)) {
error_reporting(\E_ALL);
return $defaults;
}
$data = (string) file_get_contents($path);
if ( ! $data) {
return $defaults;
}
$data = json_decode($data, true);
if ( ! $data) {
return $defaults;
}
return array_merge($defaults, $data);
}
private static function getMedian(array $arr)
{
$count = \count($arr);
sort($arr);
$mid = floor(($count - 1) / 2);
return ($arr[$mid] + $arr[$mid + 1 - $count % 2]) / 2;
}
}
namespace InnStudio\Prober\Components\ServerBenchmark;
use InnStudio\Prober\Components\Bootstrap\Bootstrap;
use InnStudio\Prober\Components\Config\ConfigApi;
use InnStudio\Prober\Components\Rest\RestResponse;
use InnStudio\Prober\Components\Rest\StatusCode;
final class ServerBenchmarkServersAction
{
public function render($action)
{
if ('benchmarkServers' !== $action) {
return;
}
$reponse = new RestResponse();
if (\defined('XPROBER_IS_DEV') && XPROBER_IS_DEV) {
$reponse
->setData($this->getDevItems())
->end();
}
foreach (ConfigApi::$config['BENCHMARKS_URLS'] as $url) {
$curl = curl_init($url);
curl_setopt($curl, \CURLOPT_RETURNTRANSFER, true);
$data = (string) curl_exec($curl);
curl_close($curl);
if ( ! $data) {
continue;
}
$json = json_decode($data, true);
if ( ! $json) {
continue;
}
$reponse
->setData($json)
->end();
}
$reponse
->setStatus(StatusCode::NO_CONTENT)
->end();
}
private function getDevItems()
{
$path = Bootstrap::$dir . '/benchmarks.json';
if ( ! file_exists($path)) {
return [];
}
$data = file_get_contents($path);
if ( ! $data) {
return [];
}
$items = json_decode($data, true);
if ( ! $items) {
return [];
}
return $items;
}
}
namespace InnStudio\Prober\Components\ServerBenchmark;
class ServerBenchmarkConstants
{
const ID = 'serverBenchmark';
}
namespace InnStudio\Prober\Components\ServerBenchmark;
use InnStudio\Prober\Components\Rest\RestResponse;
use InnStudio\Prober\Components\Rest\StatusCode;
use InnStudio\Prober\Components\UserConfig\UserConfigApi;
final class ServerBenchmarkPerformanceAction
{
public function render($action)
{
if ('benchmarkPerformance' !== $action) {
return;
}
if (UserConfigApi::isDisabled('myServerBenchmark')) {
(new RestResponse())
->setStatus(StatusCode::FORBIDDEN)
->end();
}
$this->renderMarks();
}
private function renderMarks()
{
set_time_limit(0);
$remainingSeconds = ServerBenchmarkApi::getRemainingSeconds();
$response = new RestResponse();
if ($remainingSeconds) {
$response
->setStatus(StatusCode::TOO_MANY_REQUESTS)
->setData([
'seconds' => $remainingSeconds,
])
->end();
}
ServerBenchmarkApi::setExpired();
ServerBenchmarkApi::setIsRunning(true);
// start benchmark
$marks = ServerBenchmarkApi::getPoints();
// end benchmark
ServerBenchmarkApi::setIsRunning(false);
$response
->setData([
'marks' => $marks,
])
->end();
}
}
namespace InnStudio\Prober\Components\ServerBenchmark;
final class ServerBenchmarkDelay
{
public function delay()
{
while (ServerBenchmarkApi::isRunning()) {
sleep(2);
}
}
}
namespace InnStudio\Prober\Components\Updater;
class UpdaterConstants
{
const ID = 'updater';
}
namespace InnStudio\Prober\Components\Updater;
use InnStudio\Prober\Components\Config\ConfigApi;
use InnStudio\Prober\Components\Rest\RestResponse;
use InnStudio\Prober\Components\Rest\StatusCode;
final class UpdaterActionUpdate
{
public function render($action)
{
if ('update' !== $action) {
return $action;
}
$response = new RestResponse();
// prevent update file on dev mode
if (\defined('XPROBER_IS_DEV') && XPROBER_IS_DEV) {
$response
->setStatus(StatusCode::FORBIDDEN)
->end();
}
// check file writable
if ( ! is_writable(__FILE__)) {
$response
->setStatus(StatusCode::INSUFFICIENT_STORAGE)
->end();
}
$code = '';
foreach (ConfigApi::$config['UPDATE_PHP_URLS'] as $url) {
$curl = curl_init($url);
curl_setopt($curl, \CURLOPT_RETURNTRANSFER, true);
$status = (int) curl_getinfo($curl, \CURLINFO_HTTP_CODE);
$code = (string) curl_exec($curl);
curl_close($curl);
if (StatusCode::OK !== $status || '' !== trim($code)) {
break;
}
}
if ( ! $code) {
$response
->setStatus(StatusCode::NOT_FOUND)
->end();
}
if ((bool) file_put_contents(__FILE__, $code)) {
if (\function_exists('opcache_invalidate')) {
opcache_invalidate(__FILE__, true) || opcache_reset();
}
$response
->setStatus(StatusCode::CREATED)
->end();
}
$response
->setStatus(StatusCode::INTERNAL_SERVER_ERROR)
->end();
}
}
namespace InnStudio\Prober\Components\Updater;
use InnStudio\Prober\Components\Config\ConfigApi;
use InnStudio\Prober\Components\Rest\RestResponse;
use InnStudio\Prober\Components\Rest\StatusCode;
final class UpdaterActionVersion
{
public function render($action)
{
if ('latestVersion' !== $action) {
return;
}
$response = new RestResponse();
foreach (ConfigApi::$config['APP_CONFIG_URLS'] as $url) {
$curl = curl_init();
curl_setopt($curl, \CURLOPT_URL, $url);
curl_setopt($curl, \CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, \CURLOPT_TIMEOUT, 3);
$data = curl_exec($curl);
curl_close($curl);
if ( ! $data) {
continue;
}
$data = json_decode($data, true);
if ( ! $data) {
continue;
}
$response
->setData([
'version' => $data['APP_VERSION'],
])
->end();
}
$response
->setStatus(StatusCode::NO_CONTENT)
->end();
}
}
namespace InnStudio\Prober\Components\Script;
use InnStudio\Prober\Components\Utils\UtilsApi;
final class ScriptAction
{
public function render($action)
{
if ('script' !== $action) {
return;
}
$this->output();
}
private function output()
{
UtilsApi::setFileCacheHeader();
header('Content-type: application/javascript');
echo <<<'CODE'
(function(mu){typeof define=="function"&&define.amd?define(mu):mu()})((function(){"use strict";function mu(l){return l&&l.__esModule&&Object.prototype.hasOwnProperty.call(l,"default")?l.default:l}var Th={exports:{}},vu={},Ah={exports:{}},yu={exports:{}};yu.exports;var cg;function tA(){return cg||(cg=1,(function(l,r){(function(){function s(y,D){Object.defineProperty(h.prototype,y,{get:function(){console.warn("%s(...) is deprecated in plain JavaScript React classes. %s",D[0],D[1])}})}function u(y){return y===null||typeof y!="object"?null:(y=ur&&y[ur]||y["@@iterator"],typeof y=="function"?y:null)}function d(y,D){y=(y=y.constructor)&&(y.displayName||y.name)||"ReactClass";var $=y+"."+D;ri[$]||(console.error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",D,y),ri[$]=!0)}function h(y,D,$){this.props=y,this.context=D,this.refs=Ve,this.updater=$||ui}function m(){}function g(y,D,$){this.props=y,this.context=D,this.refs=Ve,this.updater=$||ui}function _(){}function M(y){return""+y}function C(y){try{M(y);var D=!1}catch{D=!0}if(D){D=console;var $=D.error,q=typeof Symbol=="function"&&Symbol.toStringTag&&y[Symbol.toStringTag]||y.constructor.name||"Object";return $.call(D,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",q),M(y)}}function R(y){if(y==null)return null;if(typeof y=="function")return y.$$typeof===Rp?null:y.displayName||y.name||null;if(typeof y=="string")return y;switch(y){case H:return"Fragment";case Be:return"Profiler";case he:return"StrictMode";case at:return"Suspense";case Oa:return"SuspenseList";case I:return"Activity"}if(typeof y=="object")switch(typeof y.tag=="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),y.$$typeof){case Ie:return"Portal";case Zt:return y.displayName||"Context";case ve:return(y._context.displayName||"Context")+".Consumer";case ol:var D=y.render;return y=y.displayName,y||(y=D.displayName||D.name||"",y=y!==""?"ForwardRef("+y+")":"ForwardRef"),y;case ta:return D=y.displayName||null,D!==null?D:R(y.type)||"Memo";case So:D=y._payload,y=y._init;try{return R(y(D))}catch{}}return null}function T(y){if(y===H)return"<>";if(typeof y=="object"&&y!==null&&y.$$typeof===So)return"<...>";try{var D=R(y);return D?"<"+D+">":"<...>"}catch{return"<...>"}}function N(){var y=K.A;return y===null?null:y.getOwner()}function X(){return Error("react-stack-top-frame")}function ae(y){if(cr.call(y,"key")){var D=Object.getOwnPropertyDescriptor(y,"key").get;if(D&&D.isReactWarning)return!1}return y.key!==void 0}function oe(y,D){function $(){si||(si=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",D))}$.isReactWarning=!0,Object.defineProperty(y,"key",{get:$,configurable:!0})}function se(){var y=R(this.type);return uf[y]||(uf[y]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),y=this.props.ref,y!==void 0?y:null}function Ze(y,D,$,q,F,ye){var te=$.ref;return y={$$typeof:Ne,type:y,key:D,props:$,_owner:q},(te!==void 0?te:null)!==null?Object.defineProperty(y,"ref",{enumerable:!1,get:se}):Object.defineProperty(y,"ref",{enumerable:!1,value:null}),y._store={},Object.defineProperty(y._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(y,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(y,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:F}),Object.defineProperty(y,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:ye}),Object.freeze&&(Object.freeze(y.props),Object.freeze(y)),y}function ct(y,D){return D=Ze(y.type,D,y.props,y._owner,y._debugStack,y._debugTask),y._store&&(D._store.validated=y._store.validated),D}function He(y){We(y)?y._store&&(y._store.validated=1):typeof y=="object"&&y!==null&&y.$$typeof===So&&(y._payload.status==="fulfilled"?We(y._payload.value)&&y._payload.value._store&&(y._payload.value._store.validated=1):y._store&&(y._store.validated=1))}function We(y){return typeof y=="object"&&y!==null&&y.$$typeof===Ne}function kt(y){var D={"=":"=0",":":"=2"};return"$"+y.replace(/[=:]/g,function($){return D[$]})}function zt(y,D){return typeof y=="object"&&y!==null&&y.key!=null?(C(y.key),kt(""+y.key)):D.toString(36)}function Ye(y){switch(y.status){case"fulfilled":return y.value;case"rejected":throw y.reason;default:switch(typeof y.status=="string"?y.then(_,_):(y.status="pending",y.then(function(D){y.status==="pending"&&(y.status="fulfilled",y.value=D)},function(D){y.status==="pending"&&(y.status="rejected",y.reason=D)})),y.status){case"fulfilled":return y.value;case"rejected":throw y.reason}}throw y}function vt(y,D,$,q,F){var ye=typeof y;(ye==="undefined"||ye==="boolean")&&(y=null);var te=!1;if(y===null)te=!0;else switch(ye){case"bigint":case"string":case"number":te=!0;break;case"object":switch(y.$$typeof){case Ne:case Ie:te=!0;break;case So:return te=y._init,vt(te(y._payload),D,$,q,F)}}if(te){te=y,F=F(te);var je=q===""?"."+zt(te,0):q;return sr(F)?($="",je!=null&&($=je.replace(sf,"$&/")+"/"),vt(F,D,$,"",function(Wt){return Wt})):F!=null&&(We(F)&&(F.key!=null&&(te&&te.key===F.key||C(F.key)),$=ct(F,$+(F.key==null||te&&te.key===F.key?"":(""+F.key).replace(sf,"$&/")+"/")+je),q!==""&&te!=null&&We(te)&&te.key==null&&te._store&&!te._store.validated&&($._store.validated=2),F=$),D.push(F)),1}if(te=0,je=q===""?".":q+":",sr(y))for(var ge=0;ge import('./MyComponent'))
Did you accidentally put curly braces around the import?`,D),"default"in D||console.error(`lazy: Expected the result of a dynamic import() call. Instead received: %s
Your code should look like:
const MyComponent = lazy(() => import('./MyComponent'))`,D),D.default;throw y._result}function de(){var y=K.H;return y===null&&console.error(`Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:
1. You might have mismatching versions of React and the renderer (such as React DOM)
2. You might be breaking the Rules of Hooks
3. You might have more than one copy of React in the same app
See https://react.dev/link/invalid-hook-call for tips about how to debug and fix this problem.`),y}function ze(){K.asyncTransitions--}function $t(y){if(ci===null)try{var D=("require"+Math.random()).slice(0,7);ci=(l&&l[D]).call(l,"timers").setImmediate}catch{ci=function(q){ku===!1&&(ku=!0,typeof MessageChannel>"u"&&console.error("This browser does not have a MessageChannel implementation, so enqueuing tasks via await act(async () => ...) will fail. Please file an issue at https://github.com/facebook/react/issues if you encounter this warning."));var F=new MessageChannel;F.port1.onmessage=q,F.port2.postMessage(void 0)}}return ci(y)}function Qt(y){return 1 ...) without await. This could lead to unexpected testing behaviour, interleaving multiple act calls and mixing their scopes. You should - await act(async () => ...);"))}),{then:function(ge,Wt){F=!0,te.then(function($a){if(Y(D,$),$===0){try{ce(q),$t(function(){return ie($a,ge,Wt)})}catch(hr){K.thrownErrors.push(hr)}if(0 ...)"))}),K.actQueue=null),0K.recentlyCreatedOwnerStacks++;return Ze(y,F,q,N(),ge?Error("react-stack-top-frame"):Bu,ge?ka(T(y)):Lu)},r.createRef=function(){var y={current:null};return Object.seal(y),y},r.forwardRef=function(y){y!=null&&y.$$typeof===ta?console.error("forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...))."):typeof y!="function"?console.error("forwardRef requires a render function but was given %s.",y===null?"null":typeof y):y.length!==0&&y.length!==2&&console.error("forwardRef render functions accept exactly two parameters: props and ref. %s",y.length===1?"Did you forget to use the ref parameter?":"Any additional parameter will be undefined."),y!=null&&y.defaultProps!=null&&console.error("forwardRef render functions do not support defaultProps. Did you accidentally pass a React component?");var D={$$typeof:ol,render:y},$;return Object.defineProperty(D,"displayName",{enumerable:!1,configurable:!0,get:function(){return $},set:function(q){$=q,y.name||y.displayName||(Object.defineProperty(y,"name",{value:q}),y.displayName=q)}}),D},r.isValidElement=We,r.lazy=function(y){y={_status:-1,_result:y};var D={$$typeof:So,_payload:y,_init:Mt},$={name:"lazy",start:-1,end:-1,value:null,owner:null,debugStack:Error("react-stack-top-frame"),debugTask:console.createTask?console.createTask("lazy()"):null};return y._ioInfo=$,D._debugInfo=[{awaited:$}],D},r.memo=function(y,D){y==null&&console.error("memo: The first argument must be a component. Instead received: %s",y===null?"null":typeof y),D={$$typeof:ta,type:y,compare:D===void 0?null:D};var $;return Object.defineProperty(D,"displayName",{enumerable:!1,configurable:!0,get:function(){return $},set:function(q){$=q,y.name||y.displayName||(Object.defineProperty(y,"name",{value:q}),y.displayName=q)}}),D},r.startTransition=function(y){var D=K.T,$={};$._updatedFibers=new Set,K.T=$;try{var q=y(),F=K.S;F!==null&&F($,q),typeof q=="object"&&q!==null&&typeof q.then=="function"&&(K.asyncTransitions++,q.then(ze,ze),q.then(_,Hu))}catch(ye){Hu(ye)}finally{D===null&&$._updatedFibers&&(y=$._updatedFibers.size,$._updatedFibers.clear(),10";if(typeof H=="object"&&H!==null&&H.$$typeof===vt)return"<...>";try{var he=l(H);return he?"<"+he+">":"<...>"}catch{return"<...>"}}function d(){var H=de.A;return H===null?null:H.getOwner()}function h(){return Error("react-stack-top-frame")}function m(H){if(ze.call(H,"key")){var he=Object.getOwnPropertyDescriptor(H,"key").get;if(he&&he.isReactWarning)return!1}return H.key!==void 0}function g(H,he){function Be(){Y||(Y=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",he))}Be.isReactWarning=!0,Object.defineProperty(H,"key",{get:Be,configurable:!0})}function _(){var H=l(this.type);return ie[H]||(ie[H]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),H=this.props.ref,H!==void 0?H:null}function M(H,he,Be,ve,Zt,ol){var at=Be.ref;return H={$$typeof:X,type:H,key:he,props:Be,_owner:ve},(at!==void 0?at:null)!==null?Object.defineProperty(H,"ref",{enumerable:!1,get:_}):Object.defineProperty(H,"ref",{enumerable:!1,value:null}),H._store={},Object.defineProperty(H._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(H,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(H,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:Zt}),Object.defineProperty(H,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:ol}),Object.freeze&&(Object.freeze(H.props),Object.freeze(H)),H}function C(H,he,Be,ve,Zt,ol){var at=he.children;if(at!==void 0)if(ve)if($t(at)){for(ve=0;ve
React keys must be passed directly to JSX without using spread:
let props = %s;
<%s key={someKey} {...props} />`,ve,at,Oa,at),Ie[at+ve]=!0)}if(at=null,Be!==void 0&&(s(Be),at=""+Be),m(he)&&(s(he.key),at=""+he.key),"key"in he){Be={};for(var ta in he)ta!=="key"&&(Be[ta]=he[ta])}else Be=he;return at&&g(Be,typeof H=="function"?H.displayName||H.name||"Unknown":H),M(H,at,Be,d(),Zt,ol)}function R(H){T(H)?H._store&&(H._store.validated=1):typeof H=="object"&&H!==null&&H.$$typeof===vt&&(H._payload.status==="fulfilled"?T(H._payload.value)&&H._payload.value._store&&(H._payload.value._store.validated=1):H._store&&(H._store.validated=1))}function T(H){return typeof H=="object"&&H!==null&&H.$$typeof===X}var N=gu(),X=Symbol.for("react.transitional.element"),ae=Symbol.for("react.portal"),oe=Symbol.for("react.fragment"),se=Symbol.for("react.strict_mode"),Ze=Symbol.for("react.profiler"),ct=Symbol.for("react.consumer"),He=Symbol.for("react.context"),We=Symbol.for("react.forward_ref"),kt=Symbol.for("react.suspense"),zt=Symbol.for("react.suspense_list"),Ye=Symbol.for("react.memo"),vt=Symbol.for("react.lazy"),ee=Symbol.for("react.activity"),Mt=Symbol.for("react.client.reference"),de=N.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,ze=Object.prototype.hasOwnProperty,$t=Array.isArray,Qt=console.createTask?console.createTask:function(){return null};N={react_stack_bottom_frame:function(H){return H()}};var Y,ie={},ce=N.react_stack_bottom_frame.bind(N,h)(),Ne=Qt(u(h)),Ie={};vu.Fragment=oe,vu.jsx=function(H,he,Be){var ve=1e4>de.recentlyCreatedOwnerStacks++;return C(H,he,Be,!1,ve?Error("react-stack-top-frame"):ce,ve?Qt(u(H)):Ne)},vu.jsxs=function(H,he,Be){var ve=1e4>de.recentlyCreatedOwnerStacks++;return C(H,he,Be,!0,ve?Error("react-stack-top-frame"):ce,ve?Qt(u(H)):Ne)}})(),vu}var hg;function aA(){return hg||(hg=1,Th.exports=nA()),Th.exports}var b=aA(),wh={exports:{}},zh={exports:{}},Rh={},pg;function oA(){return pg||(pg=1,(function(l){(function(){function r(){if(We=!1,vt){var Y=l.unstable_now();de=Y;var ie=!0;try{e:{ct=!1,He&&(He=!1,zt(ee),ee=-1),Ze=!0;var ce=se;try{t:{for(m(Y),oe=u(N);oe!==null&&!(oe.expirationTime>Y&&_());){var Ne=oe.callback;if(typeof Ne=="function"){oe.callback=null,se=oe.priorityLevel;var Ie=Ne(oe.expirationTime<=Y);if(Y=l.unstable_now(),typeof Ie=="function"){oe.callback=Ie,m(Y),ie=!0;break t}oe===u(N)&&d(N),m(Y)}else d(N);oe=u(N)}if(oe!==null)ie=!0;else{var H=u(X);H!==null&&M(g,H.startTime-Y),ie=!1}}break e}finally{oe=null,se=ce,Ze=!1}ie=void 0}}finally{ie?ze():vt=!1}}}function s(Y,ie){var ce=Y.length;Y.push(ie);e:for(;0>>1,Ie=Y[Ne];if(0>>1;Neh(Be,ce))veh(Zt,Be)?(Y[Ne]=Zt,Y[ve]=ce,Ne=ve):(Y[Ne]=Be,Y[he]=ce,Ne=he);else if(veh(Zt,ce))Y[Ne]=Zt,Y[ve]=ce,Ne=ve;else break e}}return ie}function h(Y,ie){var ce=Y.sortIndex-ie.sortIndex;return ce!==0?ce:Y.id-ie.id}function m(Y){for(var ie=u(X);ie!==null;){if(ie.callback===null)d(X);else if(ie.startTime<=Y)d(X),ie.sortIndex=ie.expirationTime,s(N,ie);else break;ie=u(X)}}function g(Y){if(He=!1,m(Y),!ct)if(u(N)!==null)ct=!0,vt||(vt=!0,ze());else{var ie=u(X);ie!==null&&M(g,ie.startTime-Y)}}function _(){return We?!0:!(l.unstable_now()-deY||125Ne?(Y.sortIndex=ce,s(X,Y),u(N)===null&&Y===u(X)&&(He?(zt(ee),ee=-1):He=!0,M(g,ce-Ne))):(Y.sortIndex=Ie,s(N,Y),ct||Ze||(ct=!0,vt||(vt=!0,ze()))),Y},l.unstable_shouldYield=_,l.unstable_wrapCallback=function(Y){var ie=se;return function(){var ce=se;se=ie;try{return Y.apply(this,arguments)}finally{se=ce}}},typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())})()})(Rh)),Rh}var mg;function lA(){return mg||(mg=1,zh.exports=oA()),zh.exports}var Dh={exports:{}},Xt={},vg;function iA(){if(vg)return Xt;vg=1;return(function(){function l(){}function r(R){return""+R}function s(R,T,N){var X=3` tag.%s',N),typeof R=="string"&&typeof T=="object"&&T!==null&&typeof T.as=="string"){N=T.as;var X=u(N,T.crossOrigin);_.d.L(R,N,{crossOrigin:X,integrity:typeof T.integrity=="string"?T.integrity:void 0,nonce:typeof T.nonce=="string"?T.nonce:void 0,type:typeof T.type=="string"?T.type:void 0,fetchPriority:typeof T.fetchPriority=="string"?T.fetchPriority:void 0,referrerPolicy:typeof T.referrerPolicy=="string"?T.referrerPolicy:void 0,imageSrcSet:typeof T.imageSrcSet=="string"?T.imageSrcSet:void 0,imageSizes:typeof T.imageSizes=="string"?T.imageSizes:void 0,media:typeof T.media=="string"?T.media:void 0})}},Xt.preloadModule=function(R,T){var N="";typeof R=="string"&&R||(N+=" The `href` argument encountered was "+d(R)+"."),T!==void 0&&typeof T!="object"?N+=" The `options` argument encountered was "+d(T)+".":T&&"as"in T&&typeof T.as!="string"&&(N+=" The `as` option encountered was "+d(T.as)+"."),N&&console.error('ReactDOM.preloadModule(): Expected two arguments, a non-empty `href` string and, optionally, an `options` object with an `as` property valid for a `` tag.%s',N),typeof R=="string"&&(T?(N=u(T.as,T.crossOrigin),_.d.m(R,{as:typeof T.as=="string"&&T.as!=="script"?T.as:void 0,crossOrigin:N,integrity:typeof T.integrity=="string"?T.integrity:void 0})):_.d.m(R))},Xt.requestFormReset=function(R){_.d.r(R)},Xt.unstable_batchedUpdates=function(R,T){return R(T)},Xt.useFormState=function(R,T,N){return m().useFormState(R,T,N)},Xt.useFormStatus=function(){return m().useHostTransitionStatus()},Xt.version="19.2.3",typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop=="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())})(),Xt}var yg;function gg(){return yg||(yg=1,Dh.exports=iA()),Dh.exports}var bu={},bg;function rA(){if(bg)return bu;bg=1;return(function(){function l(e,t){for(e=e.memoizedState;e!==null&&0=t.length)return a;var o=t[n],i=Rt(e)?e.slice():we({},e);return i[o]=r(e[o],t,n+1,a),i}function s(e,t,n){if(t.length!==n.length)console.warn("copyWithRename() expects paths of the same length");else{for(var a=0;aMo?console.error("Unexpected pop."):(t!==qv[Mo]&&console.error("Unexpected Fiber popped."),e.current=Vv[Mo],Vv[Mo]=null,qv[Mo]=null,Mo--)}function ze(e,t,n){Mo++,Vv[Mo]=e.current,qv[Mo]=n,e.current=t}function $t(e){return e===null&&console.error("Expected host context to exist. This error is likely caused by a bug in React. Please file an issue."),e}function Qt(e,t){ze(Ol,t,e),ze(Ss,e,e),ze(El,null,e);var n=t.nodeType;switch(n){case 9:case 11:n=n===9?"#document":"#fragment",t=(t=t.documentElement)&&(t=t.namespaceURI)?H1(t):Xo;break;default:if(n=t.tagName,t=t.namespaceURI)t=H1(t),t=k1(t,n);else switch(n){case"svg":t=hu;break;case"math":t=yh;break;default:t=Xo}}n=n.toLowerCase(),n=C0(null,n),n={context:t,ancestorInfo:n},de(El,e),ze(El,n,e)}function Y(e){de(El,e),de(Ss,e),de(Ol,e)}function ie(){return $t(El.current)}function ce(e){e.memoizedState!==null&&ze(_d,e,e);var t=$t(El.current),n=e.type,a=k1(t.context,n);n=C0(t.ancestorInfo,n),a={context:a,ancestorInfo:n},t!==a&&(ze(Ss,e,e),ze(El,a,e))}function Ne(e){Ss.current===e&&(de(El,e),de(Ss,e)),_d.current===e&&(de(_d,e),dc._currentValue=Ji)}function Ie(){}function H(){if(Es===0){mE=console.log,vE=console.info,yE=console.warn,gE=console.error,bE=console.group,_E=console.groupCollapsed,SE=console.groupEnd;var e={configurable:!0,enumerable:!0,value:Ie,writable:!0};Object.defineProperties(console,{info:e,log:e,warn:e,error:e,group:e,groupCollapsed:e,groupEnd:e})}Es++}function he(){if(Es--,Es===0){var e={configurable:!0,enumerable:!0,writable:!0};Object.defineProperties(console,{log:we({},e,{value:mE}),info:we({},e,{value:vE}),warn:we({},e,{value:yE}),error:we({},e,{value:gE}),group:we({},e,{value:bE}),groupCollapsed:we({},e,{value:_E}),groupEnd:we({},e,{value:SE})})}0>Es&&console.error("disabledDepth fell below zero. This is a bug in React. Please file an issue.")}function Be(e){var t=Error.prepareStackTrace;if(Error.prepareStackTrace=void 0,e=e.stack,Error.prepareStackTrace=t,e.startsWith(`Error: react-stack-top-frame
`)&&(e=e.slice(29)),t=e.indexOf(`
`),t!==-1&&(e=e.slice(t+1)),t=e.indexOf("react_stack_bottom_frame"),t!==-1&&(t=e.lastIndexOf(`
`,t)),t!==-1)e=e.slice(0,t);else return"";return e}function ve(e){if(Gv===void 0)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);Gv=t&&t[1]||"",EE=-1)":-1c||v[i]!==w[c]){var z=`
`+v[i].replace(" at new "," at ");return e.displayName&&z.includes("")&&(z=z.replace("",e.displayName)),typeof e=="function"&&Pv.set(e,z),z}while(1<=i&&0<=c);break}}}finally{Yv=!1,U.H=a,he(),Error.prepareStackTrace=n}return v=(v=e?e.displayName||e.name:"")?ve(v):"",typeof e=="function"&&Pv.set(e,v),v}function ol(e,t){switch(e.tag){case 26:case 27:case 5:return ve(e.type);case 16:return ve("Lazy");case 13:return e.child!==t&&t!==null?ve("Suspense Fallback"):ve("Suspense");case 19:return ve("SuspenseList");case 0:case 15:return Zt(e.type,!1);case 11:return Zt(e.type.render,!1);case 1:return Zt(e.type,!0);case 31:return ve("Activity");default:return""}}function at(e){try{var t="",n=null;do{t+=ol(e,n);var a=e._debugInfo;if(a)for(var o=a.length-1;0<=o;o--){var i=a[o];if(typeof i.name=="string"){var c=t;e:{var f=i.name,p=i.env,v=i.debugLocation;if(v!=null){var w=Be(v),z=w.lastIndexOf(`
`),E=z===-1?w:w.slice(z+1);if(E.indexOf(f)!==-1){var x=`
`+E;break e}}x=ve(f+(p?" ["+p+"]":""))}t=c+x}}n=e,e=e.return}while(e);return t}catch(G){return`
Error generating stack: `+G.message+`
`+G.stack}}function Oa(e){return(e=e?e.displayName||e.name:"")?ve(e):""}function ta(){if(Hn===null)return null;var e=Hn._debugOwner;return e!=null?vt(e):null}function So(){if(Hn===null)return"";var e=Hn;try{var t="";switch(e.tag===6&&(e=e.return),e.tag){case 26:case 27:case 5:t+=ve(e.type);break;case 13:t+=ve("Suspense");break;case 19:t+=ve("SuspenseList");break;case 31:t+=ve("Activity");break;case 30:case 0:case 15:case 1:e._debugOwner||t!==""||(t+=Oa(e.type));break;case 11:e._debugOwner||t!==""||(t+=Oa(e.type.render))}for(;e;)if(typeof e.tag=="number"){var n=e;e=n._debugOwner;var a=n._debugStack;if(e&&a){var o=Be(a);o!==""&&(t+=`
`+o)}}else if(e.debugStack!=null){var i=e.debugStack;(e=e.owner)&&i&&(t+=`
`+Be(i))}else break;var c=t}catch(f){c=`
Error generating stack: `+f.message+`
`+f.stack}return c}function I(e,t,n,a,o,i,c){var f=Hn;ur(e);try{return e!==null&&e._debugTask?e._debugTask.run(t.bind(null,n,a,o,i,c)):t(n,a,o,i,c)}finally{ur(f)}throw Error("runWithFiberInDEV should never be called in production. This is a bug in React.")}function ur(e){U.getCurrentStack=e===null?null:So,lo=!1,Hn=e}function ri(e){return typeof Symbol=="function"&&Symbol.toStringTag&&e[Symbol.toStringTag]||e.constructor.name||"Object"}function ui(e){try{return ll(e),!1}catch{return!0}}function ll(e){return""+e}function Ve(e,t){if(ui(e))return console.error("The provided `%s` attribute is an unsupported type %s. This value must be coerced to a string before using it here.",t,ri(e)),ll(e)}function It(e,t){if(ui(e))return console.error("The provided `%s` CSS property is an unsupported type %s. This value must be coerced to a string before using it here.",t,ri(e)),ll(e)}function sr(e){if(ui(e))return console.error("Form field values (value, checked, defaultValue, or defaultChecked props) must be strings, not %s. This value must be coerced to a string before using it here.",ri(e)),ll(e)}function Rp(e){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u")return!1;var t=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(t.isDisabled)return!0;if(!t.supportsFiber)return console.error("The installed version of React DevTools is too old and will not work with the current version of React. Please update React DevTools. https://react.dev/link/react-devtools"),!0;try{Nr=t.inject(e),Kt=t}catch(n){console.error("React instrumentation encountered an error: %o.",n)}return!!t.checkDCE}function K(e){if(typeof fC=="function"&&dC(e),Kt&&typeof Kt.setStrictMode=="function")try{Kt.setStrictMode(Nr,e)}catch(t){io||(io=!0,console.error("React instrumentation encountered an error: %o",t))}}function cr(e){return e>>>=0,e===0?32:31-(hC(e)/pC|0)|0}function ka(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return console.error("Should have found matching lanes. This is a bug in React."),e}}function si(e,t,n){var a=e.pendingLanes;if(a===0)return 0;var o=0,i=e.suspendedLanes,c=e.pingedLanes;e=e.warmLanes;var f=a&134217727;return f!==0?(a=f&~i,a!==0?o=ka(a):(c&=f,c!==0?o=ka(c):n||(n=f&~e,n!==0&&(o=ka(n))))):(f=a&~i,f!==0?o=ka(f):c!==0?o=ka(c):n||(n=a&~e,n!==0&&(o=ka(n)))),o===0?0:t!==0&&t!==o&&(t&i)===0&&(i=o&-o,n=t&-t,i>=n||i===32&&(n&4194048)!==0)?t:o}function il(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function uf(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return console.error("Should have found matching lanes. This is a bug in React."),-1}}function Bu(){var e=Od;return Od<<=1,(Od&62914560)===0&&(Od=4194304),e}function Lu(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function rl(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function sf(e,t,n,a,o,i){var c=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var f=e.entanglements,p=e.expirationTimes,v=e.hiddenUpdates;for(n=c&~n;0"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function aa(e){return e.replace(bC,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function _0(e,t){t.checked===void 0||t.defaultChecked===void 0||RE||(console.error("%s contains an input of type %s with both checked and defaultChecked props. Input elements must be either controlled or uncontrolled (specify either the checked prop, or the defaultChecked prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://react.dev/link/controlled-components",ta()||"A component",t.type),RE=!0),t.value===void 0||t.defaultValue===void 0||zE||(console.error("%s contains an input of type %s with both value and defaultValue props. Input elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://react.dev/link/controlled-components",ta()||"A component",t.type),zE=!0)}function xp(e,t,n,a,o,i,c,f){e.name="",c!=null&&typeof c!="function"&&typeof c!="symbol"&&typeof c!="boolean"?(Ve(c,"type"),e.type=c):e.removeAttribute("type"),t!=null?c==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+na(t)):e.value!==""+na(t)&&(e.value=""+na(t)):c!=="submit"&&c!=="reset"||e.removeAttribute("value"),t!=null?Mp(e,c,na(t)):n!=null?Mp(e,c,na(n)):a!=null&&e.removeAttribute("value"),o==null&&i!=null&&(e.defaultChecked=!!i),o!=null&&(e.checked=o&&typeof o!="function"&&typeof o!="symbol"),f!=null&&typeof f!="function"&&typeof f!="symbol"&&typeof f!="boolean"?(Ve(f,"name"),e.name=""+na(f)):e.removeAttribute("name")}function S0(e,t,n,a,o,i,c,f){if(i!=null&&typeof i!="function"&&typeof i!="symbol"&&typeof i!="boolean"&&(Ve(i,"type"),e.type=i),t!=null||n!=null){if(!(i!=="submit"&&i!=="reset"||t!=null)){Dp(e);return}n=n!=null?""+na(n):"",t=t!=null?""+na(t):n,f||t===e.value||(e.value=t),e.defaultValue=t}a=a??o,a=typeof a!="function"&&typeof a!="symbol"&&!!a,e.checked=f?e.checked:!!a,e.defaultChecked=!!a,c!=null&&typeof c!="function"&&typeof c!="symbol"&&typeof c!="boolean"&&(Ve(c,"name"),e.name=c),Dp(e)}function Mp(e,t,n){t==="number"&&df(e.ownerDocument)===e||e.defaultValue===""+n||(e.defaultValue=""+n)}function E0(e,t){t.value==null&&(typeof t.children=="object"&&t.children!==null?Nv.Children.forEach(t.children,function(n){n==null||typeof n=="string"||typeof n=="number"||typeof n=="bigint"||xE||(xE=!0,console.error("Cannot infer the option value of complex children. Pass a `value` prop or use a plain string as children to