From d1e1609b8a706520f115fab9981fee0bb7dfaa92 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Sun, 5 Jul 2026 15:33:51 -0400 Subject: [PATCH 001/241] =?UTF-8?q?Right=20=E2=80=94=20same=20commit=20or?= =?UTF-8?q?=20separate,=20here's=20the=20combined=20version=20covering=20b?= =?UTF-8?q?oth:=20Remove=20exec/shell=5Fexec=20from=20update=20checker=20a?= =?UTF-8?q?nd=20domain=20lookups?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update checker (fetchUpdates) no longer shells out to git: - Current commit read directly from .git/HEAD, following the branch ref through loose refs with a packed-refs fallback (survives git gc); detached HEAD handled - Latest commit fetched from the GitHub API via curl using the Accept: application/vnd.github.sha header (returns bare SHA, no JSON parsing) - Repo owner/name derived from the origin remote in .git/config so forks check against their own remote, falling back to itflow-org/itflow - Failures now distinguish unreadable .git (permissions) from API errors (network/rate limit) instead of silently returning empty Domain lookups no longer shell out to dig and whois: - DNS records (A/NS/MX/TXT) via dns_get_record() - Registration data via RDAP (JSON over HTTPS, curl), the ICANN successor to port-43 whois; RDAP server per TLD resolved from IANA's bootstrap registry, cached locally for a week, rdap.org as secondary lookup - Expiration date from RDAP's structured expiration event, replacing regex/date-format guessing for RDAP-covered TLDs - Port-43 whois retained as socket-based fallback (fsockopen) for ccTLDs without RDAP, with IANA server discovery and one registrar referral follow - RDAP responses cached per-run: getDomainRecords() and getDomainExpirationDate() on the same domain = one HTTP request Fixes whois rate limiting, removes the exec dependency for hardened hosts (Snuffleupagus etc.), and eliminates the shell injection surface - no shell, nothing to escape. --- functions.php | 758 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 501 insertions(+), 257 deletions(-) diff --git a/functions.php b/functions.php index c93a79aff..86b7781bc 100644 --- a/functions.php +++ b/functions.php @@ -438,8 +438,7 @@ Generates what is probably best described as a session key (ephemeral-ish) - Only the user can decrypt their session ciphertext to get the master key - Encryption key never hits the disk in cleartext */ -function generateUserSessionKey($site_encryption_master_key) -{ +function generateUserSessionKey($site_encryption_master_key) { $user_encryption_session_key = randomString(); $user_encryption_session_iv = randomString(); $user_encryption_session_ciphertext = openssl_encrypt($site_encryption_master_key, 'aes-128-cbc', $user_encryption_session_key, 0, $user_encryption_session_iv); @@ -460,8 +459,7 @@ function generateUserSessionKey($site_encryption_master_key) } // Decrypts an encrypted password (website/asset credentials), returns it as a string -function decryptCredentialEntry($credential_password_ciphertext) -{ +function decryptCredentialEntry($credential_password_ciphertext) { // Split the credential into IV and Ciphertext $credential_iv = substr($credential_password_ciphertext, 0, 16); @@ -480,8 +478,7 @@ function decryptCredentialEntry($credential_password_ciphertext) } // Encrypts a website/asset credential password -function encryptCredentialEntry($credential_password_cleartext) -{ +function encryptCredentialEntry($credential_password_cleartext) { $iv = randomString(); // Get the user session info. @@ -498,8 +495,7 @@ function encryptCredentialEntry($credential_password_cleartext) return $iv . $ciphertext; } -function apiDecryptCredentialEntry($credential_ciphertext, $api_key_decrypt_hash, #[\SensitiveParameter]$api_key_decrypt_password) -{ +function apiDecryptCredentialEntry($credential_ciphertext, $api_key_decrypt_hash, #[\SensitiveParameter]$api_key_decrypt_password) { // Split the Credential entry (username/password) into IV and Ciphertext $credential_iv = substr($credential_ciphertext, 0, 16); $credential_ciphertext = $salt = substr($credential_ciphertext, 16); @@ -511,8 +507,7 @@ function apiDecryptCredentialEntry($credential_ciphertext, $api_key_decrypt_hash return openssl_decrypt($credential_ciphertext, 'aes-128-cbc', $site_encryption_master_key, 0, $credential_iv); } -function apiEncryptCredentialEntry(#[\SensitiveParameter]$credential_cleartext, $api_key_decrypt_hash, #[\SensitiveParameter]$api_key_decrypt_password) -{ +function apiEncryptCredentialEntry(#[\SensitiveParameter]$credential_cleartext, $api_key_decrypt_hash, #[\SensitiveParameter]$api_key_decrypt_password) { $iv = randomString(); // Decrypt the api hash to get the master key @@ -524,129 +519,15 @@ function apiEncryptCredentialEntry(#[\SensitiveParameter]$credential_cleartext, return $iv . $ciphertext; } -// Get domain general info (whois + NS/A/MX records) -function getDomainRecords($name) -{ - $records = array(); - // Only run if we think the domain is valid - if (!filter_var($name, FILTER_VALIDATE_DOMAIN, FILTER_FLAG_HOSTNAME) || !checkdnsrr($name, 'SOA')) { - $records['a'] = ''; - $records['ns'] = ''; - $records['mx'] = ''; - $records['whois'] = ''; - return $records; - } - - $domain = escapeshellarg(str_replace('www.', '', $name)); - - // Get A, NS, MX, TXT, and WHOIS records - $records['a'] = trim(strip_tags(shell_exec("dig +short $domain"))); - $records['ns'] = trim(strip_tags(shell_exec("dig +short NS $domain"))); - $records['mx'] = trim(strip_tags(shell_exec("dig +short MX $domain"))); - $records['txt'] = trim(strip_tags(shell_exec("dig +short TXT $domain"))); - $records['whois'] = substr(trim(strip_tags(shell_exec("whois -H $domain | head -30 | sed 's/ //g'"))), 0, 254); - - // Sort A records (if multiple records exist) - if (!empty($records['a'])) { - $a_records = explode("\n", $records['a']); - array_walk($a_records, function(&$record) { - $record = trim($record); - }); - sort($a_records); - $records['a'] = implode("\n", $a_records); - } - - // Sort NS records (if multiple records exist) - if (!empty($records['ns'])) { - $ns_records = explode("\n", $records['ns']); - array_walk($ns_records, function(&$record) { - $record = trim($record); - }); - sort($ns_records); - $records['ns'] = implode("\n", $ns_records); - } - - // Sort MX records (if multiple records exist) - if (!empty($records['mx'])) { - $mx_records = explode("\n", $records['mx']); - array_walk($mx_records, function(&$record) { - $record = trim($record); - }); - sort($mx_records); - $records['mx'] = implode("\n", $mx_records); - } - - // Sort TXT records (if multiple records exist) - if (!empty($records['txt'])) { - $txt_records = explode("\n", $records['txt']); - array_walk($txt_records, function(&$record) { - $record = trim($record); - }); - sort($txt_records); - $records['txt'] = implode("\n", $txt_records); - } - - return $records; -} - -// Used to automatically attempt to get SSL certificates as part of adding domains -// The logic for the fetch (sync) button on the client_certificates page is in ajax.php, and allows ports other than 443 -function getSSL($full_name) -{ - - // Parse host and port - $name = parse_url("//$full_name", PHP_URL_HOST); - $port = parse_url("//$full_name", PHP_URL_PORT); - - // Default port - if (!$port) { - $port = "443"; - } - - $certificate = array(); - $certificate['success'] = false; - - // Only run if we think the domain is valid - if (!filter_var($name, FILTER_VALIDATE_DOMAIN, FILTER_FLAG_HOSTNAME)) { - $certificate['expire'] = ''; - $certificate['issued_by'] = ''; - $certificate['public_key'] = ''; - return $certificate; - } - - // Get SSL/TSL certificate (using verify peer false to allow for self-signed certs) for domain on default port - $socket = "ssl://$name:$port"; - $get = stream_context_create(array("ssl" => array("capture_peer_cert" => true, "verify_peer" => false,))); - $read = stream_socket_client($socket, $errno, $errstr, 5, STREAM_CLIENT_CONNECT, $get); - - // If the socket connected - if ($read) { - $cert = stream_context_get_params($read); - $cert_public_key_obj = openssl_x509_parse($cert['options']['ssl']['peer_certificate']); - openssl_x509_export($cert['options']['ssl']['peer_certificate'], $export); - - if ($cert_public_key_obj) { - $certificate['success'] = true; - $certificate['expire'] = date('Y-m-d', $cert_public_key_obj['validTo_time_t']); - $certificate['issued_by'] = strip_tags($cert_public_key_obj['issuer']['O']); - $certificate['public_key'] = $export; - } - } - - return $certificate; -} - -function strtoAZaz09($string) -{ +function strtoAZaz09($string) { // Gets rid of non-alphanumerics return preg_replace('/[^A-Za-z0-9_-]/', '', $string); } // Cross-Site Request Forgery check for sensitive functions // Validates the CSRF token provided matches the one in the users session -function validateCSRFToken($token) -{ +function validateCSRFToken($token) { if (hash_equals($token, $_SESSION['csrf_token'])) { return true; } else { @@ -698,13 +579,11 @@ function validateAccountantRole() { } } -function roundUpToNearestMultiple($n, $increment = 1000) -{ +function roundUpToNearestMultiple($n, $increment = 1000) { return (int) ($increment * ceil($n / $increment)); } -function getAssetIcon($asset_type) -{ +function getAssetIcon($asset_type) { if ($asset_type == 'Laptop') { $device_icon = "laptop"; } elseif ($asset_type == 'Desktop') { @@ -738,8 +617,7 @@ function getAssetIcon($asset_type) return $device_icon; } -function getInvoiceBadgeColor($invoice_status) -{ +function getInvoiceBadgeColor($invoice_status) { if ($invoice_status == "Sent") { $invoice_badge_color = "warning text-white"; } elseif ($invoice_status == "Viewed") { @@ -758,8 +636,7 @@ function getInvoiceBadgeColor($invoice_status) } // Pass $_FILE['file'] to check an uploaded file before saving it -function checkFileUpload($file, $allowed_extensions) -{ +function checkFileUpload($file, $allowed_extensions) { // Variables $name = $file['name']; $tmp = $file['tmp_name']; @@ -841,16 +718,14 @@ function cleanInput($input) { } -function sanitizeForEmail($data) -{ +function sanitizeForEmail($data) { $sanitized = htmlspecialchars($data); $sanitized = strip_tags($sanitized); $sanitized = trim($sanitized); return $sanitized; } -function timeAgo($datetime) -{ +function timeAgo($datetime) { if (is_null($datetime)) { return "-"; } @@ -891,8 +766,7 @@ function removeEmoji($text) return preg_replace('/\x{1F3F4}\x{E0067}\x{E0062}(?:\x{E0077}\x{E006C}\x{E0073}|\x{E0073}\x{E0063}\x{E0074}|\x{E0065}\x{E006E}\x{E0067})\x{E007F}|(?:\x{1F9D1}\x{1F3FF}\x{200D}\x{2764}(?:\x{FE0F}\x{200D}(?:\x{1F48B}\x{200D})?|\x{200D}(?:\x{1F48B}\x{200D})?)\x{1F9D1}|\x{1F469}\x{1F3FF}\x{200D}\x{1F91D}\x{200D}[\x{1F468}\x{1F469}]|\x{1FAF1}\x{1F3FF}\x{200D}\x{1FAF2})[\x{1F3FB}-\x{1F3FE}]|(?:\x{1F9D1}\x{1F3FE}\x{200D}\x{2764}(?:\x{FE0F}\x{200D}(?:\x{1F48B}\x{200D})?|\x{200D}(?:\x{1F48B}\x{200D})?)\x{1F9D1}|\x{1F469}\x{1F3FE}\x{200D}\x{1F91D}\x{200D}[\x{1F468}\x{1F469}]|\x{1FAF1}\x{1F3FE}\x{200D}\x{1FAF2})[\x{1F3FB}-\x{1F3FD}\x{1F3FF}]|(?:\x{1F9D1}\x{1F3FD}\x{200D}\x{2764}(?:\x{FE0F}\x{200D}(?:\x{1F48B}\x{200D})?|\x{200D}(?:\x{1F48B}\x{200D})?)\x{1F9D1}|\x{1F469}\x{1F3FD}\x{200D}\x{1F91D}\x{200D}[\x{1F468}\x{1F469}]|\x{1FAF1}\x{1F3FD}\x{200D}\x{1FAF2})[\x{1F3FB}\x{1F3FC}\x{1F3FE}\x{1F3FF}]|(?:\x{1F9D1}\x{1F3FC}\x{200D}\x{2764}(?:\x{FE0F}\x{200D}(?:\x{1F48B}\x{200D})?|\x{200D}(?:\x{1F48B}\x{200D})?)\x{1F9D1}|\x{1F469}\x{1F3FC}\x{200D}\x{1F91D}\x{200D}[\x{1F468}\x{1F469}]|\x{1FAF1}\x{1F3FC}\x{200D}\x{1FAF2})[\x{1F3FB}\x{1F3FD}-\x{1F3FF}]|(?:\x{1F9D1}\x{1F3FB}\x{200D}\x{2764}(?:\x{FE0F}\x{200D}(?:\x{1F48B}\x{200D})?|\x{200D}(?:\x{1F48B}\x{200D})?)\x{1F9D1}|\x{1F469}\x{1F3FB}\x{200D}\x{1F91D}\x{200D}[\x{1F468}\x{1F469}]|\x{1FAF1}\x{1F3FB}\x{200D}\x{1FAF2})[\x{1F3FC}-\x{1F3FF}]|\x{1F468}(?:\x{1F3FB}(?:\x{200D}(?:\x{2764}(?:\x{FE0F}\x{200D}(?:\x{1F48B}\x{200D}\x{1F468}[\x{1F3FB}-\x{1F3FF}]|\x{1F468}[\x{1F3FB}-\x{1F3FF}])|\x{200D}(?:\x{1F48B}\x{200D}\x{1F468}[\x{1F3FB}-\x{1F3FF}]|\x{1F468}[\x{1F3FB}-\x{1F3FF}]))|\x{1F91D}\x{200D}\x{1F468}[\x{1F3FC}-\x{1F3FF}]|[\x{2695}\x{2696}\x{2708}]\x{FE0F}|[\x{2695}\x{2696}\x{2708}]|[\x{1F33E}\x{1F373}\x{1F37C}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}]))?|[\x{1F3FC}-\x{1F3FF}]\x{200D}\x{2764}(?:\x{FE0F}\x{200D}(?:\x{1F48B}\x{200D}\x{1F468}[\x{1F3FB}-\x{1F3FF}]|\x{1F468}[\x{1F3FB}-\x{1F3FF}])|\x{200D}(?:\x{1F48B}\x{200D}\x{1F468}[\x{1F3FB}-\x{1F3FF}]|\x{1F468}[\x{1F3FB}-\x{1F3FF}]))|\x{200D}(?:\x{2764}(?:\x{FE0F}\x{200D}(?:\x{1F48B}\x{200D})?|\x{200D}(?:\x{1F48B}\x{200D})?)\x{1F468}|[\x{1F468}\x{1F469}]\x{200D}(?:\x{1F466}\x{200D}\x{1F466}|\x{1F467}\x{200D}[\x{1F466}\x{1F467}])|\x{1F466}\x{200D}\x{1F466}|\x{1F467}\x{200D}[\x{1F466}\x{1F467}]|[\x{1F33E}\x{1F373}\x{1F37C}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}])|\x{1F3FF}\x{200D}(?:\x{1F91D}\x{200D}\x{1F468}[\x{1F3FB}-\x{1F3FE}]|[\x{1F33E}\x{1F373}\x{1F37C}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}])|\x{1F3FE}\x{200D}(?:\x{1F91D}\x{200D}\x{1F468}[\x{1F3FB}-\x{1F3FD}\x{1F3FF}]|[\x{1F33E}\x{1F373}\x{1F37C}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}])|\x{1F3FD}\x{200D}(?:\x{1F91D}\x{200D}\x{1F468}[\x{1F3FB}\x{1F3FC}\x{1F3FE}\x{1F3FF}]|[\x{1F33E}\x{1F373}\x{1F37C}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}])|\x{1F3FC}\x{200D}(?:\x{1F91D}\x{200D}\x{1F468}[\x{1F3FB}\x{1F3FD}-\x{1F3FF}]|[\x{1F33E}\x{1F373}\x{1F37C}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}])|(?:\x{1F3FF}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FE}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FD}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FC}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{200D}[\x{2695}\x{2696}\x{2708}])\x{FE0F}|\x{200D}(?:[\x{1F468}\x{1F469}]\x{200D}[\x{1F466}\x{1F467}]|[\x{1F466}\x{1F467}])|\x{1F3FF}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FE}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FD}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FC}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FF}|\x{1F3FE}|\x{1F3FD}|\x{1F3FC}|\x{200D}[\x{2695}\x{2696}\x{2708}])?|(?:\x{1F469}(?:\x{1F3FB}\x{200D}\x{2764}(?:\x{FE0F}\x{200D}(?:\x{1F48B}\x{200D}[\x{1F468}\x{1F469}]|[\x{1F468}\x{1F469}])|\x{200D}(?:\x{1F48B}\x{200D}[\x{1F468}\x{1F469}]|[\x{1F468}\x{1F469}]))|[\x{1F3FC}-\x{1F3FF}]\x{200D}\x{2764}(?:\x{FE0F}\x{200D}(?:\x{1F48B}\x{200D}[\x{1F468}\x{1F469}]|[\x{1F468}\x{1F469}])|\x{200D}(?:\x{1F48B}\x{200D}[\x{1F468}\x{1F469}]|[\x{1F468}\x{1F469}])))|\x{1F9D1}[\x{1F3FB}-\x{1F3FF}]\x{200D}\x{1F91D}\x{200D}\x{1F9D1})[\x{1F3FB}-\x{1F3FF}]|\x{1F469}\x{200D}\x{1F469}\x{200D}(?:\x{1F466}\x{200D}\x{1F466}|\x{1F467}\x{200D}[\x{1F466}\x{1F467}])|\x{1F469}(?:\x{200D}(?:\x{2764}(?:\x{FE0F}\x{200D}(?:\x{1F48B}\x{200D}[\x{1F468}\x{1F469}]|[\x{1F468}\x{1F469}])|\x{200D}(?:\x{1F48B}\x{200D}[\x{1F468}\x{1F469}]|[\x{1F468}\x{1F469}]))|[\x{1F33E}\x{1F373}\x{1F37C}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}])|\x{1F3FF}\x{200D}[\x{1F33E}\x{1F373}\x{1F37C}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}]|\x{1F3FE}\x{200D}[\x{1F33E}\x{1F373}\x{1F37C}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}]|\x{1F3FD}\x{200D}[\x{1F33E}\x{1F373}\x{1F37C}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}]|\x{1F3FC}\x{200D}[\x{1F33E}\x{1F373}\x{1F37C}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}]|\x{1F3FB}\x{200D}[\x{1F33E}\x{1F373}\x{1F37C}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}])|\x{1F9D1}(?:\x{200D}(?:\x{1F91D}\x{200D}\x{1F9D1}|[\x{1F33E}\x{1F373}\x{1F37C}\x{1F384}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}])|\x{1F3FF}\x{200D}[\x{1F33E}\x{1F373}\x{1F37C}\x{1F384}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}]|\x{1F3FE}\x{200D}[\x{1F33E}\x{1F373}\x{1F37C}\x{1F384}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}]|\x{1F3FD}\x{200D}[\x{1F33E}\x{1F373}\x{1F37C}\x{1F384}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}]|\x{1F3FC}\x{200D}[\x{1F33E}\x{1F373}\x{1F37C}\x{1F384}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}]|\x{1F3FB}\x{200D}[\x{1F33E}\x{1F373}\x{1F37C}\x{1F384}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}])|\x{1F469}\x{200D}\x{1F466}\x{200D}\x{1F466}|\x{1F469}\x{200D}\x{1F469}\x{200D}[\x{1F466}\x{1F467}]|\x{1F469}\x{200D}\x{1F467}\x{200D}[\x{1F466}\x{1F467}]|(?:\x{1F441}\x{FE0F}?\x{200D}\x{1F5E8}|\x{1F9D1}(?:\x{1F3FF}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FE}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FD}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FC}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FB}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{200D}[\x{2695}\x{2696}\x{2708}])|\x{1F469}(?:\x{1F3FF}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FE}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FD}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FC}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FB}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{200D}[\x{2695}\x{2696}\x{2708}])|\x{1F636}\x{200D}\x{1F32B}|\x{1F3F3}\x{FE0F}?\x{200D}\x{26A7}|\x{1F43B}\x{200D}\x{2744}|(?:[\x{1F3C3}\x{1F3C4}\x{1F3CA}\x{1F46E}\x{1F470}\x{1F471}\x{1F473}\x{1F477}\x{1F481}\x{1F482}\x{1F486}\x{1F487}\x{1F645}-\x{1F647}\x{1F64B}\x{1F64D}\x{1F64E}\x{1F6A3}\x{1F6B4}-\x{1F6B6}\x{1F926}\x{1F935}\x{1F937}-\x{1F939}\x{1F93D}\x{1F93E}\x{1F9B8}\x{1F9B9}\x{1F9CD}-\x{1F9CF}\x{1F9D4}\x{1F9D6}-\x{1F9DD}][\x{1F3FB}-\x{1F3FF}]|[\x{1F46F}\x{1F9DE}\x{1F9DF}])\x{200D}[\x{2640}\x{2642}]|[\x{26F9}\x{1F3CB}\x{1F3CC}\x{1F575}](?:[\x{FE0F}\x{1F3FB}-\x{1F3FF}]\x{200D}[\x{2640}\x{2642}]|\x{200D}[\x{2640}\x{2642}])|\x{1F3F4}\x{200D}\x{2620}|[\x{1F3C3}\x{1F3C4}\x{1F3CA}\x{1F46E}\x{1F470}\x{1F471}\x{1F473}\x{1F477}\x{1F481}\x{1F482}\x{1F486}\x{1F487}\x{1F645}-\x{1F647}\x{1F64B}\x{1F64D}\x{1F64E}\x{1F6A3}\x{1F6B4}-\x{1F6B6}\x{1F926}\x{1F935}\x{1F937}-\x{1F939}\x{1F93C}-\x{1F93E}\x{1F9B8}\x{1F9B9}\x{1F9CD}-\x{1F9CF}\x{1F9D4}\x{1F9D6}-\x{1F9DD}]\x{200D}[\x{2640}\x{2642}]|[\xA9\xAE\x{203C}\x{2049}\x{2122}\x{2139}\x{2194}-\x{2199}\x{21A9}\x{21AA}\x{231A}\x{231B}\x{2328}\x{23CF}\x{23ED}-\x{23EF}\x{23F1}\x{23F2}\x{23F8}-\x{23FA}\x{24C2}\x{25AA}\x{25AB}\x{25B6}\x{25C0}\x{25FB}\x{25FC}\x{25FE}\x{2600}-\x{2604}\x{260E}\x{2611}\x{2614}\x{2615}\x{2618}\x{2620}\x{2622}\x{2623}\x{2626}\x{262A}\x{262E}\x{262F}\x{2638}-\x{263A}\x{2640}\x{2642}\x{2648}-\x{2653}\x{265F}\x{2660}\x{2663}\x{2665}\x{2666}\x{2668}\x{267B}\x{267E}\x{267F}\x{2692}\x{2694}-\x{2697}\x{2699}\x{269B}\x{269C}\x{26A0}\x{26A7}\x{26AA}\x{26B0}\x{26B1}\x{26BD}\x{26BE}\x{26C4}\x{26C8}\x{26CF}\x{26D1}\x{26D3}\x{26E9}\x{26F0}-\x{26F5}\x{26F7}\x{26F8}\x{26FA}\x{2702}\x{2708}\x{2709}\x{270F}\x{2712}\x{2714}\x{2716}\x{271D}\x{2721}\x{2733}\x{2734}\x{2744}\x{2747}\x{2763}\x{27A1}\x{2934}\x{2935}\x{2B05}-\x{2B07}\x{2B1B}\x{2B1C}\x{2B55}\x{3030}\x{303D}\x{3297}\x{3299}\x{1F004}\x{1F170}\x{1F171}\x{1F17E}\x{1F17F}\x{1F202}\x{1F237}\x{1F321}\x{1F324}-\x{1F32C}\x{1F336}\x{1F37D}\x{1F396}\x{1F397}\x{1F399}-\x{1F39B}\x{1F39E}\x{1F39F}\x{1F3CD}\x{1F3CE}\x{1F3D4}-\x{1F3DF}\x{1F3F5}\x{1F3F7}\x{1F43F}\x{1F4FD}\x{1F549}\x{1F54A}\x{1F56F}\x{1F570}\x{1F573}\x{1F576}-\x{1F579}\x{1F587}\x{1F58A}-\x{1F58D}\x{1F5A5}\x{1F5A8}\x{1F5B1}\x{1F5B2}\x{1F5BC}\x{1F5C2}-\x{1F5C4}\x{1F5D1}-\x{1F5D3}\x{1F5DC}-\x{1F5DE}\x{1F5E1}\x{1F5E3}\x{1F5E8}\x{1F5EF}\x{1F5F3}\x{1F5FA}\x{1F6CB}\x{1F6CD}-\x{1F6CF}\x{1F6E0}-\x{1F6E5}\x{1F6E9}\x{1F6F0}\x{1F6F3}])\x{FE0F}|\x{1F441}\x{FE0F}?\x{200D}\x{1F5E8}|\x{1F9D1}(?:\x{1F3FF}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FE}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FD}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FC}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FB}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{200D}[\x{2695}\x{2696}\x{2708}])|\x{1F469}(?:\x{1F3FF}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FE}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FD}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FC}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FB}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{200D}[\x{2695}\x{2696}\x{2708}])|\x{1F3F3}\x{FE0F}?\x{200D}\x{1F308}|\x{1F469}\x{200D}\x{1F467}|\x{1F469}\x{200D}\x{1F466}|\x{1F636}\x{200D}\x{1F32B}|\x{1F3F3}\x{FE0F}?\x{200D}\x{26A7}|\x{1F635}\x{200D}\x{1F4AB}|\x{1F62E}\x{200D}\x{1F4A8}|\x{1F415}\x{200D}\x{1F9BA}|\x{1FAF1}(?:\x{1F3FF}|\x{1F3FE}|\x{1F3FD}|\x{1F3FC}|\x{1F3FB})?|\x{1F9D1}(?:\x{1F3FF}|\x{1F3FE}|\x{1F3FD}|\x{1F3FC}|\x{1F3FB})?|\x{1F469}(?:\x{1F3FF}|\x{1F3FE}|\x{1F3FD}|\x{1F3FC}|\x{1F3FB})?|\x{1F43B}\x{200D}\x{2744}|(?:[\x{1F3C3}\x{1F3C4}\x{1F3CA}\x{1F46E}\x{1F470}\x{1F471}\x{1F473}\x{1F477}\x{1F481}\x{1F482}\x{1F486}\x{1F487}\x{1F645}-\x{1F647}\x{1F64B}\x{1F64D}\x{1F64E}\x{1F6A3}\x{1F6B4}-\x{1F6B6}\x{1F926}\x{1F935}\x{1F937}-\x{1F939}\x{1F93D}\x{1F93E}\x{1F9B8}\x{1F9B9}\x{1F9CD}-\x{1F9CF}\x{1F9D4}\x{1F9D6}-\x{1F9DD}][\x{1F3FB}-\x{1F3FF}]|[\x{1F46F}\x{1F9DE}\x{1F9DF}])\x{200D}[\x{2640}\x{2642}]|[\x{26F9}\x{1F3CB}\x{1F3CC}\x{1F575}](?:[\x{FE0F}\x{1F3FB}-\x{1F3FF}]\x{200D}[\x{2640}\x{2642}]|\x{200D}[\x{2640}\x{2642}])|\x{1F3F4}\x{200D}\x{2620}|\x{1F1FD}\x{1F1F0}|\x{1F1F6}\x{1F1E6}|\x{1F1F4}\x{1F1F2}|\x{1F408}\x{200D}\x{2B1B}|\x{2764}(?:\x{FE0F}\x{200D}[\x{1F525}\x{1FA79}]|\x{200D}[\x{1F525}\x{1FA79}])|\x{1F441}\x{FE0F}?|\x{1F3F3}\x{FE0F}?|[\x{1F3C3}\x{1F3C4}\x{1F3CA}\x{1F46E}\x{1F470}\x{1F471}\x{1F473}\x{1F477}\x{1F481}\x{1F482}\x{1F486}\x{1F487}\x{1F645}-\x{1F647}\x{1F64B}\x{1F64D}\x{1F64E}\x{1F6A3}\x{1F6B4}-\x{1F6B6}\x{1F926}\x{1F935}\x{1F937}-\x{1F939}\x{1F93C}-\x{1F93E}\x{1F9B8}\x{1F9B9}\x{1F9CD}-\x{1F9CF}\x{1F9D4}\x{1F9D6}-\x{1F9DD}]\x{200D}[\x{2640}\x{2642}]|\x{1F1FF}[\x{1F1E6}\x{1F1F2}\x{1F1FC}]|\x{1F1FE}[\x{1F1EA}\x{1F1F9}]|\x{1F1FC}[\x{1F1EB}\x{1F1F8}]|\x{1F1FB}[\x{1F1E6}\x{1F1E8}\x{1F1EA}\x{1F1EC}\x{1F1EE}\x{1F1F3}\x{1F1FA}]|\x{1F1FA}[\x{1F1E6}\x{1F1EC}\x{1F1F2}\x{1F1F3}\x{1F1F8}\x{1F1FE}\x{1F1FF}]|\x{1F1F9}[\x{1F1E6}\x{1F1E8}\x{1F1E9}\x{1F1EB}-\x{1F1ED}\x{1F1EF}-\x{1F1F4}\x{1F1F7}\x{1F1F9}\x{1F1FB}\x{1F1FC}\x{1F1FF}]|\x{1F1F8}[\x{1F1E6}-\x{1F1EA}\x{1F1EC}-\x{1F1F4}\x{1F1F7}-\x{1F1F9}\x{1F1FB}\x{1F1FD}-\x{1F1FF}]|\x{1F1F7}[\x{1F1EA}\x{1F1F4}\x{1F1F8}\x{1F1FA}\x{1F1FC}]|\x{1F1F5}[\x{1F1E6}\x{1F1EA}-\x{1F1ED}\x{1F1F0}-\x{1F1F3}\x{1F1F7}-\x{1F1F9}\x{1F1FC}\x{1F1FE}]|\x{1F1F3}[\x{1F1E6}\x{1F1E8}\x{1F1EA}-\x{1F1EC}\x{1F1EE}\x{1F1F1}\x{1F1F4}\x{1F1F5}\x{1F1F7}\x{1F1FA}\x{1F1FF}]|\x{1F1F2}[\x{1F1E6}\x{1F1E8}-\x{1F1ED}\x{1F1F0}-\x{1F1FF}]|\x{1F1F1}[\x{1F1E6}-\x{1F1E8}\x{1F1EE}\x{1F1F0}\x{1F1F7}-\x{1F1FB}\x{1F1FE}]|\x{1F1F0}[\x{1F1EA}\x{1F1EC}-\x{1F1EE}\x{1F1F2}\x{1F1F3}\x{1F1F5}\x{1F1F7}\x{1F1FC}\x{1F1FE}\x{1F1FF}]|\x{1F1EF}[\x{1F1EA}\x{1F1F2}\x{1F1F4}\x{1F1F5}]|\x{1F1EE}[\x{1F1E8}-\x{1F1EA}\x{1F1F1}-\x{1F1F4}\x{1F1F6}-\x{1F1F9}]|\x{1F1ED}[\x{1F1F0}\x{1F1F2}\x{1F1F3}\x{1F1F7}\x{1F1F9}\x{1F1FA}]|\x{1F1EC}[\x{1F1E6}\x{1F1E7}\x{1F1E9}-\x{1F1EE}\x{1F1F1}-\x{1F1F3}\x{1F1F5}-\x{1F1FA}\x{1F1FC}\x{1F1FE}]|\x{1F1EB}[\x{1F1EE}-\x{1F1F0}\x{1F1F2}\x{1F1F4}\x{1F1F7}]|\x{1F1EA}[\x{1F1E6}\x{1F1E8}\x{1F1EA}\x{1F1EC}\x{1F1ED}\x{1F1F7}-\x{1F1FA}]|\x{1F1E9}[\x{1F1EA}\x{1F1EC}\x{1F1EF}\x{1F1F0}\x{1F1F2}\x{1F1F4}\x{1F1FF}]|\x{1F1E8}[\x{1F1E6}\x{1F1E8}\x{1F1E9}\x{1F1EB}-\x{1F1EE}\x{1F1F0}-\x{1F1F5}\x{1F1F7}\x{1F1FA}-\x{1F1FF}]|\x{1F1E7}[\x{1F1E6}\x{1F1E7}\x{1F1E9}-\x{1F1EF}\x{1F1F1}-\x{1F1F4}\x{1F1F6}-\x{1F1F9}\x{1F1FB}\x{1F1FC}\x{1F1FE}\x{1F1FF}]|\x{1F1E6}[\x{1F1E8}-\x{1F1EC}\x{1F1EE}\x{1F1F1}\x{1F1F2}\x{1F1F4}\x{1F1F6}-\x{1F1FA}\x{1F1FC}\x{1F1FD}\x{1F1FF}]|[#\*0-9]\x{FE0F}?\x{20E3}|\x{1F93C}[\x{1F3FB}-\x{1F3FF}]|\x{2764}\x{FE0F}?|[\x{1F3C3}\x{1F3C4}\x{1F3CA}\x{1F46E}\x{1F470}\x{1F471}\x{1F473}\x{1F477}\x{1F481}\x{1F482}\x{1F486}\x{1F487}\x{1F645}-\x{1F647}\x{1F64B}\x{1F64D}\x{1F64E}\x{1F6A3}\x{1F6B4}-\x{1F6B6}\x{1F926}\x{1F935}\x{1F937}-\x{1F939}\x{1F93D}\x{1F93E}\x{1F9B8}\x{1F9B9}\x{1F9CD}-\x{1F9CF}\x{1F9D4}\x{1F9D6}-\x{1F9DD}][\x{1F3FB}-\x{1F3FF}]|[\x{26F9}\x{1F3CB}\x{1F3CC}\x{1F575}][\x{FE0F}\x{1F3FB}-\x{1F3FF}]?|\x{1F3F4}|[\x{270A}\x{270B}\x{1F385}\x{1F3C2}\x{1F3C7}\x{1F442}\x{1F443}\x{1F446}-\x{1F450}\x{1F466}\x{1F467}\x{1F46B}-\x{1F46D}\x{1F472}\x{1F474}-\x{1F476}\x{1F478}\x{1F47C}\x{1F483}\x{1F485}\x{1F48F}\x{1F491}\x{1F4AA}\x{1F57A}\x{1F595}\x{1F596}\x{1F64C}\x{1F64F}\x{1F6C0}\x{1F6CC}\x{1F90C}\x{1F90F}\x{1F918}-\x{1F91F}\x{1F930}-\x{1F934}\x{1F936}\x{1F977}\x{1F9B5}\x{1F9B6}\x{1F9BB}\x{1F9D2}\x{1F9D3}\x{1F9D5}\x{1FAC3}-\x{1FAC5}\x{1FAF0}\x{1FAF2}-\x{1FAF6}][\x{1F3FB}-\x{1F3FF}]|[\x{261D}\x{270C}\x{270D}\x{1F574}\x{1F590}][\x{FE0F}\x{1F3FB}-\x{1F3FF}]|[\x{261D}\x{270A}-\x{270D}\x{1F385}\x{1F3C2}\x{1F3C7}\x{1F408}\x{1F415}\x{1F43B}\x{1F442}\x{1F443}\x{1F446}-\x{1F450}\x{1F466}\x{1F467}\x{1F46B}-\x{1F46D}\x{1F472}\x{1F474}-\x{1F476}\x{1F478}\x{1F47C}\x{1F483}\x{1F485}\x{1F48F}\x{1F491}\x{1F4AA}\x{1F574}\x{1F57A}\x{1F590}\x{1F595}\x{1F596}\x{1F62E}\x{1F635}\x{1F636}\x{1F64C}\x{1F64F}\x{1F6C0}\x{1F6CC}\x{1F90C}\x{1F90F}\x{1F918}-\x{1F91F}\x{1F930}-\x{1F934}\x{1F936}\x{1F93C}\x{1F977}\x{1F9B5}\x{1F9B6}\x{1F9BB}\x{1F9D2}\x{1F9D3}\x{1F9D5}\x{1FAC3}-\x{1FAC5}\x{1FAF0}\x{1FAF2}-\x{1FAF6}]|[\x{1F3C3}\x{1F3C4}\x{1F3CA}\x{1F46E}\x{1F470}\x{1F471}\x{1F473}\x{1F477}\x{1F481}\x{1F482}\x{1F486}\x{1F487}\x{1F645}-\x{1F647}\x{1F64B}\x{1F64D}\x{1F64E}\x{1F6A3}\x{1F6B4}-\x{1F6B6}\x{1F926}\x{1F935}\x{1F937}-\x{1F939}\x{1F93D}\x{1F93E}\x{1F9B8}\x{1F9B9}\x{1F9CD}-\x{1F9CF}\x{1F9D4}\x{1F9D6}-\x{1F9DD}]|[\x{1F46F}\x{1F9DE}\x{1F9DF}]|[\xA9\xAE\x{203C}\x{2049}\x{2122}\x{2139}\x{2194}-\x{2199}\x{21A9}\x{21AA}\x{231A}\x{231B}\x{2328}\x{23CF}\x{23ED}-\x{23EF}\x{23F1}\x{23F2}\x{23F8}-\x{23FA}\x{24C2}\x{25AA}\x{25AB}\x{25B6}\x{25C0}\x{25FB}\x{25FC}\x{25FE}\x{2600}-\x{2604}\x{260E}\x{2611}\x{2614}\x{2615}\x{2618}\x{2620}\x{2622}\x{2623}\x{2626}\x{262A}\x{262E}\x{262F}\x{2638}-\x{263A}\x{2640}\x{2642}\x{2648}-\x{2653}\x{265F}\x{2660}\x{2663}\x{2665}\x{2666}\x{2668}\x{267B}\x{267E}\x{267F}\x{2692}\x{2694}-\x{2697}\x{2699}\x{269B}\x{269C}\x{26A0}\x{26A7}\x{26AA}\x{26B0}\x{26B1}\x{26BD}\x{26BE}\x{26C4}\x{26C8}\x{26CF}\x{26D1}\x{26D3}\x{26E9}\x{26F0}-\x{26F5}\x{26F7}\x{26F8}\x{26FA}\x{2702}\x{2708}\x{2709}\x{270F}\x{2712}\x{2714}\x{2716}\x{271D}\x{2721}\x{2733}\x{2734}\x{2744}\x{2747}\x{2763}\x{27A1}\x{2934}\x{2935}\x{2B05}-\x{2B07}\x{2B1B}\x{2B1C}\x{2B55}\x{3030}\x{303D}\x{3297}\x{3299}\x{1F004}\x{1F170}\x{1F171}\x{1F17E}\x{1F17F}\x{1F202}\x{1F237}\x{1F321}\x{1F324}-\x{1F32C}\x{1F336}\x{1F37D}\x{1F396}\x{1F397}\x{1F399}-\x{1F39B}\x{1F39E}\x{1F39F}\x{1F3CD}\x{1F3CE}\x{1F3D4}-\x{1F3DF}\x{1F3F5}\x{1F3F7}\x{1F43F}\x{1F4FD}\x{1F549}\x{1F54A}\x{1F56F}\x{1F570}\x{1F573}\x{1F576}-\x{1F579}\x{1F587}\x{1F58A}-\x{1F58D}\x{1F5A5}\x{1F5A8}\x{1F5B1}\x{1F5B2}\x{1F5BC}\x{1F5C2}-\x{1F5C4}\x{1F5D1}-\x{1F5D3}\x{1F5DC}-\x{1F5DE}\x{1F5E1}\x{1F5E3}\x{1F5E8}\x{1F5EF}\x{1F5F3}\x{1F5FA}\x{1F6CB}\x{1F6CD}-\x{1F6CF}\x{1F6E0}-\x{1F6E5}\x{1F6E9}\x{1F6F0}\x{1F6F3}]|[\x{23E9}-\x{23EC}\x{23F0}\x{23F3}\x{25FD}\x{2693}\x{26A1}\x{26AB}\x{26C5}\x{26CE}\x{26D4}\x{26EA}\x{26FD}\x{2705}\x{2728}\x{274C}\x{274E}\x{2753}-\x{2755}\x{2757}\x{2795}-\x{2797}\x{27B0}\x{27BF}\x{2B50}\x{1F0CF}\x{1F18E}\x{1F191}-\x{1F19A}\x{1F201}\x{1F21A}\x{1F22F}\x{1F232}-\x{1F236}\x{1F238}-\x{1F23A}\x{1F250}\x{1F251}\x{1F300}-\x{1F320}\x{1F32D}-\x{1F335}\x{1F337}-\x{1F37C}\x{1F37E}-\x{1F384}\x{1F386}-\x{1F393}\x{1F3A0}-\x{1F3C1}\x{1F3C5}\x{1F3C6}\x{1F3C8}\x{1F3C9}\x{1F3CF}-\x{1F3D3}\x{1F3E0}-\x{1F3F0}\x{1F3F8}-\x{1F407}\x{1F409}-\x{1F414}\x{1F416}-\x{1F43A}\x{1F43C}-\x{1F43E}\x{1F440}\x{1F444}\x{1F445}\x{1F451}-\x{1F465}\x{1F46A}\x{1F479}-\x{1F47B}\x{1F47D}-\x{1F480}\x{1F484}\x{1F488}-\x{1F48E}\x{1F490}\x{1F492}-\x{1F4A9}\x{1F4AB}-\x{1F4FC}\x{1F4FF}-\x{1F53D}\x{1F54B}-\x{1F54E}\x{1F550}-\x{1F567}\x{1F5A4}\x{1F5FB}-\x{1F62D}\x{1F62F}-\x{1F634}\x{1F637}-\x{1F644}\x{1F648}-\x{1F64A}\x{1F680}-\x{1F6A2}\x{1F6A4}-\x{1F6B3}\x{1F6B7}-\x{1F6BF}\x{1F6C1}-\x{1F6C5}\x{1F6D0}-\x{1F6D2}\x{1F6D5}-\x{1F6D7}\x{1F6DD}-\x{1F6DF}\x{1F6EB}\x{1F6EC}\x{1F6F4}-\x{1F6FC}\x{1F7E0}-\x{1F7EB}\x{1F7F0}\x{1F90D}\x{1F90E}\x{1F910}-\x{1F917}\x{1F920}-\x{1F925}\x{1F927}-\x{1F92F}\x{1F93A}\x{1F93F}-\x{1F945}\x{1F947}-\x{1F976}\x{1F978}-\x{1F9B4}\x{1F9B7}\x{1F9BA}\x{1F9BC}-\x{1F9CC}\x{1F9D0}\x{1F9E0}-\x{1F9FF}\x{1FA70}-\x{1FA74}\x{1FA78}-\x{1FA7C}\x{1FA80}-\x{1FA86}\x{1FA90}-\x{1FAAC}\x{1FAB0}-\x{1FABA}\x{1FAC0}-\x{1FAC2}\x{1FAD0}-\x{1FAD9}\x{1FAE0}-\x{1FAE7}]/u', '', $text); } -function shortenClient($client) -{ +function shortenClient($client) { // Pre-process by removing any non-alphanumeric characters except for certain punctuations. $client = html_entity_decode($client); // Decode any HTML entities $client = str_replace("'", "", $client); // Removing all occurrences of ' @@ -933,8 +807,7 @@ function shortenClient($client) return strtoupper(substr($shortened, 0, 3)); } -function roundToNearest15($time) -{ +function roundToNearest15($time) { // Validate the input time format if (!preg_match('/^(\d{2}):(\d{2}):(\d{2})$/', $time, $matches)) { return false; // or throw an exception @@ -1182,145 +1055,516 @@ function getTicketStatusName($ticket_status) { function fetchUpdates() { - global $repo_branch; - - // Fetch the latest code changes but don't apply them - exec("git fetch", $output, $result); - $latest_version = exec("git rev-parse origin/$repo_branch"); - $current_version = exec("git rev-parse HEAD"); - - if ($current_version == $latest_version) { - $update_message = "No Updates available"; + + $repo_dir = dirname(__DIR__); // Adjust to wherever the repo root is relative to this file + + $output = array(); + $result = 0; + + $current_version = getCurrentGitCommit($repo_dir); + if (empty($current_version)) { + $output[] = 'Could not read current commit from .git - check file permissions'; + $result = 1; + } + + $repo = getGitHubRepoFromConfig($repo_dir); + + $api_error = null; + $latest_version = getLatestGitCommit($repo, $repo_branch, $api_error); + if (empty($latest_version)) { + $output[] = $api_error ?: 'Could not determine latest commit'; + $result = 1; + } + + if ($result !== 0) { + $update_message = 'Update check failed'; + } elseif ($current_version == $latest_version) { + $update_message = 'No Updates available'; } else { $update_message = "New Updates are Available [$latest_version]"; } - - + $updates = new stdClass(); $updates->output = $output; $updates->result = $result; $updates->current_version = $current_version; $updates->latest_version = $latest_version; $updates->update_message = $update_message; - - + return $updates; - } -function getDomainExpirationDate($domain) { - // Execute the whois command - $result = shell_exec("whois " . escapeshellarg($domain)); - if (!$result || !checkdnsrr($domain, 'SOA')) { - return null; // Return null if WHOIS query fails + +// Plain HTTPS GET via curl (used for RDAP) +function rdapHttpGet($url, &$http_code = null) { + $ch = curl_init($url); + curl_setopt_array($ch, array( + CURLOPT_RETURNTRANSFER => true, + CURLOPT_CONNECTTIMEOUT => 5, + CURLOPT_TIMEOUT => 10, + CURLOPT_USERAGENT => 'ITFlow-Domain-Check', + CURLOPT_PROTOCOLS => CURLPROTO_HTTPS, + CURLOPT_FOLLOWLOCATION => true, // RDAP bootstrap/redirectors use 30x + CURLOPT_MAXREDIRS => 5, + CURLOPT_HTTPHEADER => array('Accept: application/rdap+json'), + )); + + $response = curl_exec($ch); + $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + return ($response === false) ? '' : $response; +} + +// Find the RDAP base URL for a TLD using IANA's bootstrap registry, +// cached locally for a week (the mapping changes very rarely) +function getRdapBaseUrl($tld) { + static $bootstrap = null; + + if ($bootstrap === null) { + $cache_file = sys_get_temp_dir() . '/itflow_rdap_bootstrap.json'; + + if (is_readable($cache_file) && (time() - filemtime($cache_file)) < 604800) { + $bootstrap = json_decode(file_get_contents($cache_file), true); + } + + if (empty($bootstrap['services'])) { + $raw = rdapHttpGet('https://data.iana.org/rdap/dns.json', $code); + if ($code === 200 && !empty($raw)) { + $decoded = json_decode($raw, true); + if (!empty($decoded['services'])) { + $bootstrap = $decoded; + @file_put_contents($cache_file, $raw); + } + } + } + + if (empty($bootstrap['services'])) { + $bootstrap = array('services' => array()); // don't retry every call this run + } } - - $expireDate = ''; - - // Regular expressions to match different date formats - $patterns = [ - '/Expiration Date: (.+)/', - '/Registry Expiry Date: (.+)/', - '/expires: (.+)/', - '/Expiry Date: (.+)/', - '/renewal date: (.+)/', - '/Expires On: (.+)/', - '/paid-till: (.+)/', - '/Expiration Time: (.+)/', - '/\[Expires on\]\s+(.+)/', - '/expire: (.+)/', - '/validity: (.+)/', - '/Expires on.*: (.+)/i', - '/Expiry on.*: (.+)/i', - '/renewal: (.+)/i', - '/Expir\w+ Date: (.+)/i', - '/Valid Until: (.+)/i', - '/Valid until: (.+)/i', - '/expire-date: (.+)/i', - '/Expiration Date: (.+)/i', - '/Registry Expiry Date: (.+)/i', - '/Expire Date: (.+)/i', - '/expiry: (.+)/i', - '/expires: (.+)/i', - '/Registry Expiry Date: (.+)/i', - '/Expiration Time: (.+)/i', - '/validity: (.+)/i', - '/expires: (.+)/i', - '/paid-till: (.+)/i', - '/Expire Date: (.+)/i', - '/Expiration Date: (.+)/i', - '/expire: (.+)/i', - '/expiry: (.+)/i', - '/renewal date: (.+)/i', - '/Expiration Date: (.+)/i', - '/Expiration Time: (.+)/i', - '/Expires: (.+)/i', - ]; - - // Known date formats - $knownFormats = [ - "d-M-Y", - "d-F-Y", - "d-m-Y", - "Y-m-d", - "d.m.Y", - "Y.m.d", - "Y/m/d", - "Y/m/d H:i:s", - "Ymd", - "Ymd H:i:s", - "d/m/Y", - "Y. m. d.", - "Y.m.d H:i:s", - "d-M-Y H:i:s", - "D M d H:i:s T Y", - "D M d Y", - "Y-m-d\TH:i:s", - "Y-m-d\TH:i:s\Z", - "Y-m-d H:i:s\Z", - "Y-m-d H:i:s", - "d M Y H:i:s", - "d/m/Y H:i:s", - "d/m/Y H:i:s T", - "B d Y", - "d.m.Y H:i:s", - "before M-Y", - "before Y-m-d", - "before Ymd", - "Y-m-d H:i:s (\T\Z\Z)", - "Y-M-d.", - ]; - - // Check each pattern to find a match - foreach ($patterns as $pattern) { - if (preg_match($pattern, $result, $matches)) { - $expireDate = trim($matches[1]); + + foreach ($bootstrap['services'] as $service) { + // [0] = list of TLDs, [1] = list of base URLs + if (in_array($tld, $service[0])) { + return rtrim($service[1][0], '/') . '/'; + } + } + + return ''; +} + +// Fetch and decode the RDAP record for a domain (cached per-run so +// getDomainRecords + getDomainExpirationDate on the same domain = one request) +function getDomainRdap($domain) { + static $cache = array(); + + if (array_key_exists($domain, $cache)) { + return $cache[$domain]; + } + $cache[$domain] = null; + + $tld = substr(strrchr($domain, '.'), 1); + if (empty($tld)) { + return null; + } + + // Primary: IANA bootstrap -> registry RDAP server directly + $base = getRdapBaseUrl($tld); + if (!empty($base)) { + $raw = rdapHttpGet($base . 'domain/' . rawurlencode($domain), $code); + if ($code === 200 && !empty($raw)) { + $decoded = json_decode($raw, true); + if (is_array($decoded)) { + $cache[$domain] = $decoded; + return $decoded; + } + } + if ($code === 404) { + return null; // Domain genuinely not found - don't bother the fallback + } + } + + // Fallback: rdap.org redirector (covers gaps and bootstrap fetch failures) + $raw = rdapHttpGet('https://rdap.org/domain/' . rawurlencode($domain), $code); + if ($code === 200 && !empty($raw)) { + $decoded = json_decode($raw, true); + if (is_array($decoded)) { + $cache[$domain] = $decoded; + } + } + + return $cache[$domain]; +} + +// Pull a named event date (expiration, registration, last changed) from RDAP +function getRdapEventDate($rdap, $action) { + if (empty($rdap['events']) || !is_array($rdap['events'])) { + return ''; + } + foreach ($rdap['events'] as $event) { + if (isset($event['eventAction'], $event['eventDate']) && $event['eventAction'] === $action) { + return $event['eventDate']; + } + } + return ''; +} + +// Registrar name from RDAP entities (vCard "fn" field) +function getRdapRegistrar($rdap) { + if (empty($rdap['entities']) || !is_array($rdap['entities'])) { + return ''; + } + foreach ($rdap['entities'] as $entity) { + if (empty($entity['roles']) || !in_array('registrar', $entity['roles'])) { + continue; + } + if (!empty($entity['vcardArray'][1]) && is_array($entity['vcardArray'][1])) { + foreach ($entity['vcardArray'][1] as $field) { + if (isset($field[0], $field[3]) && $field[0] === 'fn' && is_string($field[3])) { + return $field[3]; + } + } + } + } + return ''; +} + +// Build a human-readable summary to fill the old "whois" display field +function getRdapSummary($rdap) { + $lines = array(); + + $registrar = getRdapRegistrar($rdap); + if (!empty($registrar)) { + $lines[] = "Registrar: $registrar"; + } + + $registered = getRdapEventDate($rdap, 'registration'); + if (!empty($registered)) { + $lines[] = 'Registered: ' . substr($registered, 0, 10); + } + + $expires = getRdapEventDate($rdap, 'expiration'); + if (!empty($expires)) { + $lines[] = 'Expires: ' . substr($expires, 0, 10); + } + + if (!empty($rdap['status']) && is_array($rdap['status'])) { + $lines[] = 'Status: ' . implode(', ', array_slice($rdap['status'], 0, 3)); + } + + if (!empty($rdap['nameservers']) && is_array($rdap['nameservers'])) { + $ns = array(); + foreach ($rdap['nameservers'] as $nameserver) { + if (!empty($nameserver['ldhName'])) { + $ns[] = strtolower($nameserver['ldhName']); + } + } + if (!empty($ns)) { + sort($ns); + $lines[] = 'Nameservers: ' . implode(', ', $ns); + } + } + + return implode("\n", $lines); +} + +// Raw whois query against a server on port 43 (fallback for TLDs without RDAP) +function whoisSocketQuery($server, $query) { + $response = ''; + + $fp = @fsockopen($server, 43, $errno, $errstr, 5); + if (!$fp) { + return ''; + } + + stream_set_timeout($fp, 5); + fwrite($fp, $query . "\r\n"); + + while (!feof($fp)) { + $line = fgets($fp, 1024); + if ($line === false) { + break; + } + $response .= $line; + + // Sanity cap - expiry/registrar fields always appear well before this + if (strlen($response) > 32768) { break; } } - - if ($expireDate) { - // Try parsing with known formats - foreach ($knownFormats as $format) { - $parsedDate = DateTime::createFromFormat($format, $expireDate); - if ($parsedDate && $parsedDate->format($format) === $expireDate) { - return $parsedDate->format('Y-m-d'); + fclose($fp); + + return $response; +} + +// Look up the responsible whois server via IANA, query it, follow one registrar referral +// Returns the full raw response - callers trim as needed +function getDomainWhois($domain) { + $tld = substr(strrchr($domain, '.'), 1); + if (empty($tld)) { + return ''; + } + + // Ask IANA which whois server handles this TLD + $server = ''; + $iana_response = whoisSocketQuery('whois.iana.org', $tld); + if (preg_match('/^whois:\s*(\S+)/mi', $iana_response, $matches)) { + $server = $matches[1]; + } + if (empty($server)) { + return ''; + } + + // Verisign registries match nameservers too unless you use exact-match syntax + $query = in_array($tld, array('com', 'net')) ? "=$domain" : $domain; + + $result = whoisSocketQuery($server, $query); + + // Thin registries (.com/.net) refer to the registrar's whois - follow it once + if (preg_match('/Registrar WHOIS Server:\s*(\S+)/i', $result, $matches)) { + $referral = rtrim(trim($matches[1]), '/'); + $referral = preg_replace('#^r?whois://#i', '', $referral); + if (!empty($referral) && strcasecmp($referral, $server) !== 0) { + $referred_result = whoisSocketQuery($referral, $domain); + if (trim($referred_result) !== '') { + $result = $referred_result; } } - - // If none of the formats matched, try to parse it directly - $parsedDate = date_create($expireDate); - if ($parsedDate) { + } + + return $result; +} + +// Get domain general info (whois + NS/A/MX records) - no shell_exec +function getDomainRecords($name) { + $records = array( + 'a' => '', + 'ns' => '', + 'mx' => '', + 'txt' => '', + 'whois' => '', + 'expire' => '' + ); + + // Only run if we think the domain is valid + if (!filter_var($name, FILTER_VALIDATE_DOMAIN, FILTER_FLAG_HOSTNAME) || !checkdnsrr($name, 'SOA')) { + return $records; + } + + // Anchored so we don't mangle domains that merely start with "www" + $domain = preg_replace('/^www\./i', '', strtolower(trim($name))); + + // A records + $a = @dns_get_record($domain, DNS_A); + if (is_array($a) && !empty($a)) { + $a_records = array_column($a, 'ip'); + sort($a_records); + $records['a'] = implode("\n", $a_records); + } + + // NS records + $ns = @dns_get_record($domain, DNS_NS); + if (is_array($ns) && !empty($ns)) { + $ns_records = array_column($ns, 'target'); + sort($ns_records); + $records['ns'] = implode("\n", $ns_records); + } + + // MX records - mimic dig +short output format ("10 mail.example.com") + $mx = @dns_get_record($domain, DNS_MX); + if (is_array($mx) && !empty($mx)) { + $mx_records = array(); + foreach ($mx as $record) { + $mx_records[] = $record['pri'] . ' ' . $record['target']; + } + sort($mx_records, SORT_NATURAL); + $records['mx'] = implode("\n", $mx_records); + } + + // TXT records + $txt = @dns_get_record($domain, DNS_TXT); + if (is_array($txt) && !empty($txt)) { + $txt_records = array_column($txt, 'txt'); + sort($txt_records); + $records['txt'] = implode("\n", $txt_records); + } + + // Registration data - RDAP first, legacy whois only if the TLD has no RDAP + $rdap = getDomainRdap($domain); + if ($rdap !== null) { + $records['whois'] = substr(getRdapSummary($rdap), 0, 254); + + $expires = getRdapEventDate($rdap, 'expiration'); + if (!empty($expires)) { + $parsed = date_create($expires); + if ($parsed) { + $records['expire'] = $parsed->format('Y-m-d'); + } + } + } else { + $whois_raw = getDomainWhois($domain); + if (!empty($whois_raw) && stripos($whois_raw, 'rate limit') === false) { + // Approximate the old `head -30 | sed 's/ //g'` + $lines = array_slice(explode("\n", $whois_raw), 0, 30); + $lines = array_map(function ($line) { + return preg_replace('/ +/', ' ', rtrim($line)); + }, $lines); + $records['whois'] = substr(trim(strip_tags(implode("\n", $lines))), 0, 254); + } + } + + return $records; +} + +// Used to automatically attempt to get SSL certificates as part of adding domains +// The logic for the fetch (sync) button on the client_certificates page is in ajax.php, and allows ports other than 443 +function getSSL($full_name) { + + // Parse host and port + $name = parse_url("//$full_name", PHP_URL_HOST); + $port = parse_url("//$full_name", PHP_URL_PORT); + + // Default port + if (!$port) { + $port = "443"; + } + + $certificate = array(); + $certificate['success'] = false; + + // Only run if we think the domain is valid + if (!filter_var($name, FILTER_VALIDATE_DOMAIN, FILTER_FLAG_HOSTNAME)) { + $certificate['expire'] = ''; + $certificate['issued_by'] = ''; + $certificate['public_key'] = ''; + return $certificate; + } + + // Get SSL/TSL certificate (using verify peer false to allow for self-signed certs) for domain on default port + $socket = "ssl://$name:$port"; + $get = stream_context_create(array("ssl" => array("capture_peer_cert" => true, "verify_peer" => false,))); + $read = stream_socket_client($socket, $errno, $errstr, 5, STREAM_CLIENT_CONNECT, $get); + + // If the socket connected + if ($read) { + $cert = stream_context_get_params($read); + $cert_public_key_obj = openssl_x509_parse($cert['options']['ssl']['peer_certificate']); + openssl_x509_export($cert['options']['ssl']['peer_certificate'], $export); + + if ($cert_public_key_obj) { + $certificate['success'] = true; + $certificate['expire'] = date('Y-m-d', $cert_public_key_obj['validTo_time_t']); + $certificate['issued_by'] = strip_tags($cert_public_key_obj['issuer']['O']); + $certificate['public_key'] = $export; + } + } + + return $certificate; +} + +// Get domain expiration date - RDAP first, whois parsing as last resort +function getDomainExpirationDate($domain) { + if (!filter_var($domain, FILTER_VALIDATE_DOMAIN, FILTER_FLAG_HOSTNAME) || !checkdnsrr($domain, 'SOA')) { + return null; + } + + $domain = preg_replace('/^www\./i', '', strtolower(trim($domain))); + + // RDAP: expiration is a structured field - no regex, no date-format guessing + $rdap = getDomainRdap($domain); + if ($rdap !== null) { + $expires = getRdapEventDate($rdap, 'expiration'); + if (!empty($expires)) { + $parsed = date_create($expires); + if ($parsed) { + return $parsed->format('Y-m-d'); + } + } + return null; // RDAP answered but had no expiry (rare) - trust it, don't re-query + } + + // Fallback for TLDs without RDAP: legacy whois parsing + $result = getDomainWhois($domain); + if (empty($result) || stripos($result, 'rate limit') !== false) { + return null; + } + + // Every expiry label seen in the wild, longest/most-specific first + $labels = array( + 'Registrar Registration Expiration Date', + 'Registry Expiry Date', + 'Expiration Date', + 'Expiration Time', + '\[Expires on\]', + 'Expires On', + 'Expiry Date', + 'Expire Date', + 'expire-date', + 'renewal date', + 'Valid Until', + 'paid-till', + 'validity', + 'renewal', + 'Expires', + 'expiry', + 'expire', + ); + + if (!preg_match('/(?:' . implode('|', $labels) . ')\s*:?\s+(.+)/i', $result, $matches)) { + return null; + } + $expireDate = trim($matches[1]); + + // Known date formats (roundtrip-checked to avoid d-m-Y vs Y-m-d ambiguity) + $knownFormats = array( + 'Y-m-d', + 'Y.m.d', + 'Y/m/d', + 'Ymd', + 'Y. m. d.', + 'Y-M-d.', + 'd-M-Y', + 'd-F-Y', + 'd-m-Y', + 'd.m.Y', + 'd/m/Y', + 'Y/m/d H:i:s', + 'Ymd H:i:s', + 'Y.m.d H:i:s', + 'Y-m-d H:i:s', + 'd-M-Y H:i:s', + 'd.m.Y H:i:s', + 'd/m/Y H:i:s', + 'd M Y H:i:s', + 'd/m/Y H:i:s T', + 'D M d H:i:s T Y', + 'D M d Y', + ); + + foreach ($knownFormats as $format) { + $parsedDate = DateTime::createFromFormat($format, $expireDate); + if ($parsedDate && $parsedDate->format($format) === $expireDate) { return $parsedDate->format('Y-m-d'); } } - - return null; // Return null if expiration date is not found + + // Fallback - handles ISO 8601 (2026-07-05T04:00:00Z) and most everything else + $parsedDate = date_create($expireDate); + if ($parsedDate) { + $year = (int) $parsedDate->format('Y'); + // Reject obviously bogus parses + if ($year >= 1995 && $year <= ((int) date('Y') + 100)) { + return $parsedDate->format('Y-m-d'); + } + } + + return null; } -function validateWhitelabelKey($key) -{ + +function validateWhitelabelKey($key) { $public_key = "-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr0k+4ZJudkdGMCFLx5b9 H/sOozvWphFJsjVIF0vPVx9J0bTdml65UdS+32JagIHfPtEUTohaMnI3IAxxCDzl From 78c3dd0eedec25186f82951fca33b5a372a8a560 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Sun, 5 Jul 2026 16:05:19 -0400 Subject: [PATCH 002/241] Remove Dig and Whois binary requirements, revert fetchUpdates function --- admin/debug.php | 4 ++-- functions.php | 42 ++++++++++++++---------------------------- setup/index.php | 2 +- 3 files changed, 17 insertions(+), 31 deletions(-) diff --git a/admin/debug.php b/admin/debug.php index c59c15324..a0759651c 100644 --- a/admin/debug.php +++ b/admin/debug.php @@ -147,7 +147,7 @@ $phpConfig[] = [ $shellCommands = []; if ($shell_exec_enabled) { - $commands = ['whois', 'dig', 'git']; + $commands = ['git']; foreach ($commands as $command) { $which = trim(shell_exec("which $command 2>/dev/null")); @@ -160,7 +160,7 @@ if ($shell_exec_enabled) { } } else { // If shell_exec is disabled, mark commands as unavailable - foreach (['whois', 'dig', 'git'] as $command) { + foreach (['git'] as $command) { $shellCommands[] = [ 'name' => "Command '$command' available", 'passed' => false, diff --git a/functions.php b/functions.php index 86b7781bc..eebf38de9 100644 --- a/functions.php +++ b/functions.php @@ -1053,46 +1053,32 @@ function getTicketStatusName($ticket_status) { } - function fetchUpdates() { + global $repo_branch; - - $repo_dir = dirname(__DIR__); // Adjust to wherever the repo root is relative to this file - - $output = array(); - $result = 0; - - $current_version = getCurrentGitCommit($repo_dir); - if (empty($current_version)) { - $output[] = 'Could not read current commit from .git - check file permissions'; - $result = 1; - } - - $repo = getGitHubRepoFromConfig($repo_dir); - - $api_error = null; - $latest_version = getLatestGitCommit($repo, $repo_branch, $api_error); - if (empty($latest_version)) { - $output[] = $api_error ?: 'Could not determine latest commit'; - $result = 1; - } - - if ($result !== 0) { - $update_message = 'Update check failed'; - } elseif ($current_version == $latest_version) { - $update_message = 'No Updates available'; + + // Fetch the latest code changes but don't apply them + exec("git fetch", $output, $result); + $latest_version = exec("git rev-parse origin/$repo_branch"); + $current_version = exec("git rev-parse HEAD"); + + if ($current_version == $latest_version) { + $update_message = "No Updates available"; } else { $update_message = "New Updates are Available [$latest_version]"; } - + + $updates = new stdClass(); $updates->output = $output; $updates->result = $result; $updates->current_version = $current_version; $updates->latest_version = $latest_version; $updates->update_message = $update_message; - + + return $updates; + } diff --git a/setup/index.php b/setup/index.php index 334420cf2..8cebdf1b8 100644 --- a/setup/index.php +++ b/setup/index.php @@ -939,7 +939,7 @@ if (isset($_POST['add_telemetry'])) { $shellCommands = []; if ($shell_exec_enabled) { - $commands = ['whois', 'dig', 'git']; + $commands = ['git']; foreach ($commands as $command) { $which = trim(shell_exec("which $command 2>/dev/null")); From 47a5825d3e1f8def935d03cebd8ac0204c3d78d8 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Tue, 7 Jul 2026 15:04:48 -0400 Subject: [PATCH 003/241] OAUTH Send Invoice Fix: was reading smtp host var needed to read smtp provider as smtp host is not filled in when OAUTH2 is selected --- agent/invoice.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agent/invoice.php b/agent/invoice.php index f96b6411c..c52aeb889 100644 --- a/agent/invoice.php +++ b/agent/invoice.php @@ -225,7 +225,7 @@ if (isset($_GET['invoice_id'])) { Send +
diff --git a/agent/modals/quote/quote_add.php b/agent/modals/quote/quote_add.php index 667eb9118..fb004f4e0 100644 --- a/agent/modals/quote/quote_add.php +++ b/agent/modals/quote/quote_add.php @@ -18,16 +18,6 @@ ob_start(); +
+
+
diff --git a/agent/modals/recurring_invoice/recurring_invoice_add.php b/agent/modals/recurring_invoice/recurring_invoice_add.php index 6f9ec1875..781f4a662 100644 --- a/agent/modals/recurring_invoice/recurring_invoice_add.php +++ b/agent/modals/recurring_invoice/recurring_invoice_add.php @@ -18,16 +18,6 @@ ob_start(); +
+
+
diff --git a/agent/modals/recurring_ticket/recurring_ticket_add.php b/agent/modals/recurring_ticket/recurring_ticket_add.php index 525fff303..dc9cff9e6 100644 --- a/agent/modals/recurring_ticket/recurring_ticket_add.php +++ b/agent/modals/recurring_ticket/recurring_ticket_add.php @@ -28,11 +28,6 @@ ob_start(); - - - @@ -45,13 +40,64 @@ ob_start();
+ + + + +
+
+
+ +
+
+ +
+ +
+
+
+
+
+ +
+
+ +
+ +
+
+
+
+ + +
- +
+ +
+
+ value="1"> +
+
+
@@ -133,63 +179,9 @@ ob_start();
- -
-
- value="1" id="billable"> - -
-
- -
- - - - -
- -
- -
-
- -
- -
-
- - -
- -
-
- -
- -
-
- -
- -
-
- - +
@@ -345,7 +337,7 @@ ob_start();
diff --git a/agent/modals/ticket/ticket_add_v2.php b/agent/modals/ticket/ticket_add_v2.php index 63cc2c82a..254186d66 100644 --- a/agent/modals/ticket/ticket_add_v2.php +++ b/agent/modals/ticket/ticket_add_v2.php @@ -33,11 +33,6 @@ ob_start(); - - - @@ -49,6 +44,52 @@ ob_start();
+ + + + + +
+
+
+ +
+
+ +
+ +
+
+
+
+
+ +
+
+ +
+ +
+
+
+
+ + +
@@ -90,12 +131,19 @@ ob_start();
- +
+ +
+
+ value="1"> +
+
+
@@ -176,59 +224,8 @@ ob_start();
- -
-
- value="1" id="billable"> - -
-
- - - - - - -
- -
- -
-
- -
- -
-
- -
- -
-
- -
- -
-
- -
- -
To-do: project, etc. @@ -290,7 +287,7 @@ ob_start();
diff --git a/agent/modals/trip/trip_add.php b/agent/modals/trip/trip_add.php index db2526170..54a6cd6b4 100644 --- a/agent/modals/trip/trip_add.php +++ b/agent/modals/trip/trip_add.php @@ -18,6 +18,36 @@ ob_start(); - +
- +
- -
-
- value="1"> -
-
-
@@ -179,9 +172,16 @@ ob_start(); - + +
+
+ value="1" id="billable"> + +
+
+ - +
diff --git a/agent/modals/ticket/ticket_add_v2.php b/agent/modals/ticket/ticket_add_v2.php index 254186d66..6b586d08a 100644 --- a/agent/modals/ticket/ticket_add_v2.php +++ b/agent/modals/ticket/ticket_add_v2.php @@ -131,19 +131,12 @@ ob_start();
- +
- -
-
- value="1"> -
-
-
@@ -224,6 +217,15 @@ ob_start(); + +
+
+ value="1" id="billable"> + +
+
+ +
From 8da3a107fbcd462a0ded5aa8dd94bff6fb409e58 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Fri, 10 Jul 2026 13:24:20 -0400 Subject: [PATCH 013/241] Rename plugins to libs and update all file references --- admin/document_template_details.php | 2 +- .../mail_queue/mail_queue_message_view.php | 2 +- admin/post/saved_payment_method.php | 2 +- .../post/settings_online_payment_clients.php | 2 +- admin/project_template_details.php | 2 +- admin/ticket_template_details.php | 4 +-- agent/ajax.php | 2 +- agent/calendar.php | 10 +++---- agent/client_autopay.php | 2 +- agent/document_details.php | 2 +- agent/global_search.php | 2 +- agent/invoice.php | 6 ++-- agent/modals/asset/asset_add.php | 4 +-- .../modals/document/document_version_view.php | 2 +- agent/modals/document/document_view.php | 2 +- .../recurring_ticket/recurring_ticket_add.php | 4 +-- agent/modals/ticket/ticket_add_v2.php | 4 +-- agent/post/client.php | 2 +- agent/post/document.php | 2 +- agent/post/invoice.php | 4 +-- agent/post/payment.php | 4 +-- agent/post/quote.php | 2 +- agent/quote.php | 6 ++-- agent/recurring_invoice.php | 6 ++-- agent/ticket.php | 4 +-- agent/ticket_kanban.php | 2 +- agent/user/mfa_enforcement.php | 18 ++++++------ agent/user/modals/user_mfa_modal.php | 4 +-- agent/user/post/profile.php | 2 +- client/document.php | 2 +- client/includes/footer.php | 6 ++-- client/includes/header.php | 4 +-- client/login_reset.php | 10 +++---- client/post.php | 10 +++---- client/saved_payment_methods.php | 2 +- client/ticket.php | 2 +- cron/cron.php | 2 +- cron/mail_queue.php | 12 ++++---- cron/ticket_email_parser.php | 2 +- functions.php | 4 +-- guest/guest_ajax.php | 4 +-- guest/guest_approve_ticket_task.php | 2 +- guest/guest_pay_invoice_stripe.php | 4 +-- guest/guest_post.php | 4 +-- guest/guest_view_item.php | 2 +- guest/guest_view_ticket.php | 2 +- guest/includes/guest_header.php | 16 +++++------ includes/footer.php | 26 +++++++++--------- includes/header.php | 22 +++++++-------- includes/modal_footer.php | 2 +- {plugins => libs}/.npmignore | 0 .../DataTables/datatables.min.css | 0 .../DataTables/datatables.min.js | 0 {plugins => libs}/PHPMailer/COMMITMENT | 0 {plugins => libs}/PHPMailer/LICENSE | 0 {plugins => libs}/PHPMailer/README.md | 0 {plugins => libs}/PHPMailer/SECURITY.md | 0 {plugins => libs}/PHPMailer/SMTPUTF8.md | 0 {plugins => libs}/PHPMailer/VERSION | 0 {plugins => libs}/PHPMailer/composer.json | 0 .../PHPMailer/get_oauth_token.php | 0 .../PHPMailer/language/phpmailer.lang-af.php | 0 .../PHPMailer/language/phpmailer.lang-ar.php | 0 .../PHPMailer/language/phpmailer.lang-as.php | 0 .../PHPMailer/language/phpmailer.lang-az.php | 0 .../PHPMailer/language/phpmailer.lang-ba.php | 0 .../PHPMailer/language/phpmailer.lang-be.php | 0 .../PHPMailer/language/phpmailer.lang-bg.php | 0 .../PHPMailer/language/phpmailer.lang-bn.php | 0 .../PHPMailer/language/phpmailer.lang-ca.php | 0 .../PHPMailer/language/phpmailer.lang-cs.php | 0 .../PHPMailer/language/phpmailer.lang-da.php | 0 .../PHPMailer/language/phpmailer.lang-de.php | 0 .../PHPMailer/language/phpmailer.lang-el.php | 0 .../PHPMailer/language/phpmailer.lang-eo.php | 0 .../PHPMailer/language/phpmailer.lang-es.php | 0 .../PHPMailer/language/phpmailer.lang-et.php | 0 .../PHPMailer/language/phpmailer.lang-fa.php | 0 .../PHPMailer/language/phpmailer.lang-fi.php | 0 .../PHPMailer/language/phpmailer.lang-fo.php | 0 .../PHPMailer/language/phpmailer.lang-fr.php | 0 .../PHPMailer/language/phpmailer.lang-gl.php | 0 .../PHPMailer/language/phpmailer.lang-he.php | 0 .../PHPMailer/language/phpmailer.lang-hi.php | 0 .../PHPMailer/language/phpmailer.lang-hr.php | 0 .../PHPMailer/language/phpmailer.lang-hu.php | 0 .../PHPMailer/language/phpmailer.lang-hy.php | 0 .../PHPMailer/language/phpmailer.lang-id.php | 0 .../PHPMailer/language/phpmailer.lang-it.php | 0 .../PHPMailer/language/phpmailer.lang-ja.php | 0 .../PHPMailer/language/phpmailer.lang-ka.php | 0 .../PHPMailer/language/phpmailer.lang-ko.php | 0 .../PHPMailer/language/phpmailer.lang-ku.php | 0 .../PHPMailer/language/phpmailer.lang-lt.php | 0 .../PHPMailer/language/phpmailer.lang-lv.php | 0 .../PHPMailer/language/phpmailer.lang-mg.php | 0 .../PHPMailer/language/phpmailer.lang-mn.php | 0 .../PHPMailer/language/phpmailer.lang-ms.php | 0 .../PHPMailer/language/phpmailer.lang-nb.php | 0 .../PHPMailer/language/phpmailer.lang-nl.php | 0 .../PHPMailer/language/phpmailer.lang-pl.php | 0 .../PHPMailer/language/phpmailer.lang-pt.php | 0 .../language/phpmailer.lang-pt_br.php | 0 .../PHPMailer/language/phpmailer.lang-ro.php | 0 .../PHPMailer/language/phpmailer.lang-ru.php | 0 .../PHPMailer/language/phpmailer.lang-si.php | 0 .../PHPMailer/language/phpmailer.lang-sk.php | 0 .../PHPMailer/language/phpmailer.lang-sl.php | 0 .../PHPMailer/language/phpmailer.lang-sr.php | 0 .../language/phpmailer.lang-sr_latn.php | 0 .../PHPMailer/language/phpmailer.lang-sv.php | 0 .../PHPMailer/language/phpmailer.lang-tl.php | 0 .../PHPMailer/language/phpmailer.lang-tr.php | 0 .../PHPMailer/language/phpmailer.lang-uk.php | 0 .../PHPMailer/language/phpmailer.lang-ur.php | 0 .../PHPMailer/language/phpmailer.lang-vi.php | 0 .../PHPMailer/language/phpmailer.lang-zh.php | 0 .../language/phpmailer.lang-zh_cn.php | 0 .../PHPMailer/src/DSNConfigurator.php | 0 {plugins => libs}/PHPMailer/src/Exception.php | 0 {plugins => libs}/PHPMailer/src/OAuth.php | 0 .../PHPMailer/src/OAuthTokenProvider.php | 0 {plugins => libs}/PHPMailer/src/PHPMailer.php | 0 {plugins => libs}/PHPMailer/src/POP3.php | 0 {plugins => libs}/PHPMailer/src/SMTP.php | 0 .../bootstrap-show-password.min.js | 0 {plugins => libs}/SortableJS/Sortable.min.js | 0 {plugins => libs}/TCPDF/CHANGELOG.TXT | 0 {plugins => libs}/TCPDF/LICENSE.TXT | 0 {plugins => libs}/TCPDF/Makefile | 0 {plugins => libs}/TCPDF/README.md | 0 {plugins => libs}/TCPDF/VERSION | 0 {plugins => libs}/TCPDF/composer.json | 0 .../TCPDF/config/tcpdf_config.php | 0 .../TCPDF/fonts/ae_fonts_2.0/COPYING | 0 .../TCPDF/fonts/ae_fonts_2.0/ChangeLog | 0 .../TCPDF/fonts/ae_fonts_2.0/README | 0 .../TCPDF/fonts/aealarabiya.ctg.z | Bin {plugins => libs}/TCPDF/fonts/aealarabiya.php | 0 {plugins => libs}/TCPDF/fonts/aealarabiya.z | Bin {plugins => libs}/TCPDF/fonts/aefurat.ctg.z | Bin {plugins => libs}/TCPDF/fonts/aefurat.php | 0 {plugins => libs}/TCPDF/fonts/aefurat.z | Bin {plugins => libs}/TCPDF/fonts/cid0cs.php | 0 {plugins => libs}/TCPDF/fonts/cid0ct.php | 0 {plugins => libs}/TCPDF/fonts/cid0jp.php | 0 {plugins => libs}/TCPDF/fonts/cid0kr.php | 0 {plugins => libs}/TCPDF/fonts/courier.php | 0 {plugins => libs}/TCPDF/fonts/courierb.php | 0 {plugins => libs}/TCPDF/fonts/courierbi.php | 0 {plugins => libs}/TCPDF/fonts/courieri.php | 0 .../TCPDF/fonts/dejavu-fonts-ttf-2.33/AUTHORS | 0 .../TCPDF/fonts/dejavu-fonts-ttf-2.33/BUGS | 0 .../TCPDF/fonts/dejavu-fonts-ttf-2.33/LICENSE | 0 .../TCPDF/fonts/dejavu-fonts-ttf-2.33/NEWS | 0 .../TCPDF/fonts/dejavu-fonts-ttf-2.33/README | 0 .../fonts/dejavu-fonts-ttf-2.33/langcover.txt | 0 .../fonts/dejavu-fonts-ttf-2.33/unicover.txt | 0 .../TCPDF/fonts/dejavu-fonts-ttf-2.34/AUTHORS | 0 .../TCPDF/fonts/dejavu-fonts-ttf-2.34/BUGS | 0 .../TCPDF/fonts/dejavu-fonts-ttf-2.34/LICENSE | 0 .../TCPDF/fonts/dejavu-fonts-ttf-2.34/NEWS | 0 .../TCPDF/fonts/dejavu-fonts-ttf-2.34/README | 0 .../fonts/dejavu-fonts-ttf-2.34/langcover.txt | 0 .../fonts/dejavu-fonts-ttf-2.34/unicover.txt | 0 .../TCPDF/fonts/dejavusans.ctg.z | Bin {plugins => libs}/TCPDF/fonts/dejavusans.php | 0 {plugins => libs}/TCPDF/fonts/dejavusans.z | Bin .../TCPDF/fonts/dejavusansb.ctg.z | Bin {plugins => libs}/TCPDF/fonts/dejavusansb.php | 0 {plugins => libs}/TCPDF/fonts/dejavusansb.z | Bin .../TCPDF/fonts/dejavusansbi.ctg.z | Bin .../TCPDF/fonts/dejavusansbi.php | 0 {plugins => libs}/TCPDF/fonts/dejavusansbi.z | Bin .../TCPDF/fonts/dejavusanscondensed.ctg.z | Bin .../TCPDF/fonts/dejavusanscondensed.php | 0 .../TCPDF/fonts/dejavusanscondensed.z | Bin .../TCPDF/fonts/dejavusanscondensedb.ctg.z | Bin .../TCPDF/fonts/dejavusanscondensedb.php | 0 .../TCPDF/fonts/dejavusanscondensedb.z | Bin .../TCPDF/fonts/dejavusanscondensedbi.ctg.z | Bin .../TCPDF/fonts/dejavusanscondensedbi.php | 0 .../TCPDF/fonts/dejavusanscondensedbi.z | Bin .../TCPDF/fonts/dejavusanscondensedi.ctg.z | Bin .../TCPDF/fonts/dejavusanscondensedi.php | 0 .../TCPDF/fonts/dejavusanscondensedi.z | Bin .../TCPDF/fonts/dejavusansextralight.ctg.z | Bin .../TCPDF/fonts/dejavusansextralight.php | 0 .../TCPDF/fonts/dejavusansextralight.z | Bin .../TCPDF/fonts/dejavusansi.ctg.z | Bin {plugins => libs}/TCPDF/fonts/dejavusansi.php | 0 {plugins => libs}/TCPDF/fonts/dejavusansi.z | Bin .../TCPDF/fonts/dejavusansmono.ctg.z | Bin .../TCPDF/fonts/dejavusansmono.php | 0 .../TCPDF/fonts/dejavusansmono.z | Bin .../TCPDF/fonts/dejavusansmonob.ctg.z | Bin .../TCPDF/fonts/dejavusansmonob.php | 0 .../TCPDF/fonts/dejavusansmonob.z | Bin .../TCPDF/fonts/dejavusansmonobi.ctg.z | Bin .../TCPDF/fonts/dejavusansmonobi.php | 0 .../TCPDF/fonts/dejavusansmonobi.z | Bin .../TCPDF/fonts/dejavusansmonoi.ctg.z | Bin .../TCPDF/fonts/dejavusansmonoi.php | 0 .../TCPDF/fonts/dejavusansmonoi.z | Bin .../TCPDF/fonts/dejavuserif.ctg.z | Bin {plugins => libs}/TCPDF/fonts/dejavuserif.php | 0 {plugins => libs}/TCPDF/fonts/dejavuserif.z | Bin .../TCPDF/fonts/dejavuserifb.ctg.z | Bin .../TCPDF/fonts/dejavuserifb.php | 0 {plugins => libs}/TCPDF/fonts/dejavuserifb.z | Bin .../TCPDF/fonts/dejavuserifbi.ctg.z | Bin .../TCPDF/fonts/dejavuserifbi.php | 0 {plugins => libs}/TCPDF/fonts/dejavuserifbi.z | Bin .../TCPDF/fonts/dejavuserifcondensed.ctg.z | Bin .../TCPDF/fonts/dejavuserifcondensed.php | 0 .../TCPDF/fonts/dejavuserifcondensed.z | Bin .../TCPDF/fonts/dejavuserifcondensedb.ctg.z | Bin .../TCPDF/fonts/dejavuserifcondensedb.php | 0 .../TCPDF/fonts/dejavuserifcondensedb.z | Bin .../TCPDF/fonts/dejavuserifcondensedbi.ctg.z | Bin .../TCPDF/fonts/dejavuserifcondensedbi.php | 0 .../TCPDF/fonts/dejavuserifcondensedbi.z | Bin .../TCPDF/fonts/dejavuserifcondensedi.ctg.z | Bin .../TCPDF/fonts/dejavuserifcondensedi.php | 0 .../TCPDF/fonts/dejavuserifcondensedi.z | Bin .../TCPDF/fonts/dejavuserifi.ctg.z | Bin .../TCPDF/fonts/dejavuserifi.php | 0 {plugins => libs}/TCPDF/fonts/dejavuserifi.z | Bin .../TCPDF/fonts/freefont-20100919/AUTHORS | 0 .../TCPDF/fonts/freefont-20100919/COPYING | 0 .../TCPDF/fonts/freefont-20100919/CREDITS | 0 .../TCPDF/fonts/freefont-20100919/ChangeLog | 0 .../TCPDF/fonts/freefont-20100919/INSTALL | 0 .../TCPDF/fonts/freefont-20100919/README | 0 .../TCPDF/fonts/freefont-20120503/AUTHORS | 0 .../TCPDF/fonts/freefont-20120503/COPYING | 0 .../TCPDF/fonts/freefont-20120503/CREDITS | 0 .../TCPDF/fonts/freefont-20120503/ChangeLog | 0 .../TCPDF/fonts/freefont-20120503/INSTALL | 0 .../TCPDF/fonts/freefont-20120503/README | 0 .../fonts/freefont-20120503/TROUBLESHOOTING | 0 .../TCPDF/fonts/freefont-20120503/USAGE | 0 {plugins => libs}/TCPDF/fonts/freemono.ctg.z | Bin {plugins => libs}/TCPDF/fonts/freemono.php | 0 {plugins => libs}/TCPDF/fonts/freemono.z | Bin {plugins => libs}/TCPDF/fonts/freemonob.ctg.z | Bin {plugins => libs}/TCPDF/fonts/freemonob.php | 0 {plugins => libs}/TCPDF/fonts/freemonob.z | Bin .../TCPDF/fonts/freemonobi.ctg.z | Bin {plugins => libs}/TCPDF/fonts/freemonobi.php | 0 {plugins => libs}/TCPDF/fonts/freemonobi.z | Bin {plugins => libs}/TCPDF/fonts/freemonoi.ctg.z | Bin {plugins => libs}/TCPDF/fonts/freemonoi.php | 0 {plugins => libs}/TCPDF/fonts/freemonoi.z | Bin {plugins => libs}/TCPDF/fonts/freesans.ctg.z | Bin {plugins => libs}/TCPDF/fonts/freesans.php | 0 {plugins => libs}/TCPDF/fonts/freesans.z | Bin {plugins => libs}/TCPDF/fonts/freesansb.ctg.z | Bin {plugins => libs}/TCPDF/fonts/freesansb.php | 0 {plugins => libs}/TCPDF/fonts/freesansb.z | Bin .../TCPDF/fonts/freesansbi.ctg.z | Bin {plugins => libs}/TCPDF/fonts/freesansbi.php | 0 {plugins => libs}/TCPDF/fonts/freesansbi.z | Bin {plugins => libs}/TCPDF/fonts/freesansi.ctg.z | Bin {plugins => libs}/TCPDF/fonts/freesansi.php | 0 {plugins => libs}/TCPDF/fonts/freesansi.z | Bin {plugins => libs}/TCPDF/fonts/freeserif.ctg.z | Bin {plugins => libs}/TCPDF/fonts/freeserif.php | 0 {plugins => libs}/TCPDF/fonts/freeserif.z | Bin .../TCPDF/fonts/freeserifb.ctg.z | Bin {plugins => libs}/TCPDF/fonts/freeserifb.php | 0 {plugins => libs}/TCPDF/fonts/freeserifb.z | Bin .../TCPDF/fonts/freeserifbi.ctg.z | Bin {plugins => libs}/TCPDF/fonts/freeserifbi.php | 0 {plugins => libs}/TCPDF/fonts/freeserifbi.z | Bin .../TCPDF/fonts/freeserifi.ctg.z | Bin {plugins => libs}/TCPDF/fonts/freeserifi.php | 0 {plugins => libs}/TCPDF/fonts/freeserifi.z | Bin {plugins => libs}/TCPDF/fonts/helvetica.php | 0 {plugins => libs}/TCPDF/fonts/helveticab.php | 0 {plugins => libs}/TCPDF/fonts/helveticabi.php | 0 {plugins => libs}/TCPDF/fonts/helveticai.php | 0 .../TCPDF/fonts/hysmyeongjostdmedium.php | 0 .../TCPDF/fonts/kozgopromedium.php | 0 .../TCPDF/fonts/kozminproregular.php | 0 .../TCPDF/fonts/msungstdlight.php | 0 {plugins => libs}/TCPDF/fonts/pdfacourier.php | 0 {plugins => libs}/TCPDF/fonts/pdfacourier.z | Bin .../TCPDF/fonts/pdfacourierb.php | 0 {plugins => libs}/TCPDF/fonts/pdfacourierb.z | Bin .../TCPDF/fonts/pdfacourierbi.php | 0 {plugins => libs}/TCPDF/fonts/pdfacourierbi.z | Bin .../TCPDF/fonts/pdfacourieri.php | 0 {plugins => libs}/TCPDF/fonts/pdfacourieri.z | Bin .../TCPDF/fonts/pdfahelvetica.php | 0 {plugins => libs}/TCPDF/fonts/pdfahelvetica.z | Bin .../TCPDF/fonts/pdfahelveticab.php | 0 .../TCPDF/fonts/pdfahelveticab.z | Bin .../TCPDF/fonts/pdfahelveticabi.php | 0 .../TCPDF/fonts/pdfahelveticabi.z | Bin .../TCPDF/fonts/pdfahelveticai.php | 0 .../TCPDF/fonts/pdfahelveticai.z | Bin {plugins => libs}/TCPDF/fonts/pdfasymbol.php | 0 {plugins => libs}/TCPDF/fonts/pdfasymbol.z | Bin {plugins => libs}/TCPDF/fonts/pdfatimes.php | 0 {plugins => libs}/TCPDF/fonts/pdfatimes.z | Bin {plugins => libs}/TCPDF/fonts/pdfatimesb.php | 0 {plugins => libs}/TCPDF/fonts/pdfatimesb.z | Bin {plugins => libs}/TCPDF/fonts/pdfatimesbi.php | 0 {plugins => libs}/TCPDF/fonts/pdfatimesbi.z | Bin {plugins => libs}/TCPDF/fonts/pdfatimesi.php | 0 {plugins => libs}/TCPDF/fonts/pdfatimesi.z | Bin .../TCPDF/fonts/pdfazapfdingbats.php | 0 .../TCPDF/fonts/pdfazapfdingbats.z | Bin .../TCPDF/fonts/stsongstdlight.php | 0 {plugins => libs}/TCPDF/fonts/symbol.php | 0 {plugins => libs}/TCPDF/fonts/times.php | 0 {plugins => libs}/TCPDF/fonts/timesb.php | 0 {plugins => libs}/TCPDF/fonts/timesbi.php | 0 {plugins => libs}/TCPDF/fonts/timesi.php | 0 .../TCPDF/fonts/uni2cid_ac15.php | 0 .../TCPDF/fonts/uni2cid_ag15.php | 0 .../TCPDF/fonts/uni2cid_aj16.php | 0 .../TCPDF/fonts/uni2cid_ak12.php | 0 .../TCPDF/fonts/zapfdingbats.php | 0 .../TCPDF/include/barcodes/datamatrix.php | 0 .../TCPDF/include/barcodes/pdf417.php | 0 .../TCPDF/include/barcodes/qrcode.php | 0 {plugins => libs}/TCPDF/include/sRGB.icc | Bin .../TCPDF/include/tcpdf_colors.php | 0 .../TCPDF/include/tcpdf_filters.php | 0 .../TCPDF/include/tcpdf_font_data.php | 0 .../TCPDF/include/tcpdf_fonts.php | 0 .../TCPDF/include/tcpdf_images.php | 0 .../TCPDF/include/tcpdf_static.php | 0 {plugins => libs}/TCPDF/tcpdf.php | 0 {plugins => libs}/TCPDF/tcpdf_autoconfig.php | 0 {plugins => libs}/TCPDF/tcpdf_barcodes_1d.php | 0 {plugins => libs}/TCPDF/tcpdf_barcodes_2d.php | 0 {plugins => libs}/TCPDF/tools/.htaccess | 0 .../TCPDF/tools/convert_fonts_examples.txt | 0 .../TCPDF/tools/tcpdf_addfont.php | 0 .../adminlte/css/adminlte.min.css | 0 {plugins => libs}/adminlte/js/.eslintrc.json | 0 {plugins => libs}/adminlte/js/adminlte.min.js | 0 {plugins => libs}/barcode/barcode.php | 0 .../bootstrap/js/bootstrap.bundle.min.js | 0 {plugins => libs}/chart.js/chart.umd.min.js | 0 .../clipboardjs/clipboard.min.js | 0 {plugins => libs}/composer.json | 0 {plugins => libs}/composer.lock | 0 .../daterangepicker/daterangepicker.css | 0 .../daterangepicker/daterangepicker.js | 0 {plugins => libs}/dropzone/min/basic.css | 0 {plugins => libs}/dropzone/min/basic.min.css | 0 .../dropzone/min/dropzone-amd-module.min.js | 0 {plugins => libs}/dropzone/min/dropzone.css | 0 .../dropzone/min/dropzone.min.css | 0 .../dropzone/min/dropzone.min.js | 0 .../fontawesome-free/css/all.min.css | 0 .../webfonts/fa-brands-400.eot | Bin .../webfonts/fa-brands-400.svg | 0 .../webfonts/fa-brands-400.ttf | Bin .../webfonts/fa-brands-400.woff | Bin .../webfonts/fa-brands-400.woff2 | Bin .../webfonts/fa-regular-400.eot | Bin .../webfonts/fa-regular-400.svg | 0 .../webfonts/fa-regular-400.ttf | Bin .../webfonts/fa-regular-400.woff | Bin .../webfonts/fa-regular-400.woff2 | Bin .../webfonts/fa-solid-900.eot | Bin .../webfonts/fa-solid-900.svg | 0 .../webfonts/fa-solid-900.ttf | Bin .../webfonts/fa-solid-900.woff | Bin .../webfonts/fa-solid-900.woff2 | Bin .../fullcalendar/fullcalendar.global.js | 0 .../fullcalendar/locales-all/global.js | 0 {plugins => libs}/fullcalendar/skeleton.css | 0 .../fullcalendar/themes/breezy/global.js | 0 .../themes/breezy/palettes/amber.css | 0 .../themes/breezy/palettes/emerald.css | 0 .../themes/breezy/palettes/indigo.css | 0 .../themes/breezy/palettes/rose.css | 0 .../fullcalendar/themes/breezy/theme.css | 0 .../fullcalendar/themes/classic/global.js | 0 .../fullcalendar/themes/classic/palette.css | 0 .../fullcalendar/themes/classic/theme.css | 0 .../fullcalendar/themes/forma/global.js | 0 .../themes/forma/palettes/blue.css | 0 .../themes/forma/palettes/green.css | 0 .../themes/forma/palettes/purple.css | 0 .../themes/forma/palettes/red.css | 0 .../fullcalendar/themes/forma/theme.css | 0 .../fullcalendar/themes/monarch/global.js | 0 .../themes/monarch/palettes/blue.css | 0 .../themes/monarch/palettes/green.css | 0 .../themes/monarch/palettes/purple.css | 0 .../themes/monarch/palettes/red.css | 0 .../themes/monarch/palettes/yellow.css | 0 .../fullcalendar/themes/monarch/theme.css | 0 .../fullcalendar/themes/pulse/global.js | 0 .../themes/pulse/palettes/blue.css | 0 .../themes/pulse/palettes/green.css | 0 .../themes/pulse/palettes/purple.css | 0 .../themes/pulse/palettes/red.css | 0 .../fullcalendar/themes/pulse/theme.css | 0 .../htmlpurifier/HTMLPurifier.standalone.php | 0 .../ConfigSchema/Builder/ConfigSchema.php | 0 .../HTMLPurifier/ConfigSchema/Builder/Xml.php | 0 .../HTMLPurifier/ConfigSchema/Exception.php | 0 .../HTMLPurifier/ConfigSchema/Interchange.php | 0 .../ConfigSchema/Interchange/Directive.php | 0 .../ConfigSchema/Interchange/Id.php | 0 .../ConfigSchema/InterchangeBuilder.php | 0 .../HTMLPurifier/ConfigSchema/Validator.php | 0 .../ConfigSchema/ValidatorAtom.php | 0 .../HTMLPurifier/ConfigSchema/schema.ser | 0 .../schema/Attr.AllowedClasses.txt | 0 .../schema/Attr.AllowedFrameTargets.txt | 0 .../ConfigSchema/schema/Attr.AllowedRel.txt | 0 .../ConfigSchema/schema/Attr.AllowedRev.txt | 0 .../schema/Attr.ClassUseCDATA.txt | 0 .../schema/Attr.DefaultImageAlt.txt | 0 .../schema/Attr.DefaultInvalidImage.txt | 0 .../schema/Attr.DefaultInvalidImageAlt.txt | 0 .../schema/Attr.DefaultTextDir.txt | 0 .../ConfigSchema/schema/Attr.EnableID.txt | 0 .../schema/Attr.ForbiddenClasses.txt | 0 .../ConfigSchema/schema/Attr.ID.HTML5.txt | 0 .../ConfigSchema/schema/Attr.IDBlacklist.txt | 0 .../schema/Attr.IDBlacklistRegexp.txt | 0 .../ConfigSchema/schema/Attr.IDPrefix.txt | 0 .../schema/Attr.IDPrefixLocal.txt | 0 .../schema/AutoFormat.AutoParagraph.txt | 0 .../ConfigSchema/schema/AutoFormat.Custom.txt | 0 .../schema/AutoFormat.DisplayLinkURI.txt | 0 .../schema/AutoFormat.Linkify.txt | 0 .../AutoFormat.PurifierLinkify.DocURL.txt | 0 .../schema/AutoFormat.PurifierLinkify.txt | 0 .../AutoFormat.RemoveEmpty.Predicate.txt | 0 ...rmat.RemoveEmpty.RemoveNbsp.Exceptions.txt | 0 .../AutoFormat.RemoveEmpty.RemoveNbsp.txt | 0 .../schema/AutoFormat.RemoveEmpty.txt | 0 ...utoFormat.RemoveSpansWithoutAttributes.txt | 0 .../schema/CSS.AllowDuplicates.txt | 0 .../schema/CSS.AllowImportant.txt | 0 .../ConfigSchema/schema/CSS.AllowTricky.txt | 0 .../ConfigSchema/schema/CSS.AllowedFonts.txt | 0 .../schema/CSS.AllowedProperties.txt | 0 .../ConfigSchema/schema/CSS.DefinitionRev.txt | 0 .../schema/CSS.ForbiddenProperties.txt | 0 .../ConfigSchema/schema/CSS.MaxImgLength.txt | 0 .../ConfigSchema/schema/CSS.Proprietary.txt | 0 .../ConfigSchema/schema/CSS.Trusted.txt | 0 .../schema/Cache.DefinitionImpl.txt | 0 .../schema/Cache.SerializerPath.txt | 0 .../schema/Cache.SerializerPermissions.txt | 0 .../schema/Core.AggressivelyFixLt.txt | 0 .../schema/Core.AggressivelyRemoveScript.txt | 0 .../schema/Core.AllowHostnameUnderscore.txt | 0 .../schema/Core.AllowParseManyTags.txt | 0 .../schema/Core.CollectErrors.txt | 0 .../schema/Core.ColorKeywords.txt | 0 .../schema/Core.ConvertDocumentToFragment.txt | 0 .../Core.DirectLexLineNumberSyncInterval.txt | 0 .../schema/Core.DisableExcludes.txt | 0 .../ConfigSchema/schema/Core.EnableIDNA.txt | 0 .../ConfigSchema/schema/Core.Encoding.txt | 0 .../schema/Core.EscapeInvalidChildren.txt | 0 .../schema/Core.EscapeInvalidTags.txt | 0 .../schema/Core.EscapeNonASCIICharacters.txt | 0 .../schema/Core.HiddenElements.txt | 0 .../ConfigSchema/schema/Core.Language.txt | 0 .../schema/Core.LegacyEntityDecoder.txt | 0 .../ConfigSchema/schema/Core.LexerImpl.txt | 0 .../schema/Core.MaintainLineNumbers.txt | 0 .../schema/Core.NormalizeNewlines.txt | 0 .../schema/Core.RemoveInvalidImg.txt | 0 .../Core.RemoveProcessingInstructions.txt | 0 .../schema/Core.RemoveScriptContents.txt | 0 .../ConfigSchema/schema/Filter.Custom.txt | 0 .../Filter.ExtractStyleBlocks.Escaping.txt | 0 .../Filter.ExtractStyleBlocks.Scope.txt | 0 .../Filter.ExtractStyleBlocks.TidyImpl.txt | 0 .../schema/Filter.ExtractStyleBlocks.txt | 0 .../ConfigSchema/schema/Filter.YouTube.txt | 0 .../ConfigSchema/schema/HTML.Allowed.txt | 0 .../schema/HTML.AllowedAttributes.txt | 0 .../schema/HTML.AllowedComments.txt | 0 .../schema/HTML.AllowedCommentsRegexp.txt | 0 .../schema/HTML.AllowedElements.txt | 0 .../schema/HTML.AllowedModules.txt | 0 .../schema/HTML.Attr.Name.UseCDATA.txt | 0 .../ConfigSchema/schema/HTML.BlockWrapper.txt | 0 .../ConfigSchema/schema/HTML.CoreModules.txt | 0 .../schema/HTML.CustomDoctype.txt | 0 .../ConfigSchema/schema/HTML.DefinitionID.txt | 0 .../schema/HTML.DefinitionRev.txt | 0 .../ConfigSchema/schema/HTML.Doctype.txt | 0 .../schema/HTML.FlashAllowFullScreen.txt | 0 .../schema/HTML.ForbiddenAttributes.txt | 0 .../schema/HTML.ForbiddenElements.txt | 0 .../ConfigSchema/schema/HTML.Forms.txt | 0 .../ConfigSchema/schema/HTML.MaxImgLength.txt | 0 .../ConfigSchema/schema/HTML.Nofollow.txt | 0 .../ConfigSchema/schema/HTML.Parent.txt | 0 .../ConfigSchema/schema/HTML.Proprietary.txt | 0 .../ConfigSchema/schema/HTML.SafeEmbed.txt | 0 .../ConfigSchema/schema/HTML.SafeIframe.txt | 0 .../ConfigSchema/schema/HTML.SafeObject.txt | 0 .../schema/HTML.SafeScripting.txt | 0 .../ConfigSchema/schema/HTML.Strict.txt | 0 .../ConfigSchema/schema/HTML.TargetBlank.txt | 0 .../schema/HTML.TargetNoopener.txt | 0 .../schema/HTML.TargetNoreferrer.txt | 0 .../ConfigSchema/schema/HTML.TidyAdd.txt | 0 .../ConfigSchema/schema/HTML.TidyLevel.txt | 0 .../ConfigSchema/schema/HTML.TidyRemove.txt | 0 .../ConfigSchema/schema/HTML.Trusted.txt | 0 .../ConfigSchema/schema/HTML.XHTML.txt | 0 .../schema/Output.CommentScriptContents.txt | 0 .../schema/Output.FixInnerHTML.txt | 0 .../schema/Output.FlashCompat.txt | 0 .../ConfigSchema/schema/Output.Newline.txt | 0 .../ConfigSchema/schema/Output.SortAttr.txt | 0 .../ConfigSchema/schema/Output.TidyFormat.txt | 0 .../ConfigSchema/schema/Test.ForceNoIconv.txt | 0 .../schema/URI.AllowedSchemes.txt | 0 .../ConfigSchema/schema/URI.Base.txt | 0 .../ConfigSchema/schema/URI.DefaultScheme.txt | 0 .../ConfigSchema/schema/URI.DefinitionID.txt | 0 .../ConfigSchema/schema/URI.DefinitionRev.txt | 0 .../ConfigSchema/schema/URI.Disable.txt | 0 .../schema/URI.DisableExternal.txt | 0 .../schema/URI.DisableExternalResources.txt | 0 .../schema/URI.DisableResources.txt | 0 .../ConfigSchema/schema/URI.Host.txt | 0 .../ConfigSchema/schema/URI.HostBlacklist.txt | 0 .../ConfigSchema/schema/URI.MakeAbsolute.txt | 0 .../ConfigSchema/schema/URI.Munge.txt | 0 .../schema/URI.MungeResources.txt | 0 .../schema/URI.MungeSecretKey.txt | 0 .../schema/URI.OverrideAllowedSchemes.txt | 0 .../schema/URI.SafeIframeRegexp.txt | 0 .../HTMLPurifier/ConfigSchema/schema/info.ini | 0 .../DefinitionCache/Serializer/CSS/.gitkeep | 0 ...918a13a428a8482a8a449792a5a8747582b5,1.ser | Bin 0 -> 29975 bytes .../DefinitionCache/Serializer/HTML/.gitkeep | 0 ...c0a322b208e83d22d3aef33ecb184bc71d31,1.ser | Bin 0 -> 95583 bytes .../DefinitionCache/Serializer/URI/.gitkeep | 0 ...e061fc6632c745df51b43504cb541c9339de,1.ser | Bin 0 -> 516 bytes .../HTMLPurifier/EntityLookup/entities.ser | 0 .../Filter/ExtractStyleBlocks.php | 0 .../HTMLPurifier/Filter/YouTube.php | 0 .../HTMLPurifier/Language/messages/en.php | 0 .../standalone/HTMLPurifier/Lexer/PH5P.php | 0 .../standalone/HTMLPurifier/Printer.php | 0 .../HTMLPurifier/Printer/CSSDefinition.php | 0 .../HTMLPurifier/Printer/ConfigForm.css | 0 .../HTMLPurifier/Printer/ConfigForm.js | 0 .../HTMLPurifier/Printer/ConfigForm.php | 0 .../HTMLPurifier/Printer/HTMLDefinition.php | 0 {plugins => libs}/inputmask/inputmask.min.js | 0 .../inputmask/jquery.inputmask.min.js | 0 {plugins => libs}/intl-tel-input/css/demo.css | 0 .../intl-tel-input/css/intlTelInput.css | 0 .../intl-tel-input/css/intlTelInput.min.css | 0 .../intl-tel-input/img/flags.png | Bin .../intl-tel-input/img/flags.webp | Bin .../intl-tel-input/img/flags@2x.png | Bin .../intl-tel-input/img/flags@2x.webp | Bin .../intl-tel-input/img/globe.png | Bin .../intl-tel-input/img/globe.webp | Bin .../intl-tel-input/img/globe@2x.png | Bin .../intl-tel-input/img/globe@2x.webp | Bin .../intl-tel-input/img/globe_light.png | Bin .../intl-tel-input/img/globe_light.webp | Bin .../intl-tel-input/img/globe_light@2x.png | Bin .../intl-tel-input/img/globe_light@2x.webp | Bin {plugins => libs}/intl-tel-input/js/data.js | 0 .../intl-tel-input/js/data.min.js | 0 .../intl-tel-input/js/i18n/ar/countries.js | 0 .../intl-tel-input/js/i18n/ar/index.js | 0 .../intl-tel-input/js/i18n/ar/interface.js | 0 .../intl-tel-input/js/i18n/bg/countries.js | 0 .../intl-tel-input/js/i18n/bg/index.js | 0 .../intl-tel-input/js/i18n/bg/interface.js | 0 .../intl-tel-input/js/i18n/bn/countries.js | 0 .../intl-tel-input/js/i18n/bn/index.js | 0 .../intl-tel-input/js/i18n/bn/interface.js | 0 .../intl-tel-input/js/i18n/bs/countries.js | 0 .../intl-tel-input/js/i18n/bs/index.js | 0 .../intl-tel-input/js/i18n/bs/interface.js | 0 .../intl-tel-input/js/i18n/ca/countries.js | 0 .../intl-tel-input/js/i18n/ca/index.js | 0 .../intl-tel-input/js/i18n/ca/interface.js | 0 .../intl-tel-input/js/i18n/cs/countries.js | 0 .../intl-tel-input/js/i18n/cs/index.js | 0 .../intl-tel-input/js/i18n/cs/interface.js | 0 .../intl-tel-input/js/i18n/da/countries.js | 0 .../intl-tel-input/js/i18n/da/index.js | 0 .../intl-tel-input/js/i18n/da/interface.js | 0 .../intl-tel-input/js/i18n/de/countries.js | 0 .../intl-tel-input/js/i18n/de/index.js | 0 .../intl-tel-input/js/i18n/de/interface.js | 0 .../intl-tel-input/js/i18n/el/countries.js | 0 .../intl-tel-input/js/i18n/el/index.js | 0 .../intl-tel-input/js/i18n/el/interface.js | 0 .../intl-tel-input/js/i18n/en/countries.js | 0 .../intl-tel-input/js/i18n/en/index.js | 0 .../intl-tel-input/js/i18n/en/interface.js | 0 .../intl-tel-input/js/i18n/es/countries.js | 0 .../intl-tel-input/js/i18n/es/index.js | 0 .../intl-tel-input/js/i18n/es/interface.js | 0 .../intl-tel-input/js/i18n/fa/countries.js | 0 .../intl-tel-input/js/i18n/fa/index.js | 0 .../intl-tel-input/js/i18n/fa/interface.js | 0 .../intl-tel-input/js/i18n/fi/countries.js | 0 .../intl-tel-input/js/i18n/fi/index.js | 0 .../intl-tel-input/js/i18n/fi/interface.js | 0 .../intl-tel-input/js/i18n/fr/countries.js | 0 .../intl-tel-input/js/i18n/fr/index.js | 0 .../intl-tel-input/js/i18n/fr/interface.js | 0 .../intl-tel-input/js/i18n/hi/countries.js | 0 .../intl-tel-input/js/i18n/hi/index.js | 0 .../intl-tel-input/js/i18n/hi/interface.js | 0 .../intl-tel-input/js/i18n/hr/countries.js | 0 .../intl-tel-input/js/i18n/hr/index.js | 0 .../intl-tel-input/js/i18n/hr/interface.js | 0 .../intl-tel-input/js/i18n/hu/countries.js | 0 .../intl-tel-input/js/i18n/hu/index.js | 0 .../intl-tel-input/js/i18n/hu/interface.js | 0 .../intl-tel-input/js/i18n/id/countries.js | 0 .../intl-tel-input/js/i18n/id/index.js | 0 .../intl-tel-input/js/i18n/id/interface.js | 0 .../intl-tel-input/js/i18n/index.js | 0 .../intl-tel-input/js/i18n/it/countries.js | 0 .../intl-tel-input/js/i18n/it/index.js | 0 .../intl-tel-input/js/i18n/it/interface.js | 0 .../intl-tel-input/js/i18n/ja/countries.js | 0 .../intl-tel-input/js/i18n/ja/index.js | 0 .../intl-tel-input/js/i18n/ja/interface.js | 0 .../intl-tel-input/js/i18n/ko/countries.js | 0 .../intl-tel-input/js/i18n/ko/index.js | 0 .../intl-tel-input/js/i18n/ko/interface.js | 0 .../intl-tel-input/js/i18n/mr/countries.js | 0 .../intl-tel-input/js/i18n/mr/index.js | 0 .../intl-tel-input/js/i18n/mr/interface.js | 0 .../intl-tel-input/js/i18n/nl/countries.js | 0 .../intl-tel-input/js/i18n/nl/index.js | 0 .../intl-tel-input/js/i18n/nl/interface.js | 0 .../intl-tel-input/js/i18n/no/countries.js | 0 .../intl-tel-input/js/i18n/no/index.js | 0 .../intl-tel-input/js/i18n/no/interface.js | 0 .../intl-tel-input/js/i18n/pl/countries.js | 0 .../intl-tel-input/js/i18n/pl/index.js | 0 .../intl-tel-input/js/i18n/pl/interface.js | 0 .../intl-tel-input/js/i18n/pt/countries.js | 0 .../intl-tel-input/js/i18n/pt/index.js | 0 .../intl-tel-input/js/i18n/pt/interface.js | 0 .../intl-tel-input/js/i18n/ro/countries.js | 0 .../intl-tel-input/js/i18n/ro/index.js | 0 .../intl-tel-input/js/i18n/ro/interface.js | 0 .../intl-tel-input/js/i18n/ru/countries.js | 0 .../intl-tel-input/js/i18n/ru/index.js | 0 .../intl-tel-input/js/i18n/ru/interface.js | 0 .../intl-tel-input/js/i18n/sk/countries.js | 0 .../intl-tel-input/js/i18n/sk/index.js | 0 .../intl-tel-input/js/i18n/sk/interface.js | 0 .../intl-tel-input/js/i18n/sv/countries.js | 0 .../intl-tel-input/js/i18n/sv/index.js | 0 .../intl-tel-input/js/i18n/sv/interface.js | 0 .../intl-tel-input/js/i18n/te/countries.js | 0 .../intl-tel-input/js/i18n/te/index.js | 0 .../intl-tel-input/js/i18n/te/interface.js | 0 .../intl-tel-input/js/i18n/th/countries.js | 0 .../intl-tel-input/js/i18n/th/index.js | 0 .../intl-tel-input/js/i18n/th/interface.js | 0 .../intl-tel-input/js/i18n/tr/countries.js | 0 .../intl-tel-input/js/i18n/tr/index.js | 0 .../intl-tel-input/js/i18n/tr/interface.js | 0 .../intl-tel-input/js/i18n/uk/countries.js | 0 .../intl-tel-input/js/i18n/uk/index.js | 0 .../intl-tel-input/js/i18n/uk/interface.js | 0 .../intl-tel-input/js/i18n/ur/countries.js | 0 .../intl-tel-input/js/i18n/ur/index.js | 0 .../intl-tel-input/js/i18n/ur/interface.js | 0 .../intl-tel-input/js/i18n/vi/countries.js | 0 .../intl-tel-input/js/i18n/vi/index.js | 0 .../intl-tel-input/js/i18n/vi/interface.js | 0 .../intl-tel-input/js/i18n/zh/countries.js | 0 .../intl-tel-input/js/i18n/zh/index.js | 0 .../intl-tel-input/js/i18n/zh/interface.js | 0 .../intl-tel-input/js/intlTelInput.d.ts | 0 .../intl-tel-input/js/intlTelInput.js | 0 .../intl-tel-input/js/intlTelInput.min.js | 0 .../js/intlTelInputWithUtils.js | 0 .../js/intlTelInputWithUtils.min.js | 0 {plugins => libs}/intl-tel-input/js/utils.js | 0 {plugins => libs}/jquery-ui/VERSION | 0 {plugins => libs}/jquery-ui/jquery-ui.min.css | 0 {plugins => libs}/jquery-ui/jquery-ui.min.js | 0 {plugins => libs}/jquery/jquery.min.js | 0 {plugins => libs}/moment/moment.min.js | 0 .../pdfmake/fonts/Roboto/Roboto-Italic.ttf | Bin .../pdfmake/fonts/Roboto/Roboto-Medium.ttf | Bin .../fonts/Roboto/Roboto-MediumItalic.ttf | Bin .../pdfmake/fonts/Roboto/Roboto-Regular.ttf | Bin {plugins => libs}/pdfmake/pdfmake.min.js | 0 {plugins => libs}/pdfmake/vfs_fonts.js | 0 {plugins => libs}/popper/popper-utils.min.js | 0 {plugins => libs}/popper/popper.min.js | 0 .../select2-bootstrap4.min.css | 0 {plugins => libs}/select2/css/select2.min.css | 0 {plugins => libs}/select2/js/i18n/af.js | 0 {plugins => libs}/select2/js/i18n/ar.js | 0 {plugins => libs}/select2/js/i18n/az.js | 0 {plugins => libs}/select2/js/i18n/bg.js | 0 {plugins => libs}/select2/js/i18n/bn.js | 0 {plugins => libs}/select2/js/i18n/bs.js | 0 {plugins => libs}/select2/js/i18n/build.txt | 0 {plugins => libs}/select2/js/i18n/ca.js | 0 {plugins => libs}/select2/js/i18n/cs.js | 0 {plugins => libs}/select2/js/i18n/da.js | 0 {plugins => libs}/select2/js/i18n/de.js | 0 {plugins => libs}/select2/js/i18n/dsb.js | 0 {plugins => libs}/select2/js/i18n/el.js | 0 {plugins => libs}/select2/js/i18n/en.js | 0 {plugins => libs}/select2/js/i18n/es.js | 0 {plugins => libs}/select2/js/i18n/et.js | 0 {plugins => libs}/select2/js/i18n/eu.js | 0 {plugins => libs}/select2/js/i18n/fa.js | 0 {plugins => libs}/select2/js/i18n/fi.js | 0 {plugins => libs}/select2/js/i18n/fr.js | 0 {plugins => libs}/select2/js/i18n/gl.js | 0 {plugins => libs}/select2/js/i18n/he.js | 0 {plugins => libs}/select2/js/i18n/hi.js | 0 {plugins => libs}/select2/js/i18n/hr.js | 0 {plugins => libs}/select2/js/i18n/hsb.js | 0 {plugins => libs}/select2/js/i18n/hu.js | 0 {plugins => libs}/select2/js/i18n/hy.js | 0 {plugins => libs}/select2/js/i18n/id.js | 0 {plugins => libs}/select2/js/i18n/is.js | 0 {plugins => libs}/select2/js/i18n/it.js | 0 {plugins => libs}/select2/js/i18n/ja.js | 0 {plugins => libs}/select2/js/i18n/ka.js | 0 {plugins => libs}/select2/js/i18n/km.js | 0 {plugins => libs}/select2/js/i18n/ko.js | 0 {plugins => libs}/select2/js/i18n/lt.js | 0 {plugins => libs}/select2/js/i18n/lv.js | 0 {plugins => libs}/select2/js/i18n/mk.js | 0 {plugins => libs}/select2/js/i18n/ms.js | 0 {plugins => libs}/select2/js/i18n/nb.js | 0 {plugins => libs}/select2/js/i18n/ne.js | 0 {plugins => libs}/select2/js/i18n/nl.js | 0 {plugins => libs}/select2/js/i18n/pl.js | 0 {plugins => libs}/select2/js/i18n/ps.js | 0 {plugins => libs}/select2/js/i18n/pt-BR.js | 0 {plugins => libs}/select2/js/i18n/pt.js | 0 {plugins => libs}/select2/js/i18n/ro.js | 0 {plugins => libs}/select2/js/i18n/ru.js | 0 {plugins => libs}/select2/js/i18n/sk.js | 0 {plugins => libs}/select2/js/i18n/sl.js | 0 {plugins => libs}/select2/js/i18n/sq.js | 0 {plugins => libs}/select2/js/i18n/sr-Cyrl.js | 0 {plugins => libs}/select2/js/i18n/sr.js | 0 {plugins => libs}/select2/js/i18n/sv.js | 0 {plugins => libs}/select2/js/i18n/th.js | 0 {plugins => libs}/select2/js/i18n/tk.js | 0 {plugins => libs}/select2/js/i18n/tr.js | 0 {plugins => libs}/select2/js/i18n/uk.js | 0 {plugins => libs}/select2/js/i18n/vi.js | 0 {plugins => libs}/select2/js/i18n/zh-CN.js | 0 {plugins => libs}/select2/js/i18n/zh-TW.js | 0 .../select2/js/select2.full.min.js | 0 {plugins => libs}/select2/js/select2.min.js | 0 .../stripe-php/.claude/CLAUDE.md | 0 {plugins => libs}/stripe-php/.gitignore | 0 {plugins => libs}/stripe-php/CHANGELOG.md | 0 {plugins => libs}/stripe-php/CODEGEN_VERSION | 0 {plugins => libs}/stripe-php/CONTRIBUTING.md | 0 {plugins => libs}/stripe-php/LICENSE | 0 {plugins => libs}/stripe-php/OPENAPI_VERSION | 0 {plugins => libs}/stripe-php/README.md | 0 {plugins => libs}/stripe-php/VERSION | 0 {plugins => libs}/stripe-php/composer.json | 0 .../stripe-php/data/ca-certificates.crt | 0 {plugins => libs}/stripe-php/init.php | 0 {plugins => libs}/stripe-php/justfile | 0 {plugins => libs}/stripe-php/lib/Account.php | 0 .../stripe-php/lib/AccountLink.php | 0 .../stripe-php/lib/AccountSession.php | 0 .../stripe-php/lib/ApiOperations/All.php | 0 .../stripe-php/lib/ApiOperations/Create.php | 0 .../stripe-php/lib/ApiOperations/Delete.php | 0 .../lib/ApiOperations/NestedResource.php | 0 .../stripe-php/lib/ApiOperations/Request.php | 0 .../stripe-php/lib/ApiOperations/Retrieve.php | 0 .../lib/ApiOperations/SingletonRetrieve.php | 0 .../stripe-php/lib/ApiOperations/Update.php | 0 .../stripe-php/lib/ApiRequestor.php | 0 .../stripe-php/lib/ApiResource.php | 0 .../stripe-php/lib/ApiResponse.php | 0 .../stripe-php/lib/ApplePayDomain.php | 0 .../stripe-php/lib/Application.php | 0 .../stripe-php/lib/ApplicationFee.php | 0 .../stripe-php/lib/ApplicationFeeRefund.php | 0 .../stripe-php/lib/Apps/Secret.php | 0 {plugins => libs}/stripe-php/lib/Balance.php | 0 .../stripe-php/lib/BalanceSettings.php | 0 .../stripe-php/lib/BalanceTransaction.php | 0 .../stripe-php/lib/BankAccount.php | 0 .../stripe-php/lib/BaseStripeClient.php | 0 .../lib/BaseStripeClientInterface.php | 0 .../stripe-php/lib/Billing/Alert.php | 0 .../stripe-php/lib/Billing/AlertTriggered.php | 0 .../lib/Billing/CreditBalanceSummary.php | 0 .../lib/Billing/CreditBalanceTransaction.php | 0 .../stripe-php/lib/Billing/CreditGrant.php | 0 .../stripe-php/lib/Billing/Meter.php | 0 .../stripe-php/lib/Billing/MeterEvent.php | 0 .../lib/Billing/MeterEventAdjustment.php | 0 .../lib/Billing/MeterEventSummary.php | 0 .../lib/BillingPortal/Configuration.php | 0 .../stripe-php/lib/BillingPortal/Session.php | 0 .../stripe-php/lib/Capability.php | 0 {plugins => libs}/stripe-php/lib/Card.php | 0 .../stripe-php/lib/CashBalance.php | 0 {plugins => libs}/stripe-php/lib/Charge.php | 0 .../stripe-php/lib/Checkout/Session.php | 0 .../stripe-php/lib/Climate/Order.php | 0 .../stripe-php/lib/Climate/Product.php | 0 .../stripe-php/lib/Climate/Supplier.php | 0 .../stripe-php/lib/Collection.php | 0 .../stripe-php/lib/ConfirmationToken.php | 0 .../lib/ConnectCollectionTransfer.php | 0 .../stripe-php/lib/CountrySpec.php | 0 {plugins => libs}/stripe-php/lib/Coupon.php | 0 .../stripe-php/lib/CreditNote.php | 0 .../stripe-php/lib/CreditNoteLineItem.php | 0 {plugins => libs}/stripe-php/lib/Customer.php | 0 .../lib/CustomerBalanceTransaction.php | 0 .../lib/CustomerCashBalanceTransaction.php | 0 .../stripe-php/lib/CustomerSession.php | 0 {plugins => libs}/stripe-php/lib/Discount.php | 0 {plugins => libs}/stripe-php/lib/Dispute.php | 0 .../lib/Entitlements/ActiveEntitlement.php | 0 .../Entitlements/ActiveEntitlementSummary.php | 0 .../stripe-php/lib/Entitlements/Feature.php | 0 .../stripe-php/lib/EphemeralKey.php | 0 .../stripe-php/lib/ErrorObject.php | 0 {plugins => libs}/stripe-php/lib/Event.php | 0 ...lingMeterErrorReportTriggeredEventData.php | 0 .../V1BillingMeterNoMeterFoundEventData.php | 0 ...stomerCapabilityStatusUpdatedEventData.php | 0 ...rchantCapabilityStatusUpdatedEventData.php | 0 ...ipientCapabilityStatusUpdatedEventData.php | 0 .../V2CoreAccountLinkReturnedEventData.php | 0 .../V2CoreAccountPersonCreatedEventData.php | 0 .../V2CoreAccountPersonDeletedEventData.php | 0 .../V2CoreAccountPersonUpdatedEventData.php | 0 .../lib/Events/UnknownEventNotification.php | 0 ...1BillingMeterErrorReportTriggeredEvent.php | 0 ...rErrorReportTriggeredEventNotification.php | 0 .../V1BillingMeterNoMeterFoundEvent.php | 0 ...lingMeterNoMeterFoundEventNotification.php | 0 .../lib/Events/V2CoreAccountClosedEvent.php | 0 .../V2CoreAccountClosedEventNotification.php | 0 .../lib/Events/V2CoreAccountCreatedEvent.php | 0 .../V2CoreAccountCreatedEventNotification.php | 0 ...onCustomerCapabilityStatusUpdatedEvent.php | 0 ...pabilityStatusUpdatedEventNotification.php | 0 ...udingConfigurationCustomerUpdatedEvent.php | 0 ...rationCustomerUpdatedEventNotification.php | 0 ...onMerchantCapabilityStatusUpdatedEvent.php | 0 ...pabilityStatusUpdatedEventNotification.php | 0 ...udingConfigurationMerchantUpdatedEvent.php | 0 ...rationMerchantUpdatedEventNotification.php | 0 ...nRecipientCapabilityStatusUpdatedEvent.php | 0 ...pabilityStatusUpdatedEventNotification.php | 0 ...dingConfigurationRecipientUpdatedEvent.php | 0 ...ationRecipientUpdatedEventNotification.php | 0 ...reAccountIncludingDefaultsUpdatedEvent.php | 0 ...ludingDefaultsUpdatedEventNotification.php | 0 ...ncludingFutureRequirementsUpdatedEvent.php | 0 ...reRequirementsUpdatedEventNotification.php | 0 ...reAccountIncludingIdentityUpdatedEvent.php | 0 ...ludingIdentityUpdatedEventNotification.php | 0 ...countIncludingRequirementsUpdatedEvent.php | 0 ...ngRequirementsUpdatedEventNotification.php | 0 .../Events/V2CoreAccountLinkReturnedEvent.php | 0 ...reAccountLinkReturnedEventNotification.php | 0 .../V2CoreAccountPersonCreatedEvent.php | 0 ...eAccountPersonCreatedEventNotification.php | 0 .../V2CoreAccountPersonDeletedEvent.php | 0 ...eAccountPersonDeletedEventNotification.php | 0 .../V2CoreAccountPersonUpdatedEvent.php | 0 ...eAccountPersonUpdatedEventNotification.php | 0 .../lib/Events/V2CoreAccountUpdatedEvent.php | 0 .../V2CoreAccountUpdatedEventNotification.php | 0 .../V2CoreEventDestinationPingEvent.php | 0 ...eEventDestinationPingEventNotification.php | 0 .../lib/Exception/ApiConnectionException.php | 0 .../lib/Exception/ApiErrorException.php | 0 .../lib/Exception/AuthenticationException.php | 0 .../lib/Exception/BadMethodCallException.php | 0 .../lib/Exception/CardException.php | 0 .../lib/Exception/ExceptionInterface.php | 0 .../lib/Exception/IdempotencyException.php | 0 .../Exception/InvalidArgumentException.php | 0 .../lib/Exception/InvalidRequestException.php | 0 .../Exception/OAuth/ExceptionInterface.php | 0 .../OAuth/InvalidClientException.php | 0 .../Exception/OAuth/InvalidGrantException.php | 0 .../OAuth/InvalidRequestException.php | 0 .../Exception/OAuth/InvalidScopeException.php | 0 .../Exception/OAuth/OAuthErrorException.php | 0 .../OAuth/UnknownOAuthErrorException.php | 0 .../OAuth/UnsupportedGrantTypeException.php | 0 .../UnsupportedResponseTypeException.php | 0 .../lib/Exception/PermissionException.php | 0 .../lib/Exception/RateLimitException.php | 0 .../SignatureVerificationException.php | 0 .../TemporarySessionExpiredException.php | 0 .../Exception/UnexpectedValueException.php | 0 .../Exception/UnknownApiErrorException.php | 0 .../stripe-php/lib/ExchangeRate.php | 0 {plugins => libs}/stripe-php/lib/File.php | 0 {plugins => libs}/stripe-php/lib/FileLink.php | 0 .../lib/FinancialConnections/Account.php | 0 .../lib/FinancialConnections/AccountOwner.php | 0 .../FinancialConnections/AccountOwnership.php | 0 .../lib/FinancialConnections/Session.php | 0 .../lib/FinancialConnections/Transaction.php | 0 .../stripe-php/lib/Forwarding/Request.php | 0 .../stripe-php/lib/FundingInstructions.php | 0 .../lib/HttpClient/ClientInterface.php | 0 .../stripe-php/lib/HttpClient/CurlClient.php | 0 .../HttpClient/StreamingClientInterface.php | 0 .../lib/Identity/VerificationReport.php | 0 .../lib/Identity/VerificationSession.php | 0 {plugins => libs}/stripe-php/lib/Invoice.php | 0 .../stripe-php/lib/InvoiceItem.php | 0 .../stripe-php/lib/InvoiceLineItem.php | 0 .../stripe-php/lib/InvoicePayment.php | 0 .../lib/InvoiceRenderingTemplate.php | 0 .../stripe-php/lib/Issuing/Authorization.php | 0 .../stripe-php/lib/Issuing/Card.php | 0 .../stripe-php/lib/Issuing/CardDetails.php | 0 .../stripe-php/lib/Issuing/Cardholder.php | 0 .../stripe-php/lib/Issuing/Dispute.php | 0 .../lib/Issuing/PersonalizationDesign.php | 0 .../stripe-php/lib/Issuing/PhysicalBundle.php | 0 .../stripe-php/lib/Issuing/Token.php | 0 .../stripe-php/lib/Issuing/Transaction.php | 0 {plugins => libs}/stripe-php/lib/LineItem.php | 0 .../stripe-php/lib/LoginLink.php | 0 {plugins => libs}/stripe-php/lib/Mandate.php | 0 {plugins => libs}/stripe-php/lib/OAuth.php | 0 .../stripe-php/lib/OAuthErrorObject.php | 0 .../stripe-php/lib/PaymentAttemptRecord.php | 0 .../stripe-php/lib/PaymentIntent.php | 0 .../PaymentIntentAmountDetailsLineItem.php | 0 .../stripe-php/lib/PaymentLink.php | 0 .../stripe-php/lib/PaymentMethod.php | 0 .../lib/PaymentMethodConfiguration.php | 0 .../stripe-php/lib/PaymentMethodDomain.php | 0 .../stripe-php/lib/PaymentRecord.php | 0 {plugins => libs}/stripe-php/lib/Payout.php | 0 {plugins => libs}/stripe-php/lib/Person.php | 0 {plugins => libs}/stripe-php/lib/Plan.php | 0 {plugins => libs}/stripe-php/lib/Price.php | 0 {plugins => libs}/stripe-php/lib/Product.php | 0 .../stripe-php/lib/ProductFeature.php | 0 .../stripe-php/lib/PromotionCode.php | 0 {plugins => libs}/stripe-php/lib/Quote.php | 0 .../lib/Radar/EarlyFraudWarning.php | 0 .../lib/Radar/PaymentEvaluation.php | 0 .../stripe-php/lib/Radar/ValueList.php | 0 .../stripe-php/lib/Radar/ValueListItem.php | 0 {plugins => libs}/stripe-php/lib/Reason.php | 0 .../stripe-php/lib/RecipientTransfer.php | 0 {plugins => libs}/stripe-php/lib/Refund.php | 0 .../stripe-php/lib/RelatedObject.php | 0 .../stripe-php/lib/Reporting/ReportRun.php | 0 .../stripe-php/lib/Reporting/ReportType.php | 0 .../stripe-php/lib/RequestTelemetry.php | 0 .../stripe-php/lib/Reserve/Hold.php | 0 .../stripe-php/lib/Reserve/Plan.php | 0 .../stripe-php/lib/Reserve/Release.php | 0 .../stripe-php/lib/ReserveTransaction.php | 0 {plugins => libs}/stripe-php/lib/Review.php | 0 .../stripe-php/lib/SearchResult.php | 0 .../lib/Service/AbstractService.php | 0 .../lib/Service/AbstractServiceFactory.php | 0 .../lib/Service/AccountLinkService.php | 0 .../stripe-php/lib/Service/AccountService.php | 0 .../lib/Service/AccountSessionService.php | 0 .../lib/Service/ApplePayDomainService.php | 0 .../lib/Service/ApplicationFeeService.php | 0 .../lib/Service/Apps/AppsServiceFactory.php | 0 .../lib/Service/Apps/SecretService.php | 0 .../stripe-php/lib/Service/BalanceService.php | 0 .../lib/Service/BalanceSettingsService.php | 0 .../lib/Service/BalanceTransactionService.php | 0 .../lib/Service/Billing/AlertService.php | 0 .../Service/Billing/BillingServiceFactory.php | 0 .../Billing/CreditBalanceSummaryService.php | 0 .../CreditBalanceTransactionService.php | 0 .../Service/Billing/CreditGrantService.php | 0 .../Billing/MeterEventAdjustmentService.php | 0 .../lib/Service/Billing/MeterEventService.php | 0 .../lib/Service/Billing/MeterService.php | 0 .../BillingPortalServiceFactory.php | 0 .../BillingPortal/ConfigurationService.php | 0 .../Service/BillingPortal/SessionService.php | 0 .../stripe-php/lib/Service/ChargeService.php | 0 .../Checkout/CheckoutServiceFactory.php | 0 .../lib/Service/Checkout/SessionService.php | 0 .../Service/Climate/ClimateServiceFactory.php | 0 .../lib/Service/Climate/OrderService.php | 0 .../lib/Service/Climate/ProductService.php | 0 .../lib/Service/Climate/SupplierService.php | 0 .../lib/Service/ConfirmationTokenService.php | 0 .../lib/Service/CoreServiceFactory.php | 0 .../lib/Service/CountrySpecService.php | 0 .../stripe-php/lib/Service/CouponService.php | 0 .../lib/Service/CreditNoteService.php | 0 .../lib/Service/CustomerService.php | 0 .../lib/Service/CustomerSessionService.php | 0 .../stripe-php/lib/Service/DisputeService.php | 0 .../Entitlements/ActiveEntitlementService.php | 0 .../EntitlementsServiceFactory.php | 0 .../Service/Entitlements/FeatureService.php | 0 .../lib/Service/EphemeralKeyService.php | 0 .../stripe-php/lib/Service/EventService.php | 0 .../lib/Service/ExchangeRateService.php | 0 .../lib/Service/FileLinkService.php | 0 .../stripe-php/lib/Service/FileService.php | 0 .../FinancialConnections/AccountService.php | 0 .../FinancialConnectionsServiceFactory.php | 0 .../FinancialConnections/SessionService.php | 0 .../TransactionService.php | 0 .../Forwarding/ForwardingServiceFactory.php | 0 .../lib/Service/Forwarding/RequestService.php | 0 .../Identity/IdentityServiceFactory.php | 0 .../Identity/VerificationReportService.php | 0 .../Identity/VerificationSessionService.php | 0 .../lib/Service/InvoiceItemService.php | 0 .../lib/Service/InvoicePaymentService.php | 0 .../InvoiceRenderingTemplateService.php | 0 .../stripe-php/lib/Service/InvoiceService.php | 0 .../Service/Issuing/AuthorizationService.php | 0 .../lib/Service/Issuing/CardService.php | 0 .../lib/Service/Issuing/CardholderService.php | 0 .../lib/Service/Issuing/DisputeService.php | 0 .../Service/Issuing/IssuingServiceFactory.php | 0 .../Issuing/PersonalizationDesignService.php | 0 .../Service/Issuing/PhysicalBundleService.php | 0 .../lib/Service/Issuing/TokenService.php | 0 .../Service/Issuing/TransactionService.php | 0 .../stripe-php/lib/Service/MandateService.php | 0 .../stripe-php/lib/Service/OAuthService.php | 0 .../Service/PaymentAttemptRecordService.php | 0 .../lib/Service/PaymentIntentService.php | 0 .../lib/Service/PaymentLinkService.php | 0 .../PaymentMethodConfigurationService.php | 0 .../Service/PaymentMethodDomainService.php | 0 .../lib/Service/PaymentMethodService.php | 0 .../lib/Service/PaymentRecordService.php | 0 .../stripe-php/lib/Service/PayoutService.php | 0 .../stripe-php/lib/Service/PlanService.php | 0 .../stripe-php/lib/Service/PriceService.php | 0 .../stripe-php/lib/Service/ProductService.php | 0 .../lib/Service/PromotionCodeService.php | 0 .../stripe-php/lib/Service/QuoteService.php | 0 .../Radar/EarlyFraudWarningService.php | 0 .../Radar/PaymentEvaluationService.php | 0 .../lib/Service/Radar/RadarServiceFactory.php | 0 .../Service/Radar/ValueListItemService.php | 0 .../lib/Service/Radar/ValueListService.php | 0 .../stripe-php/lib/Service/RefundService.php | 0 .../Service/Reporting/ReportRunService.php | 0 .../Service/Reporting/ReportTypeService.php | 0 .../Reporting/ReportingServiceFactory.php | 0 .../stripe-php/lib/Service/ReviewService.php | 0 .../lib/Service/ServiceNavigatorTrait.php | 0 .../lib/Service/SetupAttemptService.php | 0 .../lib/Service/SetupIntentService.php | 0 .../lib/Service/ShippingRateService.php | 0 .../Sigma/ScheduledQueryRunService.php | 0 .../lib/Service/Sigma/SigmaServiceFactory.php | 0 .../stripe-php/lib/Service/SourceService.php | 0 .../lib/Service/SubscriptionItemService.php | 0 .../Service/SubscriptionScheduleService.php | 0 .../lib/Service/SubscriptionService.php | 0 .../lib/Service/Tax/AssociationService.php | 0 .../lib/Service/Tax/CalculationService.php | 0 .../lib/Service/Tax/RegistrationService.php | 0 .../lib/Service/Tax/SettingsService.php | 0 .../lib/Service/Tax/TaxServiceFactory.php | 0 .../lib/Service/Tax/TransactionService.php | 0 .../stripe-php/lib/Service/TaxCodeService.php | 0 .../stripe-php/lib/Service/TaxIdService.php | 0 .../stripe-php/lib/Service/TaxRateService.php | 0 .../Service/Terminal/ConfigurationService.php | 0 .../Terminal/ConnectionTokenService.php | 0 .../lib/Service/Terminal/LocationService.php | 0 .../Terminal/OnboardingLinkService.php | 0 .../lib/Service/Terminal/ReaderService.php | 0 .../Terminal/TerminalServiceFactory.php | 0 .../TestHelpers/ConfirmationTokenService.php | 0 .../Service/TestHelpers/CustomerService.php | 0 .../Issuing/AuthorizationService.php | 0 .../TestHelpers/Issuing/CardService.php | 0 .../Issuing/IssuingServiceFactory.php | 0 .../Issuing/PersonalizationDesignService.php | 0 .../Issuing/TransactionService.php | 0 .../lib/Service/TestHelpers/RefundService.php | 0 .../TestHelpers/Terminal/ReaderService.php | 0 .../Terminal/TerminalServiceFactory.php | 0 .../Service/TestHelpers/TestClockService.php | 0 .../TestHelpers/TestHelpersServiceFactory.php | 0 .../Treasury/InboundTransferService.php | 0 .../Treasury/OutboundPaymentService.php | 0 .../Treasury/OutboundTransferService.php | 0 .../Treasury/ReceivedCreditService.php | 0 .../Treasury/ReceivedDebitService.php | 0 .../Treasury/TreasuryServiceFactory.php | 0 .../stripe-php/lib/Service/TokenService.php | 0 .../stripe-php/lib/Service/TopupService.php | 0 .../lib/Service/TransferService.php | 0 .../Treasury/CreditReversalService.php | 0 .../Service/Treasury/DebitReversalService.php | 0 .../Treasury/FinancialAccountService.php | 0 .../Treasury/InboundTransferService.php | 0 .../Treasury/OutboundPaymentService.php | 0 .../Treasury/OutboundTransferService.php | 0 .../Treasury/ReceivedCreditService.php | 0 .../Service/Treasury/ReceivedDebitService.php | 0 .../Treasury/TransactionEntryService.php | 0 .../Service/Treasury/TransactionService.php | 0 .../Treasury/TreasuryServiceFactory.php | 0 .../V2/Billing/BillingServiceFactory.php | 0 .../Billing/MeterEventAdjustmentService.php | 0 .../Service/V2/Billing/MeterEventService.php | 0 .../V2/Billing/MeterEventSessionService.php | 0 .../V2/Billing/MeterEventStreamService.php | 0 .../Service/V2/Core/AccountLinkService.php | 0 .../lib/Service/V2/Core/AccountService.php | 0 .../Service/V2/Core/AccountTokenService.php | 0 .../V2/Core/Accounts/PersonService.php | 0 .../V2/Core/Accounts/PersonTokenService.php | 0 .../Service/V2/Core/CoreServiceFactory.php | 0 .../V2/Core/EventDestinationService.php | 0 .../lib/Service/V2/Core/EventService.php | 0 .../lib/Service/V2/V2ServiceFactory.php | 0 .../lib/Service/WebhookEndpointService.php | 0 .../stripe-php/lib/SetupAttempt.php | 0 .../stripe-php/lib/SetupIntent.php | 0 .../stripe-php/lib/ShippingRate.php | 0 .../lib/Sigma/ScheduledQueryRun.php | 0 .../stripe-php/lib/SingletonApiResource.php | 0 {plugins => libs}/stripe-php/lib/Source.php | 0 .../lib/SourceMandateNotification.php | 0 .../stripe-php/lib/SourceTransaction.php | 0 {plugins => libs}/stripe-php/lib/Stripe.php | 0 .../stripe-php/lib/StripeClient.php | 0 .../stripe-php/lib/StripeClientInterface.php | 0 .../stripe-php/lib/StripeContext.php | 0 .../stripe-php/lib/StripeObject.php | 0 .../lib/StripeStreamingClientInterface.php | 0 .../stripe-php/lib/Subscription.php | 0 .../stripe-php/lib/SubscriptionItem.php | 0 .../stripe-php/lib/SubscriptionSchedule.php | 0 .../stripe-php/lib/Tax/Association.php | 0 .../stripe-php/lib/Tax/Calculation.php | 0 .../lib/Tax/CalculationLineItem.php | 0 .../stripe-php/lib/Tax/Registration.php | 0 .../stripe-php/lib/Tax/Settings.php | 0 .../stripe-php/lib/Tax/Transaction.php | 0 .../lib/Tax/TransactionLineItem.php | 0 {plugins => libs}/stripe-php/lib/TaxCode.php | 0 .../stripe-php/lib/TaxDeductedAtSource.php | 0 {plugins => libs}/stripe-php/lib/TaxId.php | 0 {plugins => libs}/stripe-php/lib/TaxRate.php | 0 .../stripe-php/lib/Terminal/Configuration.php | 0 .../lib/Terminal/ConnectionToken.php | 0 .../stripe-php/lib/Terminal/Location.php | 0 .../lib/Terminal/OnboardingLink.php | 0 .../stripe-php/lib/Terminal/Reader.php | 0 .../stripe-php/lib/TestHelpers/TestClock.php | 0 {plugins => libs}/stripe-php/lib/Token.php | 0 {plugins => libs}/stripe-php/lib/Topup.php | 0 {plugins => libs}/stripe-php/lib/Transfer.php | 0 .../stripe-php/lib/TransferReversal.php | 0 .../lib/Treasury/CreditReversal.php | 0 .../stripe-php/lib/Treasury/DebitReversal.php | 0 .../lib/Treasury/FinancialAccount.php | 0 .../lib/Treasury/FinancialAccountFeatures.php | 0 .../lib/Treasury/InboundTransfer.php | 0 .../lib/Treasury/OutboundPayment.php | 0 .../lib/Treasury/OutboundTransfer.php | 0 .../lib/Treasury/ReceivedCredit.php | 0 .../stripe-php/lib/Treasury/ReceivedDebit.php | 0 .../stripe-php/lib/Treasury/Transaction.php | 0 .../lib/Treasury/TransactionEntry.php | 0 .../stripe-php/lib/Util/ApiVersion.php | 0 .../lib/Util/CaseInsensitiveArray.php | 0 .../stripe-php/lib/Util/DefaultLogger.php | 0 .../lib/Util/EventNotificationTypes.php | 0 .../stripe-php/lib/Util/EventTypes.php | 0 .../stripe-php/lib/Util/LoggerInterface.php | 0 .../stripe-php/lib/Util/ObjectTypes.php | 0 .../stripe-php/lib/Util/RandomGenerator.php | 0 .../stripe-php/lib/Util/RequestOptions.php | 0 {plugins => libs}/stripe-php/lib/Util/Set.php | 0 .../stripe-php/lib/Util/Util.php | 0 .../stripe-php/lib/V2/Billing/MeterEvent.php | 0 .../lib/V2/Billing/MeterEventAdjustment.php | 0 .../lib/V2/Billing/MeterEventSession.php | 0 .../stripe-php/lib/V2/Collection.php | 0 .../stripe-php/lib/V2/Core/Account.php | 0 .../stripe-php/lib/V2/Core/AccountLink.php | 0 .../stripe-php/lib/V2/Core/AccountPerson.php | 0 .../lib/V2/Core/AccountPersonToken.php | 0 .../stripe-php/lib/V2/Core/AccountToken.php | 0 .../stripe-php/lib/V2/Core/Event.php | 0 .../lib/V2/Core/EventDestination.php | 0 .../lib/V2/Core/EventNotification.php | 0 .../stripe-php/lib/V2/DeletedObject.php | 0 {plugins => libs}/stripe-php/lib/Webhook.php | 0 .../stripe-php/lib/WebhookEndpoint.php | 0 .../stripe-php/lib/WebhookSignature.php | 0 .../css/tempusdominus-bootstrap-4.min.css | 0 .../js/tempusdominus-bootstrap-4.min.js | 0 .../tinymce/icons/default/icons.min.js | 0 {plugins => libs}/tinymce/langs/README.md | 0 {plugins => libs}/tinymce/license.md | 0 .../tinymce/models/dom/model.min.js | 0 {plugins => libs}/tinymce/notices.txt | 0 .../tinymce/plugins/accordion/plugin.min.js | 0 .../tinymce/plugins/advlist/plugin.min.js | 0 .../tinymce/plugins/anchor/plugin.min.js | 0 .../tinymce/plugins/autolink/plugin.min.js | 0 .../tinymce/plugins/autoresize/plugin.min.js | 0 .../tinymce/plugins/autosave/plugin.min.js | 0 .../tinymce/plugins/charmap/plugin.min.js | 0 .../tinymce/plugins/code/plugin.min.js | 0 .../tinymce/plugins/codesample/plugin.min.js | 0 .../plugins/directionality/plugin.min.js | 0 .../plugins/emoticons/js/emojiimages.js | 0 .../plugins/emoticons/js/emojiimages.min.js | 0 .../tinymce/plugins/emoticons/js/emojis.js | 0 .../plugins/emoticons/js/emojis.min.js | 0 .../tinymce/plugins/emoticons/plugin.min.js | 0 .../tinymce/plugins/fullscreen/plugin.min.js | 0 .../tinymce/plugins/help/js/i18n/keynav/ar.js | 0 .../plugins/help/js/i18n/keynav/bg-BG.js | 0 .../plugins/help/js/i18n/keynav/bg_BG.js | 0 .../tinymce/plugins/help/js/i18n/keynav/ca.js | 0 .../tinymce/plugins/help/js/i18n/keynav/cs.js | 0 .../tinymce/plugins/help/js/i18n/keynav/da.js | 0 .../tinymce/plugins/help/js/i18n/keynav/de.js | 0 .../tinymce/plugins/help/js/i18n/keynav/el.js | 0 .../tinymce/plugins/help/js/i18n/keynav/en.js | 0 .../tinymce/plugins/help/js/i18n/keynav/es.js | 0 .../tinymce/plugins/help/js/i18n/keynav/eu.js | 0 .../tinymce/plugins/help/js/i18n/keynav/fa.js | 0 .../tinymce/plugins/help/js/i18n/keynav/fi.js | 0 .../plugins/help/js/i18n/keynav/fr-FR.js | 0 .../plugins/help/js/i18n/keynav/fr_FR.js | 0 .../plugins/help/js/i18n/keynav/he-IL.js | 0 .../plugins/help/js/i18n/keynav/he_IL.js | 0 .../tinymce/plugins/help/js/i18n/keynav/hi.js | 0 .../tinymce/plugins/help/js/i18n/keynav/hr.js | 0 .../plugins/help/js/i18n/keynav/hu-HU.js | 0 .../plugins/help/js/i18n/keynav/hu_HU.js | 0 .../tinymce/plugins/help/js/i18n/keynav/id.js | 0 .../tinymce/plugins/help/js/i18n/keynav/it.js | 0 .../tinymce/plugins/help/js/i18n/keynav/ja.js | 0 .../tinymce/plugins/help/js/i18n/keynav/kk.js | 0 .../plugins/help/js/i18n/keynav/ko-KR.js | 0 .../plugins/help/js/i18n/keynav/ko_KR.js | 0 .../tinymce/plugins/help/js/i18n/keynav/ms.js | 0 .../plugins/help/js/i18n/keynav/nb-NO.js | 0 .../plugins/help/js/i18n/keynav/nb_NO.js | 0 .../tinymce/plugins/help/js/i18n/keynav/nl.js | 0 .../tinymce/plugins/help/js/i18n/keynav/pl.js | 0 .../plugins/help/js/i18n/keynav/pt-BR.js | 0 .../plugins/help/js/i18n/keynav/pt-PT.js | 0 .../plugins/help/js/i18n/keynav/pt_BR.js | 0 .../plugins/help/js/i18n/keynav/pt_PT.js | 0 .../tinymce/plugins/help/js/i18n/keynav/ro.js | 0 .../tinymce/plugins/help/js/i18n/keynav/ru.js | 0 .../tinymce/plugins/help/js/i18n/keynav/sk.js | 0 .../plugins/help/js/i18n/keynav/sl-SI.js | 0 .../plugins/help/js/i18n/keynav/sl_SI.js | 0 .../plugins/help/js/i18n/keynav/sv-SE.js | 0 .../plugins/help/js/i18n/keynav/sv_SE.js | 0 .../plugins/help/js/i18n/keynav/th-TH.js | 0 .../plugins/help/js/i18n/keynav/th_TH.js | 0 .../tinymce/plugins/help/js/i18n/keynav/tr.js | 0 .../tinymce/plugins/help/js/i18n/keynav/uk.js | 0 .../tinymce/plugins/help/js/i18n/keynav/vi.js | 0 .../plugins/help/js/i18n/keynav/zh-CN.js | 0 .../plugins/help/js/i18n/keynav/zh-TW.js | 0 .../plugins/help/js/i18n/keynav/zh_CN.js | 0 .../plugins/help/js/i18n/keynav/zh_TW.js | 0 .../tinymce/plugins/help/plugin.min.js | 0 .../tinymce/plugins/image/plugin.min.js | 0 .../tinymce/plugins/importcss/plugin.min.js | 0 .../plugins/insertdatetime/plugin.min.js | 0 .../tinymce/plugins/link/plugin.min.js | 0 .../tinymce/plugins/lists/plugin.min.js | 0 .../tinymce/plugins/media/plugin.min.js | 0 .../tinymce/plugins/nonbreaking/plugin.min.js | 0 .../tinymce/plugins/pagebreak/plugin.min.js | 0 .../tinymce/plugins/preview/plugin.min.js | 0 .../tinymce/plugins/quickbars/plugin.min.js | 0 .../tinymce/plugins/save/plugin.min.js | 0 .../plugins/searchreplace/plugin.min.js | 0 .../tinymce/plugins/table/plugin.min.js | 0 .../plugins/visualblocks/plugin.min.js | 0 .../tinymce/plugins/visualchars/plugin.min.js | 0 .../tinymce/plugins/wordcount/plugin.min.js | 0 .../tinymce/skins/content/dark/content.js | 0 .../skins/content/dark/content.min.css | 0 .../tinymce/skins/content/default/content.js | 0 .../skins/content/default/content.min.css | 0 .../tinymce/skins/content/document/content.js | 0 .../skins/content/document/content.min.css | 0 .../skins/content/tinymce-5-dark/content.js | 0 .../content/tinymce-5-dark/content.min.css | 0 .../skins/content/tinymce-5/content.js | 0 .../skins/content/tinymce-5/content.min.css | 0 .../tinymce/skins/content/writer/content.js | 0 .../skins/content/writer/content.min.css | 0 .../skins/ui/oxide-dark/content.inline.js | 0 .../ui/oxide-dark/content.inline.min.css | 0 .../tinymce/skins/ui/oxide-dark/content.js | 0 .../skins/ui/oxide-dark/content.min.css | 0 .../tinymce/skins/ui/oxide-dark/skin.js | 0 .../tinymce/skins/ui/oxide-dark/skin.min.css | 0 .../skins/ui/oxide-dark/skin.shadowdom.js | 0 .../ui/oxide-dark/skin.shadowdom.min.css | 0 .../tinymce/skins/ui/oxide/content.inline.js | 0 .../skins/ui/oxide/content.inline.min.css | 0 .../tinymce/skins/ui/oxide/content.js | 0 .../tinymce/skins/ui/oxide/content.min.css | 0 .../tinymce/skins/ui/oxide/skin.js | 0 .../tinymce/skins/ui/oxide/skin.min.css | 0 .../tinymce/skins/ui/oxide/skin.shadowdom.js | 0 .../skins/ui/oxide/skin.shadowdom.min.css | 0 .../skins/ui/tinymce-5-dark/content.inline.js | 0 .../ui/tinymce-5-dark/content.inline.min.css | 0 .../skins/ui/tinymce-5-dark/content.js | 0 .../skins/ui/tinymce-5-dark/content.min.css | 0 .../tinymce/skins/ui/tinymce-5-dark/skin.js | 0 .../skins/ui/tinymce-5-dark/skin.min.css | 0 .../skins/ui/tinymce-5-dark/skin.shadowdom.js | 0 .../ui/tinymce-5-dark/skin.shadowdom.min.css | 0 .../skins/ui/tinymce-5/content.inline.js | 0 .../skins/ui/tinymce-5/content.inline.min.css | 0 .../tinymce/skins/ui/tinymce-5/content.js | 0 .../skins/ui/tinymce-5/content.min.css | 0 .../tinymce/skins/ui/tinymce-5/skin.js | 0 .../tinymce/skins/ui/tinymce-5/skin.min.css | 0 .../skins/ui/tinymce-5/skin.shadowdom.js | 0 .../skins/ui/tinymce-5/skin.shadowdom.min.css | 0 .../tinymce/themes/silver/theme.min.js | 0 {plugins => libs}/tinymce/tinymce.d.ts | 0 {plugins => libs}/tinymce/tinymce.min.js | 0 {plugins => libs}/toastr/toastr.min.css | 0 {plugins => libs}/toastr/toastr.min.js | 0 {plugins => libs}/totp/totp.php | 0 {plugins => libs}/vendor/autoload.php | 0 {plugins => libs}/vendor/bin/carbon | 0 .../carbonphp/carbon-doctrine-types/LICENSE | 0 .../carbonphp/carbon-doctrine-types/README.md | 0 .../carbon-doctrine-types/composer.json | 0 .../Carbon/Doctrine/CarbonDoctrineType.php | 0 .../Carbon/Doctrine/CarbonImmutableType.php | 0 .../src/Carbon/Doctrine/CarbonType.php | 0 .../Carbon/Doctrine/CarbonTypeConverter.php | 0 .../Doctrine/DateTimeDefaultPrecision.php | 0 .../Carbon/Doctrine/DateTimeImmutableType.php | 0 .../src/Carbon/Doctrine/DateTimeType.php | 0 .../vendor/composer/ClassLoader.php | 0 .../vendor/composer/InstalledVersions.php | 0 {plugins => libs}/vendor/composer/LICENSE | 0 .../vendor/composer/autoload_classmap.php | 0 .../vendor/composer/autoload_files.php | 0 .../vendor/composer/autoload_namespaces.php | 0 .../vendor/composer/autoload_psr4.php | 0 .../vendor/composer/autoload_real.php | 0 .../vendor/composer/autoload_static.php | 0 .../vendor/composer/installed.json | 0 .../vendor/composer/installed.php | 0 .../vendor/composer/platform_check.php | 0 .../directorytree/imapengine/composer.json | 0 .../directorytree/imapengine/src/Address.php | 0 .../imapengine/src/Attachment.php | 0 .../src/BodyStructureCollection.php | 0 .../imapengine/src/BodyStructurePart.php | 0 .../src/Collections/FolderCollection.php | 0 .../src/Collections/MessageCollection.php | 0 .../src/Collections/PaginatedCollection.php | 0 .../src/Collections/ResponseCollection.php | 0 .../imapengine/src/ComparesFolders.php | 0 .../src/Connection/ConnectionInterface.php | 0 .../imapengine/src/Connection/ImapCommand.php | 0 .../src/Connection/ImapConnection.php | 0 .../imapengine/src/Connection/ImapParser.php | 0 .../src/Connection/ImapQueryBuilder.php | 0 .../src/Connection/ImapTokenizer.php | 0 .../src/Connection/Loggers/EchoLogger.php | 0 .../src/Connection/Loggers/FileLogger.php | 0 .../src/Connection/Loggers/Logger.php | 0 .../Connection/Loggers/LoggerInterface.php | 0 .../src/Connection/Loggers/RayLogger.php | 0 .../src/Connection/RawQueryValue.php | 0 .../Responses/ContinuationResponse.php | 0 .../src/Connection/Responses/Data/Data.php | 0 .../Connection/Responses/Data/ListData.php | 0 .../Responses/Data/ResponseCodeData.php | 0 .../src/Connection/Responses/HasTokens.php | 0 .../Responses/MessageResponseParser.php | 0 .../src/Connection/Responses/Response.php | 0 .../Connection/Responses/TaggedResponse.php | 0 .../Connection/Responses/UntaggedResponse.php | 0 .../imapengine/src/Connection/Result.php | 0 .../src/Connection/Streams/FakeStream.php | 0 .../src/Connection/Streams/ImapStream.php | 0 .../Connection/Streams/StreamInterface.php | 0 .../imapengine/src/Connection/Tokens/Atom.php | 0 .../imapengine/src/Connection/Tokens/Crlf.php | 0 .../src/Connection/Tokens/EmailAddress.php | 0 .../src/Connection/Tokens/ListClose.php | 0 .../src/Connection/Tokens/ListOpen.php | 0 .../src/Connection/Tokens/Literal.php | 0 .../imapengine/src/Connection/Tokens/Nil.php | 0 .../src/Connection/Tokens/Number.php | 0 .../src/Connection/Tokens/QuotedString.php | 0 .../Connection/Tokens/ResponseCodeClose.php | 0 .../Connection/Tokens/ResponseCodeOpen.php | 0 .../src/Connection/Tokens/Token.php | 0 .../imapengine/src/ContentDisposition.php | 0 .../imapengine/src/DraftMessage.php | 0 .../src/Enums/ContentDispositionType.php | 0 .../src/Enums/ImapFetchIdentifier.php | 0 .../imapengine/src/Enums/ImapFlag.php | 0 .../imapengine/src/Enums/ImapSearchKey.php | 0 .../imapengine/src/Enums/ImapSortKey.php | 0 .../imapengine/src/Exceptions/Exception.php | 0 .../Exceptions/ImapCapabilityException.php | 0 .../src/Exceptions/ImapCommandException.php | 0 .../ImapConnectionClosedException.php | 0 .../Exceptions/ImapConnectionException.php | 0 .../ImapConnectionFailedException.php | 0 .../ImapConnectionTimedOutException.php | 0 .../src/Exceptions/ImapParserException.php | 0 .../src/Exceptions/ImapResponseException.php | 0 .../src/Exceptions/ImapStreamException.php | 0 .../src/Exceptions/RuntimeException.php | 0 .../imapengine/src/FileMessage.php | 0 .../imapengine/src/FlaggableInterface.php | 0 .../directorytree/imapengine/src/Folder.php | 0 .../imapengine/src/FolderInterface.php | 0 .../imapengine/src/FolderRepository.php | 0 .../src/FolderRepositoryInterface.php | 0 .../directorytree/imapengine/src/HasFlags.php | 0 .../imapengine/src/HasMessageAccessors.php | 0 .../imapengine/src/HasParsedMessage.php | 0 .../directorytree/imapengine/src/Idle.php | 0 .../directorytree/imapengine/src/Mailbox.php | 0 .../imapengine/src/MailboxInterface.php | 0 .../directorytree/imapengine/src/Mbox.php | 0 .../directorytree/imapengine/src/Message.php | 0 .../imapengine/src/MessageInterface.php | 0 .../imapengine/src/MessageParser.php | 0 .../imapengine/src/MessageQuery.php | 0 .../imapengine/src/MessageQueryInterface.php | 0 .../src/Pagination/LengthAwarePaginator.php | 0 .../directorytree/imapengine/src/Poll.php | 0 .../imapengine/src/QueriesMessages.php | 0 .../src/Support/BodyPartDecoder.php | 0 .../imapengine/src/Support/ForwardsCalls.php | 0 .../src/Support/LazyBodyPartStream.php | 0 .../imapengine/src/Support/MimeMessage.php | 0 .../imapengine/src/Support/Str.php | 0 .../imapengine/src/Testing/FakeFolder.php | 0 .../src/Testing/FakeFolderRepository.php | 0 .../imapengine/src/Testing/FakeMailbox.php | 0 .../imapengine/src/Testing/FakeMessage.php | 0 .../src/Testing/FakeMessageQuery.php | 0 .../vendor/doctrine/lexer/LICENSE | 0 .../vendor/doctrine/lexer/README.md | 0 .../vendor/doctrine/lexer/UPGRADE.md | 0 .../vendor/doctrine/lexer/composer.json | 0 .../doctrine/lexer/src/AbstractLexer.php | 0 .../vendor/doctrine/lexer/src/Token.php | 0 .../egulias/email-validator/CONTRIBUTING.md | 0 .../vendor/egulias/email-validator/LICENSE | 0 .../egulias/email-validator/composer.json | 0 .../email-validator/src/EmailLexer.php | 0 .../email-validator/src/EmailParser.php | 0 .../email-validator/src/EmailValidator.php | 0 .../email-validator/src/MessageIDParser.php | 0 .../egulias/email-validator/src/Parser.php | 0 .../email-validator/src/Parser/Comment.php | 0 .../CommentStrategy/CommentStrategy.php | 0 .../Parser/CommentStrategy/DomainComment.php | 0 .../Parser/CommentStrategy/LocalComment.php | 0 .../src/Parser/DomainLiteral.php | 0 .../email-validator/src/Parser/DomainPart.php | 0 .../src/Parser/DoubleQuote.php | 0 .../src/Parser/FoldingWhiteSpace.php | 0 .../email-validator/src/Parser/IDLeftPart.php | 0 .../src/Parser/IDRightPart.php | 0 .../email-validator/src/Parser/LocalPart.php | 0 .../email-validator/src/Parser/PartParser.php | 0 .../src/Result/InvalidEmail.php | 0 .../src/Result/MultipleErrors.php | 0 .../src/Result/Reason/AtextAfterCFWS.php | 0 .../src/Result/Reason/CRLFAtTheEnd.php | 0 .../src/Result/Reason/CRLFX2.php | 0 .../src/Result/Reason/CRNoLF.php | 0 .../src/Result/Reason/CharNotAllowed.php | 0 .../src/Result/Reason/CommaInDomain.php | 0 .../src/Result/Reason/CommentsInIDRight.php | 0 .../src/Result/Reason/ConsecutiveAt.php | 0 .../src/Result/Reason/ConsecutiveDot.php | 0 .../src/Result/Reason/DetailedReason.php | 0 .../src/Result/Reason/DomainAcceptsNoMail.php | 0 .../src/Result/Reason/DomainHyphened.php | 0 .../src/Result/Reason/DomainTooLong.php | 0 .../src/Result/Reason/DotAtEnd.php | 0 .../src/Result/Reason/DotAtStart.php | 0 .../src/Result/Reason/EmptyReason.php | 0 .../src/Result/Reason/ExceptionFound.php | 0 .../src/Result/Reason/ExpectingATEXT.php | 0 .../src/Result/Reason/ExpectingCTEXT.php | 0 .../src/Result/Reason/ExpectingDTEXT.php | 0 .../Reason/ExpectingDomainLiteralClose.php | 0 .../src/Result/Reason/LabelTooLong.php | 0 .../Result/Reason/LocalOrReservedDomain.php | 0 .../src/Result/Reason/NoDNSRecord.php | 0 .../src/Result/Reason/NoDomainPart.php | 0 .../src/Result/Reason/NoLocalPart.php | 0 .../src/Result/Reason/RFCWarnings.php | 0 .../src/Result/Reason/Reason.php | 0 .../src/Result/Reason/SpoofEmail.php | 0 .../src/Result/Reason/UnOpenedComment.php | 0 .../Result/Reason/UnableToGetDNSRecord.php | 0 .../src/Result/Reason/UnclosedComment.php | 0 .../Result/Reason/UnclosedQuotedString.php | 0 .../src/Result/Reason/UnusualElements.php | 0 .../email-validator/src/Result/Result.php | 0 .../email-validator/src/Result/SpoofEmail.php | 0 .../email-validator/src/Result/ValidEmail.php | 0 .../src/Validation/DNSCheckValidation.php | 0 .../src/Validation/DNSGetRecordWrapper.php | 0 .../src/Validation/DNSRecords.php | 0 .../src/Validation/EmailValidation.php | 0 .../Exception/EmptyValidationList.php | 0 .../Validation/Extra/SpoofCheckValidation.php | 0 .../src/Validation/MessageIDValidation.php | 0 .../Validation/MultipleValidationWithAnd.php | 0 .../Validation/NoRFCWarningsValidation.php | 0 .../src/Validation/RFCValidation.php | 0 .../src/Warning/AddressLiteral.php | 0 .../src/Warning/CFWSNearAt.php | 0 .../src/Warning/CFWSWithFWS.php | 0 .../email-validator/src/Warning/Comment.php | 0 .../src/Warning/DeprecatedComment.php | 0 .../src/Warning/DomainLiteral.php | 0 .../src/Warning/EmailTooLong.php | 0 .../src/Warning/IPV6BadChar.php | 0 .../src/Warning/IPV6ColonEnd.php | 0 .../src/Warning/IPV6ColonStart.php | 0 .../src/Warning/IPV6Deprecated.php | 0 .../src/Warning/IPV6DoubleColon.php | 0 .../src/Warning/IPV6GroupCount.php | 0 .../src/Warning/IPV6MaxGroups.php | 0 .../src/Warning/LocalTooLong.php | 0 .../src/Warning/NoDNSMXRecord.php | 0 .../src/Warning/ObsoleteDTEXT.php | 0 .../src/Warning/QuotedPart.php | 0 .../src/Warning/QuotedString.php | 0 .../email-validator/src/Warning/TLD.php | 0 .../email-validator/src/Warning/Warning.php | 0 .../vendor/guzzlehttp/psr7/CHANGELOG.md | 0 .../vendor/guzzlehttp/psr7/LICENSE | 0 .../vendor/guzzlehttp/psr7/README.md | 0 .../vendor/guzzlehttp/psr7/UPGRADING.md | 0 .../vendor/guzzlehttp/psr7/composer.json | 0 .../guzzlehttp/psr7/src/AppendStream.php | 0 .../guzzlehttp/psr7/src/BufferStream.php | 0 .../guzzlehttp/psr7/src/CachingStream.php | 0 .../guzzlehttp/psr7/src/DroppingStream.php | 0 .../src/Exception/MalformedUriException.php | 0 .../vendor/guzzlehttp/psr7/src/FnStream.php | 0 .../vendor/guzzlehttp/psr7/src/Header.php | 0 .../guzzlehttp/psr7/src/HttpFactory.php | 0 .../guzzlehttp/psr7/src/InflateStream.php | 0 .../guzzlehttp/psr7/src/LazyOpenStream.php | 0 .../guzzlehttp/psr7/src/LimitStream.php | 0 .../vendor/guzzlehttp/psr7/src/Message.php | 0 .../guzzlehttp/psr7/src/MessageTrait.php | 0 .../vendor/guzzlehttp/psr7/src/MimeType.php | 0 .../guzzlehttp/psr7/src/MultipartStream.php | 0 .../guzzlehttp/psr7/src/NoSeekStream.php | 0 .../vendor/guzzlehttp/psr7/src/PumpStream.php | 0 .../vendor/guzzlehttp/psr7/src/Query.php | 0 .../vendor/guzzlehttp/psr7/src/Request.php | 0 .../vendor/guzzlehttp/psr7/src/Response.php | 0 .../vendor/guzzlehttp/psr7/src/Rfc3986.php | 0 .../vendor/guzzlehttp/psr7/src/Rfc7230.php | 0 .../guzzlehttp/psr7/src/ServerRequest.php | 0 .../vendor/guzzlehttp/psr7/src/Stream.php | 0 .../psr7/src/StreamDecoratorTrait.php | 0 .../guzzlehttp/psr7/src/StreamWrapper.php | 0 .../guzzlehttp/psr7/src/UploadedFile.php | 0 .../vendor/guzzlehttp/psr7/src/Uri.php | 0 .../guzzlehttp/psr7/src/UriComparator.php | 0 .../guzzlehttp/psr7/src/UriNormalizer.php | 0 .../guzzlehttp/psr7/src/UriResolver.php | 0 .../vendor/guzzlehttp/psr7/src/Utils.php | 0 .../vendor/illuminate/collections/Arr.php | 0 .../illuminate/collections/Collection.php | 0 .../illuminate/collections/Enumerable.php | 0 .../HigherOrderCollectionProxy.php | 0 .../collections/ItemNotFoundException.php | 0 .../vendor/illuminate/collections/LICENSE.md | 0 .../illuminate/collections/LazyCollection.php | 0 .../MultipleItemsFoundException.php | 0 .../collections/Traits/EnumeratesValues.php | 0 .../Traits/TransformsToResourceCollection.php | 0 .../illuminate/collections/composer.json | 0 .../illuminate/collections/functions.php | 0 .../vendor/illuminate/collections/helpers.php | 0 .../conditionable/HigherOrderWhenProxy.php | 0 .../illuminate/conditionable/LICENSE.md | 0 .../conditionable/Traits/Conditionable.php | 0 .../illuminate/conditionable/composer.json | 0 .../contracts/Auth/Access/Authorizable.php | 0 .../illuminate/contracts/Auth/Access/Gate.php | 0 .../contracts/Auth/Authenticatable.php | 0 .../contracts/Auth/CanResetPassword.php | 0 .../illuminate/contracts/Auth/Factory.php | 0 .../illuminate/contracts/Auth/Guard.php | 0 .../Auth/Middleware/AuthenticatesRequests.php | 0 .../contracts/Auth/MustVerifyEmail.php | 0 .../contracts/Auth/PasswordBroker.php | 0 .../contracts/Auth/PasswordBrokerFactory.php | 0 .../contracts/Auth/StatefulGuard.php | 0 .../contracts/Auth/SupportsBasicAuth.php | 0 .../contracts/Auth/UserProvider.php | 0 .../contracts/Broadcasting/Broadcaster.php | 0 .../contracts/Broadcasting/Factory.php | 0 .../Broadcasting/HasBroadcastChannel.php | 0 .../contracts/Broadcasting/ShouldBeUnique.php | 0 .../Broadcasting/ShouldBroadcast.php | 0 .../Broadcasting/ShouldBroadcastNow.php | 0 .../contracts/Broadcasting/ShouldRescue.php | 0 .../illuminate/contracts/Bus/Dispatcher.php | 0 .../contracts/Bus/QueueingDispatcher.php | 0 .../illuminate/contracts/Cache/Factory.php | 0 .../illuminate/contracts/Cache/Lock.php | 0 .../contracts/Cache/LockProvider.php | 0 .../contracts/Cache/LockTimeoutException.php | 0 .../illuminate/contracts/Cache/Repository.php | 0 .../illuminate/contracts/Cache/Store.php | 0 .../contracts/Concurrency/Driver.php | 0 .../contracts/Config/Repository.php | 0 .../contracts/Console/Application.php | 0 .../contracts/Console/Isolatable.php | 0 .../illuminate/contracts/Console/Kernel.php | 0 .../Console/PromptsForMissingInput.php | 0 .../Container/BindingResolutionException.php | 0 .../Container/CircularDependencyException.php | 0 .../contracts/Container/Container.php | 0 .../Container/ContextualAttribute.php | 0 .../Container/ContextualBindingBuilder.php | 0 .../contracts/Container/SelfBuilding.php | 0 .../illuminate/contracts/Cookie/Factory.php | 0 .../contracts/Cookie/QueueingFactory.php | 0 .../Database/ConcurrencyErrorDetector.php | 0 .../contracts/Database/Eloquent/Builder.php | 0 .../contracts/Database/Eloquent/Castable.php | 0 .../Database/Eloquent/CastsAttributes.php | 0 .../Eloquent/CastsInboundAttributes.php | 0 .../Eloquent/ComparesCastableAttributes.php | 0 .../Eloquent/DeviatesCastableAttributes.php | 0 .../Eloquent/SerializesCastableAttributes.php | 0 .../Eloquent/SupportsPartialRelations.php | 0 .../Database/Events/MigrationEvent.php | 0 .../Database/LostConnectionDetector.php | 0 .../contracts/Database/ModelIdentifier.php | 0 .../contracts/Database/Query/Builder.php | 0 .../Database/Query/ConditionExpression.php | 0 .../contracts/Database/Query/Expression.php | 0 .../contracts/Debug/ExceptionHandler.php | 0 .../contracts/Debug/ShouldntReport.php | 0 .../contracts/Encryption/DecryptException.php | 0 .../contracts/Encryption/EncryptException.php | 0 .../contracts/Encryption/Encrypter.php | 0 .../contracts/Encryption/StringEncrypter.php | 0 .../contracts/Events/Dispatcher.php | 0 .../Events/ShouldDispatchAfterCommit.php | 0 .../Events/ShouldHandleEventsAfterCommit.php | 0 .../illuminate/contracts/Filesystem/Cloud.php | 0 .../contracts/Filesystem/Factory.php | 0 .../Filesystem/FileNotFoundException.php | 0 .../contracts/Filesystem/Filesystem.php | 0 .../Filesystem/LockTimeoutException.php | 0 .../contracts/Foundation/Application.php | 0 .../Foundation/CachesConfiguration.php | 0 .../contracts/Foundation/CachesRoutes.php | 0 .../Foundation/ExceptionRenderer.php | 0 .../contracts/Foundation/MaintenanceMode.php | 0 .../illuminate/contracts/Hashing/Hasher.php | 0 .../illuminate/contracts/Http/Kernel.php | 0 .../contracts/JsonSchema/JsonSchema.php | 0 .../vendor/illuminate/contracts/LICENSE.md | 0 .../contracts/Log/ContextLogProcessor.php | 0 .../illuminate/contracts/Mail/Attachable.php | 0 .../illuminate/contracts/Mail/Factory.php | 0 .../illuminate/contracts/Mail/MailQueue.php | 0 .../illuminate/contracts/Mail/Mailable.php | 0 .../illuminate/contracts/Mail/Mailer.php | 0 .../contracts/Notifications/Dispatcher.php | 0 .../contracts/Notifications/Factory.php | 0 .../contracts/Pagination/CursorPaginator.php | 0 .../Pagination/LengthAwarePaginator.php | 0 .../contracts/Pagination/Paginator.php | 0 .../illuminate/contracts/Pipeline/Hub.php | 0 .../contracts/Pipeline/Pipeline.php | 0 .../contracts/Process/InvokedProcess.php | 0 .../contracts/Process/ProcessResult.php | 0 .../contracts/Queue/ClearableQueue.php | 0 .../Queue/EntityNotFoundException.php | 0 .../contracts/Queue/EntityResolver.php | 0 .../illuminate/contracts/Queue/Factory.php | 0 .../vendor/illuminate/contracts/Queue/Job.php | 0 .../illuminate/contracts/Queue/Monitor.php | 0 .../illuminate/contracts/Queue/Queue.php | 0 .../contracts/Queue/QueueableCollection.php | 0 .../contracts/Queue/QueueableEntity.php | 0 .../contracts/Queue/ShouldBeEncrypted.php | 0 .../contracts/Queue/ShouldBeUnique.php | 0 .../Queue/ShouldBeUniqueUntilProcessing.php | 0 .../contracts/Queue/ShouldQueue.php | 0 .../Queue/ShouldQueueAfterCommit.php | 0 .../illuminate/contracts/Redis/Connection.php | 0 .../illuminate/contracts/Redis/Connector.php | 0 .../illuminate/contracts/Redis/Factory.php | 0 .../Redis/LimiterTimeoutException.php | 0 .../contracts/Routing/BindingRegistrar.php | 0 .../contracts/Routing/Registrar.php | 0 .../contracts/Routing/ResponseFactory.php | 0 .../contracts/Routing/UrlGenerator.php | 0 .../contracts/Routing/UrlRoutable.php | 0 .../Middleware/AuthenticatesSessions.php | 0 .../illuminate/contracts/Session/Session.php | 0 .../contracts/Support/Arrayable.php | 0 .../Support/CanBeEscapedWhenCastToString.php | 0 .../contracts/Support/DeferrableProvider.php | 0 .../Support/DeferringDisplayableValue.php | 0 .../contracts/Support/HasOnceHash.php | 0 .../illuminate/contracts/Support/Htmlable.php | 0 .../illuminate/contracts/Support/Jsonable.php | 0 .../contracts/Support/MessageBag.php | 0 .../contracts/Support/MessageProvider.php | 0 .../contracts/Support/Renderable.php | 0 .../contracts/Support/Responsable.php | 0 .../contracts/Support/ValidatedData.php | 0 .../Translation/HasLocalePreference.php | 0 .../contracts/Translation/Loader.php | 0 .../contracts/Translation/Translator.php | 0 .../contracts/Validation/CompilableRules.php | 0 .../contracts/Validation/DataAwareRule.php | 0 .../contracts/Validation/Factory.php | 0 .../contracts/Validation/ImplicitRule.php | 0 .../contracts/Validation/InvokableRule.php | 0 .../illuminate/contracts/Validation/Rule.php | 0 .../Validation/UncompromisedVerifier.php | 0 .../Validation/ValidatesWhenResolved.php | 0 .../contracts/Validation/ValidationRule.php | 0 .../contracts/Validation/Validator.php | 0 .../Validation/ValidatorAwareRule.php | 0 .../illuminate/contracts/View/Engine.php | 0 .../illuminate/contracts/View/Factory.php | 0 .../vendor/illuminate/contracts/View/View.php | 0 .../View/ViewCompilationException.php | 0 .../vendor/illuminate/contracts/composer.json | 0 .../vendor/illuminate/macroable/LICENSE.md | 0 .../illuminate/macroable/Traits/Macroable.php | 0 .../vendor/illuminate/macroable/composer.json | 0 .../laravel/serializable-closure/LICENSE.md | 0 .../laravel/serializable-closure/README.md | 0 .../serializable-closure/composer.json | 0 .../src/Contracts/Serializable.php | 0 .../src/Contracts/Signer.php | 0 .../Exceptions/InvalidSignatureException.php | 0 .../Exceptions/MissingSecretKeyException.php | 0 .../src/SerializableClosure.php | 0 .../src/Serializers/Native.php | 0 .../src/Serializers/Signed.php | 0 .../serializable-closure/src/Signers/Hmac.php | 0 .../src/Support/ClosureScope.php | 0 .../src/Support/ClosureStream.php | 0 .../src/Support/ReflectionClosure.php | 0 .../src/Support/SelfReference.php | 0 .../src/UnsignedSerializableClosure.php | 0 .../vendor/nesbot/carbon/.phpstorm.meta.php | 0 .../vendor/nesbot/carbon/LICENSE | 0 .../vendor/nesbot/carbon/SECURITY.md | 0 .../vendor/nesbot/carbon/bin/carbon | 0 .../vendor/nesbot/carbon/bin/carbon.bat | 0 .../vendor/nesbot/carbon/composer.json | 0 .../vendor/nesbot/carbon/extension.neon | 0 .../MessageFormatterMapperStrongType.php | 0 .../MessageFormatterMapperWeakType.php | 0 .../lazy/Carbon/ProtectedDatePeriod.php | 0 .../lazy/Carbon/TranslatorStrongType.php | 0 .../carbon/lazy/Carbon/TranslatorWeakType.php | 0 .../lazy/Carbon/UnprotectedDatePeriod.php | 0 .../vendor/nesbot/carbon/readme.md | 0 .../carbon/src/Carbon/AbstractTranslator.php | 0 .../nesbot/carbon/src/Carbon/Callback.php | 0 .../nesbot/carbon/src/Carbon/Carbon.php | 0 .../src/Carbon/CarbonConverterInterface.php | 0 .../carbon/src/Carbon/CarbonImmutable.php | 0 .../carbon/src/Carbon/CarbonInterface.php | 0 .../carbon/src/Carbon/CarbonInterval.php | 0 .../nesbot/carbon/src/Carbon/CarbonPeriod.php | 0 .../src/Carbon/CarbonPeriodImmutable.php | 0 .../carbon/src/Carbon/CarbonTimeZone.php | 0 .../nesbot/carbon/src/Carbon/Cli/Invoker.php | 0 .../src/Carbon/Constants/DiffOptions.php | 0 .../carbon/src/Carbon/Constants/Format.php | 0 .../Carbon/Constants/TranslationOptions.php | 0 .../carbon/src/Carbon/Constants/UnitValue.php | 0 .../Exceptions/BadComparisonUnitException.php | 0 .../BadFluentConstructorException.php | 0 .../Exceptions/BadFluentSetterException.php | 0 .../Exceptions/BadMethodCallException.php | 0 .../Exceptions/EndLessPeriodException.php | 0 .../src/Carbon/Exceptions/Exception.php | 0 .../Carbon/Exceptions/ImmutableException.php | 0 .../Exceptions/InvalidArgumentException.php | 0 .../Exceptions/InvalidCastException.php | 0 .../Exceptions/InvalidDateException.php | 0 .../Exceptions/InvalidFormatException.php | 0 .../Exceptions/InvalidIntervalException.php | 0 .../Exceptions/InvalidPeriodDateException.php | 0 .../InvalidPeriodParameterException.php | 0 .../Exceptions/InvalidTimeZoneException.php | 0 .../Exceptions/InvalidTypeException.php | 0 .../Exceptions/NotACarbonClassException.php | 0 .../Carbon/Exceptions/NotAPeriodException.php | 0 .../Exceptions/NotLocaleAwareException.php | 0 .../Carbon/Exceptions/OutOfRangeException.php | 0 .../Carbon/Exceptions/ParseErrorException.php | 0 .../Carbon/Exceptions/RuntimeException.php | 0 .../src/Carbon/Exceptions/UnitException.php | 0 .../Exceptions/UnitNotConfiguredException.php | 0 .../Exceptions/UnknownGetterException.php | 0 .../Exceptions/UnknownMethodException.php | 0 .../Exceptions/UnknownSetterException.php | 0 .../Exceptions/UnknownUnitException.php | 0 .../Exceptions/UnreachableException.php | 0 .../Exceptions/UnsupportedUnitException.php | 0 .../nesbot/carbon/src/Carbon/Factory.php | 0 .../carbon/src/Carbon/FactoryImmutable.php | 0 .../nesbot/carbon/src/Carbon/Lang/aa.php | 0 .../nesbot/carbon/src/Carbon/Lang/aa_DJ.php | 0 .../nesbot/carbon/src/Carbon/Lang/aa_ER.php | 0 .../carbon/src/Carbon/Lang/aa_ER@saaho.php | 0 .../nesbot/carbon/src/Carbon/Lang/aa_ET.php | 0 .../nesbot/carbon/src/Carbon/Lang/af.php | 0 .../nesbot/carbon/src/Carbon/Lang/af_NA.php | 0 .../nesbot/carbon/src/Carbon/Lang/af_ZA.php | 0 .../nesbot/carbon/src/Carbon/Lang/agq.php | 0 .../nesbot/carbon/src/Carbon/Lang/agr.php | 0 .../nesbot/carbon/src/Carbon/Lang/agr_PE.php | 0 .../nesbot/carbon/src/Carbon/Lang/ak.php | 0 .../nesbot/carbon/src/Carbon/Lang/ak_GH.php | 0 .../nesbot/carbon/src/Carbon/Lang/am.php | 0 .../nesbot/carbon/src/Carbon/Lang/am_ET.php | 0 .../nesbot/carbon/src/Carbon/Lang/an.php | 0 .../nesbot/carbon/src/Carbon/Lang/an_ES.php | 0 .../nesbot/carbon/src/Carbon/Lang/anp.php | 0 .../nesbot/carbon/src/Carbon/Lang/anp_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/ar.php | 0 .../nesbot/carbon/src/Carbon/Lang/ar_AE.php | 0 .../nesbot/carbon/src/Carbon/Lang/ar_BH.php | 0 .../nesbot/carbon/src/Carbon/Lang/ar_DJ.php | 0 .../nesbot/carbon/src/Carbon/Lang/ar_DZ.php | 0 .../nesbot/carbon/src/Carbon/Lang/ar_EG.php | 0 .../nesbot/carbon/src/Carbon/Lang/ar_EH.php | 0 .../nesbot/carbon/src/Carbon/Lang/ar_ER.php | 0 .../nesbot/carbon/src/Carbon/Lang/ar_IL.php | 0 .../nesbot/carbon/src/Carbon/Lang/ar_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/ar_IQ.php | 0 .../nesbot/carbon/src/Carbon/Lang/ar_JO.php | 0 .../nesbot/carbon/src/Carbon/Lang/ar_KM.php | 0 .../nesbot/carbon/src/Carbon/Lang/ar_KW.php | 0 .../nesbot/carbon/src/Carbon/Lang/ar_LB.php | 0 .../nesbot/carbon/src/Carbon/Lang/ar_LY.php | 0 .../nesbot/carbon/src/Carbon/Lang/ar_MA.php | 0 .../nesbot/carbon/src/Carbon/Lang/ar_MR.php | 0 .../nesbot/carbon/src/Carbon/Lang/ar_OM.php | 0 .../nesbot/carbon/src/Carbon/Lang/ar_PS.php | 0 .../nesbot/carbon/src/Carbon/Lang/ar_QA.php | 0 .../nesbot/carbon/src/Carbon/Lang/ar_SA.php | 0 .../nesbot/carbon/src/Carbon/Lang/ar_SD.php | 0 .../nesbot/carbon/src/Carbon/Lang/ar_SO.php | 0 .../nesbot/carbon/src/Carbon/Lang/ar_SS.php | 0 .../nesbot/carbon/src/Carbon/Lang/ar_SY.php | 0 .../carbon/src/Carbon/Lang/ar_Shakl.php | 0 .../nesbot/carbon/src/Carbon/Lang/ar_TD.php | 0 .../nesbot/carbon/src/Carbon/Lang/ar_TN.php | 0 .../nesbot/carbon/src/Carbon/Lang/ar_YE.php | 0 .../nesbot/carbon/src/Carbon/Lang/as.php | 0 .../nesbot/carbon/src/Carbon/Lang/as_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/asa.php | 0 .../nesbot/carbon/src/Carbon/Lang/ast.php | 0 .../nesbot/carbon/src/Carbon/Lang/ast_ES.php | 0 .../nesbot/carbon/src/Carbon/Lang/ayc.php | 0 .../nesbot/carbon/src/Carbon/Lang/ayc_PE.php | 0 .../nesbot/carbon/src/Carbon/Lang/az.php | 0 .../nesbot/carbon/src/Carbon/Lang/az_AZ.php | 0 .../nesbot/carbon/src/Carbon/Lang/az_Arab.php | 0 .../nesbot/carbon/src/Carbon/Lang/az_Cyrl.php | 0 .../nesbot/carbon/src/Carbon/Lang/az_IR.php | 0 .../nesbot/carbon/src/Carbon/Lang/az_Latn.php | 0 .../nesbot/carbon/src/Carbon/Lang/bas.php | 0 .../nesbot/carbon/src/Carbon/Lang/be.php | 0 .../nesbot/carbon/src/Carbon/Lang/be_BY.php | 0 .../carbon/src/Carbon/Lang/be_BY@latin.php | 0 .../nesbot/carbon/src/Carbon/Lang/bem.php | 0 .../nesbot/carbon/src/Carbon/Lang/bem_ZM.php | 0 .../nesbot/carbon/src/Carbon/Lang/ber.php | 0 .../nesbot/carbon/src/Carbon/Lang/ber_DZ.php | 0 .../nesbot/carbon/src/Carbon/Lang/ber_MA.php | 0 .../nesbot/carbon/src/Carbon/Lang/bez.php | 0 .../nesbot/carbon/src/Carbon/Lang/bg.php | 0 .../nesbot/carbon/src/Carbon/Lang/bg_BG.php | 0 .../nesbot/carbon/src/Carbon/Lang/bhb.php | 0 .../nesbot/carbon/src/Carbon/Lang/bhb_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/bho.php | 0 .../nesbot/carbon/src/Carbon/Lang/bho_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/bi.php | 0 .../nesbot/carbon/src/Carbon/Lang/bi_VU.php | 0 .../nesbot/carbon/src/Carbon/Lang/bm.php | 0 .../nesbot/carbon/src/Carbon/Lang/bn.php | 0 .../nesbot/carbon/src/Carbon/Lang/bn_BD.php | 0 .../nesbot/carbon/src/Carbon/Lang/bn_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/bo.php | 0 .../nesbot/carbon/src/Carbon/Lang/bo_CN.php | 0 .../nesbot/carbon/src/Carbon/Lang/bo_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/br.php | 0 .../nesbot/carbon/src/Carbon/Lang/br_FR.php | 0 .../nesbot/carbon/src/Carbon/Lang/brx.php | 0 .../nesbot/carbon/src/Carbon/Lang/brx_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/bs.php | 0 .../nesbot/carbon/src/Carbon/Lang/bs_BA.php | 0 .../nesbot/carbon/src/Carbon/Lang/bs_Cyrl.php | 0 .../nesbot/carbon/src/Carbon/Lang/bs_Latn.php | 0 .../nesbot/carbon/src/Carbon/Lang/byn.php | 0 .../nesbot/carbon/src/Carbon/Lang/byn_ER.php | 0 .../nesbot/carbon/src/Carbon/Lang/ca.php | 0 .../nesbot/carbon/src/Carbon/Lang/ca_AD.php | 0 .../nesbot/carbon/src/Carbon/Lang/ca_ES.php | 0 .../carbon/src/Carbon/Lang/ca_ES_Valencia.php | 0 .../nesbot/carbon/src/Carbon/Lang/ca_FR.php | 0 .../nesbot/carbon/src/Carbon/Lang/ca_IT.php | 0 .../nesbot/carbon/src/Carbon/Lang/ccp.php | 0 .../nesbot/carbon/src/Carbon/Lang/ccp_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/ce.php | 0 .../nesbot/carbon/src/Carbon/Lang/ce_RU.php | 0 .../nesbot/carbon/src/Carbon/Lang/cgg.php | 0 .../nesbot/carbon/src/Carbon/Lang/chr.php | 0 .../nesbot/carbon/src/Carbon/Lang/chr_US.php | 0 .../nesbot/carbon/src/Carbon/Lang/ckb.php | 0 .../nesbot/carbon/src/Carbon/Lang/cmn.php | 0 .../nesbot/carbon/src/Carbon/Lang/cmn_TW.php | 0 .../nesbot/carbon/src/Carbon/Lang/crh.php | 0 .../nesbot/carbon/src/Carbon/Lang/crh_UA.php | 0 .../nesbot/carbon/src/Carbon/Lang/cs.php | 0 .../nesbot/carbon/src/Carbon/Lang/cs_CZ.php | 0 .../nesbot/carbon/src/Carbon/Lang/csb.php | 0 .../nesbot/carbon/src/Carbon/Lang/csb_PL.php | 0 .../nesbot/carbon/src/Carbon/Lang/cu.php | 0 .../nesbot/carbon/src/Carbon/Lang/cv.php | 0 .../nesbot/carbon/src/Carbon/Lang/cv_RU.php | 0 .../nesbot/carbon/src/Carbon/Lang/cy.php | 0 .../nesbot/carbon/src/Carbon/Lang/cy_GB.php | 0 .../nesbot/carbon/src/Carbon/Lang/da.php | 0 .../nesbot/carbon/src/Carbon/Lang/da_DK.php | 0 .../nesbot/carbon/src/Carbon/Lang/da_GL.php | 0 .../nesbot/carbon/src/Carbon/Lang/dav.php | 0 .../nesbot/carbon/src/Carbon/Lang/de.php | 0 .../nesbot/carbon/src/Carbon/Lang/de_AT.php | 0 .../nesbot/carbon/src/Carbon/Lang/de_BE.php | 0 .../nesbot/carbon/src/Carbon/Lang/de_CH.php | 0 .../nesbot/carbon/src/Carbon/Lang/de_DE.php | 0 .../nesbot/carbon/src/Carbon/Lang/de_IT.php | 0 .../nesbot/carbon/src/Carbon/Lang/de_LI.php | 0 .../nesbot/carbon/src/Carbon/Lang/de_LU.php | 0 .../nesbot/carbon/src/Carbon/Lang/dje.php | 0 .../nesbot/carbon/src/Carbon/Lang/doi.php | 0 .../nesbot/carbon/src/Carbon/Lang/doi_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/dsb.php | 0 .../nesbot/carbon/src/Carbon/Lang/dsb_DE.php | 0 .../nesbot/carbon/src/Carbon/Lang/dua.php | 0 .../nesbot/carbon/src/Carbon/Lang/dv.php | 0 .../nesbot/carbon/src/Carbon/Lang/dv_MV.php | 0 .../nesbot/carbon/src/Carbon/Lang/dyo.php | 0 .../nesbot/carbon/src/Carbon/Lang/dz.php | 0 .../nesbot/carbon/src/Carbon/Lang/dz_BT.php | 0 .../nesbot/carbon/src/Carbon/Lang/ebu.php | 0 .../nesbot/carbon/src/Carbon/Lang/ee.php | 0 .../nesbot/carbon/src/Carbon/Lang/ee_TG.php | 0 .../nesbot/carbon/src/Carbon/Lang/el.php | 0 .../nesbot/carbon/src/Carbon/Lang/el_CY.php | 0 .../nesbot/carbon/src/Carbon/Lang/el_GR.php | 0 .../nesbot/carbon/src/Carbon/Lang/en.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_001.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_150.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_AG.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_AI.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_AS.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_AT.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_AU.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_BB.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_BE.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_BI.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_BM.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_BS.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_BW.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_BZ.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_CA.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_CC.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_CH.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_CK.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_CM.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_CX.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_CY.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_DE.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_DG.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_DK.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_DM.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_ER.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_FI.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_FJ.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_FK.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_FM.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_GB.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_GD.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_GG.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_GH.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_GI.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_GM.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_GU.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_GY.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_HK.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_IE.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_IL.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_IM.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_IO.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_ISO.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_JE.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_JM.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_KE.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_KI.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_KN.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_KY.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_LC.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_LR.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_LS.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_MG.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_MH.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_MO.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_MP.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_MS.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_MT.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_MU.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_MW.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_MY.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_NA.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_NF.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_NG.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_NL.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_NR.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_NU.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_NZ.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_PG.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_PH.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_PK.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_PN.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_PR.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_PW.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_RW.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_SB.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_SC.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_SD.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_SE.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_SG.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_SH.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_SI.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_SL.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_SS.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_SX.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_SZ.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_TC.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_TK.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_TO.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_TT.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_TV.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_TZ.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_UG.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_UM.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_US.php | 0 .../carbon/src/Carbon/Lang/en_US_Posix.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_VC.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_VG.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_VI.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_VU.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_WS.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_ZA.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_ZM.php | 0 .../nesbot/carbon/src/Carbon/Lang/en_ZW.php | 0 .../nesbot/carbon/src/Carbon/Lang/eo.php | 0 .../nesbot/carbon/src/Carbon/Lang/es.php | 0 .../nesbot/carbon/src/Carbon/Lang/es_419.php | 0 .../nesbot/carbon/src/Carbon/Lang/es_AR.php | 0 .../nesbot/carbon/src/Carbon/Lang/es_BO.php | 0 .../nesbot/carbon/src/Carbon/Lang/es_BR.php | 0 .../nesbot/carbon/src/Carbon/Lang/es_BZ.php | 0 .../nesbot/carbon/src/Carbon/Lang/es_CL.php | 0 .../nesbot/carbon/src/Carbon/Lang/es_CO.php | 0 .../nesbot/carbon/src/Carbon/Lang/es_CR.php | 0 .../nesbot/carbon/src/Carbon/Lang/es_CU.php | 0 .../nesbot/carbon/src/Carbon/Lang/es_DO.php | 0 .../nesbot/carbon/src/Carbon/Lang/es_EA.php | 0 .../nesbot/carbon/src/Carbon/Lang/es_EC.php | 0 .../nesbot/carbon/src/Carbon/Lang/es_ES.php | 0 .../nesbot/carbon/src/Carbon/Lang/es_GQ.php | 0 .../nesbot/carbon/src/Carbon/Lang/es_GT.php | 0 .../nesbot/carbon/src/Carbon/Lang/es_HN.php | 0 .../nesbot/carbon/src/Carbon/Lang/es_IC.php | 0 .../nesbot/carbon/src/Carbon/Lang/es_MX.php | 0 .../nesbot/carbon/src/Carbon/Lang/es_NI.php | 0 .../nesbot/carbon/src/Carbon/Lang/es_PA.php | 0 .../nesbot/carbon/src/Carbon/Lang/es_PE.php | 0 .../nesbot/carbon/src/Carbon/Lang/es_PH.php | 0 .../nesbot/carbon/src/Carbon/Lang/es_PR.php | 0 .../nesbot/carbon/src/Carbon/Lang/es_PY.php | 0 .../nesbot/carbon/src/Carbon/Lang/es_SV.php | 0 .../nesbot/carbon/src/Carbon/Lang/es_US.php | 0 .../nesbot/carbon/src/Carbon/Lang/es_UY.php | 0 .../nesbot/carbon/src/Carbon/Lang/es_VE.php | 0 .../nesbot/carbon/src/Carbon/Lang/et.php | 0 .../nesbot/carbon/src/Carbon/Lang/et_EE.php | 0 .../nesbot/carbon/src/Carbon/Lang/eu.php | 0 .../nesbot/carbon/src/Carbon/Lang/eu_ES.php | 0 .../nesbot/carbon/src/Carbon/Lang/ewo.php | 0 .../nesbot/carbon/src/Carbon/Lang/fa.php | 0 .../nesbot/carbon/src/Carbon/Lang/fa_AF.php | 0 .../nesbot/carbon/src/Carbon/Lang/fa_IR.php | 0 .../nesbot/carbon/src/Carbon/Lang/ff.php | 0 .../nesbot/carbon/src/Carbon/Lang/ff_CM.php | 0 .../nesbot/carbon/src/Carbon/Lang/ff_GN.php | 0 .../nesbot/carbon/src/Carbon/Lang/ff_MR.php | 0 .../nesbot/carbon/src/Carbon/Lang/ff_SN.php | 0 .../nesbot/carbon/src/Carbon/Lang/fi.php | 0 .../nesbot/carbon/src/Carbon/Lang/fi_FI.php | 0 .../nesbot/carbon/src/Carbon/Lang/fil.php | 0 .../nesbot/carbon/src/Carbon/Lang/fil_PH.php | 0 .../nesbot/carbon/src/Carbon/Lang/fo.php | 0 .../nesbot/carbon/src/Carbon/Lang/fo_DK.php | 0 .../nesbot/carbon/src/Carbon/Lang/fo_FO.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_BE.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_BF.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_BI.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_BJ.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_BL.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_CA.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_CD.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_CF.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_CG.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_CH.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_CI.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_CM.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_DJ.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_DZ.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_FR.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_GA.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_GF.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_GN.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_GP.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_GQ.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_HT.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_KM.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_LU.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_MA.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_MC.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_MF.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_MG.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_ML.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_MQ.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_MR.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_MU.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_NC.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_NE.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_PF.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_PM.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_RE.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_RW.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_SC.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_SN.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_SY.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_TD.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_TG.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_TN.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_VU.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_WF.php | 0 .../nesbot/carbon/src/Carbon/Lang/fr_YT.php | 0 .../nesbot/carbon/src/Carbon/Lang/fur.php | 0 .../nesbot/carbon/src/Carbon/Lang/fur_IT.php | 0 .../nesbot/carbon/src/Carbon/Lang/fy.php | 0 .../nesbot/carbon/src/Carbon/Lang/fy_DE.php | 0 .../nesbot/carbon/src/Carbon/Lang/fy_NL.php | 0 .../nesbot/carbon/src/Carbon/Lang/ga.php | 0 .../nesbot/carbon/src/Carbon/Lang/ga_IE.php | 0 .../nesbot/carbon/src/Carbon/Lang/gd.php | 0 .../nesbot/carbon/src/Carbon/Lang/gd_GB.php | 0 .../nesbot/carbon/src/Carbon/Lang/gez.php | 0 .../nesbot/carbon/src/Carbon/Lang/gez_ER.php | 0 .../nesbot/carbon/src/Carbon/Lang/gez_ET.php | 0 .../nesbot/carbon/src/Carbon/Lang/gl.php | 0 .../nesbot/carbon/src/Carbon/Lang/gl_ES.php | 0 .../nesbot/carbon/src/Carbon/Lang/gom.php | 0 .../carbon/src/Carbon/Lang/gom_Latn.php | 0 .../nesbot/carbon/src/Carbon/Lang/gsw.php | 0 .../nesbot/carbon/src/Carbon/Lang/gsw_CH.php | 0 .../nesbot/carbon/src/Carbon/Lang/gsw_FR.php | 0 .../nesbot/carbon/src/Carbon/Lang/gsw_LI.php | 0 .../nesbot/carbon/src/Carbon/Lang/gu.php | 0 .../nesbot/carbon/src/Carbon/Lang/gu_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/guz.php | 0 .../nesbot/carbon/src/Carbon/Lang/gv.php | 0 .../nesbot/carbon/src/Carbon/Lang/gv_GB.php | 0 .../nesbot/carbon/src/Carbon/Lang/ha.php | 0 .../nesbot/carbon/src/Carbon/Lang/ha_GH.php | 0 .../nesbot/carbon/src/Carbon/Lang/ha_NE.php | 0 .../nesbot/carbon/src/Carbon/Lang/ha_NG.php | 0 .../nesbot/carbon/src/Carbon/Lang/hak.php | 0 .../nesbot/carbon/src/Carbon/Lang/hak_TW.php | 0 .../nesbot/carbon/src/Carbon/Lang/haw.php | 0 .../nesbot/carbon/src/Carbon/Lang/he.php | 0 .../nesbot/carbon/src/Carbon/Lang/he_IL.php | 0 .../nesbot/carbon/src/Carbon/Lang/hi.php | 0 .../nesbot/carbon/src/Carbon/Lang/hi_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/hif.php | 0 .../nesbot/carbon/src/Carbon/Lang/hif_FJ.php | 0 .../nesbot/carbon/src/Carbon/Lang/hne.php | 0 .../nesbot/carbon/src/Carbon/Lang/hne_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/hr.php | 0 .../nesbot/carbon/src/Carbon/Lang/hr_BA.php | 0 .../nesbot/carbon/src/Carbon/Lang/hr_HR.php | 0 .../nesbot/carbon/src/Carbon/Lang/hsb.php | 0 .../nesbot/carbon/src/Carbon/Lang/hsb_DE.php | 0 .../nesbot/carbon/src/Carbon/Lang/ht.php | 0 .../nesbot/carbon/src/Carbon/Lang/ht_HT.php | 0 .../nesbot/carbon/src/Carbon/Lang/hu.php | 0 .../nesbot/carbon/src/Carbon/Lang/hu_HU.php | 0 .../nesbot/carbon/src/Carbon/Lang/hy.php | 0 .../nesbot/carbon/src/Carbon/Lang/hy_AM.php | 0 .../nesbot/carbon/src/Carbon/Lang/i18n.php | 0 .../nesbot/carbon/src/Carbon/Lang/ia.php | 0 .../nesbot/carbon/src/Carbon/Lang/ia_FR.php | 0 .../nesbot/carbon/src/Carbon/Lang/id.php | 0 .../nesbot/carbon/src/Carbon/Lang/id_ID.php | 0 .../nesbot/carbon/src/Carbon/Lang/ig.php | 0 .../nesbot/carbon/src/Carbon/Lang/ig_NG.php | 0 .../nesbot/carbon/src/Carbon/Lang/ii.php | 0 .../nesbot/carbon/src/Carbon/Lang/ik.php | 0 .../nesbot/carbon/src/Carbon/Lang/ik_CA.php | 0 .../nesbot/carbon/src/Carbon/Lang/in.php | 0 .../nesbot/carbon/src/Carbon/Lang/is.php | 0 .../nesbot/carbon/src/Carbon/Lang/is_IS.php | 0 .../nesbot/carbon/src/Carbon/Lang/it.php | 0 .../nesbot/carbon/src/Carbon/Lang/it_CH.php | 0 .../nesbot/carbon/src/Carbon/Lang/it_IT.php | 0 .../nesbot/carbon/src/Carbon/Lang/it_SM.php | 0 .../nesbot/carbon/src/Carbon/Lang/it_VA.php | 0 .../nesbot/carbon/src/Carbon/Lang/iu.php | 0 .../nesbot/carbon/src/Carbon/Lang/iu_CA.php | 0 .../nesbot/carbon/src/Carbon/Lang/iw.php | 0 .../nesbot/carbon/src/Carbon/Lang/ja.php | 0 .../nesbot/carbon/src/Carbon/Lang/ja_JP.php | 0 .../nesbot/carbon/src/Carbon/Lang/jgo.php | 0 .../nesbot/carbon/src/Carbon/Lang/jmc.php | 0 .../nesbot/carbon/src/Carbon/Lang/jv.php | 0 .../nesbot/carbon/src/Carbon/Lang/ka.php | 0 .../nesbot/carbon/src/Carbon/Lang/ka_GE.php | 0 .../nesbot/carbon/src/Carbon/Lang/kab.php | 0 .../nesbot/carbon/src/Carbon/Lang/kab_DZ.php | 0 .../nesbot/carbon/src/Carbon/Lang/kam.php | 0 .../nesbot/carbon/src/Carbon/Lang/kde.php | 0 .../nesbot/carbon/src/Carbon/Lang/kea.php | 0 .../nesbot/carbon/src/Carbon/Lang/khq.php | 0 .../nesbot/carbon/src/Carbon/Lang/ki.php | 0 .../nesbot/carbon/src/Carbon/Lang/kk.php | 0 .../nesbot/carbon/src/Carbon/Lang/kk_KZ.php | 0 .../nesbot/carbon/src/Carbon/Lang/kkj.php | 0 .../nesbot/carbon/src/Carbon/Lang/kl.php | 0 .../nesbot/carbon/src/Carbon/Lang/kl_GL.php | 0 .../nesbot/carbon/src/Carbon/Lang/kln.php | 0 .../nesbot/carbon/src/Carbon/Lang/km.php | 0 .../nesbot/carbon/src/Carbon/Lang/km_KH.php | 0 .../nesbot/carbon/src/Carbon/Lang/kn.php | 0 .../nesbot/carbon/src/Carbon/Lang/kn_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/ko.php | 0 .../nesbot/carbon/src/Carbon/Lang/ko_KP.php | 0 .../nesbot/carbon/src/Carbon/Lang/ko_KR.php | 0 .../nesbot/carbon/src/Carbon/Lang/kok.php | 0 .../nesbot/carbon/src/Carbon/Lang/kok_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/ks.php | 0 .../nesbot/carbon/src/Carbon/Lang/ks_IN.php | 0 .../src/Carbon/Lang/ks_IN@devanagari.php | 0 .../nesbot/carbon/src/Carbon/Lang/ksb.php | 0 .../nesbot/carbon/src/Carbon/Lang/ksf.php | 0 .../nesbot/carbon/src/Carbon/Lang/ksh.php | 0 .../nesbot/carbon/src/Carbon/Lang/ku.php | 0 .../nesbot/carbon/src/Carbon/Lang/ku_TR.php | 0 .../nesbot/carbon/src/Carbon/Lang/kw.php | 0 .../nesbot/carbon/src/Carbon/Lang/kw_GB.php | 0 .../nesbot/carbon/src/Carbon/Lang/ky.php | 0 .../nesbot/carbon/src/Carbon/Lang/ky_KG.php | 0 .../nesbot/carbon/src/Carbon/Lang/lag.php | 0 .../nesbot/carbon/src/Carbon/Lang/lb.php | 0 .../nesbot/carbon/src/Carbon/Lang/lb_LU.php | 0 .../nesbot/carbon/src/Carbon/Lang/lg.php | 0 .../nesbot/carbon/src/Carbon/Lang/lg_UG.php | 0 .../nesbot/carbon/src/Carbon/Lang/li.php | 0 .../nesbot/carbon/src/Carbon/Lang/li_NL.php | 0 .../nesbot/carbon/src/Carbon/Lang/lij.php | 0 .../nesbot/carbon/src/Carbon/Lang/lij_IT.php | 0 .../nesbot/carbon/src/Carbon/Lang/lkt.php | 0 .../nesbot/carbon/src/Carbon/Lang/ln.php | 0 .../nesbot/carbon/src/Carbon/Lang/ln_AO.php | 0 .../nesbot/carbon/src/Carbon/Lang/ln_CD.php | 0 .../nesbot/carbon/src/Carbon/Lang/ln_CF.php | 0 .../nesbot/carbon/src/Carbon/Lang/ln_CG.php | 0 .../nesbot/carbon/src/Carbon/Lang/lo.php | 0 .../nesbot/carbon/src/Carbon/Lang/lo_LA.php | 0 .../nesbot/carbon/src/Carbon/Lang/lrc.php | 0 .../nesbot/carbon/src/Carbon/Lang/lrc_IQ.php | 0 .../nesbot/carbon/src/Carbon/Lang/lt.php | 0 .../nesbot/carbon/src/Carbon/Lang/lt_LT.php | 0 .../nesbot/carbon/src/Carbon/Lang/lu.php | 0 .../nesbot/carbon/src/Carbon/Lang/luo.php | 0 .../nesbot/carbon/src/Carbon/Lang/luy.php | 0 .../nesbot/carbon/src/Carbon/Lang/lv.php | 0 .../nesbot/carbon/src/Carbon/Lang/lv_LV.php | 0 .../nesbot/carbon/src/Carbon/Lang/lzh.php | 0 .../nesbot/carbon/src/Carbon/Lang/lzh_TW.php | 0 .../nesbot/carbon/src/Carbon/Lang/mag.php | 0 .../nesbot/carbon/src/Carbon/Lang/mag_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/mai.php | 0 .../nesbot/carbon/src/Carbon/Lang/mai_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/mas.php | 0 .../nesbot/carbon/src/Carbon/Lang/mas_TZ.php | 0 .../nesbot/carbon/src/Carbon/Lang/mer.php | 0 .../nesbot/carbon/src/Carbon/Lang/mfe.php | 0 .../nesbot/carbon/src/Carbon/Lang/mfe_MU.php | 0 .../nesbot/carbon/src/Carbon/Lang/mg.php | 0 .../nesbot/carbon/src/Carbon/Lang/mg_MG.php | 0 .../nesbot/carbon/src/Carbon/Lang/mgh.php | 0 .../nesbot/carbon/src/Carbon/Lang/mgo.php | 0 .../nesbot/carbon/src/Carbon/Lang/mhr.php | 0 .../nesbot/carbon/src/Carbon/Lang/mhr_RU.php | 0 .../nesbot/carbon/src/Carbon/Lang/mi.php | 0 .../nesbot/carbon/src/Carbon/Lang/mi_NZ.php | 0 .../nesbot/carbon/src/Carbon/Lang/miq.php | 0 .../nesbot/carbon/src/Carbon/Lang/miq_NI.php | 0 .../nesbot/carbon/src/Carbon/Lang/mjw.php | 0 .../nesbot/carbon/src/Carbon/Lang/mjw_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/mk.php | 0 .../nesbot/carbon/src/Carbon/Lang/mk_MK.php | 0 .../nesbot/carbon/src/Carbon/Lang/ml.php | 0 .../nesbot/carbon/src/Carbon/Lang/ml_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/mn.php | 0 .../nesbot/carbon/src/Carbon/Lang/mn_MN.php | 0 .../nesbot/carbon/src/Carbon/Lang/mni.php | 0 .../nesbot/carbon/src/Carbon/Lang/mni_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/mo.php | 0 .../nesbot/carbon/src/Carbon/Lang/mr.php | 0 .../nesbot/carbon/src/Carbon/Lang/mr_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/ms.php | 0 .../nesbot/carbon/src/Carbon/Lang/ms_BN.php | 0 .../nesbot/carbon/src/Carbon/Lang/ms_MY.php | 0 .../nesbot/carbon/src/Carbon/Lang/ms_SG.php | 0 .../nesbot/carbon/src/Carbon/Lang/mt.php | 0 .../nesbot/carbon/src/Carbon/Lang/mt_MT.php | 0 .../nesbot/carbon/src/Carbon/Lang/mua.php | 0 .../nesbot/carbon/src/Carbon/Lang/my.php | 0 .../nesbot/carbon/src/Carbon/Lang/my_MM.php | 0 .../nesbot/carbon/src/Carbon/Lang/mzn.php | 0 .../nesbot/carbon/src/Carbon/Lang/nan.php | 0 .../nesbot/carbon/src/Carbon/Lang/nan_TW.php | 0 .../carbon/src/Carbon/Lang/nan_TW@latin.php | 0 .../nesbot/carbon/src/Carbon/Lang/naq.php | 0 .../nesbot/carbon/src/Carbon/Lang/nb.php | 0 .../nesbot/carbon/src/Carbon/Lang/nb_NO.php | 0 .../nesbot/carbon/src/Carbon/Lang/nb_SJ.php | 0 .../nesbot/carbon/src/Carbon/Lang/nd.php | 0 .../nesbot/carbon/src/Carbon/Lang/nds.php | 0 .../nesbot/carbon/src/Carbon/Lang/nds_DE.php | 0 .../nesbot/carbon/src/Carbon/Lang/nds_NL.php | 0 .../nesbot/carbon/src/Carbon/Lang/ne.php | 0 .../nesbot/carbon/src/Carbon/Lang/ne_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/ne_NP.php | 0 .../nesbot/carbon/src/Carbon/Lang/nhn.php | 0 .../nesbot/carbon/src/Carbon/Lang/nhn_MX.php | 0 .../nesbot/carbon/src/Carbon/Lang/niu.php | 0 .../nesbot/carbon/src/Carbon/Lang/niu_NU.php | 0 .../nesbot/carbon/src/Carbon/Lang/nl.php | 0 .../nesbot/carbon/src/Carbon/Lang/nl_AW.php | 0 .../nesbot/carbon/src/Carbon/Lang/nl_BE.php | 0 .../nesbot/carbon/src/Carbon/Lang/nl_BQ.php | 0 .../nesbot/carbon/src/Carbon/Lang/nl_CW.php | 0 .../nesbot/carbon/src/Carbon/Lang/nl_NL.php | 0 .../nesbot/carbon/src/Carbon/Lang/nl_SR.php | 0 .../nesbot/carbon/src/Carbon/Lang/nl_SX.php | 0 .../nesbot/carbon/src/Carbon/Lang/nmg.php | 0 .../nesbot/carbon/src/Carbon/Lang/nn.php | 0 .../nesbot/carbon/src/Carbon/Lang/nn_NO.php | 0 .../nesbot/carbon/src/Carbon/Lang/nnh.php | 0 .../nesbot/carbon/src/Carbon/Lang/no.php | 0 .../nesbot/carbon/src/Carbon/Lang/nr.php | 0 .../nesbot/carbon/src/Carbon/Lang/nr_ZA.php | 0 .../nesbot/carbon/src/Carbon/Lang/nso.php | 0 .../nesbot/carbon/src/Carbon/Lang/nso_ZA.php | 0 .../nesbot/carbon/src/Carbon/Lang/nus.php | 0 .../nesbot/carbon/src/Carbon/Lang/nyn.php | 0 .../nesbot/carbon/src/Carbon/Lang/oc.php | 0 .../nesbot/carbon/src/Carbon/Lang/oc_FR.php | 0 .../nesbot/carbon/src/Carbon/Lang/om.php | 0 .../nesbot/carbon/src/Carbon/Lang/om_ET.php | 0 .../nesbot/carbon/src/Carbon/Lang/om_KE.php | 0 .../nesbot/carbon/src/Carbon/Lang/or.php | 0 .../nesbot/carbon/src/Carbon/Lang/or_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/os.php | 0 .../nesbot/carbon/src/Carbon/Lang/os_RU.php | 0 .../nesbot/carbon/src/Carbon/Lang/pa.php | 0 .../nesbot/carbon/src/Carbon/Lang/pa_Arab.php | 0 .../nesbot/carbon/src/Carbon/Lang/pa_Guru.php | 0 .../nesbot/carbon/src/Carbon/Lang/pa_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/pa_PK.php | 0 .../nesbot/carbon/src/Carbon/Lang/pap.php | 0 .../nesbot/carbon/src/Carbon/Lang/pap_AW.php | 0 .../nesbot/carbon/src/Carbon/Lang/pap_CW.php | 0 .../nesbot/carbon/src/Carbon/Lang/pl.php | 0 .../nesbot/carbon/src/Carbon/Lang/pl_PL.php | 0 .../nesbot/carbon/src/Carbon/Lang/prg.php | 0 .../nesbot/carbon/src/Carbon/Lang/ps.php | 0 .../nesbot/carbon/src/Carbon/Lang/ps_AF.php | 0 .../nesbot/carbon/src/Carbon/Lang/pt.php | 0 .../nesbot/carbon/src/Carbon/Lang/pt_AO.php | 0 .../nesbot/carbon/src/Carbon/Lang/pt_BR.php | 0 .../nesbot/carbon/src/Carbon/Lang/pt_CH.php | 0 .../nesbot/carbon/src/Carbon/Lang/pt_CV.php | 0 .../nesbot/carbon/src/Carbon/Lang/pt_GQ.php | 0 .../nesbot/carbon/src/Carbon/Lang/pt_GW.php | 0 .../nesbot/carbon/src/Carbon/Lang/pt_LU.php | 0 .../nesbot/carbon/src/Carbon/Lang/pt_MO.php | 0 .../nesbot/carbon/src/Carbon/Lang/pt_MZ.php | 0 .../nesbot/carbon/src/Carbon/Lang/pt_PT.php | 0 .../nesbot/carbon/src/Carbon/Lang/pt_ST.php | 0 .../nesbot/carbon/src/Carbon/Lang/pt_TL.php | 0 .../nesbot/carbon/src/Carbon/Lang/qu.php | 0 .../nesbot/carbon/src/Carbon/Lang/qu_BO.php | 0 .../nesbot/carbon/src/Carbon/Lang/qu_EC.php | 0 .../nesbot/carbon/src/Carbon/Lang/quz.php | 0 .../nesbot/carbon/src/Carbon/Lang/quz_PE.php | 0 .../nesbot/carbon/src/Carbon/Lang/raj.php | 0 .../nesbot/carbon/src/Carbon/Lang/raj_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/rm.php | 0 .../nesbot/carbon/src/Carbon/Lang/rn.php | 0 .../nesbot/carbon/src/Carbon/Lang/ro.php | 0 .../nesbot/carbon/src/Carbon/Lang/ro_MD.php | 0 .../nesbot/carbon/src/Carbon/Lang/ro_RO.php | 0 .../nesbot/carbon/src/Carbon/Lang/rof.php | 0 .../nesbot/carbon/src/Carbon/Lang/ru.php | 0 .../nesbot/carbon/src/Carbon/Lang/ru_BY.php | 0 .../nesbot/carbon/src/Carbon/Lang/ru_KG.php | 0 .../nesbot/carbon/src/Carbon/Lang/ru_KZ.php | 0 .../nesbot/carbon/src/Carbon/Lang/ru_MD.php | 0 .../nesbot/carbon/src/Carbon/Lang/ru_RU.php | 0 .../nesbot/carbon/src/Carbon/Lang/ru_UA.php | 0 .../nesbot/carbon/src/Carbon/Lang/rw.php | 0 .../nesbot/carbon/src/Carbon/Lang/rw_RW.php | 0 .../nesbot/carbon/src/Carbon/Lang/rwk.php | 0 .../nesbot/carbon/src/Carbon/Lang/sa.php | 0 .../nesbot/carbon/src/Carbon/Lang/sa_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/sah.php | 0 .../nesbot/carbon/src/Carbon/Lang/sah_RU.php | 0 .../nesbot/carbon/src/Carbon/Lang/saq.php | 0 .../nesbot/carbon/src/Carbon/Lang/sat.php | 0 .../nesbot/carbon/src/Carbon/Lang/sat_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/sbp.php | 0 .../nesbot/carbon/src/Carbon/Lang/sc.php | 0 .../nesbot/carbon/src/Carbon/Lang/sc_IT.php | 0 .../nesbot/carbon/src/Carbon/Lang/sd.php | 0 .../nesbot/carbon/src/Carbon/Lang/sd_IN.php | 0 .../src/Carbon/Lang/sd_IN@devanagari.php | 0 .../nesbot/carbon/src/Carbon/Lang/se.php | 0 .../nesbot/carbon/src/Carbon/Lang/se_FI.php | 0 .../nesbot/carbon/src/Carbon/Lang/se_NO.php | 0 .../nesbot/carbon/src/Carbon/Lang/se_SE.php | 0 .../nesbot/carbon/src/Carbon/Lang/seh.php | 0 .../nesbot/carbon/src/Carbon/Lang/ses.php | 0 .../nesbot/carbon/src/Carbon/Lang/sg.php | 0 .../nesbot/carbon/src/Carbon/Lang/sgs.php | 0 .../nesbot/carbon/src/Carbon/Lang/sgs_LT.php | 0 .../nesbot/carbon/src/Carbon/Lang/sh.php | 0 .../nesbot/carbon/src/Carbon/Lang/shi.php | 0 .../carbon/src/Carbon/Lang/shi_Latn.php | 0 .../carbon/src/Carbon/Lang/shi_Tfng.php | 0 .../nesbot/carbon/src/Carbon/Lang/shn.php | 0 .../nesbot/carbon/src/Carbon/Lang/shn_MM.php | 0 .../nesbot/carbon/src/Carbon/Lang/shs.php | 0 .../nesbot/carbon/src/Carbon/Lang/shs_CA.php | 0 .../nesbot/carbon/src/Carbon/Lang/si.php | 0 .../nesbot/carbon/src/Carbon/Lang/si_LK.php | 0 .../nesbot/carbon/src/Carbon/Lang/sid.php | 0 .../nesbot/carbon/src/Carbon/Lang/sid_ET.php | 0 .../nesbot/carbon/src/Carbon/Lang/sk.php | 0 .../nesbot/carbon/src/Carbon/Lang/sk_SK.php | 0 .../nesbot/carbon/src/Carbon/Lang/sl.php | 0 .../nesbot/carbon/src/Carbon/Lang/sl_SI.php | 0 .../nesbot/carbon/src/Carbon/Lang/sm.php | 0 .../nesbot/carbon/src/Carbon/Lang/sm_WS.php | 0 .../nesbot/carbon/src/Carbon/Lang/smn.php | 0 .../nesbot/carbon/src/Carbon/Lang/sn.php | 0 .../nesbot/carbon/src/Carbon/Lang/so.php | 0 .../nesbot/carbon/src/Carbon/Lang/so_DJ.php | 0 .../nesbot/carbon/src/Carbon/Lang/so_ET.php | 0 .../nesbot/carbon/src/Carbon/Lang/so_KE.php | 0 .../nesbot/carbon/src/Carbon/Lang/so_SO.php | 0 .../nesbot/carbon/src/Carbon/Lang/sq.php | 0 .../nesbot/carbon/src/Carbon/Lang/sq_AL.php | 0 .../nesbot/carbon/src/Carbon/Lang/sq_MK.php | 0 .../nesbot/carbon/src/Carbon/Lang/sq_XK.php | 0 .../nesbot/carbon/src/Carbon/Lang/sr.php | 0 .../nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php | 0 .../carbon/src/Carbon/Lang/sr_Cyrl_BA.php | 0 .../carbon/src/Carbon/Lang/sr_Cyrl_ME.php | 0 .../carbon/src/Carbon/Lang/sr_Cyrl_XK.php | 0 .../nesbot/carbon/src/Carbon/Lang/sr_Latn.php | 0 .../carbon/src/Carbon/Lang/sr_Latn_BA.php | 0 .../carbon/src/Carbon/Lang/sr_Latn_ME.php | 0 .../carbon/src/Carbon/Lang/sr_Latn_XK.php | 0 .../nesbot/carbon/src/Carbon/Lang/sr_ME.php | 0 .../nesbot/carbon/src/Carbon/Lang/sr_RS.php | 0 .../carbon/src/Carbon/Lang/sr_RS@latin.php | 0 .../nesbot/carbon/src/Carbon/Lang/ss.php | 0 .../nesbot/carbon/src/Carbon/Lang/ss_ZA.php | 0 .../nesbot/carbon/src/Carbon/Lang/st.php | 0 .../nesbot/carbon/src/Carbon/Lang/st_ZA.php | 0 .../nesbot/carbon/src/Carbon/Lang/sv.php | 0 .../nesbot/carbon/src/Carbon/Lang/sv_AX.php | 0 .../nesbot/carbon/src/Carbon/Lang/sv_FI.php | 0 .../nesbot/carbon/src/Carbon/Lang/sv_SE.php | 0 .../nesbot/carbon/src/Carbon/Lang/sw.php | 0 .../nesbot/carbon/src/Carbon/Lang/sw_CD.php | 0 .../nesbot/carbon/src/Carbon/Lang/sw_KE.php | 0 .../nesbot/carbon/src/Carbon/Lang/sw_TZ.php | 0 .../nesbot/carbon/src/Carbon/Lang/sw_UG.php | 0 .../nesbot/carbon/src/Carbon/Lang/szl.php | 0 .../nesbot/carbon/src/Carbon/Lang/szl_PL.php | 0 .../nesbot/carbon/src/Carbon/Lang/ta.php | 0 .../nesbot/carbon/src/Carbon/Lang/ta_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/ta_LK.php | 0 .../nesbot/carbon/src/Carbon/Lang/ta_MY.php | 0 .../nesbot/carbon/src/Carbon/Lang/ta_SG.php | 0 .../nesbot/carbon/src/Carbon/Lang/tcy.php | 0 .../nesbot/carbon/src/Carbon/Lang/tcy_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/te.php | 0 .../nesbot/carbon/src/Carbon/Lang/te_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/teo.php | 0 .../nesbot/carbon/src/Carbon/Lang/teo_KE.php | 0 .../nesbot/carbon/src/Carbon/Lang/tet.php | 0 .../nesbot/carbon/src/Carbon/Lang/tg.php | 0 .../nesbot/carbon/src/Carbon/Lang/tg_TJ.php | 0 .../nesbot/carbon/src/Carbon/Lang/th.php | 0 .../nesbot/carbon/src/Carbon/Lang/th_TH.php | 0 .../nesbot/carbon/src/Carbon/Lang/the.php | 0 .../nesbot/carbon/src/Carbon/Lang/the_NP.php | 0 .../nesbot/carbon/src/Carbon/Lang/ti.php | 0 .../nesbot/carbon/src/Carbon/Lang/ti_ER.php | 0 .../nesbot/carbon/src/Carbon/Lang/ti_ET.php | 0 .../nesbot/carbon/src/Carbon/Lang/tig.php | 0 .../nesbot/carbon/src/Carbon/Lang/tig_ER.php | 0 .../nesbot/carbon/src/Carbon/Lang/tk.php | 0 .../nesbot/carbon/src/Carbon/Lang/tk_TM.php | 0 .../nesbot/carbon/src/Carbon/Lang/tl.php | 0 .../nesbot/carbon/src/Carbon/Lang/tl_PH.php | 0 .../nesbot/carbon/src/Carbon/Lang/tlh.php | 0 .../nesbot/carbon/src/Carbon/Lang/tn.php | 0 .../nesbot/carbon/src/Carbon/Lang/tn_ZA.php | 0 .../nesbot/carbon/src/Carbon/Lang/to.php | 0 .../nesbot/carbon/src/Carbon/Lang/to_TO.php | 0 .../nesbot/carbon/src/Carbon/Lang/tpi.php | 0 .../nesbot/carbon/src/Carbon/Lang/tpi_PG.php | 0 .../nesbot/carbon/src/Carbon/Lang/tr.php | 0 .../nesbot/carbon/src/Carbon/Lang/tr_CY.php | 0 .../nesbot/carbon/src/Carbon/Lang/tr_TR.php | 0 .../nesbot/carbon/src/Carbon/Lang/ts.php | 0 .../nesbot/carbon/src/Carbon/Lang/ts_ZA.php | 0 .../nesbot/carbon/src/Carbon/Lang/tt.php | 0 .../nesbot/carbon/src/Carbon/Lang/tt_RU.php | 0 .../carbon/src/Carbon/Lang/tt_RU@iqtelif.php | 0 .../nesbot/carbon/src/Carbon/Lang/twq.php | 0 .../nesbot/carbon/src/Carbon/Lang/tzl.php | 0 .../nesbot/carbon/src/Carbon/Lang/tzm.php | 0 .../carbon/src/Carbon/Lang/tzm_Latn.php | 0 .../nesbot/carbon/src/Carbon/Lang/ug.php | 0 .../nesbot/carbon/src/Carbon/Lang/ug_CN.php | 0 .../nesbot/carbon/src/Carbon/Lang/uk.php | 0 .../nesbot/carbon/src/Carbon/Lang/uk_UA.php | 0 .../nesbot/carbon/src/Carbon/Lang/unm.php | 0 .../nesbot/carbon/src/Carbon/Lang/unm_US.php | 0 .../nesbot/carbon/src/Carbon/Lang/ur.php | 0 .../nesbot/carbon/src/Carbon/Lang/ur_IN.php | 0 .../nesbot/carbon/src/Carbon/Lang/ur_PK.php | 0 .../nesbot/carbon/src/Carbon/Lang/uz.php | 0 .../nesbot/carbon/src/Carbon/Lang/uz_Arab.php | 0 .../nesbot/carbon/src/Carbon/Lang/uz_Cyrl.php | 0 .../nesbot/carbon/src/Carbon/Lang/uz_Latn.php | 0 .../nesbot/carbon/src/Carbon/Lang/uz_UZ.php | 0 .../carbon/src/Carbon/Lang/uz_UZ@cyrillic.php | 0 .../nesbot/carbon/src/Carbon/Lang/vai.php | 0 .../carbon/src/Carbon/Lang/vai_Latn.php | 0 .../carbon/src/Carbon/Lang/vai_Vaii.php | 0 .../nesbot/carbon/src/Carbon/Lang/ve.php | 0 .../nesbot/carbon/src/Carbon/Lang/ve_ZA.php | 0 .../nesbot/carbon/src/Carbon/Lang/vi.php | 0 .../nesbot/carbon/src/Carbon/Lang/vi_VN.php | 0 .../nesbot/carbon/src/Carbon/Lang/vo.php | 0 .../nesbot/carbon/src/Carbon/Lang/vun.php | 0 .../nesbot/carbon/src/Carbon/Lang/wa.php | 0 .../nesbot/carbon/src/Carbon/Lang/wa_BE.php | 0 .../nesbot/carbon/src/Carbon/Lang/wae.php | 0 .../nesbot/carbon/src/Carbon/Lang/wae_CH.php | 0 .../nesbot/carbon/src/Carbon/Lang/wal.php | 0 .../nesbot/carbon/src/Carbon/Lang/wal_ET.php | 0 .../nesbot/carbon/src/Carbon/Lang/wo.php | 0 .../nesbot/carbon/src/Carbon/Lang/wo_SN.php | 0 .../nesbot/carbon/src/Carbon/Lang/xh.php | 0 .../nesbot/carbon/src/Carbon/Lang/xh_ZA.php | 0 .../nesbot/carbon/src/Carbon/Lang/xog.php | 0 .../nesbot/carbon/src/Carbon/Lang/yav.php | 0 .../nesbot/carbon/src/Carbon/Lang/yi.php | 0 .../nesbot/carbon/src/Carbon/Lang/yi_US.php | 0 .../nesbot/carbon/src/Carbon/Lang/yo.php | 0 .../nesbot/carbon/src/Carbon/Lang/yo_BJ.php | 0 .../nesbot/carbon/src/Carbon/Lang/yo_NG.php | 0 .../nesbot/carbon/src/Carbon/Lang/yue.php | 0 .../nesbot/carbon/src/Carbon/Lang/yue_HK.php | 0 .../carbon/src/Carbon/Lang/yue_Hans.php | 0 .../carbon/src/Carbon/Lang/yue_Hant.php | 0 .../nesbot/carbon/src/Carbon/Lang/yuw.php | 0 .../nesbot/carbon/src/Carbon/Lang/yuw_PG.php | 0 .../nesbot/carbon/src/Carbon/Lang/zgh.php | 0 .../nesbot/carbon/src/Carbon/Lang/zh.php | 0 .../nesbot/carbon/src/Carbon/Lang/zh_CN.php | 0 .../nesbot/carbon/src/Carbon/Lang/zh_HK.php | 0 .../nesbot/carbon/src/Carbon/Lang/zh_Hans.php | 0 .../carbon/src/Carbon/Lang/zh_Hans_HK.php | 0 .../carbon/src/Carbon/Lang/zh_Hans_MO.php | 0 .../carbon/src/Carbon/Lang/zh_Hans_SG.php | 0 .../nesbot/carbon/src/Carbon/Lang/zh_Hant.php | 0 .../carbon/src/Carbon/Lang/zh_Hant_HK.php | 0 .../carbon/src/Carbon/Lang/zh_Hant_MO.php | 0 .../carbon/src/Carbon/Lang/zh_Hant_TW.php | 0 .../nesbot/carbon/src/Carbon/Lang/zh_MO.php | 0 .../nesbot/carbon/src/Carbon/Lang/zh_SG.php | 0 .../nesbot/carbon/src/Carbon/Lang/zh_TW.php | 0 .../nesbot/carbon/src/Carbon/Lang/zh_YUE.php | 0 .../nesbot/carbon/src/Carbon/Lang/zu.php | 0 .../nesbot/carbon/src/Carbon/Lang/zu_ZA.php | 0 .../nesbot/carbon/src/Carbon/Language.php | 0 .../src/Carbon/Laravel/ServiceProvider.php | 0 .../carbon/src/Carbon/List/languages.php | 0 .../nesbot/carbon/src/Carbon/List/regions.php | 0 .../MessageFormatterMapper.php | 0 .../vendor/nesbot/carbon/src/Carbon/Month.php | 0 .../nesbot/carbon/src/Carbon/OverflowMode.php | 0 .../src/Carbon/PHPStan/MacroExtension.php | 0 .../Carbon/PHPStan/MacroMethodReflection.php | 0 .../carbon/src/Carbon/Traits/Boundaries.php | 0 .../nesbot/carbon/src/Carbon/Traits/Cast.php | 0 .../carbon/src/Carbon/Traits/Comparison.php | 0 .../carbon/src/Carbon/Traits/Converter.php | 0 .../carbon/src/Carbon/Traits/Creator.php | 0 .../nesbot/carbon/src/Carbon/Traits/Date.php | 0 .../Traits/DeprecatedPeriodProperties.php | 0 .../carbon/src/Carbon/Traits/Difference.php | 0 .../src/Carbon/Traits/IntervalRounding.php | 0 .../carbon/src/Carbon/Traits/IntervalStep.php | 0 .../carbon/src/Carbon/Traits/LocalFactory.php | 0 .../carbon/src/Carbon/Traits/Localization.php | 0 .../nesbot/carbon/src/Carbon/Traits/Macro.php | 0 .../src/Carbon/Traits/MagicParameter.php | 0 .../nesbot/carbon/src/Carbon/Traits/Mixin.php | 0 .../carbon/src/Carbon/Traits/Modifiers.php | 0 .../carbon/src/Carbon/Traits/Mutability.php | 0 .../Carbon/Traits/ObjectInitialisation.php | 0 .../carbon/src/Carbon/Traits/Options.php | 0 .../carbon/src/Carbon/Traits/Rounding.php | 0 .../src/Carbon/Traits/Serialization.php | 0 .../src/Carbon/Traits/StaticLocalization.php | 0 .../src/Carbon/Traits/StaticOptions.php | 0 .../nesbot/carbon/src/Carbon/Traits/Test.php | 0 .../carbon/src/Carbon/Traits/Timestamp.php | 0 .../src/Carbon/Traits/ToStringFormat.php | 0 .../nesbot/carbon/src/Carbon/Traits/Units.php | 0 .../nesbot/carbon/src/Carbon/Traits/Week.php | 0 .../nesbot/carbon/src/Carbon/Translator.php | 0 .../carbon/src/Carbon/TranslatorImmutable.php | 0 .../Carbon/TranslatorStrongTypeInterface.php | 0 .../vendor/nesbot/carbon/src/Carbon/Unit.php | 0 .../nesbot/carbon/src/Carbon/WeekDay.php | 0 .../nesbot/carbon/src/Carbon/WrapperClock.php | 0 .../vendor/php-di/invoker/LICENSE | 0 .../vendor/php-di/invoker/README.md | 0 .../vendor/php-di/invoker/composer.json | 0 .../php-di/invoker/src/CallableResolver.php | 0 .../src/Exception/InvocationException.php | 0 .../src/Exception/NotCallableException.php | 0 .../NotEnoughParametersException.php | 0 .../vendor/php-di/invoker/src/Invoker.php | 0 .../php-di/invoker/src/InvokerInterface.php | 0 .../AssociativeArrayResolver.php | 0 .../ParameterNameContainerResolver.php | 0 .../Container/TypeHintContainerResolver.php | 0 .../DefaultValueResolver.php | 0 .../NumericArrayResolver.php | 0 .../ParameterResolver/ParameterResolver.php | 0 .../src/ParameterResolver/ResolverChain.php | 0 .../ParameterResolver/TypeHintResolver.php | 0 .../src/Reflection/CallableReflection.php | 0 .../vendor/php-di/php-di/LICENSE | 0 .../vendor/php-di/php-di/README.md | 0 .../vendor/php-di/php-di/change-log.md | 0 .../vendor/php-di/php-di/composer.json | 0 .../php-di/php-di/src/Attribute/Inject.php | 0 .../php-di/src/Attribute/Injectable.php | 0 .../php-di/php-di/src/CompiledContainer.php | 0 .../php-di/php-di/src/Compiler/Compiler.php | 0 .../src/Compiler/ObjectCreationCompiler.php | 0 .../src/Compiler/RequestedEntryHolder.php | 0 .../php-di/php-di/src/Compiler/Template.php | 0 .../vendor/php-di/php-di/src/Container.php | 0 .../php-di/php-di/src/ContainerBuilder.php | 0 .../php-di/src/Definition/ArrayDefinition.php | 0 .../Definition/ArrayDefinitionExtension.php | 0 .../src/Definition/AutowireDefinition.php | 0 .../src/Definition/DecoratorDefinition.php | 0 .../php-di/src/Definition/Definition.php | 0 .../Dumper/ObjectDefinitionDumper.php | 0 .../EnvironmentVariableDefinition.php | 0 .../Definition/Exception/InvalidAttribute.php | 0 .../Exception/InvalidDefinition.php | 0 .../Definition/ExtendsPreviousDefinition.php | 0 .../src/Definition/FactoryDefinition.php | 0 .../Helper/AutowireDefinitionHelper.php | 0 .../Helper/CreateDefinitionHelper.php | 0 .../Definition/Helper/DefinitionHelper.php | 0 .../Helper/FactoryDefinitionHelper.php | 0 .../src/Definition/InstanceDefinition.php | 0 .../src/Definition/ObjectDefinition.php | 0 .../ObjectDefinition/MethodInjection.php | 0 .../ObjectDefinition/PropertyInjection.php | 0 .../php-di/src/Definition/Reference.php | 0 .../src/Definition/Resolver/ArrayResolver.php | 0 .../Definition/Resolver/DecoratorResolver.php | 0 .../Resolver/DefinitionResolver.php | 0 .../Resolver/EnvironmentVariableResolver.php | 0 .../Definition/Resolver/FactoryResolver.php | 0 .../Definition/Resolver/InstanceInjector.php | 0 .../src/Definition/Resolver/ObjectCreator.php | 0 .../Definition/Resolver/ParameterResolver.php | 0 .../Resolver/ResolverDispatcher.php | 0 .../Definition/SelfResolvingDefinition.php | 0 .../Source/AttributeBasedAutowiring.php | 0 .../src/Definition/Source/Autowiring.php | 0 .../src/Definition/Source/DefinitionArray.php | 0 .../src/Definition/Source/DefinitionFile.php | 0 .../Source/DefinitionNormalizer.php | 0 .../Definition/Source/DefinitionSource.php | 0 .../Source/MutableDefinitionSource.php | 0 .../src/Definition/Source/NoAutowiring.php | 0 .../Source/ReflectionBasedAutowiring.php | 0 .../src/Definition/Source/SourceCache.php | 0 .../src/Definition/Source/SourceChain.php | 0 .../src/Definition/StringDefinition.php | 0 .../php-di/src/Definition/ValueDefinition.php | 0 .../php-di/php-di/src/DependencyException.php | 0 .../php-di/src/Factory/RequestedEntry.php | 0 .../php-di/php-di/src/FactoryInterface.php | 0 .../Invoker/DefinitionParameterResolver.php | 0 .../src/Invoker/FactoryParameterResolver.php | 0 .../php-di/php-di/src/NotFoundException.php | 0 .../php-di/src/Proxy/NativeProxyFactory.php | 0 .../php-di/php-di/src/Proxy/ProxyFactory.php | 0 .../src/Proxy/ProxyFactoryInterface.php | 0 .../vendor/php-di/php-di/src/functions.php | 0 .../vendor/php-di/php-di/support.md | 0 .../vendor/psr/clock/CHANGELOG.md | 0 {plugins => libs}/vendor/psr/clock/LICENSE | 0 {plugins => libs}/vendor/psr/clock/README.md | 0 .../vendor/psr/clock/composer.json | 0 .../vendor/psr/clock/src/ClockInterface.php | 0 .../vendor/psr/container/.gitignore | 0 .../vendor/psr/container/LICENSE | 0 .../vendor/psr/container/README.md | 0 .../vendor/psr/container/composer.json | 0 .../src/ContainerExceptionInterface.php | 0 .../psr/container/src/ContainerInterface.php | 0 .../src/NotFoundExceptionInterface.php | 0 .../vendor/psr/http-factory/LICENSE | 0 .../vendor/psr/http-factory/README.md | 0 .../vendor/psr/http-factory/composer.json | 0 .../src/RequestFactoryInterface.php | 0 .../src/ResponseFactoryInterface.php | 0 .../src/ServerRequestFactoryInterface.php | 0 .../src/StreamFactoryInterface.php | 0 .../src/UploadedFileFactoryInterface.php | 0 .../http-factory/src/UriFactoryInterface.php | 0 .../vendor/psr/http-message/CHANGELOG.md | 0 .../vendor/psr/http-message/LICENSE | 0 .../vendor/psr/http-message/README.md | 0 .../vendor/psr/http-message/composer.json | 0 .../psr/http-message/docs/PSR7-Interfaces.md | 0 .../psr/http-message/docs/PSR7-Usage.md | 0 .../psr/http-message/src/MessageInterface.php | 0 .../psr/http-message/src/RequestInterface.php | 0 .../http-message/src/ResponseInterface.php | 0 .../src/ServerRequestInterface.php | 0 .../psr/http-message/src/StreamInterface.php | 0 .../src/UploadedFileInterface.php | 0 .../psr/http-message/src/UriInterface.php | 0 {plugins => libs}/vendor/psr/log/LICENSE | 0 {plugins => libs}/vendor/psr/log/README.md | 0 .../vendor/psr/log/composer.json | 0 .../vendor/psr/log/src/AbstractLogger.php | 0 .../psr/log/src/InvalidArgumentException.php | 0 .../vendor/psr/log/src/LogLevel.php | 0 .../psr/log/src/LoggerAwareInterface.php | 0 .../vendor/psr/log/src/LoggerAwareTrait.php | 0 .../vendor/psr/log/src/LoggerInterface.php | 0 .../vendor/psr/log/src/LoggerTrait.php | 0 .../vendor/psr/log/src/NullLogger.php | 0 .../vendor/psr/simple-cache/.editorconfig | 0 .../vendor/psr/simple-cache/LICENSE.md | 0 .../vendor/psr/simple-cache/README.md | 0 .../vendor/psr/simple-cache/composer.json | 0 .../psr/simple-cache/src/CacheException.php | 0 .../psr/simple-cache/src/CacheInterface.php | 0 .../src/InvalidArgumentException.php | 0 .../vendor/ralouphie/getallheaders/LICENSE | 0 .../vendor/ralouphie/getallheaders/README.md | 0 .../ralouphie/getallheaders/composer.json | 0 .../getallheaders/src/getallheaders.php | 0 .../vendor/symfony/clock/CHANGELOG.md | 0 .../vendor/symfony/clock/Clock.php | 0 .../vendor/symfony/clock/ClockAwareTrait.php | 0 .../vendor/symfony/clock/ClockInterface.php | 0 .../vendor/symfony/clock/DatePoint.php | 0 .../vendor/symfony/clock/LICENSE | 0 .../vendor/symfony/clock/MockClock.php | 0 .../vendor/symfony/clock/MonotonicClock.php | 0 .../vendor/symfony/clock/NativeClock.php | 0 .../vendor/symfony/clock/README.md | 0 .../vendor/symfony/clock/Resources/now.php | 0 .../clock/Test/ClockSensitiveTrait.php | 0 .../vendor/symfony/clock/composer.json | 0 .../deprecation-contracts/CHANGELOG.md | 0 .../symfony/deprecation-contracts/LICENSE | 0 .../symfony/deprecation-contracts/README.md | 0 .../deprecation-contracts/composer.json | 0 .../deprecation-contracts/function.php | 0 .../vendor/symfony/mime/Address.php | 0 .../symfony/mime/BodyRendererInterface.php | 0 .../vendor/symfony/mime/CHANGELOG.md | 0 .../vendor/symfony/mime/CharacterStream.php | 0 .../symfony/mime/Crypto/DkimOptions.php | 0 .../vendor/symfony/mime/Crypto/DkimSigner.php | 0 .../vendor/symfony/mime/Crypto/SMime.php | 0 .../symfony/mime/Crypto/SMimeEncrypter.php | 0 .../symfony/mime/Crypto/SMimeSigner.php | 0 .../AddMimeTypeGuesserPass.php | 0 .../vendor/symfony/mime/DraftEmail.php | 0 .../vendor/symfony/mime/Email.php | 0 .../mime/Encoder/AddressEncoderInterface.php | 0 .../mime/Encoder/Base64ContentEncoder.php | 0 .../symfony/mime/Encoder/Base64Encoder.php | 0 .../mime/Encoder/Base64MimeHeaderEncoder.php | 0 .../mime/Encoder/ContentEncoderInterface.php | 0 .../mime/Encoder/EightBitContentEncoder.php | 0 .../symfony/mime/Encoder/EncoderInterface.php | 0 .../mime/Encoder/IdnAddressEncoder.php | 0 .../Encoder/MimeHeaderEncoderInterface.php | 0 .../symfony/mime/Encoder/QpContentEncoder.php | 0 .../vendor/symfony/mime/Encoder/QpEncoder.php | 0 .../mime/Encoder/QpMimeHeaderEncoder.php | 0 .../symfony/mime/Encoder/Rfc2231Encoder.php | 0 .../Exception/AddressEncoderException.php | 0 .../mime/Exception/ExceptionInterface.php | 0 .../Exception/InvalidArgumentException.php | 0 .../symfony/mime/Exception/LogicException.php | 0 .../mime/Exception/RfcComplianceException.php | 0 .../mime/Exception/RuntimeException.php | 0 .../mime/FileBinaryMimeTypeGuesser.php | 0 .../symfony/mime/FileinfoMimeTypeGuesser.php | 0 .../symfony/mime/Header/AbstractHeader.php | 0 .../vendor/symfony/mime/Header/DateHeader.php | 0 .../symfony/mime/Header/HeaderInterface.php | 0 .../vendor/symfony/mime/Header/Headers.php | 0 .../mime/Header/IdentificationHeader.php | 0 .../symfony/mime/Header/MailboxHeader.php | 0 .../symfony/mime/Header/MailboxListHeader.php | 0 .../mime/Header/ParameterizedHeader.php | 0 .../vendor/symfony/mime/Header/PathHeader.php | 0 .../mime/Header/UnstructuredHeader.php | 0 .../DefaultHtmlToTextConverter.php | 0 .../HtmlToTextConverterInterface.php | 0 .../LeagueHtmlToMarkdownConverter.php | 0 {plugins => libs}/vendor/symfony/mime/LICENSE | 0 .../vendor/symfony/mime/Message.php | 0 .../vendor/symfony/mime/MessageConverter.php | 0 .../symfony/mime/MimeTypeGuesserInterface.php | 0 .../vendor/symfony/mime/MimeTypes.php | 0 .../symfony/mime/MimeTypesInterface.php | 0 .../mime/Part/AbstractMultipartPart.php | 0 .../vendor/symfony/mime/Part/AbstractPart.php | 0 .../vendor/symfony/mime/Part/DataPart.php | 0 .../vendor/symfony/mime/Part/File.php | 0 .../vendor/symfony/mime/Part/MessagePart.php | 0 .../mime/Part/Multipart/AlternativePart.php | 0 .../mime/Part/Multipart/DigestPart.php | 0 .../mime/Part/Multipart/FormDataPart.php | 0 .../symfony/mime/Part/Multipart/MixedPart.php | 0 .../mime/Part/Multipart/RelatedPart.php | 0 .../vendor/symfony/mime/Part/SMimePart.php | 0 .../vendor/symfony/mime/Part/TextPart.php | 0 .../vendor/symfony/mime/README.md | 0 .../vendor/symfony/mime/RawMessage.php | 0 .../Test/Constraint/EmailAddressContains.php | 0 .../Test/Constraint/EmailAttachmentCount.php | 0 .../mime/Test/Constraint/EmailHasHeader.php | 0 .../mime/Test/Constraint/EmailHeaderSame.php | 0 .../Test/Constraint/EmailHtmlBodyContains.php | 0 .../Test/Constraint/EmailSubjectContains.php | 0 .../Test/Constraint/EmailTextBodyContains.php | 0 .../vendor/symfony/mime/composer.json | 0 .../vendor/symfony/polyfill-iconv/Iconv.php | 0 .../vendor/symfony/polyfill-iconv/LICENSE | 0 .../vendor/symfony/polyfill-iconv/README.md | 0 .../Resources/charset/from.big5.php | 0 .../Resources/charset/from.cp037.php | Bin .../Resources/charset/from.cp1006.php | Bin .../Resources/charset/from.cp1026.php | Bin .../Resources/charset/from.cp424.php | Bin .../Resources/charset/from.cp437.php | Bin .../Resources/charset/from.cp500.php | Bin .../Resources/charset/from.cp737.php | Bin .../Resources/charset/from.cp775.php | Bin .../Resources/charset/from.cp850.php | Bin .../Resources/charset/from.cp852.php | Bin .../Resources/charset/from.cp855.php | Bin .../Resources/charset/from.cp856.php | Bin .../Resources/charset/from.cp857.php | Bin .../Resources/charset/from.cp860.php | Bin .../Resources/charset/from.cp861.php | Bin .../Resources/charset/from.cp862.php | Bin .../Resources/charset/from.cp863.php | Bin .../Resources/charset/from.cp864.php | Bin .../Resources/charset/from.cp865.php | Bin .../Resources/charset/from.cp866.php | Bin .../Resources/charset/from.cp869.php | Bin .../Resources/charset/from.cp874.php | Bin .../Resources/charset/from.cp875.php | Bin .../Resources/charset/from.cp932.php | Bin .../Resources/charset/from.cp936.php | Bin .../Resources/charset/from.cp949.php | Bin .../Resources/charset/from.cp950.php | Bin .../Resources/charset/from.iso-8859-1.php | Bin .../Resources/charset/from.iso-8859-10.php | Bin .../Resources/charset/from.iso-8859-11.php | Bin .../Resources/charset/from.iso-8859-13.php | Bin .../Resources/charset/from.iso-8859-14.php | Bin .../Resources/charset/from.iso-8859-15.php | Bin .../Resources/charset/from.iso-8859-16.php | Bin .../Resources/charset/from.iso-8859-2.php | Bin .../Resources/charset/from.iso-8859-3.php | Bin .../Resources/charset/from.iso-8859-4.php | Bin .../Resources/charset/from.iso-8859-5.php | Bin .../Resources/charset/from.iso-8859-6.php | Bin .../Resources/charset/from.iso-8859-7.php | Bin .../Resources/charset/from.iso-8859-8.php | Bin .../Resources/charset/from.iso-8859-9.php | Bin .../Resources/charset/from.koi8-r.php | Bin .../Resources/charset/from.koi8-u.php | Bin .../Resources/charset/from.us-ascii.php | Bin .../Resources/charset/from.windows-1250.php | Bin .../Resources/charset/from.windows-1251.php | Bin .../Resources/charset/from.windows-1252.php | Bin .../Resources/charset/from.windows-1253.php | Bin .../Resources/charset/from.windows-1254.php | Bin .../Resources/charset/from.windows-1255.php | Bin .../Resources/charset/from.windows-1256.php | Bin .../Resources/charset/from.windows-1257.php | Bin .../Resources/charset/from.windows-1258.php | Bin .../Resources/charset/translit.php | 0 .../symfony/polyfill-iconv/bootstrap.php | 0 .../symfony/polyfill-iconv/bootstrap80.php | 0 .../symfony/polyfill-iconv/composer.json | 0 .../vendor/symfony/polyfill-intl-idn/Idn.php | 0 .../vendor/symfony/polyfill-intl-idn/Info.php | 0 .../vendor/symfony/polyfill-intl-idn/LICENSE | 0 .../symfony/polyfill-intl-idn/README.md | 0 .../Resources/unidata/DisallowedRanges.php | 0 .../Resources/unidata/Regex.php | 0 .../Resources/unidata/deviation.php | 0 .../Resources/unidata/disallowed.php | 0 .../unidata/disallowed_STD3_mapped.php | 0 .../unidata/disallowed_STD3_valid.php | 0 .../Resources/unidata/ignored.php | 0 .../Resources/unidata/mapped.php | 0 .../Resources/unidata/virama.php | 0 .../symfony/polyfill-intl-idn/bootstrap.php | 0 .../symfony/polyfill-intl-idn/bootstrap80.php | 0 .../symfony/polyfill-intl-idn/composer.json | 0 .../symfony/polyfill-intl-normalizer/LICENSE | 0 .../polyfill-intl-normalizer/Normalizer.php | 0 .../polyfill-intl-normalizer/README.md | 0 .../Resources/stubs/Normalizer.php | 0 .../unidata/canonicalComposition.php | 0 .../unidata/canonicalDecomposition.php | 0 .../Resources/unidata/combiningClass.php | 0 .../unidata/compatibilityDecomposition.php | 0 .../unidata/rawCanonicalDecomposition.php | 0 .../unidata/rawCompatibilityDecomposition.php | 0 .../polyfill-intl-normalizer/bootstrap.php | 0 .../polyfill-intl-normalizer/bootstrap80.php | 0 .../polyfill-intl-normalizer/composer.json | 0 .../vendor/symfony/polyfill-mbstring/LICENSE | 0 .../symfony/polyfill-mbstring/Mbstring.php | 0 .../symfony/polyfill-mbstring/README.md | 0 .../Resources/unidata/caseFolding.php | 0 .../Resources/unidata/lowerCase.php | 0 .../Resources/unidata/titleCaseRegexp.php | 0 .../Resources/unidata/upperCase.php | 0 .../symfony/polyfill-mbstring/bootstrap.php | 0 .../symfony/polyfill-mbstring/bootstrap72.php | 0 .../symfony/polyfill-mbstring/bootstrap80.php | 0 .../symfony/polyfill-mbstring/composer.json | 0 .../vendor/symfony/polyfill-php80/LICENSE | 0 .../vendor/symfony/polyfill-php80/Php80.php | 0 .../symfony/polyfill-php80/PhpToken.php | 0 .../vendor/symfony/polyfill-php80/README.md | 0 .../Resources/stubs/Attribute.php | 0 .../Resources/stubs/PhpToken.php | 0 .../Resources/stubs/Stringable.php | 0 .../Resources/stubs/UnhandledMatchError.php | 0 .../Resources/stubs/ValueError.php | 0 .../symfony/polyfill-php80/bootstrap.php | 0 .../symfony/polyfill-php80/composer.json | 0 .../vendor/symfony/polyfill-php83/LICENSE | 0 .../vendor/symfony/polyfill-php83/Php83.php | 0 .../vendor/symfony/polyfill-php83/README.md | 0 .../Resources/stubs/DateError.php | 0 .../Resources/stubs/DateException.php | 0 .../stubs/DateInvalidOperationException.php | 0 .../stubs/DateInvalidTimeZoneException.php | 0 .../DateMalformedIntervalStringException.php | 0 .../DateMalformedPeriodStringException.php | 0 .../stubs/DateMalformedStringException.php | 0 .../Resources/stubs/DateObjectError.php | 0 .../Resources/stubs/DateRangeError.php | 0 .../Resources/stubs/Override.php | 0 .../Resources/stubs/SQLite3Exception.php | 0 .../symfony/polyfill-php83/bootstrap.php | 0 .../symfony/polyfill-php83/bootstrap72.php | 0 .../symfony/polyfill-php83/bootstrap81.php | 0 .../symfony/polyfill-php83/composer.json | 0 .../vendor/symfony/polyfill-php84/LICENSE | 0 .../vendor/symfony/polyfill-php84/Php84.php | 0 .../vendor/symfony/polyfill-php84/README.md | 0 .../polyfill-php84/Resources/Deprecated.php | 0 .../polyfill-php84/Resources/RoundingMode.php | 0 .../Resources/stubs/Deprecated.php | 0 .../Resources/stubs/Pdo/Dblib.php | 0 .../Resources/stubs/Pdo/Firebird.php | 0 .../Resources/stubs/Pdo/Mysql.php | 0 .../Resources/stubs/Pdo/Odbc.php | 0 .../Resources/stubs/Pdo/Pgsql.php | 0 .../Resources/stubs/Pdo/Sqlite.php | 0 .../Resources/stubs/ReflectionConstant.php | 0 .../Resources/stubs/RoundingMode.php | 0 .../symfony/polyfill-php84/bootstrap.php | 0 .../symfony/polyfill-php84/bootstrap72.php | 0 .../symfony/polyfill-php84/bootstrap82.php | 0 .../symfony/polyfill-php84/composer.json | 0 .../vendor/symfony/polyfill-php85/LICENSE | 0 .../vendor/symfony/polyfill-php85/Php85.php | 0 .../vendor/symfony/polyfill-php85/README.md | 0 .../stubs/DelayedTargetValidation.php | 0 .../stubs/Filter/FilterException.php | 0 .../stubs/Filter/FilterFailedException.php | 0 .../Resources/stubs/NoDiscard.php | 0 .../symfony/polyfill-php85/bootstrap.php | 0 .../symfony/polyfill-php85/bootstrap80.php | 0 .../symfony/polyfill-php85/composer.json | 0 .../translation-contracts/CHANGELOG.md | 0 .../symfony/translation-contracts/LICENSE | 0 .../LocaleAwareInterface.php | 0 .../symfony/translation-contracts/README.md | 0 .../Test/TranslatorTest.php | 0 .../TranslatableInterface.php | 0 .../TranslatorInterface.php | 0 .../translation-contracts/TranslatorTrait.php | 0 .../translation-contracts/composer.json | 0 .../vendor/symfony/translation/CHANGELOG.md | 0 .../Catalogue/AbstractOperation.php | 0 .../translation/Catalogue/MergeOperation.php | 0 .../Catalogue/OperationInterface.php | 0 .../translation/Catalogue/TargetOperation.php | 0 .../CatalogueMetadataAwareInterface.php | 0 .../Command/TranslationLintCommand.php | 0 .../Command/TranslationPullCommand.php | 0 .../Command/TranslationPushCommand.php | 0 .../translation/Command/TranslationTrait.php | 0 .../translation/Command/XliffLintCommand.php | 0 .../TranslationDataCollector.php | 0 .../translation/DataCollectorTranslator.php | 0 .../DataCollectorTranslatorPass.php | 0 .../LoggingTranslatorPass.php | 0 .../TranslationDumperPass.php | 0 .../TranslationExtractorPass.php | 0 .../DependencyInjection/TranslatorPass.php | 0 .../TranslatorPathsPass.php | 0 .../translation/Dumper/CsvFileDumper.php | 0 .../translation/Dumper/DumperInterface.php | 0 .../symfony/translation/Dumper/FileDumper.php | 0 .../translation/Dumper/IcuResFileDumper.php | 0 .../translation/Dumper/IniFileDumper.php | 0 .../translation/Dumper/JsonFileDumper.php | 0 .../translation/Dumper/MoFileDumper.php | 0 .../translation/Dumper/PhpFileDumper.php | 0 .../translation/Dumper/PoFileDumper.php | 0 .../translation/Dumper/QtFileDumper.php | 0 .../translation/Dumper/XliffFileDumper.php | 0 .../translation/Dumper/YamlFileDumper.php | 0 .../Exception/ExceptionInterface.php | 0 .../Exception/IncompleteDsnException.php | 0 .../Exception/InvalidArgumentException.php | 0 .../Exception/InvalidResourceException.php | 0 .../translation/Exception/LogicException.php | 0 .../MissingRequiredOptionException.php | 0 .../Exception/NotFoundResourceException.php | 0 .../Exception/ProviderException.php | 0 .../Exception/ProviderExceptionInterface.php | 0 .../Exception/RuntimeException.php | 0 .../Exception/UnsupportedSchemeException.php | 0 .../Extractor/AbstractFileExtractor.php | 0 .../translation/Extractor/ChainExtractor.php | 0 .../Extractor/ExtractorInterface.php | 0 .../translation/Extractor/PhpAstExtractor.php | 0 .../Extractor/Visitor/AbstractVisitor.php | 0 .../Extractor/Visitor/ConstraintVisitor.php | 0 .../Extractor/Visitor/TransMethodVisitor.php | 0 .../Visitor/TranslatableMessageVisitor.php | 0 .../translation/Formatter/IntlFormatter.php | 0 .../Formatter/IntlFormatterInterface.php | 0 .../Formatter/MessageFormatter.php | 0 .../Formatter/MessageFormatterInterface.php | 0 .../translation/IdentityTranslator.php | 0 .../vendor/symfony/translation/LICENSE | 0 .../translation/Loader/ArrayLoader.php | 0 .../translation/Loader/CsvFileLoader.php | 0 .../symfony/translation/Loader/FileLoader.php | 0 .../translation/Loader/IcuDatFileLoader.php | 0 .../translation/Loader/IcuResFileLoader.php | 0 .../translation/Loader/IniFileLoader.php | 0 .../translation/Loader/JsonFileLoader.php | 0 .../translation/Loader/LoaderInterface.php | 0 .../translation/Loader/MoFileLoader.php | 0 .../translation/Loader/PhpFileLoader.php | 0 .../translation/Loader/PoFileLoader.php | 0 .../translation/Loader/QtFileLoader.php | 0 .../translation/Loader/XliffFileLoader.php | 0 .../translation/Loader/YamlFileLoader.php | 0 .../symfony/translation/LocaleSwitcher.php | 0 .../symfony/translation/LoggingTranslator.php | 0 .../symfony/translation/MessageCatalogue.php | 0 .../translation/MessageCatalogueInterface.php | 0 .../translation/MetadataAwareInterface.php | 0 .../Provider/AbstractProviderFactory.php | 0 .../symfony/translation/Provider/Dsn.php | 0 .../Provider/FilteringProvider.php | 0 .../translation/Provider/NullProvider.php | 0 .../Provider/NullProviderFactory.php | 0 .../Provider/ProviderFactoryInterface.php | 0 .../Provider/ProviderInterface.php | 0 .../TranslationProviderCollection.php | 0 .../TranslationProviderCollectionFactory.php | 0 .../PseudoLocalizationTranslator.php | 0 .../vendor/symfony/translation/README.md | 0 .../translation/Reader/TranslationReader.php | 0 .../Reader/TranslationReaderInterface.php | 0 .../Resources/bin/translation-status.php | 0 .../translation/Resources/data/parents.json | 0 .../translation/Resources/functions.php | 0 .../schemas/xliff-core-1.2-transitional.xsd | 0 .../Resources/schemas/xliff-core-2.0.xsd | 0 .../translation/Resources/schemas/xml.xsd | 0 .../symfony/translation/StaticMessage.php | 0 .../Test/AbstractProviderFactoryTestCase.php | 0 .../Test/IncompleteDsnTestTrait.php | 0 .../Test/ProviderFactoryTestCase.php | 0 .../translation/Test/ProviderTestCase.php | 0 .../translation/TranslatableMessage.php | 0 .../vendor/symfony/translation/Translator.php | 0 .../symfony/translation/TranslatorBag.php | 0 .../translation/TranslatorBagInterface.php | 0 .../translation/Util/ArrayConverter.php | 0 .../symfony/translation/Util/XliffUtils.php | 0 .../translation/Writer/TranslationWriter.php | 0 .../Writer/TranslationWriterInterface.php | 0 .../vendor/symfony/translation/composer.json | 0 .../mail-mime-parser/.github/FUNDING.yml | 0 .../.github/workflows/tests.yml | 0 .../mail-mime-parser/.php-cs-fixer.dist.php | 0 .../vendor/zbateson/mail-mime-parser/LICENSE | 0 .../mail-mime-parser/PHPStanConstants.php | 0 .../zbateson/mail-mime-parser/README.md | 0 .../zbateson/mail-mime-parser/composer.json | 0 .../zbateson/mail-mime-parser/phpstan.neon | 0 .../zbateson/mail-mime-parser/src/Error.php | 0 .../mail-mime-parser/src/ErrorBag.php | 0 .../src/Header/AbstractHeader.php | 0 .../src/Header/AddressHeader.php | 0 .../Consumer/AbstractConsumerService.php | 0 .../AbstractGenericConsumerService.php | 0 .../Consumer/AddressBaseConsumerService.php | 0 .../Consumer/AddressConsumerService.php | 0 .../Consumer/AddressEmailConsumerService.php | 0 .../Consumer/AddressGroupConsumerService.php | 0 .../Consumer/CommentConsumerService.php | 0 .../Header/Consumer/DateConsumerService.php | 0 .../GenericConsumerMimeLiteralPartService.php | 0 .../Consumer/GenericConsumerService.php | 0 .../src/Header/Consumer/IConsumerService.php | 0 .../Header/Consumer/IdBaseConsumerService.php | 0 .../src/Header/Consumer/IdConsumerService.php | 0 .../Consumer/ParameterConsumerService.php | 0 .../ParameterNameValueConsumerService.php | 0 .../ParameterValueConsumerService.php | 0 .../Consumer/QuotedStringConsumerService.php | 0 ...edStringMimeLiteralPartConsumerService.php | 0 ...gMimeLiteralPartTokenSplitPatternTrait.php | 0 .../Received/DomainConsumerService.php | 0 .../GenericReceivedConsumerService.php | 0 .../Received/ReceivedDateConsumerService.php | 0 .../Consumer/ReceivedConsumerService.php | 0 .../Consumer/SubjectConsumerService.php | 0 .../src/Header/DateHeader.php | 0 .../src/Header/GenericHeader.php | 0 .../src/Header/HeaderConsts.php | 0 .../src/Header/HeaderFactory.php | 0 .../mail-mime-parser/src/Header/IHeader.php | 0 .../src/Header/IHeaderPart.php | 0 .../mail-mime-parser/src/Header/IdHeader.php | 0 .../src/Header/MimeEncodedHeader.php | 0 .../src/Header/ParameterHeader.php | 0 .../src/Header/Part/AddressGroupPart.php | 0 .../src/Header/Part/AddressPart.php | 0 .../src/Header/Part/CommentPart.php | 0 .../src/Header/Part/ContainerPart.php | 0 .../src/Header/Part/DatePart.php | 0 .../src/Header/Part/HeaderPart.php | 0 .../src/Header/Part/HeaderPartFactory.php | 0 .../src/Header/Part/MimeToken.php | 0 .../src/Header/Part/MimeTokenPartFactory.php | 0 .../src/Header/Part/NameValuePart.php | 0 .../src/Header/Part/ParameterPart.php | 0 .../src/Header/Part/QuotedLiteralPart.php | 0 .../src/Header/Part/ReceivedDomainPart.php | 0 .../src/Header/Part/ReceivedPart.php | 0 .../src/Header/Part/SplitParameterPart.php | 0 .../src/Header/Part/SubjectToken.php | 0 .../src/Header/Part/Token.php | 0 .../src/Header/ReceivedHeader.php | 0 .../src/Header/SubjectHeader.php | 0 .../mail-mime-parser/src/IErrorBag.php | 0 .../mail-mime-parser/src/IMessage.php | 0 .../mail-mime-parser/src/MailMimeParser.php | 0 .../zbateson/mail-mime-parser/src/Message.php | 0 .../Message/Factory/IMessagePartFactory.php | 0 .../src/Message/Factory/IMimePartFactory.php | 0 .../Message/Factory/IUUEncodedPartFactory.php | 0 .../Factory/PartChildrenContainerFactory.php | 0 .../Factory/PartHeaderContainerFactory.php | 0 .../Factory/PartStreamContainerFactory.php | 0 .../src/Message/Helper/AbstractHelper.php | 0 .../src/Message/Helper/GenericHelper.php | 0 .../src/Message/Helper/MultipartHelper.php | 0 .../src/Message/Helper/PrivacyHelper.php | 0 .../src/Message/IMessagePart.php | 0 .../src/Message/IMimePart.php | 0 .../src/Message/IMultiPart.php | 0 .../src/Message/IUUEncodedPart.php | 0 .../src/Message/MessagePart.php | 0 .../mail-mime-parser/src/Message/MimePart.php | 0 .../src/Message/MultiPart.php | 0 .../src/Message/NonMimePart.php | 0 .../src/Message/PartChildrenContainer.php | 0 .../src/Message/PartFilter.php | 0 .../src/Message/PartHeaderContainer.php | 0 .../src/Message/PartStreamContainer.php | 0 .../src/Message/UUEncodedPart.php | 0 .../src/Parser/AbstractParserService.php | 0 .../CompatibleParserNotFoundException.php | 0 .../src/Parser/HeaderParserService.php | 0 .../src/Parser/IParserService.php | 0 .../src/Parser/MessageParserService.php | 0 .../src/Parser/MimeParserService.php | 0 .../src/Parser/NonMimeParserService.php | 0 .../src/Parser/ParserManagerService.php | 0 .../Part/ParserPartChildrenContainer.php | 0 .../ParserPartChildrenContainerFactory.php | 0 .../Parser/Part/ParserPartStreamContainer.php | 0 .../Part/ParserPartStreamContainerFactory.php | 0 .../Part/UUEncodedPartHeaderContainer.php | 0 .../UUEncodedPartHeaderContainerFactory.php | 0 .../src/Parser/PartBuilder.php | 0 .../src/Parser/PartBuilderFactory.php | 0 .../src/Parser/Proxy/ParserMessageProxy.php | 0 .../Proxy/ParserMessageProxyFactory.php | 0 .../src/Parser/Proxy/ParserMimePartProxy.php | 0 .../Proxy/ParserMimePartProxyFactory.php | 0 .../Proxy/ParserNonMimeMessageProxy.php | 0 .../ParserNonMimeMessageProxyFactory.php | 0 .../src/Parser/Proxy/ParserPartProxy.php | 0 .../Parser/Proxy/ParserPartProxyFactory.php | 0 .../Parser/Proxy/ParserUUEncodedPartProxy.php | 0 .../Proxy/ParserUUEncodedPartProxyFactory.php | 0 .../src/Stream/HeaderStream.php | 0 .../src/Stream/MessagePartStream.php | 0 .../src/Stream/MessagePartStreamDecorator.php | 0 .../Stream/MessagePartStreamReadException.php | 0 .../src/Stream/StreamFactory.php | 0 .../mail-mime-parser/src/di_config.php | 0 .../zbateson/mail-mime-parser/version.txt | 0 .../vendor/zbateson/mb-wrapper/LICENSE | 0 .../vendor/zbateson/mb-wrapper/README.md | 0 .../vendor/zbateson/mb-wrapper/composer.json | 0 .../zbateson/mb-wrapper/src/MbWrapper.php | 0 .../src/UnsupportedCharsetException.php | 0 .../stream-decorators/.github/FUNDING.yml | 0 .../.github/workflows/tests.yml | 0 .../stream-decorators/.php-cs-fixer.dist.php | 0 .../vendor/zbateson/stream-decorators/LICENSE | 0 .../zbateson/stream-decorators/PhpCsFixer.php | 0 .../zbateson/stream-decorators/README.md | 0 .../zbateson/stream-decorators/composer.json | 0 .../zbateson/stream-decorators/phpstan.neon | 0 .../stream-decorators/src/Base64Stream.php | 0 .../stream-decorators/src/CharsetStream.php | 0 .../src/ChunkSplitStream.php | 0 .../src/DecoratedCachingStream.php | 0 .../src/NonClosingStream.php | 0 .../src/PregReplaceFilterStream.php | 0 .../src/QuotedPrintableStream.php | 0 .../src/SeekingLimitStream.php | 0 .../stream-decorators/src/TellZeroStream.php | 0 .../stream-decorators/src/UUStream.php | 0 {plugins => libs}/zapcal/README.md | 0 {plugins => libs}/zapcal/includes/date.php | 0 .../zapcal/includes/framework.php | 0 {plugins => libs}/zapcal/includes/ical.php | 0 {plugins => libs}/zapcal/includes/index.html | 0 .../zapcal/includes/recurringdate.php | 0 .../zapcal/includes/timezone.php | 0 {plugins => libs}/zapcal/zapcallib.php | 0 login.php | 12 ++++---- setup/index.php | 18 ++++++------ 3410 files changed, 140 insertions(+), 140 deletions(-) rename {plugins => libs}/.npmignore (100%) rename {plugins => libs}/DataTables/datatables.min.css (100%) rename {plugins => libs}/DataTables/datatables.min.js (100%) rename {plugins => libs}/PHPMailer/COMMITMENT (100%) rename {plugins => libs}/PHPMailer/LICENSE (100%) rename {plugins => libs}/PHPMailer/README.md (100%) rename {plugins => libs}/PHPMailer/SECURITY.md (100%) rename {plugins => libs}/PHPMailer/SMTPUTF8.md (100%) rename {plugins => libs}/PHPMailer/VERSION (100%) rename {plugins => libs}/PHPMailer/composer.json (100%) rename {plugins => libs}/PHPMailer/get_oauth_token.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-af.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-ar.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-as.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-az.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-ba.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-be.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-bg.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-bn.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-ca.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-cs.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-da.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-de.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-el.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-eo.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-es.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-et.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-fa.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-fi.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-fo.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-fr.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-gl.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-he.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-hi.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-hr.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-hu.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-hy.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-id.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-it.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-ja.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-ka.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-ko.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-ku.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-lt.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-lv.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-mg.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-mn.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-ms.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-nb.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-nl.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-pl.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-pt.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-pt_br.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-ro.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-ru.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-si.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-sk.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-sl.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-sr.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-sr_latn.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-sv.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-tl.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-tr.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-uk.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-ur.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-vi.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-zh.php (100%) rename {plugins => libs}/PHPMailer/language/phpmailer.lang-zh_cn.php (100%) rename {plugins => libs}/PHPMailer/src/DSNConfigurator.php (100%) rename {plugins => libs}/PHPMailer/src/Exception.php (100%) rename {plugins => libs}/PHPMailer/src/OAuth.php (100%) rename {plugins => libs}/PHPMailer/src/OAuthTokenProvider.php (100%) rename {plugins => libs}/PHPMailer/src/PHPMailer.php (100%) rename {plugins => libs}/PHPMailer/src/POP3.php (100%) rename {plugins => libs}/PHPMailer/src/SMTP.php (100%) rename {plugins => libs}/Show-Hide-Passwords-Bootstrap-4/bootstrap-show-password.min.js (100%) rename {plugins => libs}/SortableJS/Sortable.min.js (100%) rename {plugins => libs}/TCPDF/CHANGELOG.TXT (100%) rename {plugins => libs}/TCPDF/LICENSE.TXT (100%) rename {plugins => libs}/TCPDF/Makefile (100%) rename {plugins => libs}/TCPDF/README.md (100%) rename {plugins => libs}/TCPDF/VERSION (100%) rename {plugins => libs}/TCPDF/composer.json (100%) rename {plugins => libs}/TCPDF/config/tcpdf_config.php (100%) rename {plugins => libs}/TCPDF/fonts/ae_fonts_2.0/COPYING (100%) rename {plugins => libs}/TCPDF/fonts/ae_fonts_2.0/ChangeLog (100%) rename {plugins => libs}/TCPDF/fonts/ae_fonts_2.0/README (100%) rename {plugins => libs}/TCPDF/fonts/aealarabiya.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/aealarabiya.php (100%) rename {plugins => libs}/TCPDF/fonts/aealarabiya.z (100%) rename {plugins => libs}/TCPDF/fonts/aefurat.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/aefurat.php (100%) rename {plugins => libs}/TCPDF/fonts/aefurat.z (100%) rename {plugins => libs}/TCPDF/fonts/cid0cs.php (100%) rename {plugins => libs}/TCPDF/fonts/cid0ct.php (100%) rename {plugins => libs}/TCPDF/fonts/cid0jp.php (100%) rename {plugins => libs}/TCPDF/fonts/cid0kr.php (100%) rename {plugins => libs}/TCPDF/fonts/courier.php (100%) rename {plugins => libs}/TCPDF/fonts/courierb.php (100%) rename {plugins => libs}/TCPDF/fonts/courierbi.php (100%) rename {plugins => libs}/TCPDF/fonts/courieri.php (100%) rename {plugins => libs}/TCPDF/fonts/dejavu-fonts-ttf-2.33/AUTHORS (100%) rename {plugins => libs}/TCPDF/fonts/dejavu-fonts-ttf-2.33/BUGS (100%) rename {plugins => libs}/TCPDF/fonts/dejavu-fonts-ttf-2.33/LICENSE (100%) rename {plugins => libs}/TCPDF/fonts/dejavu-fonts-ttf-2.33/NEWS (100%) rename {plugins => libs}/TCPDF/fonts/dejavu-fonts-ttf-2.33/README (100%) rename {plugins => libs}/TCPDF/fonts/dejavu-fonts-ttf-2.33/langcover.txt (100%) rename {plugins => libs}/TCPDF/fonts/dejavu-fonts-ttf-2.33/unicover.txt (100%) rename {plugins => libs}/TCPDF/fonts/dejavu-fonts-ttf-2.34/AUTHORS (100%) rename {plugins => libs}/TCPDF/fonts/dejavu-fonts-ttf-2.34/BUGS (100%) rename {plugins => libs}/TCPDF/fonts/dejavu-fonts-ttf-2.34/LICENSE (100%) rename {plugins => libs}/TCPDF/fonts/dejavu-fonts-ttf-2.34/NEWS (100%) rename {plugins => libs}/TCPDF/fonts/dejavu-fonts-ttf-2.34/README (100%) rename {plugins => libs}/TCPDF/fonts/dejavu-fonts-ttf-2.34/langcover.txt (100%) rename {plugins => libs}/TCPDF/fonts/dejavu-fonts-ttf-2.34/unicover.txt (100%) rename {plugins => libs}/TCPDF/fonts/dejavusans.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavusans.php (100%) rename {plugins => libs}/TCPDF/fonts/dejavusans.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavusansb.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavusansb.php (100%) rename {plugins => libs}/TCPDF/fonts/dejavusansb.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavusansbi.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavusansbi.php (100%) rename {plugins => libs}/TCPDF/fonts/dejavusansbi.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavusanscondensed.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavusanscondensed.php (100%) rename {plugins => libs}/TCPDF/fonts/dejavusanscondensed.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavusanscondensedb.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavusanscondensedb.php (100%) rename {plugins => libs}/TCPDF/fonts/dejavusanscondensedb.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavusanscondensedbi.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavusanscondensedbi.php (100%) rename {plugins => libs}/TCPDF/fonts/dejavusanscondensedbi.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavusanscondensedi.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavusanscondensedi.php (100%) rename {plugins => libs}/TCPDF/fonts/dejavusanscondensedi.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavusansextralight.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavusansextralight.php (100%) rename {plugins => libs}/TCPDF/fonts/dejavusansextralight.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavusansi.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavusansi.php (100%) rename {plugins => libs}/TCPDF/fonts/dejavusansi.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavusansmono.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavusansmono.php (100%) rename {plugins => libs}/TCPDF/fonts/dejavusansmono.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavusansmonob.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavusansmonob.php (100%) rename {plugins => libs}/TCPDF/fonts/dejavusansmonob.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavusansmonobi.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavusansmonobi.php (100%) rename {plugins => libs}/TCPDF/fonts/dejavusansmonobi.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavusansmonoi.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavusansmonoi.php (100%) rename {plugins => libs}/TCPDF/fonts/dejavusansmonoi.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavuserif.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavuserif.php (100%) rename {plugins => libs}/TCPDF/fonts/dejavuserif.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavuserifb.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavuserifb.php (100%) rename {plugins => libs}/TCPDF/fonts/dejavuserifb.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavuserifbi.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavuserifbi.php (100%) rename {plugins => libs}/TCPDF/fonts/dejavuserifbi.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavuserifcondensed.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavuserifcondensed.php (100%) rename {plugins => libs}/TCPDF/fonts/dejavuserifcondensed.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavuserifcondensedb.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavuserifcondensedb.php (100%) rename {plugins => libs}/TCPDF/fonts/dejavuserifcondensedb.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavuserifcondensedbi.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavuserifcondensedbi.php (100%) rename {plugins => libs}/TCPDF/fonts/dejavuserifcondensedbi.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavuserifcondensedi.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavuserifcondensedi.php (100%) rename {plugins => libs}/TCPDF/fonts/dejavuserifcondensedi.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavuserifi.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/dejavuserifi.php (100%) rename {plugins => libs}/TCPDF/fonts/dejavuserifi.z (100%) rename {plugins => libs}/TCPDF/fonts/freefont-20100919/AUTHORS (100%) rename {plugins => libs}/TCPDF/fonts/freefont-20100919/COPYING (100%) rename {plugins => libs}/TCPDF/fonts/freefont-20100919/CREDITS (100%) rename {plugins => libs}/TCPDF/fonts/freefont-20100919/ChangeLog (100%) rename {plugins => libs}/TCPDF/fonts/freefont-20100919/INSTALL (100%) rename {plugins => libs}/TCPDF/fonts/freefont-20100919/README (100%) rename {plugins => libs}/TCPDF/fonts/freefont-20120503/AUTHORS (100%) rename {plugins => libs}/TCPDF/fonts/freefont-20120503/COPYING (100%) rename {plugins => libs}/TCPDF/fonts/freefont-20120503/CREDITS (100%) rename {plugins => libs}/TCPDF/fonts/freefont-20120503/ChangeLog (100%) rename {plugins => libs}/TCPDF/fonts/freefont-20120503/INSTALL (100%) rename {plugins => libs}/TCPDF/fonts/freefont-20120503/README (100%) rename {plugins => libs}/TCPDF/fonts/freefont-20120503/TROUBLESHOOTING (100%) rename {plugins => libs}/TCPDF/fonts/freefont-20120503/USAGE (100%) rename {plugins => libs}/TCPDF/fonts/freemono.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/freemono.php (100%) rename {plugins => libs}/TCPDF/fonts/freemono.z (100%) rename {plugins => libs}/TCPDF/fonts/freemonob.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/freemonob.php (100%) rename {plugins => libs}/TCPDF/fonts/freemonob.z (100%) rename {plugins => libs}/TCPDF/fonts/freemonobi.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/freemonobi.php (100%) rename {plugins => libs}/TCPDF/fonts/freemonobi.z (100%) rename {plugins => libs}/TCPDF/fonts/freemonoi.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/freemonoi.php (100%) rename {plugins => libs}/TCPDF/fonts/freemonoi.z (100%) rename {plugins => libs}/TCPDF/fonts/freesans.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/freesans.php (100%) rename {plugins => libs}/TCPDF/fonts/freesans.z (100%) rename {plugins => libs}/TCPDF/fonts/freesansb.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/freesansb.php (100%) rename {plugins => libs}/TCPDF/fonts/freesansb.z (100%) rename {plugins => libs}/TCPDF/fonts/freesansbi.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/freesansbi.php (100%) rename {plugins => libs}/TCPDF/fonts/freesansbi.z (100%) rename {plugins => libs}/TCPDF/fonts/freesansi.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/freesansi.php (100%) rename {plugins => libs}/TCPDF/fonts/freesansi.z (100%) rename {plugins => libs}/TCPDF/fonts/freeserif.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/freeserif.php (100%) rename {plugins => libs}/TCPDF/fonts/freeserif.z (100%) rename {plugins => libs}/TCPDF/fonts/freeserifb.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/freeserifb.php (100%) rename {plugins => libs}/TCPDF/fonts/freeserifb.z (100%) rename {plugins => libs}/TCPDF/fonts/freeserifbi.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/freeserifbi.php (100%) rename {plugins => libs}/TCPDF/fonts/freeserifbi.z (100%) rename {plugins => libs}/TCPDF/fonts/freeserifi.ctg.z (100%) rename {plugins => libs}/TCPDF/fonts/freeserifi.php (100%) rename {plugins => libs}/TCPDF/fonts/freeserifi.z (100%) rename {plugins => libs}/TCPDF/fonts/helvetica.php (100%) rename {plugins => libs}/TCPDF/fonts/helveticab.php (100%) rename {plugins => libs}/TCPDF/fonts/helveticabi.php (100%) rename {plugins => libs}/TCPDF/fonts/helveticai.php (100%) rename {plugins => libs}/TCPDF/fonts/hysmyeongjostdmedium.php (100%) rename {plugins => libs}/TCPDF/fonts/kozgopromedium.php (100%) rename {plugins => libs}/TCPDF/fonts/kozminproregular.php (100%) rename {plugins => libs}/TCPDF/fonts/msungstdlight.php (100%) rename {plugins => libs}/TCPDF/fonts/pdfacourier.php (100%) rename {plugins => libs}/TCPDF/fonts/pdfacourier.z (100%) rename {plugins => libs}/TCPDF/fonts/pdfacourierb.php (100%) rename {plugins => libs}/TCPDF/fonts/pdfacourierb.z (100%) rename {plugins => libs}/TCPDF/fonts/pdfacourierbi.php (100%) rename {plugins => libs}/TCPDF/fonts/pdfacourierbi.z (100%) rename {plugins => libs}/TCPDF/fonts/pdfacourieri.php (100%) rename {plugins => libs}/TCPDF/fonts/pdfacourieri.z (100%) rename {plugins => libs}/TCPDF/fonts/pdfahelvetica.php (100%) rename {plugins => libs}/TCPDF/fonts/pdfahelvetica.z (100%) rename {plugins => libs}/TCPDF/fonts/pdfahelveticab.php (100%) rename {plugins => libs}/TCPDF/fonts/pdfahelveticab.z (100%) rename {plugins => libs}/TCPDF/fonts/pdfahelveticabi.php (100%) rename {plugins => libs}/TCPDF/fonts/pdfahelveticabi.z (100%) rename {plugins => libs}/TCPDF/fonts/pdfahelveticai.php (100%) rename {plugins => libs}/TCPDF/fonts/pdfahelveticai.z (100%) rename {plugins => libs}/TCPDF/fonts/pdfasymbol.php (100%) rename {plugins => libs}/TCPDF/fonts/pdfasymbol.z (100%) rename {plugins => libs}/TCPDF/fonts/pdfatimes.php (100%) rename {plugins => libs}/TCPDF/fonts/pdfatimes.z (100%) rename {plugins => libs}/TCPDF/fonts/pdfatimesb.php (100%) rename {plugins => libs}/TCPDF/fonts/pdfatimesb.z (100%) rename {plugins => libs}/TCPDF/fonts/pdfatimesbi.php (100%) rename {plugins => libs}/TCPDF/fonts/pdfatimesbi.z (100%) rename {plugins => libs}/TCPDF/fonts/pdfatimesi.php (100%) rename {plugins => libs}/TCPDF/fonts/pdfatimesi.z (100%) rename {plugins => libs}/TCPDF/fonts/pdfazapfdingbats.php (100%) rename {plugins => libs}/TCPDF/fonts/pdfazapfdingbats.z (100%) rename {plugins => libs}/TCPDF/fonts/stsongstdlight.php (100%) rename {plugins => libs}/TCPDF/fonts/symbol.php (100%) rename {plugins => libs}/TCPDF/fonts/times.php (100%) rename {plugins => libs}/TCPDF/fonts/timesb.php (100%) rename {plugins => libs}/TCPDF/fonts/timesbi.php (100%) rename {plugins => libs}/TCPDF/fonts/timesi.php (100%) rename {plugins => libs}/TCPDF/fonts/uni2cid_ac15.php (100%) rename {plugins => libs}/TCPDF/fonts/uni2cid_ag15.php (100%) rename {plugins => libs}/TCPDF/fonts/uni2cid_aj16.php (100%) rename {plugins => libs}/TCPDF/fonts/uni2cid_ak12.php (100%) rename {plugins => libs}/TCPDF/fonts/zapfdingbats.php (100%) rename {plugins => libs}/TCPDF/include/barcodes/datamatrix.php (100%) rename {plugins => libs}/TCPDF/include/barcodes/pdf417.php (100%) rename {plugins => libs}/TCPDF/include/barcodes/qrcode.php (100%) rename {plugins => libs}/TCPDF/include/sRGB.icc (100%) rename {plugins => libs}/TCPDF/include/tcpdf_colors.php (100%) rename {plugins => libs}/TCPDF/include/tcpdf_filters.php (100%) rename {plugins => libs}/TCPDF/include/tcpdf_font_data.php (100%) rename {plugins => libs}/TCPDF/include/tcpdf_fonts.php (100%) rename {plugins => libs}/TCPDF/include/tcpdf_images.php (100%) rename {plugins => libs}/TCPDF/include/tcpdf_static.php (100%) rename {plugins => libs}/TCPDF/tcpdf.php (100%) rename {plugins => libs}/TCPDF/tcpdf_autoconfig.php (100%) rename {plugins => libs}/TCPDF/tcpdf_barcodes_1d.php (100%) rename {plugins => libs}/TCPDF/tcpdf_barcodes_2d.php (100%) rename {plugins => libs}/TCPDF/tools/.htaccess (100%) rename {plugins => libs}/TCPDF/tools/convert_fonts_examples.txt (100%) rename {plugins => libs}/TCPDF/tools/tcpdf_addfont.php (100%) rename {plugins => libs}/adminlte/css/adminlte.min.css (100%) rename {plugins => libs}/adminlte/js/.eslintrc.json (100%) rename {plugins => libs}/adminlte/js/adminlte.min.js (100%) rename {plugins => libs}/barcode/barcode.php (100%) rename {plugins => libs}/bootstrap/js/bootstrap.bundle.min.js (100%) rename {plugins => libs}/chart.js/chart.umd.min.js (100%) rename {plugins => libs}/clipboardjs/clipboard.min.js (100%) rename {plugins => libs}/composer.json (100%) rename {plugins => libs}/composer.lock (100%) rename {plugins => libs}/daterangepicker/daterangepicker.css (100%) rename {plugins => libs}/daterangepicker/daterangepicker.js (100%) rename {plugins => libs}/dropzone/min/basic.css (100%) rename {plugins => libs}/dropzone/min/basic.min.css (100%) rename {plugins => libs}/dropzone/min/dropzone-amd-module.min.js (100%) rename {plugins => libs}/dropzone/min/dropzone.css (100%) rename {plugins => libs}/dropzone/min/dropzone.min.css (100%) rename {plugins => libs}/dropzone/min/dropzone.min.js (100%) rename {plugins => libs}/fontawesome-free/css/all.min.css (100%) rename {plugins => libs}/fontawesome-free/webfonts/fa-brands-400.eot (100%) rename {plugins => libs}/fontawesome-free/webfonts/fa-brands-400.svg (100%) rename {plugins => libs}/fontawesome-free/webfonts/fa-brands-400.ttf (100%) rename {plugins => libs}/fontawesome-free/webfonts/fa-brands-400.woff (100%) rename {plugins => libs}/fontawesome-free/webfonts/fa-brands-400.woff2 (100%) rename {plugins => libs}/fontawesome-free/webfonts/fa-regular-400.eot (100%) rename {plugins => libs}/fontawesome-free/webfonts/fa-regular-400.svg (100%) rename {plugins => libs}/fontawesome-free/webfonts/fa-regular-400.ttf (100%) rename {plugins => libs}/fontawesome-free/webfonts/fa-regular-400.woff (100%) rename {plugins => libs}/fontawesome-free/webfonts/fa-regular-400.woff2 (100%) rename {plugins => libs}/fontawesome-free/webfonts/fa-solid-900.eot (100%) rename {plugins => libs}/fontawesome-free/webfonts/fa-solid-900.svg (100%) rename {plugins => libs}/fontawesome-free/webfonts/fa-solid-900.ttf (100%) rename {plugins => libs}/fontawesome-free/webfonts/fa-solid-900.woff (100%) rename {plugins => libs}/fontawesome-free/webfonts/fa-solid-900.woff2 (100%) rename {plugins => libs}/fullcalendar/fullcalendar.global.js (100%) rename {plugins => libs}/fullcalendar/locales-all/global.js (100%) rename {plugins => libs}/fullcalendar/skeleton.css (100%) rename {plugins => libs}/fullcalendar/themes/breezy/global.js (100%) rename {plugins => libs}/fullcalendar/themes/breezy/palettes/amber.css (100%) rename {plugins => libs}/fullcalendar/themes/breezy/palettes/emerald.css (100%) rename {plugins => libs}/fullcalendar/themes/breezy/palettes/indigo.css (100%) rename {plugins => libs}/fullcalendar/themes/breezy/palettes/rose.css (100%) rename {plugins => libs}/fullcalendar/themes/breezy/theme.css (100%) rename {plugins => libs}/fullcalendar/themes/classic/global.js (100%) rename {plugins => libs}/fullcalendar/themes/classic/palette.css (100%) rename {plugins => libs}/fullcalendar/themes/classic/theme.css (100%) rename {plugins => libs}/fullcalendar/themes/forma/global.js (100%) rename {plugins => libs}/fullcalendar/themes/forma/palettes/blue.css (100%) rename {plugins => libs}/fullcalendar/themes/forma/palettes/green.css (100%) rename {plugins => libs}/fullcalendar/themes/forma/palettes/purple.css (100%) rename {plugins => libs}/fullcalendar/themes/forma/palettes/red.css (100%) rename {plugins => libs}/fullcalendar/themes/forma/theme.css (100%) rename {plugins => libs}/fullcalendar/themes/monarch/global.js (100%) rename {plugins => libs}/fullcalendar/themes/monarch/palettes/blue.css (100%) rename {plugins => libs}/fullcalendar/themes/monarch/palettes/green.css (100%) rename {plugins => libs}/fullcalendar/themes/monarch/palettes/purple.css (100%) rename {plugins => libs}/fullcalendar/themes/monarch/palettes/red.css (100%) rename {plugins => libs}/fullcalendar/themes/monarch/palettes/yellow.css (100%) rename {plugins => libs}/fullcalendar/themes/monarch/theme.css (100%) rename {plugins => libs}/fullcalendar/themes/pulse/global.js (100%) rename {plugins => libs}/fullcalendar/themes/pulse/palettes/blue.css (100%) rename {plugins => libs}/fullcalendar/themes/pulse/palettes/green.css (100%) rename {plugins => libs}/fullcalendar/themes/pulse/palettes/purple.css (100%) rename {plugins => libs}/fullcalendar/themes/pulse/palettes/red.css (100%) rename {plugins => libs}/fullcalendar/themes/pulse/theme.css (100%) rename {plugins => libs}/htmlpurifier/HTMLPurifier.standalone.php (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/Builder/Xml.php (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/Exception.php (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/Interchange.php (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/Interchange/Directive.php (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/Interchange/Id.php (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/InterchangeBuilder.php (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/Validator.php (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/ValidatorAtom.php (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema.ser (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.ID.HTML5.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.Predicate.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/CSS.AllowDuplicates.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyRemoveScript.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.AllowHostnameUnderscore.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.AllowParseManyTags.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.Language.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.LegacyEntityDecoder.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.Forms.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoopener.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.TargetNoreferrer.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.Base.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.Host.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/info.ini (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/CSS/.gitkeep (100%) create mode 100644 libs/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/CSS/4.15.0,4114918a13a428a8482a8a449792a5a8747582b5,1.ser rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/HTML/.gitkeep (100%) create mode 100644 libs/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/HTML/4.15.0,f474c0a322b208e83d22d3aef33ecb184bc71d31,1.ser rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/URI/.gitkeep (100%) create mode 100644 libs/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/URI/4.15.0,b359e061fc6632c745df51b43504cb541c9339de,1.ser rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/EntityLookup/entities.ser (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/Filter/ExtractStyleBlocks.php (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/Filter/YouTube.php (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/Language/messages/en.php (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/Lexer/PH5P.php (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/Printer.php (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/Printer/CSSDefinition.php (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/Printer/ConfigForm.css (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/Printer/ConfigForm.js (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/Printer/ConfigForm.php (100%) rename {plugins => libs}/htmlpurifier/standalone/HTMLPurifier/Printer/HTMLDefinition.php (100%) rename {plugins => libs}/inputmask/inputmask.min.js (100%) rename {plugins => libs}/inputmask/jquery.inputmask.min.js (100%) rename {plugins => libs}/intl-tel-input/css/demo.css (100%) rename {plugins => libs}/intl-tel-input/css/intlTelInput.css (100%) rename {plugins => libs}/intl-tel-input/css/intlTelInput.min.css (100%) rename {plugins => libs}/intl-tel-input/img/flags.png (100%) rename {plugins => libs}/intl-tel-input/img/flags.webp (100%) rename {plugins => libs}/intl-tel-input/img/flags@2x.png (100%) rename {plugins => libs}/intl-tel-input/img/flags@2x.webp (100%) rename {plugins => libs}/intl-tel-input/img/globe.png (100%) rename {plugins => libs}/intl-tel-input/img/globe.webp (100%) rename {plugins => libs}/intl-tel-input/img/globe@2x.png (100%) rename {plugins => libs}/intl-tel-input/img/globe@2x.webp (100%) rename {plugins => libs}/intl-tel-input/img/globe_light.png (100%) rename {plugins => libs}/intl-tel-input/img/globe_light.webp (100%) rename {plugins => libs}/intl-tel-input/img/globe_light@2x.png (100%) rename {plugins => libs}/intl-tel-input/img/globe_light@2x.webp (100%) rename {plugins => libs}/intl-tel-input/js/data.js (100%) rename {plugins => libs}/intl-tel-input/js/data.min.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/ar/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/ar/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/ar/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/bg/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/bg/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/bg/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/bn/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/bn/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/bn/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/bs/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/bs/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/bs/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/ca/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/ca/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/ca/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/cs/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/cs/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/cs/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/da/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/da/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/da/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/de/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/de/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/de/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/el/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/el/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/el/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/en/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/en/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/en/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/es/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/es/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/es/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/fa/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/fa/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/fa/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/fi/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/fi/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/fi/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/fr/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/fr/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/fr/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/hi/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/hi/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/hi/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/hr/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/hr/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/hr/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/hu/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/hu/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/hu/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/id/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/id/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/id/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/it/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/it/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/it/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/ja/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/ja/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/ja/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/ko/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/ko/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/ko/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/mr/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/mr/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/mr/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/nl/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/nl/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/nl/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/no/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/no/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/no/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/pl/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/pl/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/pl/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/pt/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/pt/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/pt/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/ro/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/ro/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/ro/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/ru/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/ru/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/ru/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/sk/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/sk/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/sk/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/sv/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/sv/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/sv/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/te/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/te/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/te/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/th/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/th/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/th/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/tr/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/tr/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/tr/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/uk/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/uk/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/uk/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/ur/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/ur/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/ur/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/vi/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/vi/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/vi/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/zh/countries.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/zh/index.js (100%) rename {plugins => libs}/intl-tel-input/js/i18n/zh/interface.js (100%) rename {plugins => libs}/intl-tel-input/js/intlTelInput.d.ts (100%) rename {plugins => libs}/intl-tel-input/js/intlTelInput.js (100%) rename {plugins => libs}/intl-tel-input/js/intlTelInput.min.js (100%) rename {plugins => libs}/intl-tel-input/js/intlTelInputWithUtils.js (100%) rename {plugins => libs}/intl-tel-input/js/intlTelInputWithUtils.min.js (100%) rename {plugins => libs}/intl-tel-input/js/utils.js (100%) rename {plugins => libs}/jquery-ui/VERSION (100%) rename {plugins => libs}/jquery-ui/jquery-ui.min.css (100%) rename {plugins => libs}/jquery-ui/jquery-ui.min.js (100%) rename {plugins => libs}/jquery/jquery.min.js (100%) rename {plugins => libs}/moment/moment.min.js (100%) rename {plugins => libs}/pdfmake/fonts/Roboto/Roboto-Italic.ttf (100%) rename {plugins => libs}/pdfmake/fonts/Roboto/Roboto-Medium.ttf (100%) rename {plugins => libs}/pdfmake/fonts/Roboto/Roboto-MediumItalic.ttf (100%) rename {plugins => libs}/pdfmake/fonts/Roboto/Roboto-Regular.ttf (100%) rename {plugins => libs}/pdfmake/pdfmake.min.js (100%) rename {plugins => libs}/pdfmake/vfs_fonts.js (100%) rename {plugins => libs}/popper/popper-utils.min.js (100%) rename {plugins => libs}/popper/popper.min.js (100%) rename {plugins => libs}/select2-bootstrap4-theme/select2-bootstrap4.min.css (100%) rename {plugins => libs}/select2/css/select2.min.css (100%) rename {plugins => libs}/select2/js/i18n/af.js (100%) rename {plugins => libs}/select2/js/i18n/ar.js (100%) rename {plugins => libs}/select2/js/i18n/az.js (100%) rename {plugins => libs}/select2/js/i18n/bg.js (100%) rename {plugins => libs}/select2/js/i18n/bn.js (100%) rename {plugins => libs}/select2/js/i18n/bs.js (100%) rename {plugins => libs}/select2/js/i18n/build.txt (100%) rename {plugins => libs}/select2/js/i18n/ca.js (100%) rename {plugins => libs}/select2/js/i18n/cs.js (100%) rename {plugins => libs}/select2/js/i18n/da.js (100%) rename {plugins => libs}/select2/js/i18n/de.js (100%) rename {plugins => libs}/select2/js/i18n/dsb.js (100%) rename {plugins => libs}/select2/js/i18n/el.js (100%) rename {plugins => libs}/select2/js/i18n/en.js (100%) rename {plugins => libs}/select2/js/i18n/es.js (100%) rename {plugins => libs}/select2/js/i18n/et.js (100%) rename {plugins => libs}/select2/js/i18n/eu.js (100%) rename {plugins => libs}/select2/js/i18n/fa.js (100%) rename {plugins => libs}/select2/js/i18n/fi.js (100%) rename {plugins => libs}/select2/js/i18n/fr.js (100%) rename {plugins => libs}/select2/js/i18n/gl.js (100%) rename {plugins => libs}/select2/js/i18n/he.js (100%) rename {plugins => libs}/select2/js/i18n/hi.js (100%) rename {plugins => libs}/select2/js/i18n/hr.js (100%) rename {plugins => libs}/select2/js/i18n/hsb.js (100%) rename {plugins => libs}/select2/js/i18n/hu.js (100%) rename {plugins => libs}/select2/js/i18n/hy.js (100%) rename {plugins => libs}/select2/js/i18n/id.js (100%) rename {plugins => libs}/select2/js/i18n/is.js (100%) rename {plugins => libs}/select2/js/i18n/it.js (100%) rename {plugins => libs}/select2/js/i18n/ja.js (100%) rename {plugins => libs}/select2/js/i18n/ka.js (100%) rename {plugins => libs}/select2/js/i18n/km.js (100%) rename {plugins => libs}/select2/js/i18n/ko.js (100%) rename {plugins => libs}/select2/js/i18n/lt.js (100%) rename {plugins => libs}/select2/js/i18n/lv.js (100%) rename {plugins => libs}/select2/js/i18n/mk.js (100%) rename {plugins => libs}/select2/js/i18n/ms.js (100%) rename {plugins => libs}/select2/js/i18n/nb.js (100%) rename {plugins => libs}/select2/js/i18n/ne.js (100%) rename {plugins => libs}/select2/js/i18n/nl.js (100%) rename {plugins => libs}/select2/js/i18n/pl.js (100%) rename {plugins => libs}/select2/js/i18n/ps.js (100%) rename {plugins => libs}/select2/js/i18n/pt-BR.js (100%) rename {plugins => libs}/select2/js/i18n/pt.js (100%) rename {plugins => libs}/select2/js/i18n/ro.js (100%) rename {plugins => libs}/select2/js/i18n/ru.js (100%) rename {plugins => libs}/select2/js/i18n/sk.js (100%) rename {plugins => libs}/select2/js/i18n/sl.js (100%) rename {plugins => libs}/select2/js/i18n/sq.js (100%) rename {plugins => libs}/select2/js/i18n/sr-Cyrl.js (100%) rename {plugins => libs}/select2/js/i18n/sr.js (100%) rename {plugins => libs}/select2/js/i18n/sv.js (100%) rename {plugins => libs}/select2/js/i18n/th.js (100%) rename {plugins => libs}/select2/js/i18n/tk.js (100%) rename {plugins => libs}/select2/js/i18n/tr.js (100%) rename {plugins => libs}/select2/js/i18n/uk.js (100%) rename {plugins => libs}/select2/js/i18n/vi.js (100%) rename {plugins => libs}/select2/js/i18n/zh-CN.js (100%) rename {plugins => libs}/select2/js/i18n/zh-TW.js (100%) rename {plugins => libs}/select2/js/select2.full.min.js (100%) rename {plugins => libs}/select2/js/select2.min.js (100%) rename {plugins => libs}/stripe-php/.claude/CLAUDE.md (100%) rename {plugins => libs}/stripe-php/.gitignore (100%) rename {plugins => libs}/stripe-php/CHANGELOG.md (100%) rename {plugins => libs}/stripe-php/CODEGEN_VERSION (100%) rename {plugins => libs}/stripe-php/CONTRIBUTING.md (100%) rename {plugins => libs}/stripe-php/LICENSE (100%) rename {plugins => libs}/stripe-php/OPENAPI_VERSION (100%) rename {plugins => libs}/stripe-php/README.md (100%) rename {plugins => libs}/stripe-php/VERSION (100%) rename {plugins => libs}/stripe-php/composer.json (100%) rename {plugins => libs}/stripe-php/data/ca-certificates.crt (100%) rename {plugins => libs}/stripe-php/init.php (100%) rename {plugins => libs}/stripe-php/justfile (100%) rename {plugins => libs}/stripe-php/lib/Account.php (100%) rename {plugins => libs}/stripe-php/lib/AccountLink.php (100%) rename {plugins => libs}/stripe-php/lib/AccountSession.php (100%) rename {plugins => libs}/stripe-php/lib/ApiOperations/All.php (100%) rename {plugins => libs}/stripe-php/lib/ApiOperations/Create.php (100%) rename {plugins => libs}/stripe-php/lib/ApiOperations/Delete.php (100%) rename {plugins => libs}/stripe-php/lib/ApiOperations/NestedResource.php (100%) rename {plugins => libs}/stripe-php/lib/ApiOperations/Request.php (100%) rename {plugins => libs}/stripe-php/lib/ApiOperations/Retrieve.php (100%) rename {plugins => libs}/stripe-php/lib/ApiOperations/SingletonRetrieve.php (100%) rename {plugins => libs}/stripe-php/lib/ApiOperations/Update.php (100%) rename {plugins => libs}/stripe-php/lib/ApiRequestor.php (100%) rename {plugins => libs}/stripe-php/lib/ApiResource.php (100%) rename {plugins => libs}/stripe-php/lib/ApiResponse.php (100%) rename {plugins => libs}/stripe-php/lib/ApplePayDomain.php (100%) rename {plugins => libs}/stripe-php/lib/Application.php (100%) rename {plugins => libs}/stripe-php/lib/ApplicationFee.php (100%) rename {plugins => libs}/stripe-php/lib/ApplicationFeeRefund.php (100%) rename {plugins => libs}/stripe-php/lib/Apps/Secret.php (100%) rename {plugins => libs}/stripe-php/lib/Balance.php (100%) rename {plugins => libs}/stripe-php/lib/BalanceSettings.php (100%) rename {plugins => libs}/stripe-php/lib/BalanceTransaction.php (100%) rename {plugins => libs}/stripe-php/lib/BankAccount.php (100%) rename {plugins => libs}/stripe-php/lib/BaseStripeClient.php (100%) rename {plugins => libs}/stripe-php/lib/BaseStripeClientInterface.php (100%) rename {plugins => libs}/stripe-php/lib/Billing/Alert.php (100%) rename {plugins => libs}/stripe-php/lib/Billing/AlertTriggered.php (100%) rename {plugins => libs}/stripe-php/lib/Billing/CreditBalanceSummary.php (100%) rename {plugins => libs}/stripe-php/lib/Billing/CreditBalanceTransaction.php (100%) rename {plugins => libs}/stripe-php/lib/Billing/CreditGrant.php (100%) rename {plugins => libs}/stripe-php/lib/Billing/Meter.php (100%) rename {plugins => libs}/stripe-php/lib/Billing/MeterEvent.php (100%) rename {plugins => libs}/stripe-php/lib/Billing/MeterEventAdjustment.php (100%) rename {plugins => libs}/stripe-php/lib/Billing/MeterEventSummary.php (100%) rename {plugins => libs}/stripe-php/lib/BillingPortal/Configuration.php (100%) rename {plugins => libs}/stripe-php/lib/BillingPortal/Session.php (100%) rename {plugins => libs}/stripe-php/lib/Capability.php (100%) rename {plugins => libs}/stripe-php/lib/Card.php (100%) rename {plugins => libs}/stripe-php/lib/CashBalance.php (100%) rename {plugins => libs}/stripe-php/lib/Charge.php (100%) rename {plugins => libs}/stripe-php/lib/Checkout/Session.php (100%) rename {plugins => libs}/stripe-php/lib/Climate/Order.php (100%) rename {plugins => libs}/stripe-php/lib/Climate/Product.php (100%) rename {plugins => libs}/stripe-php/lib/Climate/Supplier.php (100%) rename {plugins => libs}/stripe-php/lib/Collection.php (100%) rename {plugins => libs}/stripe-php/lib/ConfirmationToken.php (100%) rename {plugins => libs}/stripe-php/lib/ConnectCollectionTransfer.php (100%) rename {plugins => libs}/stripe-php/lib/CountrySpec.php (100%) rename {plugins => libs}/stripe-php/lib/Coupon.php (100%) rename {plugins => libs}/stripe-php/lib/CreditNote.php (100%) rename {plugins => libs}/stripe-php/lib/CreditNoteLineItem.php (100%) rename {plugins => libs}/stripe-php/lib/Customer.php (100%) rename {plugins => libs}/stripe-php/lib/CustomerBalanceTransaction.php (100%) rename {plugins => libs}/stripe-php/lib/CustomerCashBalanceTransaction.php (100%) rename {plugins => libs}/stripe-php/lib/CustomerSession.php (100%) rename {plugins => libs}/stripe-php/lib/Discount.php (100%) rename {plugins => libs}/stripe-php/lib/Dispute.php (100%) rename {plugins => libs}/stripe-php/lib/Entitlements/ActiveEntitlement.php (100%) rename {plugins => libs}/stripe-php/lib/Entitlements/ActiveEntitlementSummary.php (100%) rename {plugins => libs}/stripe-php/lib/Entitlements/Feature.php (100%) rename {plugins => libs}/stripe-php/lib/EphemeralKey.php (100%) rename {plugins => libs}/stripe-php/lib/ErrorObject.php (100%) rename {plugins => libs}/stripe-php/lib/Event.php (100%) rename {plugins => libs}/stripe-php/lib/EventData/V1BillingMeterErrorReportTriggeredEventData.php (100%) rename {plugins => libs}/stripe-php/lib/EventData/V1BillingMeterNoMeterFoundEventData.php (100%) rename {plugins => libs}/stripe-php/lib/EventData/V2CoreAccountIncludingConfigurationCustomerCapabilityStatusUpdatedEventData.php (100%) rename {plugins => libs}/stripe-php/lib/EventData/V2CoreAccountIncludingConfigurationMerchantCapabilityStatusUpdatedEventData.php (100%) rename {plugins => libs}/stripe-php/lib/EventData/V2CoreAccountIncludingConfigurationRecipientCapabilityStatusUpdatedEventData.php (100%) rename {plugins => libs}/stripe-php/lib/EventData/V2CoreAccountLinkReturnedEventData.php (100%) rename {plugins => libs}/stripe-php/lib/EventData/V2CoreAccountPersonCreatedEventData.php (100%) rename {plugins => libs}/stripe-php/lib/EventData/V2CoreAccountPersonDeletedEventData.php (100%) rename {plugins => libs}/stripe-php/lib/EventData/V2CoreAccountPersonUpdatedEventData.php (100%) rename {plugins => libs}/stripe-php/lib/Events/UnknownEventNotification.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V1BillingMeterErrorReportTriggeredEvent.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V1BillingMeterErrorReportTriggeredEventNotification.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V1BillingMeterNoMeterFoundEvent.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V1BillingMeterNoMeterFoundEventNotification.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountClosedEvent.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountClosedEventNotification.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountCreatedEvent.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountCreatedEventNotification.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationCustomerCapabilityStatusUpdatedEvent.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationCustomerCapabilityStatusUpdatedEventNotification.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationCustomerUpdatedEvent.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationCustomerUpdatedEventNotification.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationMerchantCapabilityStatusUpdatedEvent.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationMerchantCapabilityStatusUpdatedEventNotification.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationMerchantUpdatedEvent.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationMerchantUpdatedEventNotification.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationRecipientCapabilityStatusUpdatedEvent.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationRecipientCapabilityStatusUpdatedEventNotification.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationRecipientUpdatedEvent.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationRecipientUpdatedEventNotification.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountIncludingDefaultsUpdatedEvent.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountIncludingDefaultsUpdatedEventNotification.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountIncludingFutureRequirementsUpdatedEvent.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountIncludingFutureRequirementsUpdatedEventNotification.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountIncludingIdentityUpdatedEvent.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountIncludingIdentityUpdatedEventNotification.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountIncludingRequirementsUpdatedEvent.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountIncludingRequirementsUpdatedEventNotification.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountLinkReturnedEvent.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountLinkReturnedEventNotification.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountPersonCreatedEvent.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountPersonCreatedEventNotification.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountPersonDeletedEvent.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountPersonDeletedEventNotification.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountPersonUpdatedEvent.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountPersonUpdatedEventNotification.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountUpdatedEvent.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreAccountUpdatedEventNotification.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreEventDestinationPingEvent.php (100%) rename {plugins => libs}/stripe-php/lib/Events/V2CoreEventDestinationPingEventNotification.php (100%) rename {plugins => libs}/stripe-php/lib/Exception/ApiConnectionException.php (100%) rename {plugins => libs}/stripe-php/lib/Exception/ApiErrorException.php (100%) rename {plugins => libs}/stripe-php/lib/Exception/AuthenticationException.php (100%) rename {plugins => libs}/stripe-php/lib/Exception/BadMethodCallException.php (100%) rename {plugins => libs}/stripe-php/lib/Exception/CardException.php (100%) rename {plugins => libs}/stripe-php/lib/Exception/ExceptionInterface.php (100%) rename {plugins => libs}/stripe-php/lib/Exception/IdempotencyException.php (100%) rename {plugins => libs}/stripe-php/lib/Exception/InvalidArgumentException.php (100%) rename {plugins => libs}/stripe-php/lib/Exception/InvalidRequestException.php (100%) rename {plugins => libs}/stripe-php/lib/Exception/OAuth/ExceptionInterface.php (100%) rename {plugins => libs}/stripe-php/lib/Exception/OAuth/InvalidClientException.php (100%) rename {plugins => libs}/stripe-php/lib/Exception/OAuth/InvalidGrantException.php (100%) rename {plugins => libs}/stripe-php/lib/Exception/OAuth/InvalidRequestException.php (100%) rename {plugins => libs}/stripe-php/lib/Exception/OAuth/InvalidScopeException.php (100%) rename {plugins => libs}/stripe-php/lib/Exception/OAuth/OAuthErrorException.php (100%) rename {plugins => libs}/stripe-php/lib/Exception/OAuth/UnknownOAuthErrorException.php (100%) rename {plugins => libs}/stripe-php/lib/Exception/OAuth/UnsupportedGrantTypeException.php (100%) rename {plugins => libs}/stripe-php/lib/Exception/OAuth/UnsupportedResponseTypeException.php (100%) rename {plugins => libs}/stripe-php/lib/Exception/PermissionException.php (100%) rename {plugins => libs}/stripe-php/lib/Exception/RateLimitException.php (100%) rename {plugins => libs}/stripe-php/lib/Exception/SignatureVerificationException.php (100%) rename {plugins => libs}/stripe-php/lib/Exception/TemporarySessionExpiredException.php (100%) rename {plugins => libs}/stripe-php/lib/Exception/UnexpectedValueException.php (100%) rename {plugins => libs}/stripe-php/lib/Exception/UnknownApiErrorException.php (100%) rename {plugins => libs}/stripe-php/lib/ExchangeRate.php (100%) rename {plugins => libs}/stripe-php/lib/File.php (100%) rename {plugins => libs}/stripe-php/lib/FileLink.php (100%) rename {plugins => libs}/stripe-php/lib/FinancialConnections/Account.php (100%) rename {plugins => libs}/stripe-php/lib/FinancialConnections/AccountOwner.php (100%) rename {plugins => libs}/stripe-php/lib/FinancialConnections/AccountOwnership.php (100%) rename {plugins => libs}/stripe-php/lib/FinancialConnections/Session.php (100%) rename {plugins => libs}/stripe-php/lib/FinancialConnections/Transaction.php (100%) rename {plugins => libs}/stripe-php/lib/Forwarding/Request.php (100%) rename {plugins => libs}/stripe-php/lib/FundingInstructions.php (100%) rename {plugins => libs}/stripe-php/lib/HttpClient/ClientInterface.php (100%) rename {plugins => libs}/stripe-php/lib/HttpClient/CurlClient.php (100%) rename {plugins => libs}/stripe-php/lib/HttpClient/StreamingClientInterface.php (100%) rename {plugins => libs}/stripe-php/lib/Identity/VerificationReport.php (100%) rename {plugins => libs}/stripe-php/lib/Identity/VerificationSession.php (100%) rename {plugins => libs}/stripe-php/lib/Invoice.php (100%) rename {plugins => libs}/stripe-php/lib/InvoiceItem.php (100%) rename {plugins => libs}/stripe-php/lib/InvoiceLineItem.php (100%) rename {plugins => libs}/stripe-php/lib/InvoicePayment.php (100%) rename {plugins => libs}/stripe-php/lib/InvoiceRenderingTemplate.php (100%) rename {plugins => libs}/stripe-php/lib/Issuing/Authorization.php (100%) rename {plugins => libs}/stripe-php/lib/Issuing/Card.php (100%) rename {plugins => libs}/stripe-php/lib/Issuing/CardDetails.php (100%) rename {plugins => libs}/stripe-php/lib/Issuing/Cardholder.php (100%) rename {plugins => libs}/stripe-php/lib/Issuing/Dispute.php (100%) rename {plugins => libs}/stripe-php/lib/Issuing/PersonalizationDesign.php (100%) rename {plugins => libs}/stripe-php/lib/Issuing/PhysicalBundle.php (100%) rename {plugins => libs}/stripe-php/lib/Issuing/Token.php (100%) rename {plugins => libs}/stripe-php/lib/Issuing/Transaction.php (100%) rename {plugins => libs}/stripe-php/lib/LineItem.php (100%) rename {plugins => libs}/stripe-php/lib/LoginLink.php (100%) rename {plugins => libs}/stripe-php/lib/Mandate.php (100%) rename {plugins => libs}/stripe-php/lib/OAuth.php (100%) rename {plugins => libs}/stripe-php/lib/OAuthErrorObject.php (100%) rename {plugins => libs}/stripe-php/lib/PaymentAttemptRecord.php (100%) rename {plugins => libs}/stripe-php/lib/PaymentIntent.php (100%) rename {plugins => libs}/stripe-php/lib/PaymentIntentAmountDetailsLineItem.php (100%) rename {plugins => libs}/stripe-php/lib/PaymentLink.php (100%) rename {plugins => libs}/stripe-php/lib/PaymentMethod.php (100%) rename {plugins => libs}/stripe-php/lib/PaymentMethodConfiguration.php (100%) rename {plugins => libs}/stripe-php/lib/PaymentMethodDomain.php (100%) rename {plugins => libs}/stripe-php/lib/PaymentRecord.php (100%) rename {plugins => libs}/stripe-php/lib/Payout.php (100%) rename {plugins => libs}/stripe-php/lib/Person.php (100%) rename {plugins => libs}/stripe-php/lib/Plan.php (100%) rename {plugins => libs}/stripe-php/lib/Price.php (100%) rename {plugins => libs}/stripe-php/lib/Product.php (100%) rename {plugins => libs}/stripe-php/lib/ProductFeature.php (100%) rename {plugins => libs}/stripe-php/lib/PromotionCode.php (100%) rename {plugins => libs}/stripe-php/lib/Quote.php (100%) rename {plugins => libs}/stripe-php/lib/Radar/EarlyFraudWarning.php (100%) rename {plugins => libs}/stripe-php/lib/Radar/PaymentEvaluation.php (100%) rename {plugins => libs}/stripe-php/lib/Radar/ValueList.php (100%) rename {plugins => libs}/stripe-php/lib/Radar/ValueListItem.php (100%) rename {plugins => libs}/stripe-php/lib/Reason.php (100%) rename {plugins => libs}/stripe-php/lib/RecipientTransfer.php (100%) rename {plugins => libs}/stripe-php/lib/Refund.php (100%) rename {plugins => libs}/stripe-php/lib/RelatedObject.php (100%) rename {plugins => libs}/stripe-php/lib/Reporting/ReportRun.php (100%) rename {plugins => libs}/stripe-php/lib/Reporting/ReportType.php (100%) rename {plugins => libs}/stripe-php/lib/RequestTelemetry.php (100%) rename {plugins => libs}/stripe-php/lib/Reserve/Hold.php (100%) rename {plugins => libs}/stripe-php/lib/Reserve/Plan.php (100%) rename {plugins => libs}/stripe-php/lib/Reserve/Release.php (100%) rename {plugins => libs}/stripe-php/lib/ReserveTransaction.php (100%) rename {plugins => libs}/stripe-php/lib/Review.php (100%) rename {plugins => libs}/stripe-php/lib/SearchResult.php (100%) rename {plugins => libs}/stripe-php/lib/Service/AbstractService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/AbstractServiceFactory.php (100%) rename {plugins => libs}/stripe-php/lib/Service/AccountLinkService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/AccountService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/AccountSessionService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/ApplePayDomainService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/ApplicationFeeService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Apps/AppsServiceFactory.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Apps/SecretService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/BalanceService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/BalanceSettingsService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/BalanceTransactionService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Billing/AlertService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Billing/BillingServiceFactory.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Billing/CreditBalanceSummaryService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Billing/CreditBalanceTransactionService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Billing/CreditGrantService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Billing/MeterEventAdjustmentService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Billing/MeterEventService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Billing/MeterService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/BillingPortal/BillingPortalServiceFactory.php (100%) rename {plugins => libs}/stripe-php/lib/Service/BillingPortal/ConfigurationService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/BillingPortal/SessionService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/ChargeService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Checkout/CheckoutServiceFactory.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Checkout/SessionService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Climate/ClimateServiceFactory.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Climate/OrderService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Climate/ProductService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Climate/SupplierService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/ConfirmationTokenService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/CoreServiceFactory.php (100%) rename {plugins => libs}/stripe-php/lib/Service/CountrySpecService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/CouponService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/CreditNoteService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/CustomerService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/CustomerSessionService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/DisputeService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Entitlements/ActiveEntitlementService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Entitlements/EntitlementsServiceFactory.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Entitlements/FeatureService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/EphemeralKeyService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/EventService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/ExchangeRateService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/FileLinkService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/FileService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/FinancialConnections/AccountService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/FinancialConnections/FinancialConnectionsServiceFactory.php (100%) rename {plugins => libs}/stripe-php/lib/Service/FinancialConnections/SessionService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/FinancialConnections/TransactionService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Forwarding/ForwardingServiceFactory.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Forwarding/RequestService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Identity/IdentityServiceFactory.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Identity/VerificationReportService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Identity/VerificationSessionService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/InvoiceItemService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/InvoicePaymentService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/InvoiceRenderingTemplateService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/InvoiceService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Issuing/AuthorizationService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Issuing/CardService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Issuing/CardholderService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Issuing/DisputeService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Issuing/IssuingServiceFactory.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Issuing/PersonalizationDesignService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Issuing/PhysicalBundleService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Issuing/TokenService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Issuing/TransactionService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/MandateService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/OAuthService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/PaymentAttemptRecordService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/PaymentIntentService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/PaymentLinkService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/PaymentMethodConfigurationService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/PaymentMethodDomainService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/PaymentMethodService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/PaymentRecordService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/PayoutService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/PlanService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/PriceService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/ProductService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/PromotionCodeService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/QuoteService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Radar/EarlyFraudWarningService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Radar/PaymentEvaluationService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Radar/RadarServiceFactory.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Radar/ValueListItemService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Radar/ValueListService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/RefundService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Reporting/ReportRunService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Reporting/ReportTypeService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Reporting/ReportingServiceFactory.php (100%) rename {plugins => libs}/stripe-php/lib/Service/ReviewService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/ServiceNavigatorTrait.php (100%) rename {plugins => libs}/stripe-php/lib/Service/SetupAttemptService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/SetupIntentService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/ShippingRateService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Sigma/ScheduledQueryRunService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Sigma/SigmaServiceFactory.php (100%) rename {plugins => libs}/stripe-php/lib/Service/SourceService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/SubscriptionItemService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/SubscriptionScheduleService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/SubscriptionService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Tax/AssociationService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Tax/CalculationService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Tax/RegistrationService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Tax/SettingsService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Tax/TaxServiceFactory.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Tax/TransactionService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/TaxCodeService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/TaxIdService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/TaxRateService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Terminal/ConfigurationService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Terminal/ConnectionTokenService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Terminal/LocationService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Terminal/OnboardingLinkService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Terminal/ReaderService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Terminal/TerminalServiceFactory.php (100%) rename {plugins => libs}/stripe-php/lib/Service/TestHelpers/ConfirmationTokenService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/TestHelpers/CustomerService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/TestHelpers/Issuing/AuthorizationService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/TestHelpers/Issuing/CardService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/TestHelpers/Issuing/IssuingServiceFactory.php (100%) rename {plugins => libs}/stripe-php/lib/Service/TestHelpers/Issuing/PersonalizationDesignService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/TestHelpers/Issuing/TransactionService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/TestHelpers/RefundService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/TestHelpers/Terminal/ReaderService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/TestHelpers/Terminal/TerminalServiceFactory.php (100%) rename {plugins => libs}/stripe-php/lib/Service/TestHelpers/TestClockService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/TestHelpers/TestHelpersServiceFactory.php (100%) rename {plugins => libs}/stripe-php/lib/Service/TestHelpers/Treasury/InboundTransferService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/TestHelpers/Treasury/OutboundPaymentService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/TestHelpers/Treasury/OutboundTransferService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedCreditService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedDebitService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/TestHelpers/Treasury/TreasuryServiceFactory.php (100%) rename {plugins => libs}/stripe-php/lib/Service/TokenService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/TopupService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/TransferService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Treasury/CreditReversalService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Treasury/DebitReversalService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Treasury/FinancialAccountService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Treasury/InboundTransferService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Treasury/OutboundPaymentService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Treasury/OutboundTransferService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Treasury/ReceivedCreditService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Treasury/ReceivedDebitService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Treasury/TransactionEntryService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Treasury/TransactionService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/Treasury/TreasuryServiceFactory.php (100%) rename {plugins => libs}/stripe-php/lib/Service/V2/Billing/BillingServiceFactory.php (100%) rename {plugins => libs}/stripe-php/lib/Service/V2/Billing/MeterEventAdjustmentService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/V2/Billing/MeterEventService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/V2/Billing/MeterEventSessionService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/V2/Billing/MeterEventStreamService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/V2/Core/AccountLinkService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/V2/Core/AccountService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/V2/Core/AccountTokenService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/V2/Core/Accounts/PersonService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/V2/Core/Accounts/PersonTokenService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/V2/Core/CoreServiceFactory.php (100%) rename {plugins => libs}/stripe-php/lib/Service/V2/Core/EventDestinationService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/V2/Core/EventService.php (100%) rename {plugins => libs}/stripe-php/lib/Service/V2/V2ServiceFactory.php (100%) rename {plugins => libs}/stripe-php/lib/Service/WebhookEndpointService.php (100%) rename {plugins => libs}/stripe-php/lib/SetupAttempt.php (100%) rename {plugins => libs}/stripe-php/lib/SetupIntent.php (100%) rename {plugins => libs}/stripe-php/lib/ShippingRate.php (100%) rename {plugins => libs}/stripe-php/lib/Sigma/ScheduledQueryRun.php (100%) rename {plugins => libs}/stripe-php/lib/SingletonApiResource.php (100%) rename {plugins => libs}/stripe-php/lib/Source.php (100%) rename {plugins => libs}/stripe-php/lib/SourceMandateNotification.php (100%) rename {plugins => libs}/stripe-php/lib/SourceTransaction.php (100%) rename {plugins => libs}/stripe-php/lib/Stripe.php (100%) rename {plugins => libs}/stripe-php/lib/StripeClient.php (100%) rename {plugins => libs}/stripe-php/lib/StripeClientInterface.php (100%) rename {plugins => libs}/stripe-php/lib/StripeContext.php (100%) rename {plugins => libs}/stripe-php/lib/StripeObject.php (100%) rename {plugins => libs}/stripe-php/lib/StripeStreamingClientInterface.php (100%) rename {plugins => libs}/stripe-php/lib/Subscription.php (100%) rename {plugins => libs}/stripe-php/lib/SubscriptionItem.php (100%) rename {plugins => libs}/stripe-php/lib/SubscriptionSchedule.php (100%) rename {plugins => libs}/stripe-php/lib/Tax/Association.php (100%) rename {plugins => libs}/stripe-php/lib/Tax/Calculation.php (100%) rename {plugins => libs}/stripe-php/lib/Tax/CalculationLineItem.php (100%) rename {plugins => libs}/stripe-php/lib/Tax/Registration.php (100%) rename {plugins => libs}/stripe-php/lib/Tax/Settings.php (100%) rename {plugins => libs}/stripe-php/lib/Tax/Transaction.php (100%) rename {plugins => libs}/stripe-php/lib/Tax/TransactionLineItem.php (100%) rename {plugins => libs}/stripe-php/lib/TaxCode.php (100%) rename {plugins => libs}/stripe-php/lib/TaxDeductedAtSource.php (100%) rename {plugins => libs}/stripe-php/lib/TaxId.php (100%) rename {plugins => libs}/stripe-php/lib/TaxRate.php (100%) rename {plugins => libs}/stripe-php/lib/Terminal/Configuration.php (100%) rename {plugins => libs}/stripe-php/lib/Terminal/ConnectionToken.php (100%) rename {plugins => libs}/stripe-php/lib/Terminal/Location.php (100%) rename {plugins => libs}/stripe-php/lib/Terminal/OnboardingLink.php (100%) rename {plugins => libs}/stripe-php/lib/Terminal/Reader.php (100%) rename {plugins => libs}/stripe-php/lib/TestHelpers/TestClock.php (100%) rename {plugins => libs}/stripe-php/lib/Token.php (100%) rename {plugins => libs}/stripe-php/lib/Topup.php (100%) rename {plugins => libs}/stripe-php/lib/Transfer.php (100%) rename {plugins => libs}/stripe-php/lib/TransferReversal.php (100%) rename {plugins => libs}/stripe-php/lib/Treasury/CreditReversal.php (100%) rename {plugins => libs}/stripe-php/lib/Treasury/DebitReversal.php (100%) rename {plugins => libs}/stripe-php/lib/Treasury/FinancialAccount.php (100%) rename {plugins => libs}/stripe-php/lib/Treasury/FinancialAccountFeatures.php (100%) rename {plugins => libs}/stripe-php/lib/Treasury/InboundTransfer.php (100%) rename {plugins => libs}/stripe-php/lib/Treasury/OutboundPayment.php (100%) rename {plugins => libs}/stripe-php/lib/Treasury/OutboundTransfer.php (100%) rename {plugins => libs}/stripe-php/lib/Treasury/ReceivedCredit.php (100%) rename {plugins => libs}/stripe-php/lib/Treasury/ReceivedDebit.php (100%) rename {plugins => libs}/stripe-php/lib/Treasury/Transaction.php (100%) rename {plugins => libs}/stripe-php/lib/Treasury/TransactionEntry.php (100%) rename {plugins => libs}/stripe-php/lib/Util/ApiVersion.php (100%) rename {plugins => libs}/stripe-php/lib/Util/CaseInsensitiveArray.php (100%) rename {plugins => libs}/stripe-php/lib/Util/DefaultLogger.php (100%) rename {plugins => libs}/stripe-php/lib/Util/EventNotificationTypes.php (100%) rename {plugins => libs}/stripe-php/lib/Util/EventTypes.php (100%) rename {plugins => libs}/stripe-php/lib/Util/LoggerInterface.php (100%) rename {plugins => libs}/stripe-php/lib/Util/ObjectTypes.php (100%) rename {plugins => libs}/stripe-php/lib/Util/RandomGenerator.php (100%) rename {plugins => libs}/stripe-php/lib/Util/RequestOptions.php (100%) rename {plugins => libs}/stripe-php/lib/Util/Set.php (100%) rename {plugins => libs}/stripe-php/lib/Util/Util.php (100%) rename {plugins => libs}/stripe-php/lib/V2/Billing/MeterEvent.php (100%) rename {plugins => libs}/stripe-php/lib/V2/Billing/MeterEventAdjustment.php (100%) rename {plugins => libs}/stripe-php/lib/V2/Billing/MeterEventSession.php (100%) rename {plugins => libs}/stripe-php/lib/V2/Collection.php (100%) rename {plugins => libs}/stripe-php/lib/V2/Core/Account.php (100%) rename {plugins => libs}/stripe-php/lib/V2/Core/AccountLink.php (100%) rename {plugins => libs}/stripe-php/lib/V2/Core/AccountPerson.php (100%) rename {plugins => libs}/stripe-php/lib/V2/Core/AccountPersonToken.php (100%) rename {plugins => libs}/stripe-php/lib/V2/Core/AccountToken.php (100%) rename {plugins => libs}/stripe-php/lib/V2/Core/Event.php (100%) rename {plugins => libs}/stripe-php/lib/V2/Core/EventDestination.php (100%) rename {plugins => libs}/stripe-php/lib/V2/Core/EventNotification.php (100%) rename {plugins => libs}/stripe-php/lib/V2/DeletedObject.php (100%) rename {plugins => libs}/stripe-php/lib/Webhook.php (100%) rename {plugins => libs}/stripe-php/lib/WebhookEndpoint.php (100%) rename {plugins => libs}/stripe-php/lib/WebhookSignature.php (100%) rename {plugins => libs}/tempusdominus-bootstrap-4/css/tempusdominus-bootstrap-4.min.css (100%) rename {plugins => libs}/tempusdominus-bootstrap-4/js/tempusdominus-bootstrap-4.min.js (100%) rename {plugins => libs}/tinymce/icons/default/icons.min.js (100%) rename {plugins => libs}/tinymce/langs/README.md (100%) rename {plugins => libs}/tinymce/license.md (100%) rename {plugins => libs}/tinymce/models/dom/model.min.js (100%) rename {plugins => libs}/tinymce/notices.txt (100%) rename {plugins => libs}/tinymce/plugins/accordion/plugin.min.js (100%) rename {plugins => libs}/tinymce/plugins/advlist/plugin.min.js (100%) rename {plugins => libs}/tinymce/plugins/anchor/plugin.min.js (100%) rename {plugins => libs}/tinymce/plugins/autolink/plugin.min.js (100%) rename {plugins => libs}/tinymce/plugins/autoresize/plugin.min.js (100%) rename {plugins => libs}/tinymce/plugins/autosave/plugin.min.js (100%) rename {plugins => libs}/tinymce/plugins/charmap/plugin.min.js (100%) rename {plugins => libs}/tinymce/plugins/code/plugin.min.js (100%) rename {plugins => libs}/tinymce/plugins/codesample/plugin.min.js (100%) rename {plugins => libs}/tinymce/plugins/directionality/plugin.min.js (100%) rename {plugins => libs}/tinymce/plugins/emoticons/js/emojiimages.js (100%) rename {plugins => libs}/tinymce/plugins/emoticons/js/emojiimages.min.js (100%) rename {plugins => libs}/tinymce/plugins/emoticons/js/emojis.js (100%) rename {plugins => libs}/tinymce/plugins/emoticons/js/emojis.min.js (100%) rename {plugins => libs}/tinymce/plugins/emoticons/plugin.min.js (100%) rename {plugins => libs}/tinymce/plugins/fullscreen/plugin.min.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/ar.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/bg-BG.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/bg_BG.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/ca.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/cs.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/da.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/de.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/el.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/en.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/es.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/eu.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/fa.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/fi.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/fr-FR.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/fr_FR.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/he-IL.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/he_IL.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/hi.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/hr.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/hu-HU.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/hu_HU.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/id.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/it.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/ja.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/kk.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/ko-KR.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/ko_KR.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/ms.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/nb-NO.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/nb_NO.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/nl.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/pl.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/pt-BR.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/pt-PT.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/pt_BR.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/pt_PT.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/ro.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/ru.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/sk.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/sl-SI.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/sl_SI.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/sv-SE.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/sv_SE.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/th-TH.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/th_TH.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/tr.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/uk.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/vi.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/zh-CN.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/zh-TW.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/zh_CN.js (100%) rename {plugins => libs}/tinymce/plugins/help/js/i18n/keynav/zh_TW.js (100%) rename {plugins => libs}/tinymce/plugins/help/plugin.min.js (100%) rename {plugins => libs}/tinymce/plugins/image/plugin.min.js (100%) rename {plugins => libs}/tinymce/plugins/importcss/plugin.min.js (100%) rename {plugins => libs}/tinymce/plugins/insertdatetime/plugin.min.js (100%) rename {plugins => libs}/tinymce/plugins/link/plugin.min.js (100%) rename {plugins => libs}/tinymce/plugins/lists/plugin.min.js (100%) rename {plugins => libs}/tinymce/plugins/media/plugin.min.js (100%) rename {plugins => libs}/tinymce/plugins/nonbreaking/plugin.min.js (100%) rename {plugins => libs}/tinymce/plugins/pagebreak/plugin.min.js (100%) rename {plugins => libs}/tinymce/plugins/preview/plugin.min.js (100%) rename {plugins => libs}/tinymce/plugins/quickbars/plugin.min.js (100%) rename {plugins => libs}/tinymce/plugins/save/plugin.min.js (100%) rename {plugins => libs}/tinymce/plugins/searchreplace/plugin.min.js (100%) rename {plugins => libs}/tinymce/plugins/table/plugin.min.js (100%) rename {plugins => libs}/tinymce/plugins/visualblocks/plugin.min.js (100%) rename {plugins => libs}/tinymce/plugins/visualchars/plugin.min.js (100%) rename {plugins => libs}/tinymce/plugins/wordcount/plugin.min.js (100%) rename {plugins => libs}/tinymce/skins/content/dark/content.js (100%) rename {plugins => libs}/tinymce/skins/content/dark/content.min.css (100%) rename {plugins => libs}/tinymce/skins/content/default/content.js (100%) rename {plugins => libs}/tinymce/skins/content/default/content.min.css (100%) rename {plugins => libs}/tinymce/skins/content/document/content.js (100%) rename {plugins => libs}/tinymce/skins/content/document/content.min.css (100%) rename {plugins => libs}/tinymce/skins/content/tinymce-5-dark/content.js (100%) rename {plugins => libs}/tinymce/skins/content/tinymce-5-dark/content.min.css (100%) rename {plugins => libs}/tinymce/skins/content/tinymce-5/content.js (100%) rename {plugins => libs}/tinymce/skins/content/tinymce-5/content.min.css (100%) rename {plugins => libs}/tinymce/skins/content/writer/content.js (100%) rename {plugins => libs}/tinymce/skins/content/writer/content.min.css (100%) rename {plugins => libs}/tinymce/skins/ui/oxide-dark/content.inline.js (100%) rename {plugins => libs}/tinymce/skins/ui/oxide-dark/content.inline.min.css (100%) rename {plugins => libs}/tinymce/skins/ui/oxide-dark/content.js (100%) rename {plugins => libs}/tinymce/skins/ui/oxide-dark/content.min.css (100%) rename {plugins => libs}/tinymce/skins/ui/oxide-dark/skin.js (100%) rename {plugins => libs}/tinymce/skins/ui/oxide-dark/skin.min.css (100%) rename {plugins => libs}/tinymce/skins/ui/oxide-dark/skin.shadowdom.js (100%) rename {plugins => libs}/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css (100%) rename {plugins => libs}/tinymce/skins/ui/oxide/content.inline.js (100%) rename {plugins => libs}/tinymce/skins/ui/oxide/content.inline.min.css (100%) rename {plugins => libs}/tinymce/skins/ui/oxide/content.js (100%) rename {plugins => libs}/tinymce/skins/ui/oxide/content.min.css (100%) rename {plugins => libs}/tinymce/skins/ui/oxide/skin.js (100%) rename {plugins => libs}/tinymce/skins/ui/oxide/skin.min.css (100%) rename {plugins => libs}/tinymce/skins/ui/oxide/skin.shadowdom.js (100%) rename {plugins => libs}/tinymce/skins/ui/oxide/skin.shadowdom.min.css (100%) rename {plugins => libs}/tinymce/skins/ui/tinymce-5-dark/content.inline.js (100%) rename {plugins => libs}/tinymce/skins/ui/tinymce-5-dark/content.inline.min.css (100%) rename {plugins => libs}/tinymce/skins/ui/tinymce-5-dark/content.js (100%) rename {plugins => libs}/tinymce/skins/ui/tinymce-5-dark/content.min.css (100%) rename {plugins => libs}/tinymce/skins/ui/tinymce-5-dark/skin.js (100%) rename {plugins => libs}/tinymce/skins/ui/tinymce-5-dark/skin.min.css (100%) rename {plugins => libs}/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.js (100%) rename {plugins => libs}/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css (100%) rename {plugins => libs}/tinymce/skins/ui/tinymce-5/content.inline.js (100%) rename {plugins => libs}/tinymce/skins/ui/tinymce-5/content.inline.min.css (100%) rename {plugins => libs}/tinymce/skins/ui/tinymce-5/content.js (100%) rename {plugins => libs}/tinymce/skins/ui/tinymce-5/content.min.css (100%) rename {plugins => libs}/tinymce/skins/ui/tinymce-5/skin.js (100%) rename {plugins => libs}/tinymce/skins/ui/tinymce-5/skin.min.css (100%) rename {plugins => libs}/tinymce/skins/ui/tinymce-5/skin.shadowdom.js (100%) rename {plugins => libs}/tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css (100%) rename {plugins => libs}/tinymce/themes/silver/theme.min.js (100%) rename {plugins => libs}/tinymce/tinymce.d.ts (100%) rename {plugins => libs}/tinymce/tinymce.min.js (100%) rename {plugins => libs}/toastr/toastr.min.css (100%) rename {plugins => libs}/toastr/toastr.min.js (100%) rename {plugins => libs}/totp/totp.php (100%) rename {plugins => libs}/vendor/autoload.php (100%) rename {plugins => libs}/vendor/bin/carbon (100%) rename {plugins => libs}/vendor/carbonphp/carbon-doctrine-types/LICENSE (100%) rename {plugins => libs}/vendor/carbonphp/carbon-doctrine-types/README.md (100%) rename {plugins => libs}/vendor/carbonphp/carbon-doctrine-types/composer.json (100%) rename {plugins => libs}/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonDoctrineType.php (100%) rename {plugins => libs}/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonImmutableType.php (100%) rename {plugins => libs}/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonType.php (100%) rename {plugins => libs}/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonTypeConverter.php (100%) rename {plugins => libs}/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeDefaultPrecision.php (100%) rename {plugins => libs}/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeImmutableType.php (100%) rename {plugins => libs}/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeType.php (100%) rename {plugins => libs}/vendor/composer/ClassLoader.php (100%) rename {plugins => libs}/vendor/composer/InstalledVersions.php (100%) rename {plugins => libs}/vendor/composer/LICENSE (100%) rename {plugins => libs}/vendor/composer/autoload_classmap.php (100%) rename {plugins => libs}/vendor/composer/autoload_files.php (100%) rename {plugins => libs}/vendor/composer/autoload_namespaces.php (100%) rename {plugins => libs}/vendor/composer/autoload_psr4.php (100%) rename {plugins => libs}/vendor/composer/autoload_real.php (100%) rename {plugins => libs}/vendor/composer/autoload_static.php (100%) rename {plugins => libs}/vendor/composer/installed.json (100%) rename {plugins => libs}/vendor/composer/installed.php (100%) rename {plugins => libs}/vendor/composer/platform_check.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/composer.json (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Address.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Attachment.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/BodyStructureCollection.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/BodyStructurePart.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Collections/FolderCollection.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Collections/MessageCollection.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Collections/PaginatedCollection.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Collections/ResponseCollection.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/ComparesFolders.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/ConnectionInterface.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/ImapCommand.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/ImapConnection.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/ImapParser.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/ImapQueryBuilder.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/ImapTokenizer.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Loggers/EchoLogger.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Loggers/FileLogger.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Loggers/Logger.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Loggers/LoggerInterface.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Loggers/RayLogger.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/RawQueryValue.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Responses/ContinuationResponse.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Responses/Data/Data.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Responses/Data/ListData.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Responses/Data/ResponseCodeData.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Responses/HasTokens.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Responses/MessageResponseParser.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Responses/Response.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Responses/TaggedResponse.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Responses/UntaggedResponse.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Result.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Streams/FakeStream.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Streams/ImapStream.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Streams/StreamInterface.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Tokens/Atom.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Tokens/Crlf.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Tokens/EmailAddress.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Tokens/ListClose.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Tokens/ListOpen.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Tokens/Literal.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Tokens/Nil.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Tokens/Number.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Tokens/QuotedString.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Tokens/ResponseCodeClose.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Tokens/ResponseCodeOpen.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Connection/Tokens/Token.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/ContentDisposition.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/DraftMessage.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Enums/ContentDispositionType.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Enums/ImapFetchIdentifier.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Enums/ImapFlag.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Enums/ImapSearchKey.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Enums/ImapSortKey.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Exceptions/Exception.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Exceptions/ImapCapabilityException.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Exceptions/ImapCommandException.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Exceptions/ImapConnectionClosedException.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Exceptions/ImapConnectionException.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Exceptions/ImapConnectionFailedException.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Exceptions/ImapConnectionTimedOutException.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Exceptions/ImapParserException.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Exceptions/ImapResponseException.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Exceptions/ImapStreamException.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Exceptions/RuntimeException.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/FileMessage.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/FlaggableInterface.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Folder.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/FolderInterface.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/FolderRepository.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/FolderRepositoryInterface.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/HasFlags.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/HasMessageAccessors.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/HasParsedMessage.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Idle.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Mailbox.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/MailboxInterface.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Mbox.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Message.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/MessageInterface.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/MessageParser.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/MessageQuery.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/MessageQueryInterface.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Pagination/LengthAwarePaginator.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Poll.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/QueriesMessages.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Support/BodyPartDecoder.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Support/ForwardsCalls.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Support/LazyBodyPartStream.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Support/MimeMessage.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Support/Str.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Testing/FakeFolder.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Testing/FakeFolderRepository.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Testing/FakeMailbox.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Testing/FakeMessage.php (100%) rename {plugins => libs}/vendor/directorytree/imapengine/src/Testing/FakeMessageQuery.php (100%) rename {plugins => libs}/vendor/doctrine/lexer/LICENSE (100%) rename {plugins => libs}/vendor/doctrine/lexer/README.md (100%) rename {plugins => libs}/vendor/doctrine/lexer/UPGRADE.md (100%) rename {plugins => libs}/vendor/doctrine/lexer/composer.json (100%) rename {plugins => libs}/vendor/doctrine/lexer/src/AbstractLexer.php (100%) rename {plugins => libs}/vendor/doctrine/lexer/src/Token.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/CONTRIBUTING.md (100%) rename {plugins => libs}/vendor/egulias/email-validator/LICENSE (100%) rename {plugins => libs}/vendor/egulias/email-validator/composer.json (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/EmailLexer.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/EmailParser.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/EmailValidator.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/MessageIDParser.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Parser.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Parser/Comment.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Parser/CommentStrategy/CommentStrategy.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Parser/CommentStrategy/DomainComment.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Parser/CommentStrategy/LocalComment.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Parser/DomainLiteral.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Parser/DomainPart.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Parser/DoubleQuote.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Parser/FoldingWhiteSpace.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Parser/IDLeftPart.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Parser/IDRightPart.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Parser/LocalPart.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Parser/PartParser.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/InvalidEmail.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/MultipleErrors.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/AtextAfterCFWS.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/CRLFAtTheEnd.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/CRLFX2.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/CRNoLF.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/CharNotAllowed.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/CommaInDomain.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/CommentsInIDRight.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/ConsecutiveAt.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/ConsecutiveDot.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/DetailedReason.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/DomainAcceptsNoMail.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/DomainHyphened.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/DomainTooLong.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/DotAtEnd.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/DotAtStart.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/EmptyReason.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/ExceptionFound.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/ExpectingATEXT.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/ExpectingCTEXT.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/ExpectingDTEXT.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/ExpectingDomainLiteralClose.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/LabelTooLong.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/LocalOrReservedDomain.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/NoDNSRecord.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/NoDomainPart.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/NoLocalPart.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/RFCWarnings.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/Reason.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/SpoofEmail.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/UnOpenedComment.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/UnableToGetDNSRecord.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/UnclosedComment.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/UnclosedQuotedString.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Reason/UnusualElements.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/Result.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/SpoofEmail.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Result/ValidEmail.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Validation/DNSCheckValidation.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Validation/DNSGetRecordWrapper.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Validation/DNSRecords.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Validation/EmailValidation.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Validation/Exception/EmptyValidationList.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Validation/Extra/SpoofCheckValidation.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Validation/MessageIDValidation.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Validation/MultipleValidationWithAnd.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Validation/NoRFCWarningsValidation.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Validation/RFCValidation.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Warning/AddressLiteral.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Warning/CFWSNearAt.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Warning/CFWSWithFWS.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Warning/Comment.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Warning/DeprecatedComment.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Warning/DomainLiteral.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Warning/EmailTooLong.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Warning/IPV6BadChar.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Warning/IPV6ColonEnd.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Warning/IPV6ColonStart.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Warning/IPV6Deprecated.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Warning/IPV6DoubleColon.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Warning/IPV6GroupCount.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Warning/IPV6MaxGroups.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Warning/LocalTooLong.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Warning/NoDNSMXRecord.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Warning/ObsoleteDTEXT.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Warning/QuotedPart.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Warning/QuotedString.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Warning/TLD.php (100%) rename {plugins => libs}/vendor/egulias/email-validator/src/Warning/Warning.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/CHANGELOG.md (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/LICENSE (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/README.md (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/UPGRADING.md (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/composer.json (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/AppendStream.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/BufferStream.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/CachingStream.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/DroppingStream.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/Exception/MalformedUriException.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/FnStream.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/Header.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/HttpFactory.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/InflateStream.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/LazyOpenStream.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/LimitStream.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/Message.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/MessageTrait.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/MimeType.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/MultipartStream.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/NoSeekStream.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/PumpStream.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/Query.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/Request.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/Response.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/Rfc3986.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/Rfc7230.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/ServerRequest.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/Stream.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/StreamWrapper.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/UploadedFile.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/Uri.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/UriComparator.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/UriNormalizer.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/UriResolver.php (100%) rename {plugins => libs}/vendor/guzzlehttp/psr7/src/Utils.php (100%) rename {plugins => libs}/vendor/illuminate/collections/Arr.php (100%) rename {plugins => libs}/vendor/illuminate/collections/Collection.php (100%) rename {plugins => libs}/vendor/illuminate/collections/Enumerable.php (100%) rename {plugins => libs}/vendor/illuminate/collections/HigherOrderCollectionProxy.php (100%) rename {plugins => libs}/vendor/illuminate/collections/ItemNotFoundException.php (100%) rename {plugins => libs}/vendor/illuminate/collections/LICENSE.md (100%) rename {plugins => libs}/vendor/illuminate/collections/LazyCollection.php (100%) rename {plugins => libs}/vendor/illuminate/collections/MultipleItemsFoundException.php (100%) rename {plugins => libs}/vendor/illuminate/collections/Traits/EnumeratesValues.php (100%) rename {plugins => libs}/vendor/illuminate/collections/Traits/TransformsToResourceCollection.php (100%) rename {plugins => libs}/vendor/illuminate/collections/composer.json (100%) rename {plugins => libs}/vendor/illuminate/collections/functions.php (100%) rename {plugins => libs}/vendor/illuminate/collections/helpers.php (100%) rename {plugins => libs}/vendor/illuminate/conditionable/HigherOrderWhenProxy.php (100%) rename {plugins => libs}/vendor/illuminate/conditionable/LICENSE.md (100%) rename {plugins => libs}/vendor/illuminate/conditionable/Traits/Conditionable.php (100%) rename {plugins => libs}/vendor/illuminate/conditionable/composer.json (100%) rename {plugins => libs}/vendor/illuminate/contracts/Auth/Access/Authorizable.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Auth/Access/Gate.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Auth/Authenticatable.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Auth/CanResetPassword.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Auth/Factory.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Auth/Guard.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Auth/Middleware/AuthenticatesRequests.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Auth/MustVerifyEmail.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Auth/PasswordBroker.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Auth/PasswordBrokerFactory.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Auth/StatefulGuard.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Auth/SupportsBasicAuth.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Auth/UserProvider.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Broadcasting/Broadcaster.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Broadcasting/Factory.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Broadcasting/HasBroadcastChannel.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Broadcasting/ShouldBeUnique.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Broadcasting/ShouldBroadcast.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Broadcasting/ShouldBroadcastNow.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Broadcasting/ShouldRescue.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Bus/Dispatcher.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Bus/QueueingDispatcher.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Cache/Factory.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Cache/Lock.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Cache/LockProvider.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Cache/LockTimeoutException.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Cache/Repository.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Cache/Store.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Concurrency/Driver.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Config/Repository.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Console/Application.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Console/Isolatable.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Console/Kernel.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Console/PromptsForMissingInput.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Container/BindingResolutionException.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Container/CircularDependencyException.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Container/Container.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Container/ContextualAttribute.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Container/ContextualBindingBuilder.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Container/SelfBuilding.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Cookie/Factory.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Cookie/QueueingFactory.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Database/ConcurrencyErrorDetector.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Database/Eloquent/Builder.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Database/Eloquent/Castable.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Database/Eloquent/CastsAttributes.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Database/Eloquent/ComparesCastableAttributes.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Database/Eloquent/DeviatesCastableAttributes.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Database/Eloquent/SerializesCastableAttributes.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Database/Eloquent/SupportsPartialRelations.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Database/Events/MigrationEvent.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Database/LostConnectionDetector.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Database/ModelIdentifier.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Database/Query/Builder.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Database/Query/ConditionExpression.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Database/Query/Expression.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Debug/ExceptionHandler.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Debug/ShouldntReport.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Encryption/DecryptException.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Encryption/EncryptException.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Encryption/Encrypter.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Encryption/StringEncrypter.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Events/Dispatcher.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Events/ShouldDispatchAfterCommit.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Events/ShouldHandleEventsAfterCommit.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Filesystem/Cloud.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Filesystem/Factory.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Filesystem/FileNotFoundException.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Filesystem/Filesystem.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Filesystem/LockTimeoutException.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Foundation/Application.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Foundation/CachesConfiguration.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Foundation/CachesRoutes.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Foundation/ExceptionRenderer.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Foundation/MaintenanceMode.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Hashing/Hasher.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Http/Kernel.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/JsonSchema/JsonSchema.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/LICENSE.md (100%) rename {plugins => libs}/vendor/illuminate/contracts/Log/ContextLogProcessor.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Mail/Attachable.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Mail/Factory.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Mail/MailQueue.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Mail/Mailable.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Mail/Mailer.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Notifications/Dispatcher.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Notifications/Factory.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Pagination/CursorPaginator.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Pagination/LengthAwarePaginator.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Pagination/Paginator.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Pipeline/Hub.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Pipeline/Pipeline.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Process/InvokedProcess.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Process/ProcessResult.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Queue/ClearableQueue.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Queue/EntityNotFoundException.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Queue/EntityResolver.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Queue/Factory.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Queue/Job.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Queue/Monitor.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Queue/Queue.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Queue/QueueableCollection.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Queue/QueueableEntity.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Queue/ShouldBeEncrypted.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Queue/ShouldBeUnique.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Queue/ShouldBeUniqueUntilProcessing.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Queue/ShouldQueue.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Queue/ShouldQueueAfterCommit.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Redis/Connection.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Redis/Connector.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Redis/Factory.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Redis/LimiterTimeoutException.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Routing/BindingRegistrar.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Routing/Registrar.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Routing/ResponseFactory.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Routing/UrlGenerator.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Routing/UrlRoutable.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Session/Middleware/AuthenticatesSessions.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Session/Session.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Support/Arrayable.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Support/DeferrableProvider.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Support/DeferringDisplayableValue.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Support/HasOnceHash.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Support/Htmlable.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Support/Jsonable.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Support/MessageBag.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Support/MessageProvider.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Support/Renderable.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Support/Responsable.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Support/ValidatedData.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Translation/HasLocalePreference.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Translation/Loader.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Translation/Translator.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Validation/CompilableRules.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Validation/DataAwareRule.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Validation/Factory.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Validation/ImplicitRule.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Validation/InvokableRule.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Validation/Rule.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Validation/UncompromisedVerifier.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Validation/ValidatesWhenResolved.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Validation/ValidationRule.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Validation/Validator.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/Validation/ValidatorAwareRule.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/View/Engine.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/View/Factory.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/View/View.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/View/ViewCompilationException.php (100%) rename {plugins => libs}/vendor/illuminate/contracts/composer.json (100%) rename {plugins => libs}/vendor/illuminate/macroable/LICENSE.md (100%) rename {plugins => libs}/vendor/illuminate/macroable/Traits/Macroable.php (100%) rename {plugins => libs}/vendor/illuminate/macroable/composer.json (100%) rename {plugins => libs}/vendor/laravel/serializable-closure/LICENSE.md (100%) rename {plugins => libs}/vendor/laravel/serializable-closure/README.md (100%) rename {plugins => libs}/vendor/laravel/serializable-closure/composer.json (100%) rename {plugins => libs}/vendor/laravel/serializable-closure/src/Contracts/Serializable.php (100%) rename {plugins => libs}/vendor/laravel/serializable-closure/src/Contracts/Signer.php (100%) rename {plugins => libs}/vendor/laravel/serializable-closure/src/Exceptions/InvalidSignatureException.php (100%) rename {plugins => libs}/vendor/laravel/serializable-closure/src/Exceptions/MissingSecretKeyException.php (100%) rename {plugins => libs}/vendor/laravel/serializable-closure/src/SerializableClosure.php (100%) rename {plugins => libs}/vendor/laravel/serializable-closure/src/Serializers/Native.php (100%) rename {plugins => libs}/vendor/laravel/serializable-closure/src/Serializers/Signed.php (100%) rename {plugins => libs}/vendor/laravel/serializable-closure/src/Signers/Hmac.php (100%) rename {plugins => libs}/vendor/laravel/serializable-closure/src/Support/ClosureScope.php (100%) rename {plugins => libs}/vendor/laravel/serializable-closure/src/Support/ClosureStream.php (100%) rename {plugins => libs}/vendor/laravel/serializable-closure/src/Support/ReflectionClosure.php (100%) rename {plugins => libs}/vendor/laravel/serializable-closure/src/Support/SelfReference.php (100%) rename {plugins => libs}/vendor/laravel/serializable-closure/src/UnsignedSerializableClosure.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/.phpstorm.meta.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/LICENSE (100%) rename {plugins => libs}/vendor/nesbot/carbon/SECURITY.md (100%) rename {plugins => libs}/vendor/nesbot/carbon/bin/carbon (100%) rename {plugins => libs}/vendor/nesbot/carbon/bin/carbon.bat (100%) rename {plugins => libs}/vendor/nesbot/carbon/composer.json (100%) rename {plugins => libs}/vendor/nesbot/carbon/extension.neon (100%) rename {plugins => libs}/vendor/nesbot/carbon/lazy/Carbon/MessageFormatter/MessageFormatterMapperStrongType.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/lazy/Carbon/MessageFormatter/MessageFormatterMapperWeakType.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/lazy/Carbon/ProtectedDatePeriod.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/lazy/Carbon/TranslatorStrongType.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/lazy/Carbon/TranslatorWeakType.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/lazy/Carbon/UnprotectedDatePeriod.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/readme.md (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/AbstractTranslator.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Callback.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Carbon.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/CarbonConverterInterface.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/CarbonImmutable.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/CarbonInterface.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/CarbonInterval.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/CarbonPeriod.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/CarbonPeriodImmutable.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/CarbonTimeZone.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Cli/Invoker.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Constants/DiffOptions.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Constants/Format.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Constants/TranslationOptions.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Constants/UnitValue.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/Exception.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitException.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Exceptions/UnsupportedUnitException.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Factory.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/FactoryImmutable.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/aa.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/aa_DJ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/aa_ER.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/aa_ER@saaho.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/aa_ET.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/af.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/af_NA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/af_ZA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/agq.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/agr.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/agr_PE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ak.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ak_GH.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/am.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/am_ET.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/an.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/an_ES.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/anp.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/anp_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar_AE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar_BH.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar_DJ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar_DZ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar_EG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar_EH.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar_ER.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar_IL.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar_IQ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar_JO.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar_KM.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar_KW.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar_LB.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar_LY.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar_MA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar_MR.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar_OM.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar_PS.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar_QA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar_SA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar_SD.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar_SO.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar_SS.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar_SY.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar_Shakl.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar_TD.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar_TN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ar_YE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/as.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/as_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/asa.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ast.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ast_ES.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ayc.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ayc_PE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/az.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/az_AZ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/az_Arab.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/az_Cyrl.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/az_IR.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/az_Latn.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/bas.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/be.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/be_BY.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/be_BY@latin.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/bem.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/bem_ZM.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ber.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ber_DZ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ber_MA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/bez.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/bg.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/bg_BG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/bhb.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/bhb_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/bho.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/bho_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/bi.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/bi_VU.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/bm.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/bn.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/bn_BD.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/bn_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/bo.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/bo_CN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/bo_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/br.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/br_FR.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/brx.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/brx_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/bs.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/bs_BA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/bs_Cyrl.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/bs_Latn.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/byn.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/byn_ER.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ca.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ca_AD.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ca_ES.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ca_ES_Valencia.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ca_FR.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ca_IT.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ccp.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ccp_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ce.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ce_RU.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/cgg.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/chr.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/chr_US.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ckb.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/cmn.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/cmn_TW.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/crh.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/crh_UA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/cs.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/cs_CZ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/csb.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/csb_PL.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/cu.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/cv.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/cv_RU.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/cy.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/cy_GB.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/da.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/da_DK.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/da_GL.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/dav.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/de.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/de_AT.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/de_BE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/de_CH.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/de_DE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/de_IT.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/de_LI.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/de_LU.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/dje.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/doi.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/doi_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/dsb.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/dsb_DE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/dua.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/dv.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/dv_MV.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/dyo.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/dz.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/dz_BT.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ebu.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ee.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ee_TG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/el.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/el_CY.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/el_GR.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_001.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_150.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_AG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_AI.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_AS.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_AT.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_AU.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_BB.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_BE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_BI.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_BM.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_BS.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_BW.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_BZ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_CA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_CC.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_CH.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_CK.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_CM.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_CX.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_CY.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_DE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_DG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_DK.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_DM.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_ER.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_FI.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_FJ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_FK.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_FM.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_GB.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_GD.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_GG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_GH.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_GI.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_GM.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_GU.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_GY.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_HK.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_IE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_IL.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_IM.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_IO.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_ISO.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_JE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_JM.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_KE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_KI.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_KN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_KY.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_LC.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_LR.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_LS.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_MG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_MH.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_MO.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_MP.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_MS.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_MT.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_MU.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_MW.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_MY.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_NA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_NF.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_NG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_NL.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_NR.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_NU.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_NZ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_PG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_PH.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_PK.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_PN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_PR.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_PW.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_RW.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_SB.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_SC.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_SD.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_SE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_SG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_SH.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_SI.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_SL.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_SS.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_SX.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_SZ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_TC.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_TK.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_TO.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_TT.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_TV.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_TZ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_UG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_UM.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_US.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_US_Posix.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_VC.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_VG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_VI.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_VU.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_WS.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_ZA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_ZM.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/en_ZW.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/eo.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/es.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/es_419.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/es_AR.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/es_BO.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/es_BR.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/es_BZ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/es_CL.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/es_CO.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/es_CR.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/es_CU.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/es_DO.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/es_EA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/es_EC.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/es_ES.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/es_GQ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/es_GT.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/es_HN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/es_IC.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/es_MX.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/es_NI.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/es_PA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/es_PE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/es_PH.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/es_PR.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/es_PY.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/es_SV.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/es_US.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/es_UY.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/es_VE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/et.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/et_EE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/eu.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/eu_ES.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ewo.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fa.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fa_AF.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fa_IR.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ff.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ff_CM.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ff_GN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ff_MR.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ff_SN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fi.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fi_FI.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fil.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fil_PH.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fo.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fo_DK.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fo_FO.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_BE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_BF.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_BI.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_BJ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_BL.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_CA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_CD.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_CF.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_CG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_CH.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_CI.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_CM.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_DJ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_DZ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_FR.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_GA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_GF.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_GN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_GP.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_GQ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_HT.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_KM.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_LU.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_MA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_MC.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_MF.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_MG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_ML.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_MQ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_MR.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_MU.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_NC.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_NE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_PF.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_PM.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_RE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_RW.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_SC.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_SN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_SY.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_TD.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_TG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_TN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_VU.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_WF.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fr_YT.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fur.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fur_IT.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fy.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fy_DE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/fy_NL.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ga.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ga_IE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/gd.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/gd_GB.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/gez.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/gez_ER.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/gez_ET.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/gl.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/gl_ES.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/gom.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/gom_Latn.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/gsw.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/gsw_CH.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/gsw_FR.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/gsw_LI.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/gu.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/gu_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/guz.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/gv.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/gv_GB.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ha.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ha_GH.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ha_NE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ha_NG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/hak.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/hak_TW.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/haw.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/he.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/he_IL.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/hi.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/hi_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/hif.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/hif_FJ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/hne.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/hne_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/hr.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/hr_BA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/hr_HR.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/hsb.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/hsb_DE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ht.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ht_HT.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/hu.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/hu_HU.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/hy.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/hy_AM.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/i18n.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ia.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ia_FR.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/id.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/id_ID.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ig.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ig_NG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ii.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ik.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ik_CA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/in.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/is.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/is_IS.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/it.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/it_CH.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/it_IT.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/it_SM.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/it_VA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/iu.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/iu_CA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/iw.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ja.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ja_JP.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/jgo.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/jmc.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/jv.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ka.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ka_GE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/kab.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/kab_DZ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/kam.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/kde.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/kea.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/khq.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ki.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/kk.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/kk_KZ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/kkj.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/kl.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/kl_GL.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/kln.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/km.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/km_KH.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/kn.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/kn_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ko.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ko_KP.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ko_KR.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/kok.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/kok_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ks.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ks_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ks_IN@devanagari.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ksb.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ksf.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ksh.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ku.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ku_TR.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/kw.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/kw_GB.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ky.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ky_KG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/lag.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/lb.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/lb_LU.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/lg.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/lg_UG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/li.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/li_NL.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/lij.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/lij_IT.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/lkt.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ln.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ln_AO.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ln_CD.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ln_CF.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ln_CG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/lo.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/lo_LA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/lrc.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/lrc_IQ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/lt.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/lt_LT.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/lu.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/luo.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/luy.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/lv.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/lv_LV.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/lzh.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/lzh_TW.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mag.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mag_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mai.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mai_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mas.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mas_TZ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mer.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mfe.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mfe_MU.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mg.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mg_MG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mgh.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mgo.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mhr.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mhr_RU.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mi.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mi_NZ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/miq.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/miq_NI.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mjw.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mjw_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mk.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mk_MK.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ml.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ml_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mn.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mn_MN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mni.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mni_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mo.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mr.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mr_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ms.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ms_BN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ms_MY.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ms_SG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mt.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mt_MT.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mua.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/my.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/my_MM.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/mzn.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nan.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nan_TW.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nan_TW@latin.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/naq.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nb.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nb_NO.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nb_SJ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nd.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nds.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nds_DE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nds_NL.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ne.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ne_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ne_NP.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nhn.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nhn_MX.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/niu.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/niu_NU.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nl.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nl_AW.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nl_BE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nl_BQ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nl_CW.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nl_NL.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nl_SR.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nl_SX.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nmg.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nn.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nn_NO.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nnh.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/no.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nr.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nr_ZA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nso.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nso_ZA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nus.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/nyn.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/oc.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/oc_FR.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/om.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/om_ET.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/om_KE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/or.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/or_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/os.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/os_RU.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/pa.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/pa_Arab.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/pa_Guru.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/pa_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/pa_PK.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/pap.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/pap_AW.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/pap_CW.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/pl.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/pl_PL.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/prg.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ps.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ps_AF.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/pt.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/pt_AO.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/pt_BR.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/pt_CH.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/pt_CV.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/pt_GQ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/pt_GW.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/pt_LU.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/pt_MO.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/pt_MZ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/pt_PT.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/pt_ST.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/pt_TL.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/qu.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/qu_BO.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/qu_EC.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/quz.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/quz_PE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/raj.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/raj_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/rm.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/rn.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ro.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ro_MD.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ro_RO.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/rof.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ru.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ru_BY.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ru_KG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ru_KZ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ru_MD.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ru_RU.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ru_UA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/rw.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/rw_RW.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/rwk.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sa.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sa_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sah.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sah_RU.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/saq.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sat.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sat_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sbp.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sc.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sc_IT.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sd.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sd_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sd_IN@devanagari.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/se.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/se_FI.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/se_NO.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/se_SE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/seh.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ses.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sg.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sgs.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sgs_LT.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sh.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/shi.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/shi_Latn.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/shi_Tfng.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/shn.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/shn_MM.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/shs.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/shs_CA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/si.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/si_LK.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sid.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sid_ET.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sk.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sk_SK.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sl.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sl_SI.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sm.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sm_WS.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/smn.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sn.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/so.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/so_DJ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/so_ET.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/so_KE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/so_SO.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sq.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sq_AL.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sq_MK.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sq_XK.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sr.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_BA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_ME.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_XK.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_BA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_ME.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_XK.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sr_ME.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sr_RS.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sr_RS@latin.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ss.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ss_ZA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/st.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/st_ZA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sv.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sv_AX.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sv_FI.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sv_SE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sw.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sw_CD.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sw_KE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sw_TZ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/sw_UG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/szl.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/szl_PL.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ta.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ta_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ta_LK.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ta_MY.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ta_SG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/tcy.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/tcy_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/te.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/te_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/teo.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/teo_KE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/tet.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/tg.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/tg_TJ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/th.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/th_TH.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/the.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/the_NP.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ti.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ti_ER.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ti_ET.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/tig.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/tig_ER.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/tk.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/tk_TM.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/tl.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/tl_PH.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/tlh.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/tn.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/tn_ZA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/to.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/to_TO.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/tpi.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/tpi_PG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/tr.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/tr_CY.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/tr_TR.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ts.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ts_ZA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/tt.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/tt_RU.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/tt_RU@iqtelif.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/twq.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/tzl.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/tzm.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/tzm_Latn.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ug.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ug_CN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/uk.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/uk_UA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/unm.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/unm_US.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ur.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ur_IN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ur_PK.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/uz.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/uz_Arab.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/uz_Cyrl.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/uz_Latn.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ@cyrillic.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/vai.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/vai_Latn.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/vai_Vaii.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ve.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/ve_ZA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/vi.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/vi_VN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/vo.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/vun.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/wa.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/wa_BE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/wae.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/wae_CH.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/wal.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/wal_ET.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/wo.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/wo_SN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/xh.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/xh_ZA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/xog.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/yav.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/yi.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/yi_US.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/yo.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/yo_BJ.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/yo_NG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/yue.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/yue_HK.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/yue_Hans.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/yue_Hant.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/yuw.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/yuw_PG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/zgh.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/zh.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/zh_CN.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/zh_HK.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_HK.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_MO.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_SG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_HK.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_MO.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_TW.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/zh_MO.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/zh_SG.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/zh_TW.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/zh_YUE.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/zu.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Lang/zu_ZA.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Language.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/List/languages.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/List/regions.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/MessageFormatter/MessageFormatterMapper.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Month.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/OverflowMode.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/PHPStan/MacroExtension.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/PHPStan/MacroMethodReflection.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Traits/Boundaries.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Traits/Cast.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Traits/Comparison.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Traits/Converter.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Traits/Creator.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Traits/Date.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Traits/DeprecatedPeriodProperties.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Traits/Difference.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Traits/IntervalStep.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Traits/LocalFactory.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Traits/Localization.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Traits/Macro.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Traits/MagicParameter.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Traits/Mixin.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Traits/Modifiers.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Traits/Mutability.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Traits/Options.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Traits/Rounding.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Traits/Serialization.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Traits/StaticLocalization.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Traits/StaticOptions.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Traits/Test.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Traits/Timestamp.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Traits/ToStringFormat.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Traits/Units.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Traits/Week.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Translator.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/TranslatorImmutable.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/TranslatorStrongTypeInterface.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/Unit.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/WeekDay.php (100%) rename {plugins => libs}/vendor/nesbot/carbon/src/Carbon/WrapperClock.php (100%) rename {plugins => libs}/vendor/php-di/invoker/LICENSE (100%) rename {plugins => libs}/vendor/php-di/invoker/README.md (100%) rename {plugins => libs}/vendor/php-di/invoker/composer.json (100%) rename {plugins => libs}/vendor/php-di/invoker/src/CallableResolver.php (100%) rename {plugins => libs}/vendor/php-di/invoker/src/Exception/InvocationException.php (100%) rename {plugins => libs}/vendor/php-di/invoker/src/Exception/NotCallableException.php (100%) rename {plugins => libs}/vendor/php-di/invoker/src/Exception/NotEnoughParametersException.php (100%) rename {plugins => libs}/vendor/php-di/invoker/src/Invoker.php (100%) rename {plugins => libs}/vendor/php-di/invoker/src/InvokerInterface.php (100%) rename {plugins => libs}/vendor/php-di/invoker/src/ParameterResolver/AssociativeArrayResolver.php (100%) rename {plugins => libs}/vendor/php-di/invoker/src/ParameterResolver/Container/ParameterNameContainerResolver.php (100%) rename {plugins => libs}/vendor/php-di/invoker/src/ParameterResolver/Container/TypeHintContainerResolver.php (100%) rename {plugins => libs}/vendor/php-di/invoker/src/ParameterResolver/DefaultValueResolver.php (100%) rename {plugins => libs}/vendor/php-di/invoker/src/ParameterResolver/NumericArrayResolver.php (100%) rename {plugins => libs}/vendor/php-di/invoker/src/ParameterResolver/ParameterResolver.php (100%) rename {plugins => libs}/vendor/php-di/invoker/src/ParameterResolver/ResolverChain.php (100%) rename {plugins => libs}/vendor/php-di/invoker/src/ParameterResolver/TypeHintResolver.php (100%) rename {plugins => libs}/vendor/php-di/invoker/src/Reflection/CallableReflection.php (100%) rename {plugins => libs}/vendor/php-di/php-di/LICENSE (100%) rename {plugins => libs}/vendor/php-di/php-di/README.md (100%) rename {plugins => libs}/vendor/php-di/php-di/change-log.md (100%) rename {plugins => libs}/vendor/php-di/php-di/composer.json (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Attribute/Inject.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Attribute/Injectable.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/CompiledContainer.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Compiler/Compiler.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Compiler/ObjectCreationCompiler.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Compiler/RequestedEntryHolder.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Compiler/Template.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Container.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/ContainerBuilder.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/ArrayDefinition.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/ArrayDefinitionExtension.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/AutowireDefinition.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/DecoratorDefinition.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/Definition.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/Dumper/ObjectDefinitionDumper.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/EnvironmentVariableDefinition.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/Exception/InvalidAttribute.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/Exception/InvalidDefinition.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/ExtendsPreviousDefinition.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/FactoryDefinition.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/Helper/AutowireDefinitionHelper.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/Helper/CreateDefinitionHelper.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/Helper/DefinitionHelper.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/Helper/FactoryDefinitionHelper.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/InstanceDefinition.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/ObjectDefinition.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/ObjectDefinition/MethodInjection.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/ObjectDefinition/PropertyInjection.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/Reference.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/Resolver/ArrayResolver.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/Resolver/DecoratorResolver.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/Resolver/DefinitionResolver.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/Resolver/EnvironmentVariableResolver.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/Resolver/FactoryResolver.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/Resolver/InstanceInjector.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/Resolver/ObjectCreator.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/Resolver/ParameterResolver.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/Resolver/ResolverDispatcher.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/SelfResolvingDefinition.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/Source/AttributeBasedAutowiring.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/Source/Autowiring.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/Source/DefinitionArray.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/Source/DefinitionFile.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/Source/DefinitionNormalizer.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/Source/DefinitionSource.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/Source/MutableDefinitionSource.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/Source/NoAutowiring.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/Source/ReflectionBasedAutowiring.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/Source/SourceCache.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/Source/SourceChain.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/StringDefinition.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Definition/ValueDefinition.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/DependencyException.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Factory/RequestedEntry.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/FactoryInterface.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Invoker/DefinitionParameterResolver.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Invoker/FactoryParameterResolver.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/NotFoundException.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Proxy/NativeProxyFactory.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Proxy/ProxyFactory.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/Proxy/ProxyFactoryInterface.php (100%) rename {plugins => libs}/vendor/php-di/php-di/src/functions.php (100%) rename {plugins => libs}/vendor/php-di/php-di/support.md (100%) rename {plugins => libs}/vendor/psr/clock/CHANGELOG.md (100%) rename {plugins => libs}/vendor/psr/clock/LICENSE (100%) rename {plugins => libs}/vendor/psr/clock/README.md (100%) rename {plugins => libs}/vendor/psr/clock/composer.json (100%) rename {plugins => libs}/vendor/psr/clock/src/ClockInterface.php (100%) rename {plugins => libs}/vendor/psr/container/.gitignore (100%) rename {plugins => libs}/vendor/psr/container/LICENSE (100%) rename {plugins => libs}/vendor/psr/container/README.md (100%) rename {plugins => libs}/vendor/psr/container/composer.json (100%) rename {plugins => libs}/vendor/psr/container/src/ContainerExceptionInterface.php (100%) rename {plugins => libs}/vendor/psr/container/src/ContainerInterface.php (100%) rename {plugins => libs}/vendor/psr/container/src/NotFoundExceptionInterface.php (100%) rename {plugins => libs}/vendor/psr/http-factory/LICENSE (100%) rename {plugins => libs}/vendor/psr/http-factory/README.md (100%) rename {plugins => libs}/vendor/psr/http-factory/composer.json (100%) rename {plugins => libs}/vendor/psr/http-factory/src/RequestFactoryInterface.php (100%) rename {plugins => libs}/vendor/psr/http-factory/src/ResponseFactoryInterface.php (100%) rename {plugins => libs}/vendor/psr/http-factory/src/ServerRequestFactoryInterface.php (100%) rename {plugins => libs}/vendor/psr/http-factory/src/StreamFactoryInterface.php (100%) rename {plugins => libs}/vendor/psr/http-factory/src/UploadedFileFactoryInterface.php (100%) rename {plugins => libs}/vendor/psr/http-factory/src/UriFactoryInterface.php (100%) rename {plugins => libs}/vendor/psr/http-message/CHANGELOG.md (100%) rename {plugins => libs}/vendor/psr/http-message/LICENSE (100%) rename {plugins => libs}/vendor/psr/http-message/README.md (100%) rename {plugins => libs}/vendor/psr/http-message/composer.json (100%) rename {plugins => libs}/vendor/psr/http-message/docs/PSR7-Interfaces.md (100%) rename {plugins => libs}/vendor/psr/http-message/docs/PSR7-Usage.md (100%) rename {plugins => libs}/vendor/psr/http-message/src/MessageInterface.php (100%) rename {plugins => libs}/vendor/psr/http-message/src/RequestInterface.php (100%) rename {plugins => libs}/vendor/psr/http-message/src/ResponseInterface.php (100%) rename {plugins => libs}/vendor/psr/http-message/src/ServerRequestInterface.php (100%) rename {plugins => libs}/vendor/psr/http-message/src/StreamInterface.php (100%) rename {plugins => libs}/vendor/psr/http-message/src/UploadedFileInterface.php (100%) rename {plugins => libs}/vendor/psr/http-message/src/UriInterface.php (100%) rename {plugins => libs}/vendor/psr/log/LICENSE (100%) rename {plugins => libs}/vendor/psr/log/README.md (100%) rename {plugins => libs}/vendor/psr/log/composer.json (100%) rename {plugins => libs}/vendor/psr/log/src/AbstractLogger.php (100%) rename {plugins => libs}/vendor/psr/log/src/InvalidArgumentException.php (100%) rename {plugins => libs}/vendor/psr/log/src/LogLevel.php (100%) rename {plugins => libs}/vendor/psr/log/src/LoggerAwareInterface.php (100%) rename {plugins => libs}/vendor/psr/log/src/LoggerAwareTrait.php (100%) rename {plugins => libs}/vendor/psr/log/src/LoggerInterface.php (100%) rename {plugins => libs}/vendor/psr/log/src/LoggerTrait.php (100%) rename {plugins => libs}/vendor/psr/log/src/NullLogger.php (100%) rename {plugins => libs}/vendor/psr/simple-cache/.editorconfig (100%) rename {plugins => libs}/vendor/psr/simple-cache/LICENSE.md (100%) rename {plugins => libs}/vendor/psr/simple-cache/README.md (100%) rename {plugins => libs}/vendor/psr/simple-cache/composer.json (100%) rename {plugins => libs}/vendor/psr/simple-cache/src/CacheException.php (100%) rename {plugins => libs}/vendor/psr/simple-cache/src/CacheInterface.php (100%) rename {plugins => libs}/vendor/psr/simple-cache/src/InvalidArgumentException.php (100%) rename {plugins => libs}/vendor/ralouphie/getallheaders/LICENSE (100%) rename {plugins => libs}/vendor/ralouphie/getallheaders/README.md (100%) rename {plugins => libs}/vendor/ralouphie/getallheaders/composer.json (100%) rename {plugins => libs}/vendor/ralouphie/getallheaders/src/getallheaders.php (100%) rename {plugins => libs}/vendor/symfony/clock/CHANGELOG.md (100%) rename {plugins => libs}/vendor/symfony/clock/Clock.php (100%) rename {plugins => libs}/vendor/symfony/clock/ClockAwareTrait.php (100%) rename {plugins => libs}/vendor/symfony/clock/ClockInterface.php (100%) rename {plugins => libs}/vendor/symfony/clock/DatePoint.php (100%) rename {plugins => libs}/vendor/symfony/clock/LICENSE (100%) rename {plugins => libs}/vendor/symfony/clock/MockClock.php (100%) rename {plugins => libs}/vendor/symfony/clock/MonotonicClock.php (100%) rename {plugins => libs}/vendor/symfony/clock/NativeClock.php (100%) rename {plugins => libs}/vendor/symfony/clock/README.md (100%) rename {plugins => libs}/vendor/symfony/clock/Resources/now.php (100%) rename {plugins => libs}/vendor/symfony/clock/Test/ClockSensitiveTrait.php (100%) rename {plugins => libs}/vendor/symfony/clock/composer.json (100%) rename {plugins => libs}/vendor/symfony/deprecation-contracts/CHANGELOG.md (100%) rename {plugins => libs}/vendor/symfony/deprecation-contracts/LICENSE (100%) rename {plugins => libs}/vendor/symfony/deprecation-contracts/README.md (100%) rename {plugins => libs}/vendor/symfony/deprecation-contracts/composer.json (100%) rename {plugins => libs}/vendor/symfony/deprecation-contracts/function.php (100%) rename {plugins => libs}/vendor/symfony/mime/Address.php (100%) rename {plugins => libs}/vendor/symfony/mime/BodyRendererInterface.php (100%) rename {plugins => libs}/vendor/symfony/mime/CHANGELOG.md (100%) rename {plugins => libs}/vendor/symfony/mime/CharacterStream.php (100%) rename {plugins => libs}/vendor/symfony/mime/Crypto/DkimOptions.php (100%) rename {plugins => libs}/vendor/symfony/mime/Crypto/DkimSigner.php (100%) rename {plugins => libs}/vendor/symfony/mime/Crypto/SMime.php (100%) rename {plugins => libs}/vendor/symfony/mime/Crypto/SMimeEncrypter.php (100%) rename {plugins => libs}/vendor/symfony/mime/Crypto/SMimeSigner.php (100%) rename {plugins => libs}/vendor/symfony/mime/DependencyInjection/AddMimeTypeGuesserPass.php (100%) rename {plugins => libs}/vendor/symfony/mime/DraftEmail.php (100%) rename {plugins => libs}/vendor/symfony/mime/Email.php (100%) rename {plugins => libs}/vendor/symfony/mime/Encoder/AddressEncoderInterface.php (100%) rename {plugins => libs}/vendor/symfony/mime/Encoder/Base64ContentEncoder.php (100%) rename {plugins => libs}/vendor/symfony/mime/Encoder/Base64Encoder.php (100%) rename {plugins => libs}/vendor/symfony/mime/Encoder/Base64MimeHeaderEncoder.php (100%) rename {plugins => libs}/vendor/symfony/mime/Encoder/ContentEncoderInterface.php (100%) rename {plugins => libs}/vendor/symfony/mime/Encoder/EightBitContentEncoder.php (100%) rename {plugins => libs}/vendor/symfony/mime/Encoder/EncoderInterface.php (100%) rename {plugins => libs}/vendor/symfony/mime/Encoder/IdnAddressEncoder.php (100%) rename {plugins => libs}/vendor/symfony/mime/Encoder/MimeHeaderEncoderInterface.php (100%) rename {plugins => libs}/vendor/symfony/mime/Encoder/QpContentEncoder.php (100%) rename {plugins => libs}/vendor/symfony/mime/Encoder/QpEncoder.php (100%) rename {plugins => libs}/vendor/symfony/mime/Encoder/QpMimeHeaderEncoder.php (100%) rename {plugins => libs}/vendor/symfony/mime/Encoder/Rfc2231Encoder.php (100%) rename {plugins => libs}/vendor/symfony/mime/Exception/AddressEncoderException.php (100%) rename {plugins => libs}/vendor/symfony/mime/Exception/ExceptionInterface.php (100%) rename {plugins => libs}/vendor/symfony/mime/Exception/InvalidArgumentException.php (100%) rename {plugins => libs}/vendor/symfony/mime/Exception/LogicException.php (100%) rename {plugins => libs}/vendor/symfony/mime/Exception/RfcComplianceException.php (100%) rename {plugins => libs}/vendor/symfony/mime/Exception/RuntimeException.php (100%) rename {plugins => libs}/vendor/symfony/mime/FileBinaryMimeTypeGuesser.php (100%) rename {plugins => libs}/vendor/symfony/mime/FileinfoMimeTypeGuesser.php (100%) rename {plugins => libs}/vendor/symfony/mime/Header/AbstractHeader.php (100%) rename {plugins => libs}/vendor/symfony/mime/Header/DateHeader.php (100%) rename {plugins => libs}/vendor/symfony/mime/Header/HeaderInterface.php (100%) rename {plugins => libs}/vendor/symfony/mime/Header/Headers.php (100%) rename {plugins => libs}/vendor/symfony/mime/Header/IdentificationHeader.php (100%) rename {plugins => libs}/vendor/symfony/mime/Header/MailboxHeader.php (100%) rename {plugins => libs}/vendor/symfony/mime/Header/MailboxListHeader.php (100%) rename {plugins => libs}/vendor/symfony/mime/Header/ParameterizedHeader.php (100%) rename {plugins => libs}/vendor/symfony/mime/Header/PathHeader.php (100%) rename {plugins => libs}/vendor/symfony/mime/Header/UnstructuredHeader.php (100%) rename {plugins => libs}/vendor/symfony/mime/HtmlToTextConverter/DefaultHtmlToTextConverter.php (100%) rename {plugins => libs}/vendor/symfony/mime/HtmlToTextConverter/HtmlToTextConverterInterface.php (100%) rename {plugins => libs}/vendor/symfony/mime/HtmlToTextConverter/LeagueHtmlToMarkdownConverter.php (100%) rename {plugins => libs}/vendor/symfony/mime/LICENSE (100%) rename {plugins => libs}/vendor/symfony/mime/Message.php (100%) rename {plugins => libs}/vendor/symfony/mime/MessageConverter.php (100%) rename {plugins => libs}/vendor/symfony/mime/MimeTypeGuesserInterface.php (100%) rename {plugins => libs}/vendor/symfony/mime/MimeTypes.php (100%) rename {plugins => libs}/vendor/symfony/mime/MimeTypesInterface.php (100%) rename {plugins => libs}/vendor/symfony/mime/Part/AbstractMultipartPart.php (100%) rename {plugins => libs}/vendor/symfony/mime/Part/AbstractPart.php (100%) rename {plugins => libs}/vendor/symfony/mime/Part/DataPart.php (100%) rename {plugins => libs}/vendor/symfony/mime/Part/File.php (100%) rename {plugins => libs}/vendor/symfony/mime/Part/MessagePart.php (100%) rename {plugins => libs}/vendor/symfony/mime/Part/Multipart/AlternativePart.php (100%) rename {plugins => libs}/vendor/symfony/mime/Part/Multipart/DigestPart.php (100%) rename {plugins => libs}/vendor/symfony/mime/Part/Multipart/FormDataPart.php (100%) rename {plugins => libs}/vendor/symfony/mime/Part/Multipart/MixedPart.php (100%) rename {plugins => libs}/vendor/symfony/mime/Part/Multipart/RelatedPart.php (100%) rename {plugins => libs}/vendor/symfony/mime/Part/SMimePart.php (100%) rename {plugins => libs}/vendor/symfony/mime/Part/TextPart.php (100%) rename {plugins => libs}/vendor/symfony/mime/README.md (100%) rename {plugins => libs}/vendor/symfony/mime/RawMessage.php (100%) rename {plugins => libs}/vendor/symfony/mime/Test/Constraint/EmailAddressContains.php (100%) rename {plugins => libs}/vendor/symfony/mime/Test/Constraint/EmailAttachmentCount.php (100%) rename {plugins => libs}/vendor/symfony/mime/Test/Constraint/EmailHasHeader.php (100%) rename {plugins => libs}/vendor/symfony/mime/Test/Constraint/EmailHeaderSame.php (100%) rename {plugins => libs}/vendor/symfony/mime/Test/Constraint/EmailHtmlBodyContains.php (100%) rename {plugins => libs}/vendor/symfony/mime/Test/Constraint/EmailSubjectContains.php (100%) rename {plugins => libs}/vendor/symfony/mime/Test/Constraint/EmailTextBodyContains.php (100%) rename {plugins => libs}/vendor/symfony/mime/composer.json (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Iconv.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/LICENSE (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/README.md (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.big5.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.cp037.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.cp1006.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.cp1026.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.cp424.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.cp437.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.cp500.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.cp737.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.cp775.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.cp850.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.cp852.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.cp855.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.cp856.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.cp857.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.cp860.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.cp861.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.cp862.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.cp863.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.cp864.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.cp865.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.cp866.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.cp869.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.cp874.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.cp875.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.cp932.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.cp936.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.cp949.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.cp950.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-1.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-10.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-11.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-13.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-14.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-15.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-16.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-2.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-3.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-4.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-5.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-6.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-7.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-8.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-9.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.koi8-r.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.koi8-u.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.us-ascii.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1250.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1251.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1252.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1253.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1254.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1255.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1256.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1257.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1258.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/Resources/charset/translit.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/bootstrap.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/bootstrap80.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-iconv/composer.json (100%) rename {plugins => libs}/vendor/symfony/polyfill-intl-idn/Idn.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-intl-idn/Info.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-intl-idn/LICENSE (100%) rename {plugins => libs}/vendor/symfony/polyfill-intl-idn/README.md (100%) rename {plugins => libs}/vendor/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-intl-idn/Resources/unidata/Regex.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-intl-idn/Resources/unidata/deviation.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_mapped.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_valid.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-intl-idn/Resources/unidata/ignored.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-intl-idn/Resources/unidata/mapped.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-intl-idn/Resources/unidata/virama.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-intl-idn/bootstrap.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-intl-idn/bootstrap80.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-intl-idn/composer.json (100%) rename {plugins => libs}/vendor/symfony/polyfill-intl-normalizer/LICENSE (100%) rename {plugins => libs}/vendor/symfony/polyfill-intl-normalizer/Normalizer.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-intl-normalizer/README.md (100%) rename {plugins => libs}/vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalComposition.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/rawCanonicalDecomposition.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/rawCompatibilityDecomposition.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-intl-normalizer/bootstrap.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-intl-normalizer/bootstrap80.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-intl-normalizer/composer.json (100%) rename {plugins => libs}/vendor/symfony/polyfill-mbstring/LICENSE (100%) rename {plugins => libs}/vendor/symfony/polyfill-mbstring/Mbstring.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-mbstring/README.md (100%) rename {plugins => libs}/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-mbstring/bootstrap.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-mbstring/bootstrap72.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-mbstring/bootstrap80.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-mbstring/composer.json (100%) rename {plugins => libs}/vendor/symfony/polyfill-php80/LICENSE (100%) rename {plugins => libs}/vendor/symfony/polyfill-php80/Php80.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php80/PhpToken.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php80/README.md (100%) rename {plugins => libs}/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php80/bootstrap.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php80/composer.json (100%) rename {plugins => libs}/vendor/symfony/polyfill-php83/LICENSE (100%) rename {plugins => libs}/vendor/symfony/polyfill-php83/Php83.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php83/README.md (100%) rename {plugins => libs}/vendor/symfony/polyfill-php83/Resources/stubs/DateError.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php83/Resources/stubs/DateException.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php83/Resources/stubs/DateInvalidOperationException.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php83/Resources/stubs/DateInvalidTimeZoneException.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedIntervalStringException.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedPeriodStringException.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedStringException.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php83/Resources/stubs/DateObjectError.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php83/Resources/stubs/DateRangeError.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php83/Resources/stubs/Override.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php83/Resources/stubs/SQLite3Exception.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php83/bootstrap.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php83/bootstrap72.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php83/bootstrap81.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php83/composer.json (100%) rename {plugins => libs}/vendor/symfony/polyfill-php84/LICENSE (100%) rename {plugins => libs}/vendor/symfony/polyfill-php84/Php84.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php84/README.md (100%) rename {plugins => libs}/vendor/symfony/polyfill-php84/Resources/Deprecated.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php84/Resources/RoundingMode.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php84/Resources/stubs/Deprecated.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Dblib.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Firebird.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Mysql.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Odbc.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Pgsql.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Sqlite.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php84/Resources/stubs/ReflectionConstant.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php84/Resources/stubs/RoundingMode.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php84/bootstrap.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php84/bootstrap72.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php84/bootstrap82.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php84/composer.json (100%) rename {plugins => libs}/vendor/symfony/polyfill-php85/LICENSE (100%) rename {plugins => libs}/vendor/symfony/polyfill-php85/Php85.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php85/README.md (100%) rename {plugins => libs}/vendor/symfony/polyfill-php85/Resources/stubs/DelayedTargetValidation.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php85/Resources/stubs/Filter/FilterException.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php85/Resources/stubs/Filter/FilterFailedException.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php85/Resources/stubs/NoDiscard.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php85/bootstrap.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php85/bootstrap80.php (100%) rename {plugins => libs}/vendor/symfony/polyfill-php85/composer.json (100%) rename {plugins => libs}/vendor/symfony/translation-contracts/CHANGELOG.md (100%) rename {plugins => libs}/vendor/symfony/translation-contracts/LICENSE (100%) rename {plugins => libs}/vendor/symfony/translation-contracts/LocaleAwareInterface.php (100%) rename {plugins => libs}/vendor/symfony/translation-contracts/README.md (100%) rename {plugins => libs}/vendor/symfony/translation-contracts/Test/TranslatorTest.php (100%) rename {plugins => libs}/vendor/symfony/translation-contracts/TranslatableInterface.php (100%) rename {plugins => libs}/vendor/symfony/translation-contracts/TranslatorInterface.php (100%) rename {plugins => libs}/vendor/symfony/translation-contracts/TranslatorTrait.php (100%) rename {plugins => libs}/vendor/symfony/translation-contracts/composer.json (100%) rename {plugins => libs}/vendor/symfony/translation/CHANGELOG.md (100%) rename {plugins => libs}/vendor/symfony/translation/Catalogue/AbstractOperation.php (100%) rename {plugins => libs}/vendor/symfony/translation/Catalogue/MergeOperation.php (100%) rename {plugins => libs}/vendor/symfony/translation/Catalogue/OperationInterface.php (100%) rename {plugins => libs}/vendor/symfony/translation/Catalogue/TargetOperation.php (100%) rename {plugins => libs}/vendor/symfony/translation/CatalogueMetadataAwareInterface.php (100%) rename {plugins => libs}/vendor/symfony/translation/Command/TranslationLintCommand.php (100%) rename {plugins => libs}/vendor/symfony/translation/Command/TranslationPullCommand.php (100%) rename {plugins => libs}/vendor/symfony/translation/Command/TranslationPushCommand.php (100%) rename {plugins => libs}/vendor/symfony/translation/Command/TranslationTrait.php (100%) rename {plugins => libs}/vendor/symfony/translation/Command/XliffLintCommand.php (100%) rename {plugins => libs}/vendor/symfony/translation/DataCollector/TranslationDataCollector.php (100%) rename {plugins => libs}/vendor/symfony/translation/DataCollectorTranslator.php (100%) rename {plugins => libs}/vendor/symfony/translation/DependencyInjection/DataCollectorTranslatorPass.php (100%) rename {plugins => libs}/vendor/symfony/translation/DependencyInjection/LoggingTranslatorPass.php (100%) rename {plugins => libs}/vendor/symfony/translation/DependencyInjection/TranslationDumperPass.php (100%) rename {plugins => libs}/vendor/symfony/translation/DependencyInjection/TranslationExtractorPass.php (100%) rename {plugins => libs}/vendor/symfony/translation/DependencyInjection/TranslatorPass.php (100%) rename {plugins => libs}/vendor/symfony/translation/DependencyInjection/TranslatorPathsPass.php (100%) rename {plugins => libs}/vendor/symfony/translation/Dumper/CsvFileDumper.php (100%) rename {plugins => libs}/vendor/symfony/translation/Dumper/DumperInterface.php (100%) rename {plugins => libs}/vendor/symfony/translation/Dumper/FileDumper.php (100%) rename {plugins => libs}/vendor/symfony/translation/Dumper/IcuResFileDumper.php (100%) rename {plugins => libs}/vendor/symfony/translation/Dumper/IniFileDumper.php (100%) rename {plugins => libs}/vendor/symfony/translation/Dumper/JsonFileDumper.php (100%) rename {plugins => libs}/vendor/symfony/translation/Dumper/MoFileDumper.php (100%) rename {plugins => libs}/vendor/symfony/translation/Dumper/PhpFileDumper.php (100%) rename {plugins => libs}/vendor/symfony/translation/Dumper/PoFileDumper.php (100%) rename {plugins => libs}/vendor/symfony/translation/Dumper/QtFileDumper.php (100%) rename {plugins => libs}/vendor/symfony/translation/Dumper/XliffFileDumper.php (100%) rename {plugins => libs}/vendor/symfony/translation/Dumper/YamlFileDumper.php (100%) rename {plugins => libs}/vendor/symfony/translation/Exception/ExceptionInterface.php (100%) rename {plugins => libs}/vendor/symfony/translation/Exception/IncompleteDsnException.php (100%) rename {plugins => libs}/vendor/symfony/translation/Exception/InvalidArgumentException.php (100%) rename {plugins => libs}/vendor/symfony/translation/Exception/InvalidResourceException.php (100%) rename {plugins => libs}/vendor/symfony/translation/Exception/LogicException.php (100%) rename {plugins => libs}/vendor/symfony/translation/Exception/MissingRequiredOptionException.php (100%) rename {plugins => libs}/vendor/symfony/translation/Exception/NotFoundResourceException.php (100%) rename {plugins => libs}/vendor/symfony/translation/Exception/ProviderException.php (100%) rename {plugins => libs}/vendor/symfony/translation/Exception/ProviderExceptionInterface.php (100%) rename {plugins => libs}/vendor/symfony/translation/Exception/RuntimeException.php (100%) rename {plugins => libs}/vendor/symfony/translation/Exception/UnsupportedSchemeException.php (100%) rename {plugins => libs}/vendor/symfony/translation/Extractor/AbstractFileExtractor.php (100%) rename {plugins => libs}/vendor/symfony/translation/Extractor/ChainExtractor.php (100%) rename {plugins => libs}/vendor/symfony/translation/Extractor/ExtractorInterface.php (100%) rename {plugins => libs}/vendor/symfony/translation/Extractor/PhpAstExtractor.php (100%) rename {plugins => libs}/vendor/symfony/translation/Extractor/Visitor/AbstractVisitor.php (100%) rename {plugins => libs}/vendor/symfony/translation/Extractor/Visitor/ConstraintVisitor.php (100%) rename {plugins => libs}/vendor/symfony/translation/Extractor/Visitor/TransMethodVisitor.php (100%) rename {plugins => libs}/vendor/symfony/translation/Extractor/Visitor/TranslatableMessageVisitor.php (100%) rename {plugins => libs}/vendor/symfony/translation/Formatter/IntlFormatter.php (100%) rename {plugins => libs}/vendor/symfony/translation/Formatter/IntlFormatterInterface.php (100%) rename {plugins => libs}/vendor/symfony/translation/Formatter/MessageFormatter.php (100%) rename {plugins => libs}/vendor/symfony/translation/Formatter/MessageFormatterInterface.php (100%) rename {plugins => libs}/vendor/symfony/translation/IdentityTranslator.php (100%) rename {plugins => libs}/vendor/symfony/translation/LICENSE (100%) rename {plugins => libs}/vendor/symfony/translation/Loader/ArrayLoader.php (100%) rename {plugins => libs}/vendor/symfony/translation/Loader/CsvFileLoader.php (100%) rename {plugins => libs}/vendor/symfony/translation/Loader/FileLoader.php (100%) rename {plugins => libs}/vendor/symfony/translation/Loader/IcuDatFileLoader.php (100%) rename {plugins => libs}/vendor/symfony/translation/Loader/IcuResFileLoader.php (100%) rename {plugins => libs}/vendor/symfony/translation/Loader/IniFileLoader.php (100%) rename {plugins => libs}/vendor/symfony/translation/Loader/JsonFileLoader.php (100%) rename {plugins => libs}/vendor/symfony/translation/Loader/LoaderInterface.php (100%) rename {plugins => libs}/vendor/symfony/translation/Loader/MoFileLoader.php (100%) rename {plugins => libs}/vendor/symfony/translation/Loader/PhpFileLoader.php (100%) rename {plugins => libs}/vendor/symfony/translation/Loader/PoFileLoader.php (100%) rename {plugins => libs}/vendor/symfony/translation/Loader/QtFileLoader.php (100%) rename {plugins => libs}/vendor/symfony/translation/Loader/XliffFileLoader.php (100%) rename {plugins => libs}/vendor/symfony/translation/Loader/YamlFileLoader.php (100%) rename {plugins => libs}/vendor/symfony/translation/LocaleSwitcher.php (100%) rename {plugins => libs}/vendor/symfony/translation/LoggingTranslator.php (100%) rename {plugins => libs}/vendor/symfony/translation/MessageCatalogue.php (100%) rename {plugins => libs}/vendor/symfony/translation/MessageCatalogueInterface.php (100%) rename {plugins => libs}/vendor/symfony/translation/MetadataAwareInterface.php (100%) rename {plugins => libs}/vendor/symfony/translation/Provider/AbstractProviderFactory.php (100%) rename {plugins => libs}/vendor/symfony/translation/Provider/Dsn.php (100%) rename {plugins => libs}/vendor/symfony/translation/Provider/FilteringProvider.php (100%) rename {plugins => libs}/vendor/symfony/translation/Provider/NullProvider.php (100%) rename {plugins => libs}/vendor/symfony/translation/Provider/NullProviderFactory.php (100%) rename {plugins => libs}/vendor/symfony/translation/Provider/ProviderFactoryInterface.php (100%) rename {plugins => libs}/vendor/symfony/translation/Provider/ProviderInterface.php (100%) rename {plugins => libs}/vendor/symfony/translation/Provider/TranslationProviderCollection.php (100%) rename {plugins => libs}/vendor/symfony/translation/Provider/TranslationProviderCollectionFactory.php (100%) rename {plugins => libs}/vendor/symfony/translation/PseudoLocalizationTranslator.php (100%) rename {plugins => libs}/vendor/symfony/translation/README.md (100%) rename {plugins => libs}/vendor/symfony/translation/Reader/TranslationReader.php (100%) rename {plugins => libs}/vendor/symfony/translation/Reader/TranslationReaderInterface.php (100%) rename {plugins => libs}/vendor/symfony/translation/Resources/bin/translation-status.php (100%) rename {plugins => libs}/vendor/symfony/translation/Resources/data/parents.json (100%) rename {plugins => libs}/vendor/symfony/translation/Resources/functions.php (100%) rename {plugins => libs}/vendor/symfony/translation/Resources/schemas/xliff-core-1.2-transitional.xsd (100%) rename {plugins => libs}/vendor/symfony/translation/Resources/schemas/xliff-core-2.0.xsd (100%) rename {plugins => libs}/vendor/symfony/translation/Resources/schemas/xml.xsd (100%) rename {plugins => libs}/vendor/symfony/translation/StaticMessage.php (100%) rename {plugins => libs}/vendor/symfony/translation/Test/AbstractProviderFactoryTestCase.php (100%) rename {plugins => libs}/vendor/symfony/translation/Test/IncompleteDsnTestTrait.php (100%) rename {plugins => libs}/vendor/symfony/translation/Test/ProviderFactoryTestCase.php (100%) rename {plugins => libs}/vendor/symfony/translation/Test/ProviderTestCase.php (100%) rename {plugins => libs}/vendor/symfony/translation/TranslatableMessage.php (100%) rename {plugins => libs}/vendor/symfony/translation/Translator.php (100%) rename {plugins => libs}/vendor/symfony/translation/TranslatorBag.php (100%) rename {plugins => libs}/vendor/symfony/translation/TranslatorBagInterface.php (100%) rename {plugins => libs}/vendor/symfony/translation/Util/ArrayConverter.php (100%) rename {plugins => libs}/vendor/symfony/translation/Util/XliffUtils.php (100%) rename {plugins => libs}/vendor/symfony/translation/Writer/TranslationWriter.php (100%) rename {plugins => libs}/vendor/symfony/translation/Writer/TranslationWriterInterface.php (100%) rename {plugins => libs}/vendor/symfony/translation/composer.json (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/.github/FUNDING.yml (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/.github/workflows/tests.yml (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/.php-cs-fixer.dist.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/LICENSE (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/PHPStanConstants.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/README.md (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/composer.json (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/phpstan.neon (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Error.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/ErrorBag.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/AbstractHeader.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/AddressHeader.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AbstractConsumerService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AbstractGenericConsumerService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AddressBaseConsumerService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AddressConsumerService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AddressEmailConsumerService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AddressGroupConsumerService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Consumer/CommentConsumerService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Consumer/DateConsumerService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Consumer/GenericConsumerMimeLiteralPartService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Consumer/GenericConsumerService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Consumer/IConsumerService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Consumer/IdBaseConsumerService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Consumer/IdConsumerService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Consumer/ParameterConsumerService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Consumer/ParameterNameValueConsumerService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Consumer/ParameterValueConsumerService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Consumer/QuotedStringConsumerService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Consumer/QuotedStringMimeLiteralPartConsumerService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Consumer/QuotedStringMimeLiteralPartTokenSplitPatternTrait.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Consumer/Received/DomainConsumerService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Consumer/Received/GenericReceivedConsumerService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Consumer/Received/ReceivedDateConsumerService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Consumer/ReceivedConsumerService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Consumer/SubjectConsumerService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/DateHeader.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/GenericHeader.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/HeaderConsts.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/HeaderFactory.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/IHeader.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/IHeaderPart.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/IdHeader.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/MimeEncodedHeader.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/ParameterHeader.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Part/AddressGroupPart.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Part/AddressPart.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Part/CommentPart.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Part/ContainerPart.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Part/DatePart.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Part/HeaderPart.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Part/HeaderPartFactory.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Part/MimeToken.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Part/MimeTokenPartFactory.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Part/NameValuePart.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Part/ParameterPart.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Part/QuotedLiteralPart.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Part/ReceivedDomainPart.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Part/ReceivedPart.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Part/SplitParameterPart.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Part/SubjectToken.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/Part/Token.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/ReceivedHeader.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Header/SubjectHeader.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/IErrorBag.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/IMessage.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/MailMimeParser.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Message.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Message/Factory/IMessagePartFactory.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Message/Factory/IMimePartFactory.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Message/Factory/IUUEncodedPartFactory.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Message/Factory/PartChildrenContainerFactory.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Message/Factory/PartHeaderContainerFactory.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Message/Factory/PartStreamContainerFactory.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Message/Helper/AbstractHelper.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Message/Helper/GenericHelper.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Message/Helper/MultipartHelper.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Message/Helper/PrivacyHelper.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Message/IMessagePart.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Message/IMimePart.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Message/IMultiPart.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Message/IUUEncodedPart.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Message/MessagePart.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Message/MimePart.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Message/MultiPart.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Message/NonMimePart.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Message/PartChildrenContainer.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Message/PartFilter.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Message/PartHeaderContainer.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Message/PartStreamContainer.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Message/UUEncodedPart.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Parser/AbstractParserService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Parser/CompatibleParserNotFoundException.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Parser/HeaderParserService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Parser/IParserService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Parser/MessageParserService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Parser/MimeParserService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Parser/NonMimeParserService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Parser/ParserManagerService.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Parser/Part/ParserPartChildrenContainer.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Parser/Part/ParserPartChildrenContainerFactory.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Parser/Part/ParserPartStreamContainer.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Parser/Part/ParserPartStreamContainerFactory.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Parser/Part/UUEncodedPartHeaderContainer.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Parser/Part/UUEncodedPartHeaderContainerFactory.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Parser/PartBuilder.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Parser/PartBuilderFactory.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMessageProxy.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMessageProxyFactory.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMimePartProxy.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMimePartProxyFactory.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserNonMimeMessageProxy.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserNonMimeMessageProxyFactory.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserPartProxy.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserPartProxyFactory.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserUUEncodedPartProxy.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserUUEncodedPartProxyFactory.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Stream/HeaderStream.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Stream/MessagePartStream.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Stream/MessagePartStreamDecorator.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Stream/MessagePartStreamReadException.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/Stream/StreamFactory.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/src/di_config.php (100%) rename {plugins => libs}/vendor/zbateson/mail-mime-parser/version.txt (100%) rename {plugins => libs}/vendor/zbateson/mb-wrapper/LICENSE (100%) rename {plugins => libs}/vendor/zbateson/mb-wrapper/README.md (100%) rename {plugins => libs}/vendor/zbateson/mb-wrapper/composer.json (100%) rename {plugins => libs}/vendor/zbateson/mb-wrapper/src/MbWrapper.php (100%) rename {plugins => libs}/vendor/zbateson/mb-wrapper/src/UnsupportedCharsetException.php (100%) rename {plugins => libs}/vendor/zbateson/stream-decorators/.github/FUNDING.yml (100%) rename {plugins => libs}/vendor/zbateson/stream-decorators/.github/workflows/tests.yml (100%) rename {plugins => libs}/vendor/zbateson/stream-decorators/.php-cs-fixer.dist.php (100%) rename {plugins => libs}/vendor/zbateson/stream-decorators/LICENSE (100%) rename {plugins => libs}/vendor/zbateson/stream-decorators/PhpCsFixer.php (100%) rename {plugins => libs}/vendor/zbateson/stream-decorators/README.md (100%) rename {plugins => libs}/vendor/zbateson/stream-decorators/composer.json (100%) rename {plugins => libs}/vendor/zbateson/stream-decorators/phpstan.neon (100%) rename {plugins => libs}/vendor/zbateson/stream-decorators/src/Base64Stream.php (100%) rename {plugins => libs}/vendor/zbateson/stream-decorators/src/CharsetStream.php (100%) rename {plugins => libs}/vendor/zbateson/stream-decorators/src/ChunkSplitStream.php (100%) rename {plugins => libs}/vendor/zbateson/stream-decorators/src/DecoratedCachingStream.php (100%) rename {plugins => libs}/vendor/zbateson/stream-decorators/src/NonClosingStream.php (100%) rename {plugins => libs}/vendor/zbateson/stream-decorators/src/PregReplaceFilterStream.php (100%) rename {plugins => libs}/vendor/zbateson/stream-decorators/src/QuotedPrintableStream.php (100%) rename {plugins => libs}/vendor/zbateson/stream-decorators/src/SeekingLimitStream.php (100%) rename {plugins => libs}/vendor/zbateson/stream-decorators/src/TellZeroStream.php (100%) rename {plugins => libs}/vendor/zbateson/stream-decorators/src/UUStream.php (100%) rename {plugins => libs}/zapcal/README.md (100%) rename {plugins => libs}/zapcal/includes/date.php (100%) rename {plugins => libs}/zapcal/includes/framework.php (100%) rename {plugins => libs}/zapcal/includes/ical.php (100%) rename {plugins => libs}/zapcal/includes/index.html (100%) rename {plugins => libs}/zapcal/includes/recurringdate.php (100%) rename {plugins => libs}/zapcal/includes/timezone.php (100%) rename {plugins => libs}/zapcal/zapcallib.php (100%) diff --git a/admin/document_template_details.php b/admin/document_template_details.php index 375837cb0..fa6c3f511 100644 --- a/admin/document_template_details.php +++ b/admin/document_template_details.php @@ -4,7 +4,7 @@ require_once "includes/inc_all_admin.php"; //Initialize the HTML Purifier to prevent XSS -require "../plugins/htmlpurifier/HTMLPurifier.standalone.php"; +require "../libs/htmlpurifier/HTMLPurifier.standalone.php"; $purifier_config = HTMLPurifier_Config::createDefault(); $purifier_config->set('Cache.DefinitionImpl', null); // Disable cache by setting a non-existent directory or an invalid one diff --git a/admin/modals/mail_queue/mail_queue_message_view.php b/admin/modals/mail_queue/mail_queue_message_view.php index 5a5ce9a09..5f44becec 100644 --- a/admin/modals/mail_queue/mail_queue_message_view.php +++ b/admin/modals/mail_queue/mail_queue_message_view.php @@ -9,7 +9,7 @@ if (!isset($session_is_admin) || !$session_is_admin) { $email_id = intval($_GET['id']); //Initialize the HTML Purifier to prevent XSS -require "../../../plugins/htmlpurifier/HTMLPurifier.standalone.php"; +require "../../../libs/htmlpurifier/HTMLPurifier.standalone.php"; $purifier_config = HTMLPurifier_Config::createDefault(); $purifier_config->set('Cache.DefinitionImpl', null); // Disable cache by setting a non-existent directory or an invalid one diff --git a/admin/post/saved_payment_method.php b/admin/post/saved_payment_method.php index 7f2b78964..07c51e961 100644 --- a/admin/post/saved_payment_method.php +++ b/admin/post/saved_payment_method.php @@ -42,7 +42,7 @@ if (isset($_GET['delete_saved_payment'])) { try { // Initialize stripe - require_once '../plugins/stripe-php/init.php'; + require_once '../libs/stripe-php/init.php'; $stripe = new \Stripe\StripeClient($private_key); // Detach PM diff --git a/admin/post/settings_online_payment_clients.php b/admin/post/settings_online_payment_clients.php index 4350b07a8..473c3a134 100644 --- a/admin/post/settings_online_payment_clients.php +++ b/admin/post/settings_online_payment_clients.php @@ -16,7 +16,7 @@ if (isset($_GET['stripe_remove_pm'])) { try { // Initialize stripe - require_once '../plugins/stripe-php/init.php'; + require_once '../libs/stripe-php/init.php'; $stripe = new \Stripe\StripeClient($config_stripe_secret); // Detach PM diff --git a/admin/project_template_details.php b/admin/project_template_details.php index 7e9b1e750..381d24105 100644 --- a/admin/project_template_details.php +++ b/admin/project_template_details.php @@ -212,7 +212,7 @@ if (isset($_GET['project_template_id'])) {
- + - + - + + + + + + + - + + + + + - - + + SetCreator(PDF_CREATOR); diff --git a/agent/post/document.php b/agent/post/document.php index 1055fa0d4..b0703075a 100644 --- a/agent/post/document.php +++ b/agent/post/document.php @@ -703,7 +703,7 @@ if (isset($_GET['export_document'])) { enforceClientAccess(); // Include the TCPDF class - require_once('../plugins/TCPDF/tcpdf.php'); + require_once('../libs/TCPDF/tcpdf.php'); $pdf = new TCPDF(); diff --git a/agent/post/invoice.php b/agent/post/invoice.php index 083534104..946708d56 100644 --- a/agent/post/invoice.php +++ b/agent/post/invoice.php @@ -857,7 +857,7 @@ if (isset($_GET['export_invoice_pdf'])) { //Set Badge color based off of invoice status $invoice_badge_color = getInvoiceBadgeColor($invoice_status); - require_once("../plugins/TCPDF/tcpdf.php"); + require_once("../libs/TCPDF/tcpdf.php"); // Start TCPDF $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false); @@ -1042,7 +1042,7 @@ if (isset($_GET['export_invoice_packing_slip'])) { $company_website = nullable_htmlentities($row['company_website']); $company_logo = nullable_htmlentities($row['company_logo']); - require_once("../plugins/TCPDF/tcpdf.php"); + require_once("../libs/TCPDF/tcpdf.php"); // Start TCPDF $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false); diff --git a/agent/post/payment.php b/agent/post/payment.php index 1d4cd7133..2c9fb422a 100644 --- a/agent/post/payment.php +++ b/agent/post/payment.php @@ -396,7 +396,7 @@ if (isset($_POST['add_payment_stripe'])) { } // Initialize Stripe - require_once __DIR__ . '/../../plugins/stripe-php/init.php'; + require_once __DIR__ . '/../../libs/stripe-php/init.php'; $stripe = new \Stripe\StripeClient($private_key); $balance_to_pay = round($invoice_amount, 2); @@ -581,7 +581,7 @@ if (isset($_GET['add_payment_stripe'])) { } // Initialize Stripe - require_once __DIR__ . '/../plugins/stripe-php/init.php'; + require_once __DIR__ . '/../libs/stripe-php/init.php'; $stripe = new \Stripe\StripeClient($config_stripe_secret); $balance_to_pay = round($invoice_amount, 2); diff --git a/agent/post/quote.php b/agent/post/quote.php index 6d34d4a8f..b5e23b3bb 100644 --- a/agent/post/quote.php +++ b/agent/post/quote.php @@ -828,7 +828,7 @@ if (isset($_GET['export_quote_pdf'])) { $quote_badge_color = "secondary"; } - require_once("../plugins/TCPDF/tcpdf.php"); + require_once("../libs/TCPDF/tcpdf.php"); // Start TCPDF $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false); diff --git a/agent/quote.php b/agent/quote.php index 933399962..c97995c75 100644 --- a/agent/quote.php +++ b/agent/quote.php @@ -582,8 +582,8 @@ require_once "../includes/footer.php"; - - + + - + + + - + - + "; ?> - + diff --git a/agent/user/mfa_enforcement.php b/agent/user/mfa_enforcement.php index 5f930e6a1..889462227 100644 --- a/agent/user/mfa_enforcement.php +++ b/agent/user/mfa_enforcement.php @@ -2,7 +2,7 @@ require_once "../../config.php"; require_once "../../functions.php"; require_once "../../includes/check_login.php"; -require_once '../../plugins/totp/totp.php'; //TOTP MFA Lib +require_once '../../libs/totp/totp.php'; //TOTP MFA Lib // Get Company Logo $sql = mysqli_query($mysqli, "SELECT company_logo FROM companies"); @@ -41,15 +41,15 @@ $data = "otpauth://totp/ITFlow:$session_email?secret=$token"; - + - - + + - - + + @@ -72,7 +72,7 @@ $data = "otpauth://totp/ITFlow:$session_email?secret=$token";
- +

@@ -100,10 +100,10 @@ $data = "otpauth://totp/ITFlow:$session_email?secret=$token"; - + - + + - + - + + - + - + diff --git a/client/post.php b/client/post.php index 9d8e0f6d5..9fd1b8ded 100644 --- a/client/post.php +++ b/client/post.php @@ -577,7 +577,7 @@ if (isset($_GET['add_payment_by_provider'])) { } // Initialize Stripe - require_once __DIR__ . '/../plugins/stripe-php/init.php'; + require_once __DIR__ . '/../libs/stripe-php/init.php'; $stripe = new \Stripe\StripeClient($private_key); $balance_to_pay = round($invoice_amount, 2); @@ -737,7 +737,7 @@ if (isset($_POST['create_stripe_customer'])) { if (!$existing_customer) { try { // Initialize Stripe - require_once '../plugins/stripe-php/init.php'; + require_once '../libs/stripe-php/init.php'; $stripe = new \Stripe\StripeClient($stripe_secret_key); // Create new customer in Stripe @@ -831,7 +831,7 @@ if (isset($_GET['create_stripe_checkout'])) { $return_url = "https://$config_base_url/client/post.php?stripe_save_card&session_id={CHECKOUT_SESSION_ID}"; try { - require_once '../plugins/stripe-php/init.php'; + require_once '../libs/stripe-php/init.php'; $stripe = new \Stripe\StripeClient($stripe_secret_key); // Create checkout session @@ -905,7 +905,7 @@ if (isset($_GET['stripe_save_card'])) { $checkout_session_id = sanitizeInput($_GET['session_id']); try { - require_once '../plugins/stripe-php/init.php'; + require_once '../libs/stripe-php/init.php'; $stripe = new \Stripe\StripeClient($stripe_secret_key); // Retrieve checkout session & setup intent @@ -1041,7 +1041,7 @@ if (isset($_GET['delete_saved_payment'])) { try { // Initialize Stripe - require_once '../plugins/stripe-php/init.php'; + require_once '../libs/stripe-php/init.php'; $stripe = new \Stripe\StripeClient($stripe_secret_key); // Detach the payment method from Stripe diff --git a/client/saved_payment_methods.php b/client/saved_payment_methods.php index da7d970b7..037bcfe21 100644 --- a/client/saved_payment_methods.php +++ b/client/saved_payment_methods.php @@ -11,7 +11,7 @@ if ($session_contact_primary == 0 && !$session_contact_is_billing_contact) { } // Initialize Stripe -require_once '../plugins/stripe-php/init.php'; +require_once '../libs/stripe-php/init.php'; // Get Stripe provider info $stripe_provider_query = mysqli_query($mysqli, " diff --git a/client/ticket.php b/client/ticket.php index 8d96c5635..288a566b7 100644 --- a/client/ticket.php +++ b/client/ticket.php @@ -7,7 +7,7 @@ require_once "includes/inc_all.php"; //Initialize the HTML Purifier to prevent XSS -require "../plugins/htmlpurifier/HTMLPurifier.standalone.php"; +require "../libs/htmlpurifier/HTMLPurifier.standalone.php"; $purifier_config = HTMLPurifier_Config::createDefault(); $purifier_config->set('Cache.DefinitionImpl', null); // Disable cache by setting a non-existent directory or an invalid one diff --git a/cron/cron.php b/cron/cron.php index 7a76b3334..f14e9bcdf 100644 --- a/cron/cron.php +++ b/cron/cron.php @@ -838,7 +838,7 @@ while ($row = mysqli_fetch_assoc($sql_recurring_payments)) { // Stripe if ($provider_name === "Stripe") { if ($provider_private_key && $stripe_customer_id && $stripe_payment_method_id) { - require_once __DIR__ . '/../plugins/stripe-php/init.php'; + require_once __DIR__ . '/../libs/stripe-php/init.php'; $stripe = new \Stripe\StripeClient($provider_private_key); $balance_to_pay = round($invoice_amount, 2); diff --git a/cron/mail_queue.php b/cron/mail_queue.php index d50008532..41cb0ffec 100644 --- a/cron/mail_queue.php +++ b/cron/mail_queue.php @@ -10,14 +10,14 @@ if (php_sapi_name() !== 'cli') { require_once "../config.php"; require_once "../includes/inc_set_timezone.php"; require_once "../functions.php"; -require_once "../plugins/vendor/autoload.php"; +require_once "../libs/vendor/autoload.php"; // PHP Mailer Libs -require_once "../plugins/PHPMailer/src/Exception.php"; -require_once "../plugins/PHPMailer/src/PHPMailer.php"; -require_once "../plugins/PHPMailer/src/SMTP.php"; -require_once "../plugins/PHPMailer/src/OAuthTokenProvider.php"; -require_once "../plugins/PHPMailer/src/OAuth.php"; +require_once "../libs/PHPMailer/src/Exception.php"; +require_once "../libs/PHPMailer/src/PHPMailer.php"; +require_once "../libs/PHPMailer/src/SMTP.php"; +require_once "../libs/PHPMailer/src/OAuthTokenProvider.php"; +require_once "../libs/PHPMailer/src/OAuth.php"; use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; diff --git a/cron/ticket_email_parser.php b/cron/ticket_email_parser.php index 7b1877d28..07c2338d5 100644 --- a/cron/ticket_email_parser.php +++ b/cron/ticket_email_parser.php @@ -16,7 +16,7 @@ if (php_sapi_name() !== 'cli') { } // Autoload (Webklex & any composer deps) -require_once "../plugins/vendor/autoload.php"; +require_once "../libs/vendor/autoload.php"; // Get ITFlow config & helper functions require_once "../config.php"; diff --git a/functions.php b/functions.php index eebf38de9..42f295147 100644 --- a/functions.php +++ b/functions.php @@ -976,7 +976,7 @@ function addToMailQueue($data) { function createiCalStr($datetime, $title, $description, $location) { - require_once "plugins/zapcal/zapcallib.php"; + require_once "libs/zapcal/zapcallib.php"; // Create the iCal object $cal_event = new ZCiCal(); @@ -1009,7 +1009,7 @@ function isMobile() } function createiCalStrCancel($originaliCalStr) { - require_once "plugins/zapcal/zapcallib.php"; + require_once "libs/zapcal/zapcallib.php"; // Import the original iCal string $cal_event = new ZCiCal($originaliCalStr); diff --git a/guest/guest_ajax.php b/guest/guest_ajax.php index aba9b1c5d..851431ad5 100644 --- a/guest/guest_ajax.php +++ b/guest/guest_ajax.php @@ -11,7 +11,7 @@ require_once "../config.php"; // Set Timezone require_once "../includes/inc_set_timezone.php"; require_once "../functions.php"; -require_once "../plugins/totp/totp.php"; +require_once "../libs/totp/totp.php"; /* @@ -69,7 +69,7 @@ if (isset($_GET['stripe_create_pi'])) { } $stripe_secret_key = $stripe_provider['payment_provider_private_key']; - require_once '../plugins/stripe-php/init.php'; + require_once '../libs/stripe-php/init.php'; $pi_description = "ITFlow: $client_name payment of $invoice_currency_code $balance_to_pay for $invoice_prefix$invoice_number"; diff --git a/guest/guest_approve_ticket_task.php b/guest/guest_approve_ticket_task.php index e59f06356..a9b19883a 100644 --- a/guest/guest_approve_ticket_task.php +++ b/guest/guest_approve_ticket_task.php @@ -3,7 +3,7 @@ require_once "includes/inc_all_guest.php"; //Initialize the HTML Purifier to prevent XSS -require_once "../plugins/htmlpurifier/HTMLPurifier.standalone.php"; +require_once "../libs/htmlpurifier/HTMLPurifier.standalone.php"; $purifier_config = HTMLPurifier_Config::createDefault(); $purifier_config->set('Cache.DefinitionImpl', null); // Disable cache by setting a non-existent directory or an invalid one diff --git a/guest/guest_pay_invoice_stripe.php b/guest/guest_pay_invoice_stripe.php index ba9750a4b..758f86c54 100644 --- a/guest/guest_pay_invoice_stripe.php +++ b/guest/guest_pay_invoice_stripe.php @@ -76,7 +76,7 @@ if (isset($_GET['invoice_id'], $_GET['url_key']) && !isset($_GET['payment_intent - +

@@ -161,7 +161,7 @@ if (isset($_GET['invoice_id'], $_GET['url_key']) && !isset($_GET['payment_intent $pi_id = sanitizeInput($_GET['payment_intent']); $pi_cs = $_GET['payment_intent_client_secret']; - require_once '../plugins/stripe-php/init.php'; + require_once '../libs/stripe-php/init.php'; \Stripe\Stripe::setApiKey($stripe_secret); $pi_obj = \Stripe\PaymentIntent::retrieve($pi_id); diff --git a/guest/guest_post.php b/guest/guest_post.php index 53c53057d..b0d1f81ca 100644 --- a/guest/guest_post.php +++ b/guest/guest_post.php @@ -329,7 +329,7 @@ if (isset($_GET['export_quote_pdf'])) { //Set Currency Format $currency_format = numfmt_create($company_locale, NumberFormatter::CURRENCY); - require_once("../plugins/TCPDF/tcpdf.php"); + require_once("../libs/TCPDF/tcpdf.php"); // Start TCPDF $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false); @@ -555,7 +555,7 @@ if (isset($_GET['export_invoice_pdf'])) { //Set Badge color based off of invoice status $invoice_badge_color = getInvoiceBadgeColor($invoice_status); - require_once("../plugins/TCPDF/tcpdf.php"); + require_once("../libs/TCPDF/tcpdf.php"); // Start TCPDF $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false); diff --git a/guest/guest_view_item.php b/guest/guest_view_item.php index 42b64a57b..0a54ba318 100644 --- a/guest/guest_view_item.php +++ b/guest/guest_view_item.php @@ -8,7 +8,7 @@ require_once "includes/inc_all_guest.php"; //Initialize the HTML Purifier to prevent XSS -require "../plugins/htmlpurifier/HTMLPurifier.standalone.php"; +require "../libs/htmlpurifier/HTMLPurifier.standalone.php"; $purifier_config = HTMLPurifier_Config::createDefault(); $purifier_config->set('Cache.DefinitionImpl', null); // Disable cache by setting a non-existent directory or an invalid one diff --git a/guest/guest_view_ticket.php b/guest/guest_view_ticket.php index 48ad8c2dc..39ceffa85 100644 --- a/guest/guest_view_ticket.php +++ b/guest/guest_view_ticket.php @@ -3,7 +3,7 @@ require_once "includes/inc_all_guest.php"; //Initialize the HTML Purifier to prevent XSS -require "../plugins/htmlpurifier/HTMLPurifier.standalone.php"; +require "../libs/htmlpurifier/HTMLPurifier.standalone.php"; $purifier_config = HTMLPurifier_Config::createDefault(); $purifier_config->set('Cache.DefinitionImpl', null); // Disable cache by setting a non-existent directory or an invalid one diff --git a/guest/includes/guest_header.php b/guest/includes/guest_header.php index c45cdac3d..00da6f2d2 100644 --- a/guest/includes/guest_header.php +++ b/guest/includes/guest_header.php @@ -17,19 +17,19 @@ - + - + - - - - + + + + - - + + diff --git a/includes/footer.php b/includes/footer.php index ce5b8bf26..403e68c5e 100644 --- a/includes/footer.php +++ b/includes/footer.php @@ -30,24 +30,24 @@ if (basename(dirname($_SERVER['REQUEST_URI'])) === 'guest') { ?> - + - - - - - - - - - + + + + + + + + + - - + + - + diff --git a/includes/header.php b/includes/header.php index 9913f39b3..b8d40f8a0 100644 --- a/includes/header.php +++ b/includes/header.php @@ -24,22 +24,22 @@ header("X-Frame-Options: DENY"); - + - - - - - - - + + + + + + + - + - - + + - + Z=yx$ z?MfoS+uE8QA3U+j`M`*wWtipPh-N@%MRQ{77(Zn+R?LQ<{iMFCxLAJKgpq zkSq^{h9`T3_ETy20%{LXgzmXbi_LpS5hdwhAG%)XNH$_AglnL|iUDsZr~$Dc=nhY| ztsp7&)A5U_ACO!n0aGco0A4*D?mI@@cY}loc1A!_`%sa50BnekFTi#nNo_0IvfZKY zA$SH5`N3@6ns|V9EVX1V#D9q00PJjAUWjlY<*pE}vJ)PPyesV*5OAs$l{<91Wfdy~ z?Y&F))(ypYhX_Ja3T6eM{MNUh@YM66JRlF)m%bE6$PR_xK@(i-9eU)d zyX|tqTZSMk8wEPn}d;o2{`>yK=I4(y8t3^f=K8Cc*6I7I}1bY8j=;NoI? z@%X5|Xw?_T^~Fhj@uh2!Zydcc%{MQ1 zndZov8u41>CBV&6#xvE67N-!bu@qvq4e=Qm#l-03R|#t#FbLAwNE35 z?bdOra&E&p@Bl0-XqmnG0Pa2lFbd?pNlp;ArQ0tKB{$Lm-Zn_mCR~3AU;?x(ar&lI z@(2b19ZS`X+<7$;K(s|#zHZyvkhOY#K^s!>Z19aXsFLA*uL=LFUR$D^%yY3Q=r~}} zEoNccC%{3sc8?*zGexe~=TrHJ=V1__^c${bNLM_ods!BET$YqII0h3}J!}^9R9k7^ zMuNS3Wmci)YY)kHQ2Jkh@b!CD25{-vM=yFEz*1BhLRoi%x5_D7+m=4qI~#sxk z>#0I=3&zo-&n1Xk)kqK&lOYti4W2#qb(!+f=N#pBQM^|c!{b-DD}tzFgB$Xm%}>B% zjhLU0x8|pm#1N3JBrDKWfv^`Khn;6p0l%t*_;44aEF-~{I}(9E&_I@JYN1s|!yet` zPN9K1(756%5Q5!2V(W$%#7MkFF?88|wJMii4mj;&!5Y2KBDBXKbfT-lmT^SIqw~E8eQY#DLspiPr zm)3UA*tDt8Na>SAK0>oXp4%9jqp22T=WW3$Felts))h2;HkEvjb{bpmr)yH9w*2bX zLEa{m1_`q`LjPA1A%V=wIzbWn4dE#(0)G}tP%Evy>(<}?ori?M6@Aw%--Yc*5F*&8 zhHvP*S7lVm&gj?en3{X6jtf(C;$xLB0t=uQ+M%gcM^PS1(iTJt8}XXok9>U_ zV-j)kz^qb6^Y$_CXpMvzJ+w>vh*}cdSP)OsxieuQY*8+KUHoK5nu>ww- zGN4!49kB#4in7Lu<&;<35FR{fis&9FsD=Uy_sNNksPyL;1W4LCKDrS_g}eulwU8zY zLDrk0RPc(?Ypfta3$OK&RPTeyMuT{*=Vp$+! zZybq!tzv+S-gy;M9@+trawQdi8|u5VIqy8TgYedCz4MakSg-XCN@RUTSN*=Y_1neE zz|1$iyw$W0n^rbwCn!dKV>SqpLIJJU$_BCr-ddUQwX%6-?U@=F)<@EJn&#zz;cMOV z(y73&bD|&1xnz$sfwVbbjw1~DO5|c?{6Hwk0dK#su`xWTHB86`9T=PNt)%wMv^2rBqXVlCh3wPnUW=~q_t#AP*P0t zBwq@oP>Q5jN~BcEq+BYbjV#HstjMaY$+~RFrfkV8c`e(rBfGLE`*I+MawNxcBBydD z=W-!$6iJa4MNt(^(G^266-!wuYsFR^1xiFIz7i;*5-G8gD5;Vuxl$+_RZ?YDQK5LR zs;h=-s+PJ^*Q%{Ls;hdcuLf$UMry1kYN}>xt`_P>lQdaVG*#0yT{ASW+qIRp)@%)` zGH4!@zX&u`S}N8OE!8qD*9vW;OS-Hpx~glst{b|kTlz|0>$dLbP>fpl^*|5xNRRbI zPxVaC^+Mkmk|7(40X2UO-7pN(u#APlPbD`RD@tkr6@UfC;W<*vMyzY132 zDq6*>WRv)~4({;Aa z*Ts5cOSWt)wrXp(ZX32~TlUIc+qUi4uI<^r9oV5A*|DA2sh!!mUDz8(a%4wwR7Z1k z$8b!?a#qgTu^q>89VpG_1WxEgPV6L3>SRvt6wbz#T-jAz)zw_xHC)rR+?Bg_ZP#&K z03E&?xS<=lv75N5o4L7LxEoLMWDjbOd77tthG%+~xAN9dXvXne&+~jQ@Io*0VlVMh zFY|J*@HW2W%f8~PzUJ$`;hVnYul%)d`;PDWp6~mCANr9W`-z|WnVBP&`(>&T9r$c?;VO}xZUf+S3$BuV>ZN`fq+uGRahjxQnx%PKq?=62jR@pkUGbeL1FY~h?3$rMT zvm{HiEX%VZ+vHL%=Sr^TTCV3tZsu0L%GbG_JGq;Cxt|Alm`8b>CwZD@d7c;frjQD` zPztrs3cWB2v#^R)u`cYwDcr&<{30mAA}Zn{DbgY<@}ej<7*3F#Zm&-bhV+PGxiK$@ zlj&@}SYjB4V+2NG9juG>us%j%18j)V*a%}V7UQrn#$y5|ViRnN&9FJPz?L|M<2Zqn zcn9y|J-m-o_y8Z`G(N%^oW(hOjPtmFi}(be;xl}XFYqOS5ja5*B+((dM33kb6fq!% z1Wk+xhF}Sf7!y1p5F#-lro@bx6ANNVVkAxyBuRG2F4-gdBt;I$AxV=Xk|9}=BgZ69 z3ZzI*$SFA^=j4K1cCZfKAv$EI)9H44oqmVv3_8OO-5GV54%^{6;||{uI$~$inRaHK zd1ujCcCjwrCAws{)9rS9-F}zq4!XlG-5qtAF5Bh0<1XJ7x?*?Iopxv4d3VuW_OKq_ zBYI@7)9dzny?&4C4SK^K-5d3o9^2!3;~w7=dSY+VoAzeCd2i8M_OU+RC;DW+)9?0s z{eGY75BkGC-5>RtKHKN|<38UP`eJ|5pY~_{d4JJgQW%9(1VvIEs!R2#K1ERjYDm%4 zh+-&~;;1pjQvxMY6KYD$s5!NumIG{n4~PLd=nT4p-k?9A27|$HKo3R(X21@(!Fa$A zgn>Ai45owGU_Mw3mP2fa4~Zc;>G(nSehwjonx=&N|fF9B`J)#+!r8#;`^Rz&V^n{+$GkQ)h=;a6-;Ui*1 zjyj|6s5k15sL^0F9MPlEh#9dXZZsb8BVi9ENM{*sm%k{WEM{xsg$kE)0V>p)MxG~3b0w;14ZpzKL zIk(`JV{D9%i7`3ujJxCBxId=GgYj@ok4Ix>%#OM7c+8K5u{fTLr{mdpK3AM!Lm;u)UhIeyIZyuge6grD*=e$FrWrGN>zKnSGJ5xPQ8=nIrE z5QYLRj08qt1x^?XydVgoFcGH0OqdG`VJTuFE)pUscEqmO6Z;}14#c5IizAT{S&<)-5)KNY6pbTXYzXVdv~F8_!fJkN%jC{kV_+girjWPyUoo{j^X2jL-b6&;Fdx{k+frf-n4{FaDA*{jx9rim&{t zul|~^{kpIJhHw0)Z~m5V{kCuaj_>@g@BW_e{l4%2fgk*#AO4Xa{jneaiJ$zbpZ=Mj z{kfn2g_(L0sUDWvO%YLz(jy=shHdEikzUs(op*oedz+ih~?E|xH>7XPEmV#bp}_D%d2y^ zIxVj*;OeZrg2JBgp^NGg)!DqLF7FKg?O86EKC;IeG{ladW^E!v?B&ZifMd5bGPj?7 z2!TMb63E+KHt(vcL+u8rxe9mQ%Clkn94gP2e)OuN@(3K9tG=iozjkT|a)_av>6LzJ z>lXSsy}LL=<3|hNb#Jxz@$%UE%dA1UPY|)UC*Zd}7N8!~gRPcfduO*kk4x&6duR8x zoNLuL_U0m?WxI09zA+v~{B&#hdOM+J6CH1x54aHx3V z@a2If%huhqwkq9p5ZJkVv+DRMG({TJ&XS-aJ7|tOgVK9c2HM(COcyyR53A1(H0H!> zf@rX3%FSERtK?VoQKOfkRxH8Stl-3M0l8$2@%_CQ%r99C@Wa&%CD>9gSEv;FgMx># zrAT(;AECSF#8A+Sjhu-+M>rMsxeR5k5lpF1o&#e?iCpnM<<^USgnqw!XNlSy5ai7_{||AH B0)GGi literal 0 HcmV?d00001 diff --git a/plugins/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/HTML/.gitkeep b/libs/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/HTML/.gitkeep similarity index 100% rename from plugins/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/HTML/.gitkeep rename to libs/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/HTML/.gitkeep diff --git a/libs/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/HTML/4.15.0,f474c0a322b208e83d22d3aef33ecb184bc71d31,1.ser b/libs/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/HTML/4.15.0,f474c0a322b208e83d22d3aef33ecb184bc71d31,1.ser new file mode 100644 index 0000000000000000000000000000000000000000..e2c429252e5bc827f655255ad493e0fa1c91cb6e GIT binary patch literal 95583 zcmeI5+j85+vWD|0DXzO+wPI06ioSAer{XHdQQ6wH*BuKaAqg=E&;V#z@yfgJuX`{< zf}#$TA%=4LLKKcOz+mR@bNBE4-J^cz*VEtLp3I8mEQyPO?7WK4k}Ro`JnQtk2mP;Q z|DfL~<7zhTJRkPE&&&RCzmrd^WRmvbuUrn;(Mg^#xKRbGDhu;!aEZN`b4K{t)h>ufgZFxT$; znfV-i=Fd@@j0gPAV&+ohUY6ccnQMto5cY~HmA$UajV`N)k2s3Tcu>Y!$(s4B(^O{; z^X1DV?Wa+8e(TqKD;KOcw2Y=}w&?He>XXo!EQ&!@L|J*37n8xX;8CLfPXDVsDbs!V zd|p=b3uJm+B&p8yJ(gYLW4)9!vWk9Z(dSu|)`QDq_(f0uf(Uw&l_b+UO4Iyu5KpGn zm0!AC#e|ntt|Pq9!!2NfTi%RmG%E7!YU1yrn^97Q^)D0PEb}MX`#99)D!@dypZpna zE2BxkEH3;U=|YnW`QCBp;812NUGkj*#EkNB=uujlMxjgY6$o>e%8UAKx+rJE#$M>2 z>lV)plh7Gw5`T}ZnF#~u_vxzQE4i-Z#p7^_y(D88!@1!YpbdM;By=FJH!6~8Xo$~{ z<;_D}lMnv@i+mGYGh|+$0RjFH!?3u^bBFHT2qquHka2S6@8e{0Rz#CUX4(G#bvwgL(6>lb5evoW5{Z$gF3KSf7^{%pN}A zNFTtVIs-e7%TWw%VKNTrX^>=TGN&?fuO|irSvvEzBD46*D4o&3{GcqbS(T5{yrdhy z?ijMmB4QEQyC5%%A;}Q8hPNH z+{&pM$BX{1+%5A^5SZNqb{UR2&M6@2nl^w6YtaBoCyfErQv@g=%u!!Mrv`gv?31U& zj`$nMq|GH~*EWU`&fc3UCa0Zz*L8#oy_88|srfhnH0MDc`%4pnJ8 z&~#kuaf6_U(Adx*zo^YH|NH*UdWw0}YH0ALQBlTdoOoJ@d!uDqJaK1H{(eQ1<#h7X zxInpAz0O3B>+a-45=dB$ai|=J3aE99{HA!e9K3^3A#J}5xP768M-_EA-X%hhwhH=qPr9N=!QPJp%3(-qNl^6(+z!eLm%DH2WnD( zUFf45`an@ypWO|8?1nzjn!2<5zPWwh+Oa><-F1il`fF}jiYLQ(T)vOXe8y}R3Zlwu z(bYPGr|EVX71cnS@d;+rj8C%6paEul5~J_k#wV_DCen7;fF*YfLnlKgFZLKZDg8Ed zTEjHXoKcSr11D3TcpNd^uIYBSLbqE_M8hV-Cc`FE?ILc8YVvRQDHH*iXIXH`FoZIM zGK4aO+A@R^w?cKXH+(XDGJG<8+CF@8F+YY+hEIl1hELmqPZ~9bsM%f=HU2Fc<@IPz z1?sR6OYkLN%1*-#$GZl#6SS*Azwnl6d`5U-h}zYVN{QOl7cG+W3q32*Y+Rgaba~R> z6Vds$pk6smxSNCnwi0Q3E&M)2+P>DXSr<~y6Z$Y)2CojN-g!Q#%L-x0>bvx2qf<`UkzqYw(s zW>a4ih)A7^;_yT?VUMr#W)_ViLPY78HpZkbr^Ev!=Rmd$2v^t_gWf*mcRQ z+*xCj9wBkf=91DddGe54hn?Bt&N%Gw(ItnApCCws?8CMs|8!{VK>NehhDd(UHxpYvq+$;5*lkee=v-muk=M~e0 zK^*-vE;QSde#|;%DW4}G!wH~mUB$*Ijb#O^y@V|**b~kQb|fnuJXy%Y#@<5OH*lJ9#+N$fZfO{eLcuqf%7r(*+bni<+y@ej>HR`Ye=HB6J<@!Vw!Vdz)F^y8_Z=`kps zWp(pyJ)@cQMGFn{_{XfQk~4B8{tb#~19ujerF>ih6g7@m%13Y&tZgslqkt`Pvw>|3 zNqSe=`wVO?zwQE~g>+<`^b_W!T?XrK;cU@M8rT}xx(Wxu#ln)AizEUwV#&p1omdr$` zKa8^tS%a^&#-?H%efX;BhH|MYrgBwCI-2mSt`_{9beDZBcPvW3n@FvSZOL zD8;;5{-H`CXdCsZ+o4WGLx0upeNn_`+9>pKrI)hR(6OLk;h}u-8LOe=gT>dVp#y7K zNahA2Xm5%Jki|E6n`9qPuclObcez-Aib;|sljP5sa_Ul$N1cOxrFee`cYX=o(wg`1 zz(lpaNYnf>9>14PVScrLWol{;pVY;^J=|mDk+4Rr_MPv*QjSIO#LM?;qU!@=IFJq<`3zH{9O*Y zii<*m8^uvmqFK0=cJFa(K8-VfV?8G?l9Y9|!MJvdHWUpL-^+ZYpRkX#D}AW!sId4f zrU&q}^_{h-&=Om#Pqt;$26{5eC(~%;$P3i@8dw3h135VOIY*bZn)b`W0gi8{{fm7$ zj4PpR+VSp9Sl(8+xICcaM0~iou5}0c(`LB1${sGw9AEw>o~WG&NuuC|#MBB&g&wDd z`bV~3$o9U>>>KIxBLuzg!iY5HM(`ego0L^u$`t0s=jUTHl@s#( z@&dy24eE@2@7#2W(-<{NrQ)Z`e5|)LfbX(s?o(38doxcjFG#zFN1;@MbcrCj;pU

LXpb8D6U z$4NPoT|pAD8YIOi)$_Zzu1#SpnK2+`eH^SRg^el$$Z&E zMrj!88vULmU*dF47cQ0sSR7qqmbzP_TJvc**OWpR~wCQa2RX$CabkoQwgj} zV|0QU^ZTtc24a=7VOv;Ye2(!smMBd$6D%vwbO2hVB}$uB>nBQ6aH14iJB*HjlYx_g zlYvt@!xgNRuqNZ1mfe)Lpf;;|CWs|vIM3J$V;_x*Ji7`NskmTdwOL)vy47a&tlHDp z57ioWI43oC80WNYrK1g=90wA7xmk0K3Qwr0s-VrAXO zvF_W&x|(;I6C~rFjC=C57q%o0(xX%9<`T~349g-;=3?6myOz*iEss_g4=bfOBz_sS z22eGJZ0Ka@u_G{}tr^yd68VHmc$l>LTWljf=?71`T?Cyk#B%39iFyWykZ zJy@V(6zG!|KiiT-E`uJ&9|i$S0Br-wHt2CqZsk;2UAc>QfrJx46 zOa@gb(?bOX6|hih)Mb5m31BVBl==*z zne!w;rptsv4SpXaGds@=GCr>z8d8}j7Rni&AmDAHt`ZDH*;=E7%QZ#2;q*jMFf zR2=xDQW)kWD8sSb)rt_njnBYKSKWoDE0XgI-QT;5JbW8GyWC@jw%@garzz5|_Tkwa zH_T*f+vxRV(U!5O`LlNHVDOP&)$e7P7h+S|Nb)yvjvK{kI>j+fYaQK{aqio5z`>H% zol3o@jdjZBI+Kc;N*dW|aHZ|a4Bi9!b1tmDqZ{-X4Ra9;9NA!>td{wuryJ0fi!#wP zC$2P@$Q&1l4N@G;l~r|nb(M$D;bN)sz{SIygnmi?h&`oIZVn~=-d#jU8TMk9N`{q3 z7pJ_lW~MpR14%tE^4U~hR`?}IYLQ>+ZY|P`ad2pBCAfy*;v{{CsRF^7|G-rBfcR)?#kr4TdLH@*%S}v%ZGa=OY%%I z!M)#VSWSWJy0c!FQk>yAb4n`10(i?-Lyram5rda{**bIMR<2Ixn7aK&qmMG}Gc7={ zvJ~)wggw8wE^Z)r5j#ecH{cUq!?XF_9<#M?r>*c6oEMq_ml4)QlTnsZs8`bUFPzpg zXE*B#t}~;%^wfB$Ao`!GpR!9M%3Al1+dyJXP#uYA6d7Du$~V!R8igC`k-L+G$K=TILH?)M-)H46>Hnk%W0hnJ`4{bgh5cje4>xP?HidJZGOmGh`f2`{l~r=agm=`D&qwqF>*2oSQLfI< z&J+llPK_1Y078!<3djJ#eagjy9{|cc*D(81nf#nd^XROGpCL`*eUgmFuCAkS8a&Tj zny*!=Lln8r@%+A1UBlz6t)G?y}sK-l4l?4RB*peQOos zg|0TtliftDDJhP4ivX#WxLhqQ95bCQ5GDv z`QWHl6=oZ*&qMV9A^gy_2A}bOYHP-P{UcEuTER*hLr;v&p0fyu$Q zOJ2sTBHCIczgK7l9Zyh#S*~qAHlk7s>Om2}ADGN`b4FR7*lQ=Z&NKf>GplMHXoXo- z&AXTYH>CSA{wz>XkB%merCJ?ya-e4MB6`_$sAmsGRuQEUl7nXK*)ak~VZT zbY1qvUmIO-1yW~CUrYIav$_5IErr=I=o+Hk&n8RtU^T*y2bf}KuCA6LnjzZOA=<{w znQE=|jL{R~<-}piIXkt4eL4^(rq1hnx51d=qF_ER_YZ1pmyy~wM~s#wQhhxULTd-e zCnAIja5=9`11@vclUU?`qO;zu5}*MWUc_|_{r31<3vfC2aRV*`E(5Mc)(DqX!hmZV zfeWrWnUE!CA7@!m|%=Zadf#Y?L{g^cm9hT_YSJa&SwW2kIf7Q)Cz9?a48( z!>F}Vu~(-ojY$}=D}~&S%%mDl8FQC*BE;r`9A~-|1CPOxGWnCm8IG_-L(<4wC%E~I zFg%Q(3qF1a5=%}CiP4LyN>dGaMDqDV+WELD56j2hnj9@{Pm_%q<1Mz>VvEIB*(y-| z4Hc-KY`6v!Ml)r!1Lv9u2U&WQPhgXg{~tSz#bRF|_dk@9%z18QmZ0N4H5B~V`tJJP zIU=o7A`3}mo@~2^zA%Jj09R3f$887^4+)glVR#_p`463lEvHMd+~k@C8zIIASu(FI zH@V8J6`3caB98pXh$?7CerYmfx!_!eDvd}L>h~cPPcb(+sOHk;7=^y8tb^xe?wyZw zbF!XMXjSHdUTu+Q(;P(U%J9rw3mI@ylsG6cm$HEhMG=)>8Urg8p93F4v|kJPD;<0S zmzLYW(+>2At>iYar1Z5t<6aJm%KQN8UV<5*i$oFc3-Gk1xUK_NU?8Y@nS4~^P8-P! z45196I>S1^04xSjJ)SVB%h_Vt_;MCX&vM=3nGLJ+4579cp_mynW1m)+Tyq9IQM*_L zHIFigj-!06UbR9>*=24A`52zYz)4{lCfM=33oL*;;8t8Xnbd_)+yN$=)%0;gr+yxc zUXq>VgYz^WM(Gl>CX$Gr#a$1%Lxd9**FUS6qC?58?&M%xJ9Kcx&01W|pdwc4vWl{C zgsbu5O!us!S|kJ(w#LA`(TpqJ9^iefBsmYG5qzu!7x-@8sPEGKBl5MOIsL_T0!Po-zKvmQDc!LG|^rF6U zdjeMFk(FQ3X)_SNIKl>$S?PC>)!j?!6;*UTuK_(*Pl*ai&kHLuzhJ=BlZ({43`_2c zPU9y5gVbPlUNlNvyp>wjzPQCM_pNNYu0LISGeWcVDnImmMAi3d^(UJ6Ma$?#{X^CN zA`e)iUoQzTI$Sw?w}(o^a1F;BPWlIVtMzsl;OQ&wL&_j?8*U zf*^Tv>klz;Zu5CyYQZ1_X|vw+@~pVY3Ht&;j7CnqpE=8jrg9t4Wrz);z<=ao?%I{ zKkAqlZ)#&m$N9)HZTO)qS0;N^pJV8GJl@Jz$rOI>Kf=}g*!^keM~xFoswB^xb(&UT zV+NuCK0lrY65*`feG_%dX^RCbsC;D;P6b84H#C+}Cjx zfF*6?2{Hg$r%3vi%cNW@ExjHmdRJWu_~&shC+kYUT5MDM?Qu0@{$>)L!@3cv%zl^K zKU7y~93D~5bVa|yGkq8p31)a$HaS=;S$-eNu<8+cbXt@z>)uRa-)Pa559JmqUCb!F zjnAWzmMHAj<%>_F;yiYZ$WwF8n_4N!UGn4-ZuOtv-mV-!c@g;}@A7QrB}`G#(^bj% z>bLoa0XFLI!UsF$+@Sd(=~((@Qs_zj-tw06lJY6_=t+@JizLQnD^y(MLG_e-Y5HdV zeVHu!YmxPxU?SyN9ZSnC<7#{|8>R`d#N5I1`1iAC|F`$@*|S%tuYO!T*PcCl{Z6iS zcYnAltC%&&7vK|IRMoWq?Ahhzwv(xv_zFbt3v@0#voBytgC@br!`xB4Q h5xR}vMCXSF&n`PeoF$oF`okciT(cX=&T|52{vVn9wUYn< literal 0 HcmV?d00001 diff --git a/plugins/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/URI/.gitkeep b/libs/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/URI/.gitkeep similarity index 100% rename from plugins/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/URI/.gitkeep rename to libs/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/URI/.gitkeep diff --git a/libs/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/URI/4.15.0,b359e061fc6632c745df51b43504cb541c9339de,1.ser b/libs/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/URI/4.15.0,b359e061fc6632c745df51b43504cb541c9339de,1.ser new file mode 100644 index 0000000000000000000000000000000000000000..b97b97489ab394a5929996c3b7c186ff8a82b2e7 GIT binary patch literal 516 zcmaix%}&EG5QO_Id*qa)6v6t25Nai85ruQKY1hQ6n?$iAC{^B_wG)W~mAKjaGxK@8 z!t4rR{_^c*SB`Q$CArBp5v z{Gnlx;}k(O!YNGa1UH ON*+=ZrP6y*?!N$am!lW} literal 0 HcmV?d00001 diff --git a/plugins/htmlpurifier/standalone/HTMLPurifier/EntityLookup/entities.ser b/libs/htmlpurifier/standalone/HTMLPurifier/EntityLookup/entities.ser similarity index 100% rename from plugins/htmlpurifier/standalone/HTMLPurifier/EntityLookup/entities.ser rename to libs/htmlpurifier/standalone/HTMLPurifier/EntityLookup/entities.ser diff --git a/plugins/htmlpurifier/standalone/HTMLPurifier/Filter/ExtractStyleBlocks.php b/libs/htmlpurifier/standalone/HTMLPurifier/Filter/ExtractStyleBlocks.php similarity index 100% rename from plugins/htmlpurifier/standalone/HTMLPurifier/Filter/ExtractStyleBlocks.php rename to libs/htmlpurifier/standalone/HTMLPurifier/Filter/ExtractStyleBlocks.php diff --git a/plugins/htmlpurifier/standalone/HTMLPurifier/Filter/YouTube.php b/libs/htmlpurifier/standalone/HTMLPurifier/Filter/YouTube.php similarity index 100% rename from plugins/htmlpurifier/standalone/HTMLPurifier/Filter/YouTube.php rename to libs/htmlpurifier/standalone/HTMLPurifier/Filter/YouTube.php diff --git a/plugins/htmlpurifier/standalone/HTMLPurifier/Language/messages/en.php b/libs/htmlpurifier/standalone/HTMLPurifier/Language/messages/en.php similarity index 100% rename from plugins/htmlpurifier/standalone/HTMLPurifier/Language/messages/en.php rename to libs/htmlpurifier/standalone/HTMLPurifier/Language/messages/en.php diff --git a/plugins/htmlpurifier/standalone/HTMLPurifier/Lexer/PH5P.php b/libs/htmlpurifier/standalone/HTMLPurifier/Lexer/PH5P.php similarity index 100% rename from plugins/htmlpurifier/standalone/HTMLPurifier/Lexer/PH5P.php rename to libs/htmlpurifier/standalone/HTMLPurifier/Lexer/PH5P.php diff --git a/plugins/htmlpurifier/standalone/HTMLPurifier/Printer.php b/libs/htmlpurifier/standalone/HTMLPurifier/Printer.php similarity index 100% rename from plugins/htmlpurifier/standalone/HTMLPurifier/Printer.php rename to libs/htmlpurifier/standalone/HTMLPurifier/Printer.php diff --git a/plugins/htmlpurifier/standalone/HTMLPurifier/Printer/CSSDefinition.php b/libs/htmlpurifier/standalone/HTMLPurifier/Printer/CSSDefinition.php similarity index 100% rename from plugins/htmlpurifier/standalone/HTMLPurifier/Printer/CSSDefinition.php rename to libs/htmlpurifier/standalone/HTMLPurifier/Printer/CSSDefinition.php diff --git a/plugins/htmlpurifier/standalone/HTMLPurifier/Printer/ConfigForm.css b/libs/htmlpurifier/standalone/HTMLPurifier/Printer/ConfigForm.css similarity index 100% rename from plugins/htmlpurifier/standalone/HTMLPurifier/Printer/ConfigForm.css rename to libs/htmlpurifier/standalone/HTMLPurifier/Printer/ConfigForm.css diff --git a/plugins/htmlpurifier/standalone/HTMLPurifier/Printer/ConfigForm.js b/libs/htmlpurifier/standalone/HTMLPurifier/Printer/ConfigForm.js similarity index 100% rename from plugins/htmlpurifier/standalone/HTMLPurifier/Printer/ConfigForm.js rename to libs/htmlpurifier/standalone/HTMLPurifier/Printer/ConfigForm.js diff --git a/plugins/htmlpurifier/standalone/HTMLPurifier/Printer/ConfigForm.php b/libs/htmlpurifier/standalone/HTMLPurifier/Printer/ConfigForm.php similarity index 100% rename from plugins/htmlpurifier/standalone/HTMLPurifier/Printer/ConfigForm.php rename to libs/htmlpurifier/standalone/HTMLPurifier/Printer/ConfigForm.php diff --git a/plugins/htmlpurifier/standalone/HTMLPurifier/Printer/HTMLDefinition.php b/libs/htmlpurifier/standalone/HTMLPurifier/Printer/HTMLDefinition.php similarity index 100% rename from plugins/htmlpurifier/standalone/HTMLPurifier/Printer/HTMLDefinition.php rename to libs/htmlpurifier/standalone/HTMLPurifier/Printer/HTMLDefinition.php diff --git a/plugins/inputmask/inputmask.min.js b/libs/inputmask/inputmask.min.js similarity index 100% rename from plugins/inputmask/inputmask.min.js rename to libs/inputmask/inputmask.min.js diff --git a/plugins/inputmask/jquery.inputmask.min.js b/libs/inputmask/jquery.inputmask.min.js similarity index 100% rename from plugins/inputmask/jquery.inputmask.min.js rename to libs/inputmask/jquery.inputmask.min.js diff --git a/plugins/intl-tel-input/css/demo.css b/libs/intl-tel-input/css/demo.css similarity index 100% rename from plugins/intl-tel-input/css/demo.css rename to libs/intl-tel-input/css/demo.css diff --git a/plugins/intl-tel-input/css/intlTelInput.css b/libs/intl-tel-input/css/intlTelInput.css similarity index 100% rename from plugins/intl-tel-input/css/intlTelInput.css rename to libs/intl-tel-input/css/intlTelInput.css diff --git a/plugins/intl-tel-input/css/intlTelInput.min.css b/libs/intl-tel-input/css/intlTelInput.min.css similarity index 100% rename from plugins/intl-tel-input/css/intlTelInput.min.css rename to libs/intl-tel-input/css/intlTelInput.min.css diff --git a/plugins/intl-tel-input/img/flags.png b/libs/intl-tel-input/img/flags.png similarity index 100% rename from plugins/intl-tel-input/img/flags.png rename to libs/intl-tel-input/img/flags.png diff --git a/plugins/intl-tel-input/img/flags.webp b/libs/intl-tel-input/img/flags.webp similarity index 100% rename from plugins/intl-tel-input/img/flags.webp rename to libs/intl-tel-input/img/flags.webp diff --git a/plugins/intl-tel-input/img/flags@2x.png b/libs/intl-tel-input/img/flags@2x.png similarity index 100% rename from plugins/intl-tel-input/img/flags@2x.png rename to libs/intl-tel-input/img/flags@2x.png diff --git a/plugins/intl-tel-input/img/flags@2x.webp b/libs/intl-tel-input/img/flags@2x.webp similarity index 100% rename from plugins/intl-tel-input/img/flags@2x.webp rename to libs/intl-tel-input/img/flags@2x.webp diff --git a/plugins/intl-tel-input/img/globe.png b/libs/intl-tel-input/img/globe.png similarity index 100% rename from plugins/intl-tel-input/img/globe.png rename to libs/intl-tel-input/img/globe.png diff --git a/plugins/intl-tel-input/img/globe.webp b/libs/intl-tel-input/img/globe.webp similarity index 100% rename from plugins/intl-tel-input/img/globe.webp rename to libs/intl-tel-input/img/globe.webp diff --git a/plugins/intl-tel-input/img/globe@2x.png b/libs/intl-tel-input/img/globe@2x.png similarity index 100% rename from plugins/intl-tel-input/img/globe@2x.png rename to libs/intl-tel-input/img/globe@2x.png diff --git a/plugins/intl-tel-input/img/globe@2x.webp b/libs/intl-tel-input/img/globe@2x.webp similarity index 100% rename from plugins/intl-tel-input/img/globe@2x.webp rename to libs/intl-tel-input/img/globe@2x.webp diff --git a/plugins/intl-tel-input/img/globe_light.png b/libs/intl-tel-input/img/globe_light.png similarity index 100% rename from plugins/intl-tel-input/img/globe_light.png rename to libs/intl-tel-input/img/globe_light.png diff --git a/plugins/intl-tel-input/img/globe_light.webp b/libs/intl-tel-input/img/globe_light.webp similarity index 100% rename from plugins/intl-tel-input/img/globe_light.webp rename to libs/intl-tel-input/img/globe_light.webp diff --git a/plugins/intl-tel-input/img/globe_light@2x.png b/libs/intl-tel-input/img/globe_light@2x.png similarity index 100% rename from plugins/intl-tel-input/img/globe_light@2x.png rename to libs/intl-tel-input/img/globe_light@2x.png diff --git a/plugins/intl-tel-input/img/globe_light@2x.webp b/libs/intl-tel-input/img/globe_light@2x.webp similarity index 100% rename from plugins/intl-tel-input/img/globe_light@2x.webp rename to libs/intl-tel-input/img/globe_light@2x.webp diff --git a/plugins/intl-tel-input/js/data.js b/libs/intl-tel-input/js/data.js similarity index 100% rename from plugins/intl-tel-input/js/data.js rename to libs/intl-tel-input/js/data.js diff --git a/plugins/intl-tel-input/js/data.min.js b/libs/intl-tel-input/js/data.min.js similarity index 100% rename from plugins/intl-tel-input/js/data.min.js rename to libs/intl-tel-input/js/data.min.js diff --git a/plugins/intl-tel-input/js/i18n/ar/countries.js b/libs/intl-tel-input/js/i18n/ar/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/ar/countries.js rename to libs/intl-tel-input/js/i18n/ar/countries.js diff --git a/plugins/intl-tel-input/js/i18n/ar/index.js b/libs/intl-tel-input/js/i18n/ar/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/ar/index.js rename to libs/intl-tel-input/js/i18n/ar/index.js diff --git a/plugins/intl-tel-input/js/i18n/ar/interface.js b/libs/intl-tel-input/js/i18n/ar/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/ar/interface.js rename to libs/intl-tel-input/js/i18n/ar/interface.js diff --git a/plugins/intl-tel-input/js/i18n/bg/countries.js b/libs/intl-tel-input/js/i18n/bg/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/bg/countries.js rename to libs/intl-tel-input/js/i18n/bg/countries.js diff --git a/plugins/intl-tel-input/js/i18n/bg/index.js b/libs/intl-tel-input/js/i18n/bg/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/bg/index.js rename to libs/intl-tel-input/js/i18n/bg/index.js diff --git a/plugins/intl-tel-input/js/i18n/bg/interface.js b/libs/intl-tel-input/js/i18n/bg/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/bg/interface.js rename to libs/intl-tel-input/js/i18n/bg/interface.js diff --git a/plugins/intl-tel-input/js/i18n/bn/countries.js b/libs/intl-tel-input/js/i18n/bn/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/bn/countries.js rename to libs/intl-tel-input/js/i18n/bn/countries.js diff --git a/plugins/intl-tel-input/js/i18n/bn/index.js b/libs/intl-tel-input/js/i18n/bn/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/bn/index.js rename to libs/intl-tel-input/js/i18n/bn/index.js diff --git a/plugins/intl-tel-input/js/i18n/bn/interface.js b/libs/intl-tel-input/js/i18n/bn/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/bn/interface.js rename to libs/intl-tel-input/js/i18n/bn/interface.js diff --git a/plugins/intl-tel-input/js/i18n/bs/countries.js b/libs/intl-tel-input/js/i18n/bs/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/bs/countries.js rename to libs/intl-tel-input/js/i18n/bs/countries.js diff --git a/plugins/intl-tel-input/js/i18n/bs/index.js b/libs/intl-tel-input/js/i18n/bs/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/bs/index.js rename to libs/intl-tel-input/js/i18n/bs/index.js diff --git a/plugins/intl-tel-input/js/i18n/bs/interface.js b/libs/intl-tel-input/js/i18n/bs/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/bs/interface.js rename to libs/intl-tel-input/js/i18n/bs/interface.js diff --git a/plugins/intl-tel-input/js/i18n/ca/countries.js b/libs/intl-tel-input/js/i18n/ca/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/ca/countries.js rename to libs/intl-tel-input/js/i18n/ca/countries.js diff --git a/plugins/intl-tel-input/js/i18n/ca/index.js b/libs/intl-tel-input/js/i18n/ca/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/ca/index.js rename to libs/intl-tel-input/js/i18n/ca/index.js diff --git a/plugins/intl-tel-input/js/i18n/ca/interface.js b/libs/intl-tel-input/js/i18n/ca/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/ca/interface.js rename to libs/intl-tel-input/js/i18n/ca/interface.js diff --git a/plugins/intl-tel-input/js/i18n/cs/countries.js b/libs/intl-tel-input/js/i18n/cs/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/cs/countries.js rename to libs/intl-tel-input/js/i18n/cs/countries.js diff --git a/plugins/intl-tel-input/js/i18n/cs/index.js b/libs/intl-tel-input/js/i18n/cs/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/cs/index.js rename to libs/intl-tel-input/js/i18n/cs/index.js diff --git a/plugins/intl-tel-input/js/i18n/cs/interface.js b/libs/intl-tel-input/js/i18n/cs/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/cs/interface.js rename to libs/intl-tel-input/js/i18n/cs/interface.js diff --git a/plugins/intl-tel-input/js/i18n/da/countries.js b/libs/intl-tel-input/js/i18n/da/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/da/countries.js rename to libs/intl-tel-input/js/i18n/da/countries.js diff --git a/plugins/intl-tel-input/js/i18n/da/index.js b/libs/intl-tel-input/js/i18n/da/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/da/index.js rename to libs/intl-tel-input/js/i18n/da/index.js diff --git a/plugins/intl-tel-input/js/i18n/da/interface.js b/libs/intl-tel-input/js/i18n/da/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/da/interface.js rename to libs/intl-tel-input/js/i18n/da/interface.js diff --git a/plugins/intl-tel-input/js/i18n/de/countries.js b/libs/intl-tel-input/js/i18n/de/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/de/countries.js rename to libs/intl-tel-input/js/i18n/de/countries.js diff --git a/plugins/intl-tel-input/js/i18n/de/index.js b/libs/intl-tel-input/js/i18n/de/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/de/index.js rename to libs/intl-tel-input/js/i18n/de/index.js diff --git a/plugins/intl-tel-input/js/i18n/de/interface.js b/libs/intl-tel-input/js/i18n/de/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/de/interface.js rename to libs/intl-tel-input/js/i18n/de/interface.js diff --git a/plugins/intl-tel-input/js/i18n/el/countries.js b/libs/intl-tel-input/js/i18n/el/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/el/countries.js rename to libs/intl-tel-input/js/i18n/el/countries.js diff --git a/plugins/intl-tel-input/js/i18n/el/index.js b/libs/intl-tel-input/js/i18n/el/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/el/index.js rename to libs/intl-tel-input/js/i18n/el/index.js diff --git a/plugins/intl-tel-input/js/i18n/el/interface.js b/libs/intl-tel-input/js/i18n/el/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/el/interface.js rename to libs/intl-tel-input/js/i18n/el/interface.js diff --git a/plugins/intl-tel-input/js/i18n/en/countries.js b/libs/intl-tel-input/js/i18n/en/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/en/countries.js rename to libs/intl-tel-input/js/i18n/en/countries.js diff --git a/plugins/intl-tel-input/js/i18n/en/index.js b/libs/intl-tel-input/js/i18n/en/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/en/index.js rename to libs/intl-tel-input/js/i18n/en/index.js diff --git a/plugins/intl-tel-input/js/i18n/en/interface.js b/libs/intl-tel-input/js/i18n/en/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/en/interface.js rename to libs/intl-tel-input/js/i18n/en/interface.js diff --git a/plugins/intl-tel-input/js/i18n/es/countries.js b/libs/intl-tel-input/js/i18n/es/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/es/countries.js rename to libs/intl-tel-input/js/i18n/es/countries.js diff --git a/plugins/intl-tel-input/js/i18n/es/index.js b/libs/intl-tel-input/js/i18n/es/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/es/index.js rename to libs/intl-tel-input/js/i18n/es/index.js diff --git a/plugins/intl-tel-input/js/i18n/es/interface.js b/libs/intl-tel-input/js/i18n/es/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/es/interface.js rename to libs/intl-tel-input/js/i18n/es/interface.js diff --git a/plugins/intl-tel-input/js/i18n/fa/countries.js b/libs/intl-tel-input/js/i18n/fa/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/fa/countries.js rename to libs/intl-tel-input/js/i18n/fa/countries.js diff --git a/plugins/intl-tel-input/js/i18n/fa/index.js b/libs/intl-tel-input/js/i18n/fa/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/fa/index.js rename to libs/intl-tel-input/js/i18n/fa/index.js diff --git a/plugins/intl-tel-input/js/i18n/fa/interface.js b/libs/intl-tel-input/js/i18n/fa/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/fa/interface.js rename to libs/intl-tel-input/js/i18n/fa/interface.js diff --git a/plugins/intl-tel-input/js/i18n/fi/countries.js b/libs/intl-tel-input/js/i18n/fi/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/fi/countries.js rename to libs/intl-tel-input/js/i18n/fi/countries.js diff --git a/plugins/intl-tel-input/js/i18n/fi/index.js b/libs/intl-tel-input/js/i18n/fi/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/fi/index.js rename to libs/intl-tel-input/js/i18n/fi/index.js diff --git a/plugins/intl-tel-input/js/i18n/fi/interface.js b/libs/intl-tel-input/js/i18n/fi/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/fi/interface.js rename to libs/intl-tel-input/js/i18n/fi/interface.js diff --git a/plugins/intl-tel-input/js/i18n/fr/countries.js b/libs/intl-tel-input/js/i18n/fr/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/fr/countries.js rename to libs/intl-tel-input/js/i18n/fr/countries.js diff --git a/plugins/intl-tel-input/js/i18n/fr/index.js b/libs/intl-tel-input/js/i18n/fr/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/fr/index.js rename to libs/intl-tel-input/js/i18n/fr/index.js diff --git a/plugins/intl-tel-input/js/i18n/fr/interface.js b/libs/intl-tel-input/js/i18n/fr/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/fr/interface.js rename to libs/intl-tel-input/js/i18n/fr/interface.js diff --git a/plugins/intl-tel-input/js/i18n/hi/countries.js b/libs/intl-tel-input/js/i18n/hi/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/hi/countries.js rename to libs/intl-tel-input/js/i18n/hi/countries.js diff --git a/plugins/intl-tel-input/js/i18n/hi/index.js b/libs/intl-tel-input/js/i18n/hi/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/hi/index.js rename to libs/intl-tel-input/js/i18n/hi/index.js diff --git a/plugins/intl-tel-input/js/i18n/hi/interface.js b/libs/intl-tel-input/js/i18n/hi/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/hi/interface.js rename to libs/intl-tel-input/js/i18n/hi/interface.js diff --git a/plugins/intl-tel-input/js/i18n/hr/countries.js b/libs/intl-tel-input/js/i18n/hr/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/hr/countries.js rename to libs/intl-tel-input/js/i18n/hr/countries.js diff --git a/plugins/intl-tel-input/js/i18n/hr/index.js b/libs/intl-tel-input/js/i18n/hr/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/hr/index.js rename to libs/intl-tel-input/js/i18n/hr/index.js diff --git a/plugins/intl-tel-input/js/i18n/hr/interface.js b/libs/intl-tel-input/js/i18n/hr/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/hr/interface.js rename to libs/intl-tel-input/js/i18n/hr/interface.js diff --git a/plugins/intl-tel-input/js/i18n/hu/countries.js b/libs/intl-tel-input/js/i18n/hu/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/hu/countries.js rename to libs/intl-tel-input/js/i18n/hu/countries.js diff --git a/plugins/intl-tel-input/js/i18n/hu/index.js b/libs/intl-tel-input/js/i18n/hu/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/hu/index.js rename to libs/intl-tel-input/js/i18n/hu/index.js diff --git a/plugins/intl-tel-input/js/i18n/hu/interface.js b/libs/intl-tel-input/js/i18n/hu/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/hu/interface.js rename to libs/intl-tel-input/js/i18n/hu/interface.js diff --git a/plugins/intl-tel-input/js/i18n/id/countries.js b/libs/intl-tel-input/js/i18n/id/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/id/countries.js rename to libs/intl-tel-input/js/i18n/id/countries.js diff --git a/plugins/intl-tel-input/js/i18n/id/index.js b/libs/intl-tel-input/js/i18n/id/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/id/index.js rename to libs/intl-tel-input/js/i18n/id/index.js diff --git a/plugins/intl-tel-input/js/i18n/id/interface.js b/libs/intl-tel-input/js/i18n/id/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/id/interface.js rename to libs/intl-tel-input/js/i18n/id/interface.js diff --git a/plugins/intl-tel-input/js/i18n/index.js b/libs/intl-tel-input/js/i18n/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/index.js rename to libs/intl-tel-input/js/i18n/index.js diff --git a/plugins/intl-tel-input/js/i18n/it/countries.js b/libs/intl-tel-input/js/i18n/it/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/it/countries.js rename to libs/intl-tel-input/js/i18n/it/countries.js diff --git a/plugins/intl-tel-input/js/i18n/it/index.js b/libs/intl-tel-input/js/i18n/it/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/it/index.js rename to libs/intl-tel-input/js/i18n/it/index.js diff --git a/plugins/intl-tel-input/js/i18n/it/interface.js b/libs/intl-tel-input/js/i18n/it/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/it/interface.js rename to libs/intl-tel-input/js/i18n/it/interface.js diff --git a/plugins/intl-tel-input/js/i18n/ja/countries.js b/libs/intl-tel-input/js/i18n/ja/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/ja/countries.js rename to libs/intl-tel-input/js/i18n/ja/countries.js diff --git a/plugins/intl-tel-input/js/i18n/ja/index.js b/libs/intl-tel-input/js/i18n/ja/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/ja/index.js rename to libs/intl-tel-input/js/i18n/ja/index.js diff --git a/plugins/intl-tel-input/js/i18n/ja/interface.js b/libs/intl-tel-input/js/i18n/ja/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/ja/interface.js rename to libs/intl-tel-input/js/i18n/ja/interface.js diff --git a/plugins/intl-tel-input/js/i18n/ko/countries.js b/libs/intl-tel-input/js/i18n/ko/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/ko/countries.js rename to libs/intl-tel-input/js/i18n/ko/countries.js diff --git a/plugins/intl-tel-input/js/i18n/ko/index.js b/libs/intl-tel-input/js/i18n/ko/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/ko/index.js rename to libs/intl-tel-input/js/i18n/ko/index.js diff --git a/plugins/intl-tel-input/js/i18n/ko/interface.js b/libs/intl-tel-input/js/i18n/ko/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/ko/interface.js rename to libs/intl-tel-input/js/i18n/ko/interface.js diff --git a/plugins/intl-tel-input/js/i18n/mr/countries.js b/libs/intl-tel-input/js/i18n/mr/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/mr/countries.js rename to libs/intl-tel-input/js/i18n/mr/countries.js diff --git a/plugins/intl-tel-input/js/i18n/mr/index.js b/libs/intl-tel-input/js/i18n/mr/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/mr/index.js rename to libs/intl-tel-input/js/i18n/mr/index.js diff --git a/plugins/intl-tel-input/js/i18n/mr/interface.js b/libs/intl-tel-input/js/i18n/mr/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/mr/interface.js rename to libs/intl-tel-input/js/i18n/mr/interface.js diff --git a/plugins/intl-tel-input/js/i18n/nl/countries.js b/libs/intl-tel-input/js/i18n/nl/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/nl/countries.js rename to libs/intl-tel-input/js/i18n/nl/countries.js diff --git a/plugins/intl-tel-input/js/i18n/nl/index.js b/libs/intl-tel-input/js/i18n/nl/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/nl/index.js rename to libs/intl-tel-input/js/i18n/nl/index.js diff --git a/plugins/intl-tel-input/js/i18n/nl/interface.js b/libs/intl-tel-input/js/i18n/nl/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/nl/interface.js rename to libs/intl-tel-input/js/i18n/nl/interface.js diff --git a/plugins/intl-tel-input/js/i18n/no/countries.js b/libs/intl-tel-input/js/i18n/no/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/no/countries.js rename to libs/intl-tel-input/js/i18n/no/countries.js diff --git a/plugins/intl-tel-input/js/i18n/no/index.js b/libs/intl-tel-input/js/i18n/no/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/no/index.js rename to libs/intl-tel-input/js/i18n/no/index.js diff --git a/plugins/intl-tel-input/js/i18n/no/interface.js b/libs/intl-tel-input/js/i18n/no/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/no/interface.js rename to libs/intl-tel-input/js/i18n/no/interface.js diff --git a/plugins/intl-tel-input/js/i18n/pl/countries.js b/libs/intl-tel-input/js/i18n/pl/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/pl/countries.js rename to libs/intl-tel-input/js/i18n/pl/countries.js diff --git a/plugins/intl-tel-input/js/i18n/pl/index.js b/libs/intl-tel-input/js/i18n/pl/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/pl/index.js rename to libs/intl-tel-input/js/i18n/pl/index.js diff --git a/plugins/intl-tel-input/js/i18n/pl/interface.js b/libs/intl-tel-input/js/i18n/pl/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/pl/interface.js rename to libs/intl-tel-input/js/i18n/pl/interface.js diff --git a/plugins/intl-tel-input/js/i18n/pt/countries.js b/libs/intl-tel-input/js/i18n/pt/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/pt/countries.js rename to libs/intl-tel-input/js/i18n/pt/countries.js diff --git a/plugins/intl-tel-input/js/i18n/pt/index.js b/libs/intl-tel-input/js/i18n/pt/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/pt/index.js rename to libs/intl-tel-input/js/i18n/pt/index.js diff --git a/plugins/intl-tel-input/js/i18n/pt/interface.js b/libs/intl-tel-input/js/i18n/pt/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/pt/interface.js rename to libs/intl-tel-input/js/i18n/pt/interface.js diff --git a/plugins/intl-tel-input/js/i18n/ro/countries.js b/libs/intl-tel-input/js/i18n/ro/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/ro/countries.js rename to libs/intl-tel-input/js/i18n/ro/countries.js diff --git a/plugins/intl-tel-input/js/i18n/ro/index.js b/libs/intl-tel-input/js/i18n/ro/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/ro/index.js rename to libs/intl-tel-input/js/i18n/ro/index.js diff --git a/plugins/intl-tel-input/js/i18n/ro/interface.js b/libs/intl-tel-input/js/i18n/ro/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/ro/interface.js rename to libs/intl-tel-input/js/i18n/ro/interface.js diff --git a/plugins/intl-tel-input/js/i18n/ru/countries.js b/libs/intl-tel-input/js/i18n/ru/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/ru/countries.js rename to libs/intl-tel-input/js/i18n/ru/countries.js diff --git a/plugins/intl-tel-input/js/i18n/ru/index.js b/libs/intl-tel-input/js/i18n/ru/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/ru/index.js rename to libs/intl-tel-input/js/i18n/ru/index.js diff --git a/plugins/intl-tel-input/js/i18n/ru/interface.js b/libs/intl-tel-input/js/i18n/ru/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/ru/interface.js rename to libs/intl-tel-input/js/i18n/ru/interface.js diff --git a/plugins/intl-tel-input/js/i18n/sk/countries.js b/libs/intl-tel-input/js/i18n/sk/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/sk/countries.js rename to libs/intl-tel-input/js/i18n/sk/countries.js diff --git a/plugins/intl-tel-input/js/i18n/sk/index.js b/libs/intl-tel-input/js/i18n/sk/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/sk/index.js rename to libs/intl-tel-input/js/i18n/sk/index.js diff --git a/plugins/intl-tel-input/js/i18n/sk/interface.js b/libs/intl-tel-input/js/i18n/sk/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/sk/interface.js rename to libs/intl-tel-input/js/i18n/sk/interface.js diff --git a/plugins/intl-tel-input/js/i18n/sv/countries.js b/libs/intl-tel-input/js/i18n/sv/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/sv/countries.js rename to libs/intl-tel-input/js/i18n/sv/countries.js diff --git a/plugins/intl-tel-input/js/i18n/sv/index.js b/libs/intl-tel-input/js/i18n/sv/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/sv/index.js rename to libs/intl-tel-input/js/i18n/sv/index.js diff --git a/plugins/intl-tel-input/js/i18n/sv/interface.js b/libs/intl-tel-input/js/i18n/sv/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/sv/interface.js rename to libs/intl-tel-input/js/i18n/sv/interface.js diff --git a/plugins/intl-tel-input/js/i18n/te/countries.js b/libs/intl-tel-input/js/i18n/te/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/te/countries.js rename to libs/intl-tel-input/js/i18n/te/countries.js diff --git a/plugins/intl-tel-input/js/i18n/te/index.js b/libs/intl-tel-input/js/i18n/te/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/te/index.js rename to libs/intl-tel-input/js/i18n/te/index.js diff --git a/plugins/intl-tel-input/js/i18n/te/interface.js b/libs/intl-tel-input/js/i18n/te/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/te/interface.js rename to libs/intl-tel-input/js/i18n/te/interface.js diff --git a/plugins/intl-tel-input/js/i18n/th/countries.js b/libs/intl-tel-input/js/i18n/th/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/th/countries.js rename to libs/intl-tel-input/js/i18n/th/countries.js diff --git a/plugins/intl-tel-input/js/i18n/th/index.js b/libs/intl-tel-input/js/i18n/th/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/th/index.js rename to libs/intl-tel-input/js/i18n/th/index.js diff --git a/plugins/intl-tel-input/js/i18n/th/interface.js b/libs/intl-tel-input/js/i18n/th/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/th/interface.js rename to libs/intl-tel-input/js/i18n/th/interface.js diff --git a/plugins/intl-tel-input/js/i18n/tr/countries.js b/libs/intl-tel-input/js/i18n/tr/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/tr/countries.js rename to libs/intl-tel-input/js/i18n/tr/countries.js diff --git a/plugins/intl-tel-input/js/i18n/tr/index.js b/libs/intl-tel-input/js/i18n/tr/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/tr/index.js rename to libs/intl-tel-input/js/i18n/tr/index.js diff --git a/plugins/intl-tel-input/js/i18n/tr/interface.js b/libs/intl-tel-input/js/i18n/tr/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/tr/interface.js rename to libs/intl-tel-input/js/i18n/tr/interface.js diff --git a/plugins/intl-tel-input/js/i18n/uk/countries.js b/libs/intl-tel-input/js/i18n/uk/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/uk/countries.js rename to libs/intl-tel-input/js/i18n/uk/countries.js diff --git a/plugins/intl-tel-input/js/i18n/uk/index.js b/libs/intl-tel-input/js/i18n/uk/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/uk/index.js rename to libs/intl-tel-input/js/i18n/uk/index.js diff --git a/plugins/intl-tel-input/js/i18n/uk/interface.js b/libs/intl-tel-input/js/i18n/uk/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/uk/interface.js rename to libs/intl-tel-input/js/i18n/uk/interface.js diff --git a/plugins/intl-tel-input/js/i18n/ur/countries.js b/libs/intl-tel-input/js/i18n/ur/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/ur/countries.js rename to libs/intl-tel-input/js/i18n/ur/countries.js diff --git a/plugins/intl-tel-input/js/i18n/ur/index.js b/libs/intl-tel-input/js/i18n/ur/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/ur/index.js rename to libs/intl-tel-input/js/i18n/ur/index.js diff --git a/plugins/intl-tel-input/js/i18n/ur/interface.js b/libs/intl-tel-input/js/i18n/ur/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/ur/interface.js rename to libs/intl-tel-input/js/i18n/ur/interface.js diff --git a/plugins/intl-tel-input/js/i18n/vi/countries.js b/libs/intl-tel-input/js/i18n/vi/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/vi/countries.js rename to libs/intl-tel-input/js/i18n/vi/countries.js diff --git a/plugins/intl-tel-input/js/i18n/vi/index.js b/libs/intl-tel-input/js/i18n/vi/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/vi/index.js rename to libs/intl-tel-input/js/i18n/vi/index.js diff --git a/plugins/intl-tel-input/js/i18n/vi/interface.js b/libs/intl-tel-input/js/i18n/vi/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/vi/interface.js rename to libs/intl-tel-input/js/i18n/vi/interface.js diff --git a/plugins/intl-tel-input/js/i18n/zh/countries.js b/libs/intl-tel-input/js/i18n/zh/countries.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/zh/countries.js rename to libs/intl-tel-input/js/i18n/zh/countries.js diff --git a/plugins/intl-tel-input/js/i18n/zh/index.js b/libs/intl-tel-input/js/i18n/zh/index.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/zh/index.js rename to libs/intl-tel-input/js/i18n/zh/index.js diff --git a/plugins/intl-tel-input/js/i18n/zh/interface.js b/libs/intl-tel-input/js/i18n/zh/interface.js similarity index 100% rename from plugins/intl-tel-input/js/i18n/zh/interface.js rename to libs/intl-tel-input/js/i18n/zh/interface.js diff --git a/plugins/intl-tel-input/js/intlTelInput.d.ts b/libs/intl-tel-input/js/intlTelInput.d.ts similarity index 100% rename from plugins/intl-tel-input/js/intlTelInput.d.ts rename to libs/intl-tel-input/js/intlTelInput.d.ts diff --git a/plugins/intl-tel-input/js/intlTelInput.js b/libs/intl-tel-input/js/intlTelInput.js similarity index 100% rename from plugins/intl-tel-input/js/intlTelInput.js rename to libs/intl-tel-input/js/intlTelInput.js diff --git a/plugins/intl-tel-input/js/intlTelInput.min.js b/libs/intl-tel-input/js/intlTelInput.min.js similarity index 100% rename from plugins/intl-tel-input/js/intlTelInput.min.js rename to libs/intl-tel-input/js/intlTelInput.min.js diff --git a/plugins/intl-tel-input/js/intlTelInputWithUtils.js b/libs/intl-tel-input/js/intlTelInputWithUtils.js similarity index 100% rename from plugins/intl-tel-input/js/intlTelInputWithUtils.js rename to libs/intl-tel-input/js/intlTelInputWithUtils.js diff --git a/plugins/intl-tel-input/js/intlTelInputWithUtils.min.js b/libs/intl-tel-input/js/intlTelInputWithUtils.min.js similarity index 100% rename from plugins/intl-tel-input/js/intlTelInputWithUtils.min.js rename to libs/intl-tel-input/js/intlTelInputWithUtils.min.js diff --git a/plugins/intl-tel-input/js/utils.js b/libs/intl-tel-input/js/utils.js similarity index 100% rename from plugins/intl-tel-input/js/utils.js rename to libs/intl-tel-input/js/utils.js diff --git a/plugins/jquery-ui/VERSION b/libs/jquery-ui/VERSION similarity index 100% rename from plugins/jquery-ui/VERSION rename to libs/jquery-ui/VERSION diff --git a/plugins/jquery-ui/jquery-ui.min.css b/libs/jquery-ui/jquery-ui.min.css similarity index 100% rename from plugins/jquery-ui/jquery-ui.min.css rename to libs/jquery-ui/jquery-ui.min.css diff --git a/plugins/jquery-ui/jquery-ui.min.js b/libs/jquery-ui/jquery-ui.min.js similarity index 100% rename from plugins/jquery-ui/jquery-ui.min.js rename to libs/jquery-ui/jquery-ui.min.js diff --git a/plugins/jquery/jquery.min.js b/libs/jquery/jquery.min.js similarity index 100% rename from plugins/jquery/jquery.min.js rename to libs/jquery/jquery.min.js diff --git a/plugins/moment/moment.min.js b/libs/moment/moment.min.js similarity index 100% rename from plugins/moment/moment.min.js rename to libs/moment/moment.min.js diff --git a/plugins/pdfmake/fonts/Roboto/Roboto-Italic.ttf b/libs/pdfmake/fonts/Roboto/Roboto-Italic.ttf similarity index 100% rename from plugins/pdfmake/fonts/Roboto/Roboto-Italic.ttf rename to libs/pdfmake/fonts/Roboto/Roboto-Italic.ttf diff --git a/plugins/pdfmake/fonts/Roboto/Roboto-Medium.ttf b/libs/pdfmake/fonts/Roboto/Roboto-Medium.ttf similarity index 100% rename from plugins/pdfmake/fonts/Roboto/Roboto-Medium.ttf rename to libs/pdfmake/fonts/Roboto/Roboto-Medium.ttf diff --git a/plugins/pdfmake/fonts/Roboto/Roboto-MediumItalic.ttf b/libs/pdfmake/fonts/Roboto/Roboto-MediumItalic.ttf similarity index 100% rename from plugins/pdfmake/fonts/Roboto/Roboto-MediumItalic.ttf rename to libs/pdfmake/fonts/Roboto/Roboto-MediumItalic.ttf diff --git a/plugins/pdfmake/fonts/Roboto/Roboto-Regular.ttf b/libs/pdfmake/fonts/Roboto/Roboto-Regular.ttf similarity index 100% rename from plugins/pdfmake/fonts/Roboto/Roboto-Regular.ttf rename to libs/pdfmake/fonts/Roboto/Roboto-Regular.ttf diff --git a/plugins/pdfmake/pdfmake.min.js b/libs/pdfmake/pdfmake.min.js similarity index 100% rename from plugins/pdfmake/pdfmake.min.js rename to libs/pdfmake/pdfmake.min.js diff --git a/plugins/pdfmake/vfs_fonts.js b/libs/pdfmake/vfs_fonts.js similarity index 100% rename from plugins/pdfmake/vfs_fonts.js rename to libs/pdfmake/vfs_fonts.js diff --git a/plugins/popper/popper-utils.min.js b/libs/popper/popper-utils.min.js similarity index 100% rename from plugins/popper/popper-utils.min.js rename to libs/popper/popper-utils.min.js diff --git a/plugins/popper/popper.min.js b/libs/popper/popper.min.js similarity index 100% rename from plugins/popper/popper.min.js rename to libs/popper/popper.min.js diff --git a/plugins/select2-bootstrap4-theme/select2-bootstrap4.min.css b/libs/select2-bootstrap4-theme/select2-bootstrap4.min.css similarity index 100% rename from plugins/select2-bootstrap4-theme/select2-bootstrap4.min.css rename to libs/select2-bootstrap4-theme/select2-bootstrap4.min.css diff --git a/plugins/select2/css/select2.min.css b/libs/select2/css/select2.min.css similarity index 100% rename from plugins/select2/css/select2.min.css rename to libs/select2/css/select2.min.css diff --git a/plugins/select2/js/i18n/af.js b/libs/select2/js/i18n/af.js similarity index 100% rename from plugins/select2/js/i18n/af.js rename to libs/select2/js/i18n/af.js diff --git a/plugins/select2/js/i18n/ar.js b/libs/select2/js/i18n/ar.js similarity index 100% rename from plugins/select2/js/i18n/ar.js rename to libs/select2/js/i18n/ar.js diff --git a/plugins/select2/js/i18n/az.js b/libs/select2/js/i18n/az.js similarity index 100% rename from plugins/select2/js/i18n/az.js rename to libs/select2/js/i18n/az.js diff --git a/plugins/select2/js/i18n/bg.js b/libs/select2/js/i18n/bg.js similarity index 100% rename from plugins/select2/js/i18n/bg.js rename to libs/select2/js/i18n/bg.js diff --git a/plugins/select2/js/i18n/bn.js b/libs/select2/js/i18n/bn.js similarity index 100% rename from plugins/select2/js/i18n/bn.js rename to libs/select2/js/i18n/bn.js diff --git a/plugins/select2/js/i18n/bs.js b/libs/select2/js/i18n/bs.js similarity index 100% rename from plugins/select2/js/i18n/bs.js rename to libs/select2/js/i18n/bs.js diff --git a/plugins/select2/js/i18n/build.txt b/libs/select2/js/i18n/build.txt similarity index 100% rename from plugins/select2/js/i18n/build.txt rename to libs/select2/js/i18n/build.txt diff --git a/plugins/select2/js/i18n/ca.js b/libs/select2/js/i18n/ca.js similarity index 100% rename from plugins/select2/js/i18n/ca.js rename to libs/select2/js/i18n/ca.js diff --git a/plugins/select2/js/i18n/cs.js b/libs/select2/js/i18n/cs.js similarity index 100% rename from plugins/select2/js/i18n/cs.js rename to libs/select2/js/i18n/cs.js diff --git a/plugins/select2/js/i18n/da.js b/libs/select2/js/i18n/da.js similarity index 100% rename from plugins/select2/js/i18n/da.js rename to libs/select2/js/i18n/da.js diff --git a/plugins/select2/js/i18n/de.js b/libs/select2/js/i18n/de.js similarity index 100% rename from plugins/select2/js/i18n/de.js rename to libs/select2/js/i18n/de.js diff --git a/plugins/select2/js/i18n/dsb.js b/libs/select2/js/i18n/dsb.js similarity index 100% rename from plugins/select2/js/i18n/dsb.js rename to libs/select2/js/i18n/dsb.js diff --git a/plugins/select2/js/i18n/el.js b/libs/select2/js/i18n/el.js similarity index 100% rename from plugins/select2/js/i18n/el.js rename to libs/select2/js/i18n/el.js diff --git a/plugins/select2/js/i18n/en.js b/libs/select2/js/i18n/en.js similarity index 100% rename from plugins/select2/js/i18n/en.js rename to libs/select2/js/i18n/en.js diff --git a/plugins/select2/js/i18n/es.js b/libs/select2/js/i18n/es.js similarity index 100% rename from plugins/select2/js/i18n/es.js rename to libs/select2/js/i18n/es.js diff --git a/plugins/select2/js/i18n/et.js b/libs/select2/js/i18n/et.js similarity index 100% rename from plugins/select2/js/i18n/et.js rename to libs/select2/js/i18n/et.js diff --git a/plugins/select2/js/i18n/eu.js b/libs/select2/js/i18n/eu.js similarity index 100% rename from plugins/select2/js/i18n/eu.js rename to libs/select2/js/i18n/eu.js diff --git a/plugins/select2/js/i18n/fa.js b/libs/select2/js/i18n/fa.js similarity index 100% rename from plugins/select2/js/i18n/fa.js rename to libs/select2/js/i18n/fa.js diff --git a/plugins/select2/js/i18n/fi.js b/libs/select2/js/i18n/fi.js similarity index 100% rename from plugins/select2/js/i18n/fi.js rename to libs/select2/js/i18n/fi.js diff --git a/plugins/select2/js/i18n/fr.js b/libs/select2/js/i18n/fr.js similarity index 100% rename from plugins/select2/js/i18n/fr.js rename to libs/select2/js/i18n/fr.js diff --git a/plugins/select2/js/i18n/gl.js b/libs/select2/js/i18n/gl.js similarity index 100% rename from plugins/select2/js/i18n/gl.js rename to libs/select2/js/i18n/gl.js diff --git a/plugins/select2/js/i18n/he.js b/libs/select2/js/i18n/he.js similarity index 100% rename from plugins/select2/js/i18n/he.js rename to libs/select2/js/i18n/he.js diff --git a/plugins/select2/js/i18n/hi.js b/libs/select2/js/i18n/hi.js similarity index 100% rename from plugins/select2/js/i18n/hi.js rename to libs/select2/js/i18n/hi.js diff --git a/plugins/select2/js/i18n/hr.js b/libs/select2/js/i18n/hr.js similarity index 100% rename from plugins/select2/js/i18n/hr.js rename to libs/select2/js/i18n/hr.js diff --git a/plugins/select2/js/i18n/hsb.js b/libs/select2/js/i18n/hsb.js similarity index 100% rename from plugins/select2/js/i18n/hsb.js rename to libs/select2/js/i18n/hsb.js diff --git a/plugins/select2/js/i18n/hu.js b/libs/select2/js/i18n/hu.js similarity index 100% rename from plugins/select2/js/i18n/hu.js rename to libs/select2/js/i18n/hu.js diff --git a/plugins/select2/js/i18n/hy.js b/libs/select2/js/i18n/hy.js similarity index 100% rename from plugins/select2/js/i18n/hy.js rename to libs/select2/js/i18n/hy.js diff --git a/plugins/select2/js/i18n/id.js b/libs/select2/js/i18n/id.js similarity index 100% rename from plugins/select2/js/i18n/id.js rename to libs/select2/js/i18n/id.js diff --git a/plugins/select2/js/i18n/is.js b/libs/select2/js/i18n/is.js similarity index 100% rename from plugins/select2/js/i18n/is.js rename to libs/select2/js/i18n/is.js diff --git a/plugins/select2/js/i18n/it.js b/libs/select2/js/i18n/it.js similarity index 100% rename from plugins/select2/js/i18n/it.js rename to libs/select2/js/i18n/it.js diff --git a/plugins/select2/js/i18n/ja.js b/libs/select2/js/i18n/ja.js similarity index 100% rename from plugins/select2/js/i18n/ja.js rename to libs/select2/js/i18n/ja.js diff --git a/plugins/select2/js/i18n/ka.js b/libs/select2/js/i18n/ka.js similarity index 100% rename from plugins/select2/js/i18n/ka.js rename to libs/select2/js/i18n/ka.js diff --git a/plugins/select2/js/i18n/km.js b/libs/select2/js/i18n/km.js similarity index 100% rename from plugins/select2/js/i18n/km.js rename to libs/select2/js/i18n/km.js diff --git a/plugins/select2/js/i18n/ko.js b/libs/select2/js/i18n/ko.js similarity index 100% rename from plugins/select2/js/i18n/ko.js rename to libs/select2/js/i18n/ko.js diff --git a/plugins/select2/js/i18n/lt.js b/libs/select2/js/i18n/lt.js similarity index 100% rename from plugins/select2/js/i18n/lt.js rename to libs/select2/js/i18n/lt.js diff --git a/plugins/select2/js/i18n/lv.js b/libs/select2/js/i18n/lv.js similarity index 100% rename from plugins/select2/js/i18n/lv.js rename to libs/select2/js/i18n/lv.js diff --git a/plugins/select2/js/i18n/mk.js b/libs/select2/js/i18n/mk.js similarity index 100% rename from plugins/select2/js/i18n/mk.js rename to libs/select2/js/i18n/mk.js diff --git a/plugins/select2/js/i18n/ms.js b/libs/select2/js/i18n/ms.js similarity index 100% rename from plugins/select2/js/i18n/ms.js rename to libs/select2/js/i18n/ms.js diff --git a/plugins/select2/js/i18n/nb.js b/libs/select2/js/i18n/nb.js similarity index 100% rename from plugins/select2/js/i18n/nb.js rename to libs/select2/js/i18n/nb.js diff --git a/plugins/select2/js/i18n/ne.js b/libs/select2/js/i18n/ne.js similarity index 100% rename from plugins/select2/js/i18n/ne.js rename to libs/select2/js/i18n/ne.js diff --git a/plugins/select2/js/i18n/nl.js b/libs/select2/js/i18n/nl.js similarity index 100% rename from plugins/select2/js/i18n/nl.js rename to libs/select2/js/i18n/nl.js diff --git a/plugins/select2/js/i18n/pl.js b/libs/select2/js/i18n/pl.js similarity index 100% rename from plugins/select2/js/i18n/pl.js rename to libs/select2/js/i18n/pl.js diff --git a/plugins/select2/js/i18n/ps.js b/libs/select2/js/i18n/ps.js similarity index 100% rename from plugins/select2/js/i18n/ps.js rename to libs/select2/js/i18n/ps.js diff --git a/plugins/select2/js/i18n/pt-BR.js b/libs/select2/js/i18n/pt-BR.js similarity index 100% rename from plugins/select2/js/i18n/pt-BR.js rename to libs/select2/js/i18n/pt-BR.js diff --git a/plugins/select2/js/i18n/pt.js b/libs/select2/js/i18n/pt.js similarity index 100% rename from plugins/select2/js/i18n/pt.js rename to libs/select2/js/i18n/pt.js diff --git a/plugins/select2/js/i18n/ro.js b/libs/select2/js/i18n/ro.js similarity index 100% rename from plugins/select2/js/i18n/ro.js rename to libs/select2/js/i18n/ro.js diff --git a/plugins/select2/js/i18n/ru.js b/libs/select2/js/i18n/ru.js similarity index 100% rename from plugins/select2/js/i18n/ru.js rename to libs/select2/js/i18n/ru.js diff --git a/plugins/select2/js/i18n/sk.js b/libs/select2/js/i18n/sk.js similarity index 100% rename from plugins/select2/js/i18n/sk.js rename to libs/select2/js/i18n/sk.js diff --git a/plugins/select2/js/i18n/sl.js b/libs/select2/js/i18n/sl.js similarity index 100% rename from plugins/select2/js/i18n/sl.js rename to libs/select2/js/i18n/sl.js diff --git a/plugins/select2/js/i18n/sq.js b/libs/select2/js/i18n/sq.js similarity index 100% rename from plugins/select2/js/i18n/sq.js rename to libs/select2/js/i18n/sq.js diff --git a/plugins/select2/js/i18n/sr-Cyrl.js b/libs/select2/js/i18n/sr-Cyrl.js similarity index 100% rename from plugins/select2/js/i18n/sr-Cyrl.js rename to libs/select2/js/i18n/sr-Cyrl.js diff --git a/plugins/select2/js/i18n/sr.js b/libs/select2/js/i18n/sr.js similarity index 100% rename from plugins/select2/js/i18n/sr.js rename to libs/select2/js/i18n/sr.js diff --git a/plugins/select2/js/i18n/sv.js b/libs/select2/js/i18n/sv.js similarity index 100% rename from plugins/select2/js/i18n/sv.js rename to libs/select2/js/i18n/sv.js diff --git a/plugins/select2/js/i18n/th.js b/libs/select2/js/i18n/th.js similarity index 100% rename from plugins/select2/js/i18n/th.js rename to libs/select2/js/i18n/th.js diff --git a/plugins/select2/js/i18n/tk.js b/libs/select2/js/i18n/tk.js similarity index 100% rename from plugins/select2/js/i18n/tk.js rename to libs/select2/js/i18n/tk.js diff --git a/plugins/select2/js/i18n/tr.js b/libs/select2/js/i18n/tr.js similarity index 100% rename from plugins/select2/js/i18n/tr.js rename to libs/select2/js/i18n/tr.js diff --git a/plugins/select2/js/i18n/uk.js b/libs/select2/js/i18n/uk.js similarity index 100% rename from plugins/select2/js/i18n/uk.js rename to libs/select2/js/i18n/uk.js diff --git a/plugins/select2/js/i18n/vi.js b/libs/select2/js/i18n/vi.js similarity index 100% rename from plugins/select2/js/i18n/vi.js rename to libs/select2/js/i18n/vi.js diff --git a/plugins/select2/js/i18n/zh-CN.js b/libs/select2/js/i18n/zh-CN.js similarity index 100% rename from plugins/select2/js/i18n/zh-CN.js rename to libs/select2/js/i18n/zh-CN.js diff --git a/plugins/select2/js/i18n/zh-TW.js b/libs/select2/js/i18n/zh-TW.js similarity index 100% rename from plugins/select2/js/i18n/zh-TW.js rename to libs/select2/js/i18n/zh-TW.js diff --git a/plugins/select2/js/select2.full.min.js b/libs/select2/js/select2.full.min.js similarity index 100% rename from plugins/select2/js/select2.full.min.js rename to libs/select2/js/select2.full.min.js diff --git a/plugins/select2/js/select2.min.js b/libs/select2/js/select2.min.js similarity index 100% rename from plugins/select2/js/select2.min.js rename to libs/select2/js/select2.min.js diff --git a/plugins/stripe-php/.claude/CLAUDE.md b/libs/stripe-php/.claude/CLAUDE.md similarity index 100% rename from plugins/stripe-php/.claude/CLAUDE.md rename to libs/stripe-php/.claude/CLAUDE.md diff --git a/plugins/stripe-php/.gitignore b/libs/stripe-php/.gitignore similarity index 100% rename from plugins/stripe-php/.gitignore rename to libs/stripe-php/.gitignore diff --git a/plugins/stripe-php/CHANGELOG.md b/libs/stripe-php/CHANGELOG.md similarity index 100% rename from plugins/stripe-php/CHANGELOG.md rename to libs/stripe-php/CHANGELOG.md diff --git a/plugins/stripe-php/CODEGEN_VERSION b/libs/stripe-php/CODEGEN_VERSION similarity index 100% rename from plugins/stripe-php/CODEGEN_VERSION rename to libs/stripe-php/CODEGEN_VERSION diff --git a/plugins/stripe-php/CONTRIBUTING.md b/libs/stripe-php/CONTRIBUTING.md similarity index 100% rename from plugins/stripe-php/CONTRIBUTING.md rename to libs/stripe-php/CONTRIBUTING.md diff --git a/plugins/stripe-php/LICENSE b/libs/stripe-php/LICENSE similarity index 100% rename from plugins/stripe-php/LICENSE rename to libs/stripe-php/LICENSE diff --git a/plugins/stripe-php/OPENAPI_VERSION b/libs/stripe-php/OPENAPI_VERSION similarity index 100% rename from plugins/stripe-php/OPENAPI_VERSION rename to libs/stripe-php/OPENAPI_VERSION diff --git a/plugins/stripe-php/README.md b/libs/stripe-php/README.md similarity index 100% rename from plugins/stripe-php/README.md rename to libs/stripe-php/README.md diff --git a/plugins/stripe-php/VERSION b/libs/stripe-php/VERSION similarity index 100% rename from plugins/stripe-php/VERSION rename to libs/stripe-php/VERSION diff --git a/plugins/stripe-php/composer.json b/libs/stripe-php/composer.json similarity index 100% rename from plugins/stripe-php/composer.json rename to libs/stripe-php/composer.json diff --git a/plugins/stripe-php/data/ca-certificates.crt b/libs/stripe-php/data/ca-certificates.crt similarity index 100% rename from plugins/stripe-php/data/ca-certificates.crt rename to libs/stripe-php/data/ca-certificates.crt diff --git a/plugins/stripe-php/init.php b/libs/stripe-php/init.php similarity index 100% rename from plugins/stripe-php/init.php rename to libs/stripe-php/init.php diff --git a/plugins/stripe-php/justfile b/libs/stripe-php/justfile similarity index 100% rename from plugins/stripe-php/justfile rename to libs/stripe-php/justfile diff --git a/plugins/stripe-php/lib/Account.php b/libs/stripe-php/lib/Account.php similarity index 100% rename from plugins/stripe-php/lib/Account.php rename to libs/stripe-php/lib/Account.php diff --git a/plugins/stripe-php/lib/AccountLink.php b/libs/stripe-php/lib/AccountLink.php similarity index 100% rename from plugins/stripe-php/lib/AccountLink.php rename to libs/stripe-php/lib/AccountLink.php diff --git a/plugins/stripe-php/lib/AccountSession.php b/libs/stripe-php/lib/AccountSession.php similarity index 100% rename from plugins/stripe-php/lib/AccountSession.php rename to libs/stripe-php/lib/AccountSession.php diff --git a/plugins/stripe-php/lib/ApiOperations/All.php b/libs/stripe-php/lib/ApiOperations/All.php similarity index 100% rename from plugins/stripe-php/lib/ApiOperations/All.php rename to libs/stripe-php/lib/ApiOperations/All.php diff --git a/plugins/stripe-php/lib/ApiOperations/Create.php b/libs/stripe-php/lib/ApiOperations/Create.php similarity index 100% rename from plugins/stripe-php/lib/ApiOperations/Create.php rename to libs/stripe-php/lib/ApiOperations/Create.php diff --git a/plugins/stripe-php/lib/ApiOperations/Delete.php b/libs/stripe-php/lib/ApiOperations/Delete.php similarity index 100% rename from plugins/stripe-php/lib/ApiOperations/Delete.php rename to libs/stripe-php/lib/ApiOperations/Delete.php diff --git a/plugins/stripe-php/lib/ApiOperations/NestedResource.php b/libs/stripe-php/lib/ApiOperations/NestedResource.php similarity index 100% rename from plugins/stripe-php/lib/ApiOperations/NestedResource.php rename to libs/stripe-php/lib/ApiOperations/NestedResource.php diff --git a/plugins/stripe-php/lib/ApiOperations/Request.php b/libs/stripe-php/lib/ApiOperations/Request.php similarity index 100% rename from plugins/stripe-php/lib/ApiOperations/Request.php rename to libs/stripe-php/lib/ApiOperations/Request.php diff --git a/plugins/stripe-php/lib/ApiOperations/Retrieve.php b/libs/stripe-php/lib/ApiOperations/Retrieve.php similarity index 100% rename from plugins/stripe-php/lib/ApiOperations/Retrieve.php rename to libs/stripe-php/lib/ApiOperations/Retrieve.php diff --git a/plugins/stripe-php/lib/ApiOperations/SingletonRetrieve.php b/libs/stripe-php/lib/ApiOperations/SingletonRetrieve.php similarity index 100% rename from plugins/stripe-php/lib/ApiOperations/SingletonRetrieve.php rename to libs/stripe-php/lib/ApiOperations/SingletonRetrieve.php diff --git a/plugins/stripe-php/lib/ApiOperations/Update.php b/libs/stripe-php/lib/ApiOperations/Update.php similarity index 100% rename from plugins/stripe-php/lib/ApiOperations/Update.php rename to libs/stripe-php/lib/ApiOperations/Update.php diff --git a/plugins/stripe-php/lib/ApiRequestor.php b/libs/stripe-php/lib/ApiRequestor.php similarity index 100% rename from plugins/stripe-php/lib/ApiRequestor.php rename to libs/stripe-php/lib/ApiRequestor.php diff --git a/plugins/stripe-php/lib/ApiResource.php b/libs/stripe-php/lib/ApiResource.php similarity index 100% rename from plugins/stripe-php/lib/ApiResource.php rename to libs/stripe-php/lib/ApiResource.php diff --git a/plugins/stripe-php/lib/ApiResponse.php b/libs/stripe-php/lib/ApiResponse.php similarity index 100% rename from plugins/stripe-php/lib/ApiResponse.php rename to libs/stripe-php/lib/ApiResponse.php diff --git a/plugins/stripe-php/lib/ApplePayDomain.php b/libs/stripe-php/lib/ApplePayDomain.php similarity index 100% rename from plugins/stripe-php/lib/ApplePayDomain.php rename to libs/stripe-php/lib/ApplePayDomain.php diff --git a/plugins/stripe-php/lib/Application.php b/libs/stripe-php/lib/Application.php similarity index 100% rename from plugins/stripe-php/lib/Application.php rename to libs/stripe-php/lib/Application.php diff --git a/plugins/stripe-php/lib/ApplicationFee.php b/libs/stripe-php/lib/ApplicationFee.php similarity index 100% rename from plugins/stripe-php/lib/ApplicationFee.php rename to libs/stripe-php/lib/ApplicationFee.php diff --git a/plugins/stripe-php/lib/ApplicationFeeRefund.php b/libs/stripe-php/lib/ApplicationFeeRefund.php similarity index 100% rename from plugins/stripe-php/lib/ApplicationFeeRefund.php rename to libs/stripe-php/lib/ApplicationFeeRefund.php diff --git a/plugins/stripe-php/lib/Apps/Secret.php b/libs/stripe-php/lib/Apps/Secret.php similarity index 100% rename from plugins/stripe-php/lib/Apps/Secret.php rename to libs/stripe-php/lib/Apps/Secret.php diff --git a/plugins/stripe-php/lib/Balance.php b/libs/stripe-php/lib/Balance.php similarity index 100% rename from plugins/stripe-php/lib/Balance.php rename to libs/stripe-php/lib/Balance.php diff --git a/plugins/stripe-php/lib/BalanceSettings.php b/libs/stripe-php/lib/BalanceSettings.php similarity index 100% rename from plugins/stripe-php/lib/BalanceSettings.php rename to libs/stripe-php/lib/BalanceSettings.php diff --git a/plugins/stripe-php/lib/BalanceTransaction.php b/libs/stripe-php/lib/BalanceTransaction.php similarity index 100% rename from plugins/stripe-php/lib/BalanceTransaction.php rename to libs/stripe-php/lib/BalanceTransaction.php diff --git a/plugins/stripe-php/lib/BankAccount.php b/libs/stripe-php/lib/BankAccount.php similarity index 100% rename from plugins/stripe-php/lib/BankAccount.php rename to libs/stripe-php/lib/BankAccount.php diff --git a/plugins/stripe-php/lib/BaseStripeClient.php b/libs/stripe-php/lib/BaseStripeClient.php similarity index 100% rename from plugins/stripe-php/lib/BaseStripeClient.php rename to libs/stripe-php/lib/BaseStripeClient.php diff --git a/plugins/stripe-php/lib/BaseStripeClientInterface.php b/libs/stripe-php/lib/BaseStripeClientInterface.php similarity index 100% rename from plugins/stripe-php/lib/BaseStripeClientInterface.php rename to libs/stripe-php/lib/BaseStripeClientInterface.php diff --git a/plugins/stripe-php/lib/Billing/Alert.php b/libs/stripe-php/lib/Billing/Alert.php similarity index 100% rename from plugins/stripe-php/lib/Billing/Alert.php rename to libs/stripe-php/lib/Billing/Alert.php diff --git a/plugins/stripe-php/lib/Billing/AlertTriggered.php b/libs/stripe-php/lib/Billing/AlertTriggered.php similarity index 100% rename from plugins/stripe-php/lib/Billing/AlertTriggered.php rename to libs/stripe-php/lib/Billing/AlertTriggered.php diff --git a/plugins/stripe-php/lib/Billing/CreditBalanceSummary.php b/libs/stripe-php/lib/Billing/CreditBalanceSummary.php similarity index 100% rename from plugins/stripe-php/lib/Billing/CreditBalanceSummary.php rename to libs/stripe-php/lib/Billing/CreditBalanceSummary.php diff --git a/plugins/stripe-php/lib/Billing/CreditBalanceTransaction.php b/libs/stripe-php/lib/Billing/CreditBalanceTransaction.php similarity index 100% rename from plugins/stripe-php/lib/Billing/CreditBalanceTransaction.php rename to libs/stripe-php/lib/Billing/CreditBalanceTransaction.php diff --git a/plugins/stripe-php/lib/Billing/CreditGrant.php b/libs/stripe-php/lib/Billing/CreditGrant.php similarity index 100% rename from plugins/stripe-php/lib/Billing/CreditGrant.php rename to libs/stripe-php/lib/Billing/CreditGrant.php diff --git a/plugins/stripe-php/lib/Billing/Meter.php b/libs/stripe-php/lib/Billing/Meter.php similarity index 100% rename from plugins/stripe-php/lib/Billing/Meter.php rename to libs/stripe-php/lib/Billing/Meter.php diff --git a/plugins/stripe-php/lib/Billing/MeterEvent.php b/libs/stripe-php/lib/Billing/MeterEvent.php similarity index 100% rename from plugins/stripe-php/lib/Billing/MeterEvent.php rename to libs/stripe-php/lib/Billing/MeterEvent.php diff --git a/plugins/stripe-php/lib/Billing/MeterEventAdjustment.php b/libs/stripe-php/lib/Billing/MeterEventAdjustment.php similarity index 100% rename from plugins/stripe-php/lib/Billing/MeterEventAdjustment.php rename to libs/stripe-php/lib/Billing/MeterEventAdjustment.php diff --git a/plugins/stripe-php/lib/Billing/MeterEventSummary.php b/libs/stripe-php/lib/Billing/MeterEventSummary.php similarity index 100% rename from plugins/stripe-php/lib/Billing/MeterEventSummary.php rename to libs/stripe-php/lib/Billing/MeterEventSummary.php diff --git a/plugins/stripe-php/lib/BillingPortal/Configuration.php b/libs/stripe-php/lib/BillingPortal/Configuration.php similarity index 100% rename from plugins/stripe-php/lib/BillingPortal/Configuration.php rename to libs/stripe-php/lib/BillingPortal/Configuration.php diff --git a/plugins/stripe-php/lib/BillingPortal/Session.php b/libs/stripe-php/lib/BillingPortal/Session.php similarity index 100% rename from plugins/stripe-php/lib/BillingPortal/Session.php rename to libs/stripe-php/lib/BillingPortal/Session.php diff --git a/plugins/stripe-php/lib/Capability.php b/libs/stripe-php/lib/Capability.php similarity index 100% rename from plugins/stripe-php/lib/Capability.php rename to libs/stripe-php/lib/Capability.php diff --git a/plugins/stripe-php/lib/Card.php b/libs/stripe-php/lib/Card.php similarity index 100% rename from plugins/stripe-php/lib/Card.php rename to libs/stripe-php/lib/Card.php diff --git a/plugins/stripe-php/lib/CashBalance.php b/libs/stripe-php/lib/CashBalance.php similarity index 100% rename from plugins/stripe-php/lib/CashBalance.php rename to libs/stripe-php/lib/CashBalance.php diff --git a/plugins/stripe-php/lib/Charge.php b/libs/stripe-php/lib/Charge.php similarity index 100% rename from plugins/stripe-php/lib/Charge.php rename to libs/stripe-php/lib/Charge.php diff --git a/plugins/stripe-php/lib/Checkout/Session.php b/libs/stripe-php/lib/Checkout/Session.php similarity index 100% rename from plugins/stripe-php/lib/Checkout/Session.php rename to libs/stripe-php/lib/Checkout/Session.php diff --git a/plugins/stripe-php/lib/Climate/Order.php b/libs/stripe-php/lib/Climate/Order.php similarity index 100% rename from plugins/stripe-php/lib/Climate/Order.php rename to libs/stripe-php/lib/Climate/Order.php diff --git a/plugins/stripe-php/lib/Climate/Product.php b/libs/stripe-php/lib/Climate/Product.php similarity index 100% rename from plugins/stripe-php/lib/Climate/Product.php rename to libs/stripe-php/lib/Climate/Product.php diff --git a/plugins/stripe-php/lib/Climate/Supplier.php b/libs/stripe-php/lib/Climate/Supplier.php similarity index 100% rename from plugins/stripe-php/lib/Climate/Supplier.php rename to libs/stripe-php/lib/Climate/Supplier.php diff --git a/plugins/stripe-php/lib/Collection.php b/libs/stripe-php/lib/Collection.php similarity index 100% rename from plugins/stripe-php/lib/Collection.php rename to libs/stripe-php/lib/Collection.php diff --git a/plugins/stripe-php/lib/ConfirmationToken.php b/libs/stripe-php/lib/ConfirmationToken.php similarity index 100% rename from plugins/stripe-php/lib/ConfirmationToken.php rename to libs/stripe-php/lib/ConfirmationToken.php diff --git a/plugins/stripe-php/lib/ConnectCollectionTransfer.php b/libs/stripe-php/lib/ConnectCollectionTransfer.php similarity index 100% rename from plugins/stripe-php/lib/ConnectCollectionTransfer.php rename to libs/stripe-php/lib/ConnectCollectionTransfer.php diff --git a/plugins/stripe-php/lib/CountrySpec.php b/libs/stripe-php/lib/CountrySpec.php similarity index 100% rename from plugins/stripe-php/lib/CountrySpec.php rename to libs/stripe-php/lib/CountrySpec.php diff --git a/plugins/stripe-php/lib/Coupon.php b/libs/stripe-php/lib/Coupon.php similarity index 100% rename from plugins/stripe-php/lib/Coupon.php rename to libs/stripe-php/lib/Coupon.php diff --git a/plugins/stripe-php/lib/CreditNote.php b/libs/stripe-php/lib/CreditNote.php similarity index 100% rename from plugins/stripe-php/lib/CreditNote.php rename to libs/stripe-php/lib/CreditNote.php diff --git a/plugins/stripe-php/lib/CreditNoteLineItem.php b/libs/stripe-php/lib/CreditNoteLineItem.php similarity index 100% rename from plugins/stripe-php/lib/CreditNoteLineItem.php rename to libs/stripe-php/lib/CreditNoteLineItem.php diff --git a/plugins/stripe-php/lib/Customer.php b/libs/stripe-php/lib/Customer.php similarity index 100% rename from plugins/stripe-php/lib/Customer.php rename to libs/stripe-php/lib/Customer.php diff --git a/plugins/stripe-php/lib/CustomerBalanceTransaction.php b/libs/stripe-php/lib/CustomerBalanceTransaction.php similarity index 100% rename from plugins/stripe-php/lib/CustomerBalanceTransaction.php rename to libs/stripe-php/lib/CustomerBalanceTransaction.php diff --git a/plugins/stripe-php/lib/CustomerCashBalanceTransaction.php b/libs/stripe-php/lib/CustomerCashBalanceTransaction.php similarity index 100% rename from plugins/stripe-php/lib/CustomerCashBalanceTransaction.php rename to libs/stripe-php/lib/CustomerCashBalanceTransaction.php diff --git a/plugins/stripe-php/lib/CustomerSession.php b/libs/stripe-php/lib/CustomerSession.php similarity index 100% rename from plugins/stripe-php/lib/CustomerSession.php rename to libs/stripe-php/lib/CustomerSession.php diff --git a/plugins/stripe-php/lib/Discount.php b/libs/stripe-php/lib/Discount.php similarity index 100% rename from plugins/stripe-php/lib/Discount.php rename to libs/stripe-php/lib/Discount.php diff --git a/plugins/stripe-php/lib/Dispute.php b/libs/stripe-php/lib/Dispute.php similarity index 100% rename from plugins/stripe-php/lib/Dispute.php rename to libs/stripe-php/lib/Dispute.php diff --git a/plugins/stripe-php/lib/Entitlements/ActiveEntitlement.php b/libs/stripe-php/lib/Entitlements/ActiveEntitlement.php similarity index 100% rename from plugins/stripe-php/lib/Entitlements/ActiveEntitlement.php rename to libs/stripe-php/lib/Entitlements/ActiveEntitlement.php diff --git a/plugins/stripe-php/lib/Entitlements/ActiveEntitlementSummary.php b/libs/stripe-php/lib/Entitlements/ActiveEntitlementSummary.php similarity index 100% rename from plugins/stripe-php/lib/Entitlements/ActiveEntitlementSummary.php rename to libs/stripe-php/lib/Entitlements/ActiveEntitlementSummary.php diff --git a/plugins/stripe-php/lib/Entitlements/Feature.php b/libs/stripe-php/lib/Entitlements/Feature.php similarity index 100% rename from plugins/stripe-php/lib/Entitlements/Feature.php rename to libs/stripe-php/lib/Entitlements/Feature.php diff --git a/plugins/stripe-php/lib/EphemeralKey.php b/libs/stripe-php/lib/EphemeralKey.php similarity index 100% rename from plugins/stripe-php/lib/EphemeralKey.php rename to libs/stripe-php/lib/EphemeralKey.php diff --git a/plugins/stripe-php/lib/ErrorObject.php b/libs/stripe-php/lib/ErrorObject.php similarity index 100% rename from plugins/stripe-php/lib/ErrorObject.php rename to libs/stripe-php/lib/ErrorObject.php diff --git a/plugins/stripe-php/lib/Event.php b/libs/stripe-php/lib/Event.php similarity index 100% rename from plugins/stripe-php/lib/Event.php rename to libs/stripe-php/lib/Event.php diff --git a/plugins/stripe-php/lib/EventData/V1BillingMeterErrorReportTriggeredEventData.php b/libs/stripe-php/lib/EventData/V1BillingMeterErrorReportTriggeredEventData.php similarity index 100% rename from plugins/stripe-php/lib/EventData/V1BillingMeterErrorReportTriggeredEventData.php rename to libs/stripe-php/lib/EventData/V1BillingMeterErrorReportTriggeredEventData.php diff --git a/plugins/stripe-php/lib/EventData/V1BillingMeterNoMeterFoundEventData.php b/libs/stripe-php/lib/EventData/V1BillingMeterNoMeterFoundEventData.php similarity index 100% rename from plugins/stripe-php/lib/EventData/V1BillingMeterNoMeterFoundEventData.php rename to libs/stripe-php/lib/EventData/V1BillingMeterNoMeterFoundEventData.php diff --git a/plugins/stripe-php/lib/EventData/V2CoreAccountIncludingConfigurationCustomerCapabilityStatusUpdatedEventData.php b/libs/stripe-php/lib/EventData/V2CoreAccountIncludingConfigurationCustomerCapabilityStatusUpdatedEventData.php similarity index 100% rename from plugins/stripe-php/lib/EventData/V2CoreAccountIncludingConfigurationCustomerCapabilityStatusUpdatedEventData.php rename to libs/stripe-php/lib/EventData/V2CoreAccountIncludingConfigurationCustomerCapabilityStatusUpdatedEventData.php diff --git a/plugins/stripe-php/lib/EventData/V2CoreAccountIncludingConfigurationMerchantCapabilityStatusUpdatedEventData.php b/libs/stripe-php/lib/EventData/V2CoreAccountIncludingConfigurationMerchantCapabilityStatusUpdatedEventData.php similarity index 100% rename from plugins/stripe-php/lib/EventData/V2CoreAccountIncludingConfigurationMerchantCapabilityStatusUpdatedEventData.php rename to libs/stripe-php/lib/EventData/V2CoreAccountIncludingConfigurationMerchantCapabilityStatusUpdatedEventData.php diff --git a/plugins/stripe-php/lib/EventData/V2CoreAccountIncludingConfigurationRecipientCapabilityStatusUpdatedEventData.php b/libs/stripe-php/lib/EventData/V2CoreAccountIncludingConfigurationRecipientCapabilityStatusUpdatedEventData.php similarity index 100% rename from plugins/stripe-php/lib/EventData/V2CoreAccountIncludingConfigurationRecipientCapabilityStatusUpdatedEventData.php rename to libs/stripe-php/lib/EventData/V2CoreAccountIncludingConfigurationRecipientCapabilityStatusUpdatedEventData.php diff --git a/plugins/stripe-php/lib/EventData/V2CoreAccountLinkReturnedEventData.php b/libs/stripe-php/lib/EventData/V2CoreAccountLinkReturnedEventData.php similarity index 100% rename from plugins/stripe-php/lib/EventData/V2CoreAccountLinkReturnedEventData.php rename to libs/stripe-php/lib/EventData/V2CoreAccountLinkReturnedEventData.php diff --git a/plugins/stripe-php/lib/EventData/V2CoreAccountPersonCreatedEventData.php b/libs/stripe-php/lib/EventData/V2CoreAccountPersonCreatedEventData.php similarity index 100% rename from plugins/stripe-php/lib/EventData/V2CoreAccountPersonCreatedEventData.php rename to libs/stripe-php/lib/EventData/V2CoreAccountPersonCreatedEventData.php diff --git a/plugins/stripe-php/lib/EventData/V2CoreAccountPersonDeletedEventData.php b/libs/stripe-php/lib/EventData/V2CoreAccountPersonDeletedEventData.php similarity index 100% rename from plugins/stripe-php/lib/EventData/V2CoreAccountPersonDeletedEventData.php rename to libs/stripe-php/lib/EventData/V2CoreAccountPersonDeletedEventData.php diff --git a/plugins/stripe-php/lib/EventData/V2CoreAccountPersonUpdatedEventData.php b/libs/stripe-php/lib/EventData/V2CoreAccountPersonUpdatedEventData.php similarity index 100% rename from plugins/stripe-php/lib/EventData/V2CoreAccountPersonUpdatedEventData.php rename to libs/stripe-php/lib/EventData/V2CoreAccountPersonUpdatedEventData.php diff --git a/plugins/stripe-php/lib/Events/UnknownEventNotification.php b/libs/stripe-php/lib/Events/UnknownEventNotification.php similarity index 100% rename from plugins/stripe-php/lib/Events/UnknownEventNotification.php rename to libs/stripe-php/lib/Events/UnknownEventNotification.php diff --git a/plugins/stripe-php/lib/Events/V1BillingMeterErrorReportTriggeredEvent.php b/libs/stripe-php/lib/Events/V1BillingMeterErrorReportTriggeredEvent.php similarity index 100% rename from plugins/stripe-php/lib/Events/V1BillingMeterErrorReportTriggeredEvent.php rename to libs/stripe-php/lib/Events/V1BillingMeterErrorReportTriggeredEvent.php diff --git a/plugins/stripe-php/lib/Events/V1BillingMeterErrorReportTriggeredEventNotification.php b/libs/stripe-php/lib/Events/V1BillingMeterErrorReportTriggeredEventNotification.php similarity index 100% rename from plugins/stripe-php/lib/Events/V1BillingMeterErrorReportTriggeredEventNotification.php rename to libs/stripe-php/lib/Events/V1BillingMeterErrorReportTriggeredEventNotification.php diff --git a/plugins/stripe-php/lib/Events/V1BillingMeterNoMeterFoundEvent.php b/libs/stripe-php/lib/Events/V1BillingMeterNoMeterFoundEvent.php similarity index 100% rename from plugins/stripe-php/lib/Events/V1BillingMeterNoMeterFoundEvent.php rename to libs/stripe-php/lib/Events/V1BillingMeterNoMeterFoundEvent.php diff --git a/plugins/stripe-php/lib/Events/V1BillingMeterNoMeterFoundEventNotification.php b/libs/stripe-php/lib/Events/V1BillingMeterNoMeterFoundEventNotification.php similarity index 100% rename from plugins/stripe-php/lib/Events/V1BillingMeterNoMeterFoundEventNotification.php rename to libs/stripe-php/lib/Events/V1BillingMeterNoMeterFoundEventNotification.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountClosedEvent.php b/libs/stripe-php/lib/Events/V2CoreAccountClosedEvent.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountClosedEvent.php rename to libs/stripe-php/lib/Events/V2CoreAccountClosedEvent.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountClosedEventNotification.php b/libs/stripe-php/lib/Events/V2CoreAccountClosedEventNotification.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountClosedEventNotification.php rename to libs/stripe-php/lib/Events/V2CoreAccountClosedEventNotification.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountCreatedEvent.php b/libs/stripe-php/lib/Events/V2CoreAccountCreatedEvent.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountCreatedEvent.php rename to libs/stripe-php/lib/Events/V2CoreAccountCreatedEvent.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountCreatedEventNotification.php b/libs/stripe-php/lib/Events/V2CoreAccountCreatedEventNotification.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountCreatedEventNotification.php rename to libs/stripe-php/lib/Events/V2CoreAccountCreatedEventNotification.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationCustomerCapabilityStatusUpdatedEvent.php b/libs/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationCustomerCapabilityStatusUpdatedEvent.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationCustomerCapabilityStatusUpdatedEvent.php rename to libs/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationCustomerCapabilityStatusUpdatedEvent.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationCustomerCapabilityStatusUpdatedEventNotification.php b/libs/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationCustomerCapabilityStatusUpdatedEventNotification.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationCustomerCapabilityStatusUpdatedEventNotification.php rename to libs/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationCustomerCapabilityStatusUpdatedEventNotification.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationCustomerUpdatedEvent.php b/libs/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationCustomerUpdatedEvent.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationCustomerUpdatedEvent.php rename to libs/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationCustomerUpdatedEvent.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationCustomerUpdatedEventNotification.php b/libs/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationCustomerUpdatedEventNotification.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationCustomerUpdatedEventNotification.php rename to libs/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationCustomerUpdatedEventNotification.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationMerchantCapabilityStatusUpdatedEvent.php b/libs/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationMerchantCapabilityStatusUpdatedEvent.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationMerchantCapabilityStatusUpdatedEvent.php rename to libs/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationMerchantCapabilityStatusUpdatedEvent.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationMerchantCapabilityStatusUpdatedEventNotification.php b/libs/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationMerchantCapabilityStatusUpdatedEventNotification.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationMerchantCapabilityStatusUpdatedEventNotification.php rename to libs/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationMerchantCapabilityStatusUpdatedEventNotification.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationMerchantUpdatedEvent.php b/libs/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationMerchantUpdatedEvent.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationMerchantUpdatedEvent.php rename to libs/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationMerchantUpdatedEvent.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationMerchantUpdatedEventNotification.php b/libs/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationMerchantUpdatedEventNotification.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationMerchantUpdatedEventNotification.php rename to libs/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationMerchantUpdatedEventNotification.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationRecipientCapabilityStatusUpdatedEvent.php b/libs/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationRecipientCapabilityStatusUpdatedEvent.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationRecipientCapabilityStatusUpdatedEvent.php rename to libs/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationRecipientCapabilityStatusUpdatedEvent.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationRecipientCapabilityStatusUpdatedEventNotification.php b/libs/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationRecipientCapabilityStatusUpdatedEventNotification.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationRecipientCapabilityStatusUpdatedEventNotification.php rename to libs/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationRecipientCapabilityStatusUpdatedEventNotification.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationRecipientUpdatedEvent.php b/libs/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationRecipientUpdatedEvent.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationRecipientUpdatedEvent.php rename to libs/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationRecipientUpdatedEvent.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationRecipientUpdatedEventNotification.php b/libs/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationRecipientUpdatedEventNotification.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationRecipientUpdatedEventNotification.php rename to libs/stripe-php/lib/Events/V2CoreAccountIncludingConfigurationRecipientUpdatedEventNotification.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountIncludingDefaultsUpdatedEvent.php b/libs/stripe-php/lib/Events/V2CoreAccountIncludingDefaultsUpdatedEvent.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountIncludingDefaultsUpdatedEvent.php rename to libs/stripe-php/lib/Events/V2CoreAccountIncludingDefaultsUpdatedEvent.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountIncludingDefaultsUpdatedEventNotification.php b/libs/stripe-php/lib/Events/V2CoreAccountIncludingDefaultsUpdatedEventNotification.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountIncludingDefaultsUpdatedEventNotification.php rename to libs/stripe-php/lib/Events/V2CoreAccountIncludingDefaultsUpdatedEventNotification.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountIncludingFutureRequirementsUpdatedEvent.php b/libs/stripe-php/lib/Events/V2CoreAccountIncludingFutureRequirementsUpdatedEvent.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountIncludingFutureRequirementsUpdatedEvent.php rename to libs/stripe-php/lib/Events/V2CoreAccountIncludingFutureRequirementsUpdatedEvent.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountIncludingFutureRequirementsUpdatedEventNotification.php b/libs/stripe-php/lib/Events/V2CoreAccountIncludingFutureRequirementsUpdatedEventNotification.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountIncludingFutureRequirementsUpdatedEventNotification.php rename to libs/stripe-php/lib/Events/V2CoreAccountIncludingFutureRequirementsUpdatedEventNotification.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountIncludingIdentityUpdatedEvent.php b/libs/stripe-php/lib/Events/V2CoreAccountIncludingIdentityUpdatedEvent.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountIncludingIdentityUpdatedEvent.php rename to libs/stripe-php/lib/Events/V2CoreAccountIncludingIdentityUpdatedEvent.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountIncludingIdentityUpdatedEventNotification.php b/libs/stripe-php/lib/Events/V2CoreAccountIncludingIdentityUpdatedEventNotification.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountIncludingIdentityUpdatedEventNotification.php rename to libs/stripe-php/lib/Events/V2CoreAccountIncludingIdentityUpdatedEventNotification.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountIncludingRequirementsUpdatedEvent.php b/libs/stripe-php/lib/Events/V2CoreAccountIncludingRequirementsUpdatedEvent.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountIncludingRequirementsUpdatedEvent.php rename to libs/stripe-php/lib/Events/V2CoreAccountIncludingRequirementsUpdatedEvent.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountIncludingRequirementsUpdatedEventNotification.php b/libs/stripe-php/lib/Events/V2CoreAccountIncludingRequirementsUpdatedEventNotification.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountIncludingRequirementsUpdatedEventNotification.php rename to libs/stripe-php/lib/Events/V2CoreAccountIncludingRequirementsUpdatedEventNotification.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountLinkReturnedEvent.php b/libs/stripe-php/lib/Events/V2CoreAccountLinkReturnedEvent.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountLinkReturnedEvent.php rename to libs/stripe-php/lib/Events/V2CoreAccountLinkReturnedEvent.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountLinkReturnedEventNotification.php b/libs/stripe-php/lib/Events/V2CoreAccountLinkReturnedEventNotification.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountLinkReturnedEventNotification.php rename to libs/stripe-php/lib/Events/V2CoreAccountLinkReturnedEventNotification.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountPersonCreatedEvent.php b/libs/stripe-php/lib/Events/V2CoreAccountPersonCreatedEvent.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountPersonCreatedEvent.php rename to libs/stripe-php/lib/Events/V2CoreAccountPersonCreatedEvent.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountPersonCreatedEventNotification.php b/libs/stripe-php/lib/Events/V2CoreAccountPersonCreatedEventNotification.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountPersonCreatedEventNotification.php rename to libs/stripe-php/lib/Events/V2CoreAccountPersonCreatedEventNotification.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountPersonDeletedEvent.php b/libs/stripe-php/lib/Events/V2CoreAccountPersonDeletedEvent.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountPersonDeletedEvent.php rename to libs/stripe-php/lib/Events/V2CoreAccountPersonDeletedEvent.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountPersonDeletedEventNotification.php b/libs/stripe-php/lib/Events/V2CoreAccountPersonDeletedEventNotification.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountPersonDeletedEventNotification.php rename to libs/stripe-php/lib/Events/V2CoreAccountPersonDeletedEventNotification.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountPersonUpdatedEvent.php b/libs/stripe-php/lib/Events/V2CoreAccountPersonUpdatedEvent.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountPersonUpdatedEvent.php rename to libs/stripe-php/lib/Events/V2CoreAccountPersonUpdatedEvent.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountPersonUpdatedEventNotification.php b/libs/stripe-php/lib/Events/V2CoreAccountPersonUpdatedEventNotification.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountPersonUpdatedEventNotification.php rename to libs/stripe-php/lib/Events/V2CoreAccountPersonUpdatedEventNotification.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountUpdatedEvent.php b/libs/stripe-php/lib/Events/V2CoreAccountUpdatedEvent.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountUpdatedEvent.php rename to libs/stripe-php/lib/Events/V2CoreAccountUpdatedEvent.php diff --git a/plugins/stripe-php/lib/Events/V2CoreAccountUpdatedEventNotification.php b/libs/stripe-php/lib/Events/V2CoreAccountUpdatedEventNotification.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreAccountUpdatedEventNotification.php rename to libs/stripe-php/lib/Events/V2CoreAccountUpdatedEventNotification.php diff --git a/plugins/stripe-php/lib/Events/V2CoreEventDestinationPingEvent.php b/libs/stripe-php/lib/Events/V2CoreEventDestinationPingEvent.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreEventDestinationPingEvent.php rename to libs/stripe-php/lib/Events/V2CoreEventDestinationPingEvent.php diff --git a/plugins/stripe-php/lib/Events/V2CoreEventDestinationPingEventNotification.php b/libs/stripe-php/lib/Events/V2CoreEventDestinationPingEventNotification.php similarity index 100% rename from plugins/stripe-php/lib/Events/V2CoreEventDestinationPingEventNotification.php rename to libs/stripe-php/lib/Events/V2CoreEventDestinationPingEventNotification.php diff --git a/plugins/stripe-php/lib/Exception/ApiConnectionException.php b/libs/stripe-php/lib/Exception/ApiConnectionException.php similarity index 100% rename from plugins/stripe-php/lib/Exception/ApiConnectionException.php rename to libs/stripe-php/lib/Exception/ApiConnectionException.php diff --git a/plugins/stripe-php/lib/Exception/ApiErrorException.php b/libs/stripe-php/lib/Exception/ApiErrorException.php similarity index 100% rename from plugins/stripe-php/lib/Exception/ApiErrorException.php rename to libs/stripe-php/lib/Exception/ApiErrorException.php diff --git a/plugins/stripe-php/lib/Exception/AuthenticationException.php b/libs/stripe-php/lib/Exception/AuthenticationException.php similarity index 100% rename from plugins/stripe-php/lib/Exception/AuthenticationException.php rename to libs/stripe-php/lib/Exception/AuthenticationException.php diff --git a/plugins/stripe-php/lib/Exception/BadMethodCallException.php b/libs/stripe-php/lib/Exception/BadMethodCallException.php similarity index 100% rename from plugins/stripe-php/lib/Exception/BadMethodCallException.php rename to libs/stripe-php/lib/Exception/BadMethodCallException.php diff --git a/plugins/stripe-php/lib/Exception/CardException.php b/libs/stripe-php/lib/Exception/CardException.php similarity index 100% rename from plugins/stripe-php/lib/Exception/CardException.php rename to libs/stripe-php/lib/Exception/CardException.php diff --git a/plugins/stripe-php/lib/Exception/ExceptionInterface.php b/libs/stripe-php/lib/Exception/ExceptionInterface.php similarity index 100% rename from plugins/stripe-php/lib/Exception/ExceptionInterface.php rename to libs/stripe-php/lib/Exception/ExceptionInterface.php diff --git a/plugins/stripe-php/lib/Exception/IdempotencyException.php b/libs/stripe-php/lib/Exception/IdempotencyException.php similarity index 100% rename from plugins/stripe-php/lib/Exception/IdempotencyException.php rename to libs/stripe-php/lib/Exception/IdempotencyException.php diff --git a/plugins/stripe-php/lib/Exception/InvalidArgumentException.php b/libs/stripe-php/lib/Exception/InvalidArgumentException.php similarity index 100% rename from plugins/stripe-php/lib/Exception/InvalidArgumentException.php rename to libs/stripe-php/lib/Exception/InvalidArgumentException.php diff --git a/plugins/stripe-php/lib/Exception/InvalidRequestException.php b/libs/stripe-php/lib/Exception/InvalidRequestException.php similarity index 100% rename from plugins/stripe-php/lib/Exception/InvalidRequestException.php rename to libs/stripe-php/lib/Exception/InvalidRequestException.php diff --git a/plugins/stripe-php/lib/Exception/OAuth/ExceptionInterface.php b/libs/stripe-php/lib/Exception/OAuth/ExceptionInterface.php similarity index 100% rename from plugins/stripe-php/lib/Exception/OAuth/ExceptionInterface.php rename to libs/stripe-php/lib/Exception/OAuth/ExceptionInterface.php diff --git a/plugins/stripe-php/lib/Exception/OAuth/InvalidClientException.php b/libs/stripe-php/lib/Exception/OAuth/InvalidClientException.php similarity index 100% rename from plugins/stripe-php/lib/Exception/OAuth/InvalidClientException.php rename to libs/stripe-php/lib/Exception/OAuth/InvalidClientException.php diff --git a/plugins/stripe-php/lib/Exception/OAuth/InvalidGrantException.php b/libs/stripe-php/lib/Exception/OAuth/InvalidGrantException.php similarity index 100% rename from plugins/stripe-php/lib/Exception/OAuth/InvalidGrantException.php rename to libs/stripe-php/lib/Exception/OAuth/InvalidGrantException.php diff --git a/plugins/stripe-php/lib/Exception/OAuth/InvalidRequestException.php b/libs/stripe-php/lib/Exception/OAuth/InvalidRequestException.php similarity index 100% rename from plugins/stripe-php/lib/Exception/OAuth/InvalidRequestException.php rename to libs/stripe-php/lib/Exception/OAuth/InvalidRequestException.php diff --git a/plugins/stripe-php/lib/Exception/OAuth/InvalidScopeException.php b/libs/stripe-php/lib/Exception/OAuth/InvalidScopeException.php similarity index 100% rename from plugins/stripe-php/lib/Exception/OAuth/InvalidScopeException.php rename to libs/stripe-php/lib/Exception/OAuth/InvalidScopeException.php diff --git a/plugins/stripe-php/lib/Exception/OAuth/OAuthErrorException.php b/libs/stripe-php/lib/Exception/OAuth/OAuthErrorException.php similarity index 100% rename from plugins/stripe-php/lib/Exception/OAuth/OAuthErrorException.php rename to libs/stripe-php/lib/Exception/OAuth/OAuthErrorException.php diff --git a/plugins/stripe-php/lib/Exception/OAuth/UnknownOAuthErrorException.php b/libs/stripe-php/lib/Exception/OAuth/UnknownOAuthErrorException.php similarity index 100% rename from plugins/stripe-php/lib/Exception/OAuth/UnknownOAuthErrorException.php rename to libs/stripe-php/lib/Exception/OAuth/UnknownOAuthErrorException.php diff --git a/plugins/stripe-php/lib/Exception/OAuth/UnsupportedGrantTypeException.php b/libs/stripe-php/lib/Exception/OAuth/UnsupportedGrantTypeException.php similarity index 100% rename from plugins/stripe-php/lib/Exception/OAuth/UnsupportedGrantTypeException.php rename to libs/stripe-php/lib/Exception/OAuth/UnsupportedGrantTypeException.php diff --git a/plugins/stripe-php/lib/Exception/OAuth/UnsupportedResponseTypeException.php b/libs/stripe-php/lib/Exception/OAuth/UnsupportedResponseTypeException.php similarity index 100% rename from plugins/stripe-php/lib/Exception/OAuth/UnsupportedResponseTypeException.php rename to libs/stripe-php/lib/Exception/OAuth/UnsupportedResponseTypeException.php diff --git a/plugins/stripe-php/lib/Exception/PermissionException.php b/libs/stripe-php/lib/Exception/PermissionException.php similarity index 100% rename from plugins/stripe-php/lib/Exception/PermissionException.php rename to libs/stripe-php/lib/Exception/PermissionException.php diff --git a/plugins/stripe-php/lib/Exception/RateLimitException.php b/libs/stripe-php/lib/Exception/RateLimitException.php similarity index 100% rename from plugins/stripe-php/lib/Exception/RateLimitException.php rename to libs/stripe-php/lib/Exception/RateLimitException.php diff --git a/plugins/stripe-php/lib/Exception/SignatureVerificationException.php b/libs/stripe-php/lib/Exception/SignatureVerificationException.php similarity index 100% rename from plugins/stripe-php/lib/Exception/SignatureVerificationException.php rename to libs/stripe-php/lib/Exception/SignatureVerificationException.php diff --git a/plugins/stripe-php/lib/Exception/TemporarySessionExpiredException.php b/libs/stripe-php/lib/Exception/TemporarySessionExpiredException.php similarity index 100% rename from plugins/stripe-php/lib/Exception/TemporarySessionExpiredException.php rename to libs/stripe-php/lib/Exception/TemporarySessionExpiredException.php diff --git a/plugins/stripe-php/lib/Exception/UnexpectedValueException.php b/libs/stripe-php/lib/Exception/UnexpectedValueException.php similarity index 100% rename from plugins/stripe-php/lib/Exception/UnexpectedValueException.php rename to libs/stripe-php/lib/Exception/UnexpectedValueException.php diff --git a/plugins/stripe-php/lib/Exception/UnknownApiErrorException.php b/libs/stripe-php/lib/Exception/UnknownApiErrorException.php similarity index 100% rename from plugins/stripe-php/lib/Exception/UnknownApiErrorException.php rename to libs/stripe-php/lib/Exception/UnknownApiErrorException.php diff --git a/plugins/stripe-php/lib/ExchangeRate.php b/libs/stripe-php/lib/ExchangeRate.php similarity index 100% rename from plugins/stripe-php/lib/ExchangeRate.php rename to libs/stripe-php/lib/ExchangeRate.php diff --git a/plugins/stripe-php/lib/File.php b/libs/stripe-php/lib/File.php similarity index 100% rename from plugins/stripe-php/lib/File.php rename to libs/stripe-php/lib/File.php diff --git a/plugins/stripe-php/lib/FileLink.php b/libs/stripe-php/lib/FileLink.php similarity index 100% rename from plugins/stripe-php/lib/FileLink.php rename to libs/stripe-php/lib/FileLink.php diff --git a/plugins/stripe-php/lib/FinancialConnections/Account.php b/libs/stripe-php/lib/FinancialConnections/Account.php similarity index 100% rename from plugins/stripe-php/lib/FinancialConnections/Account.php rename to libs/stripe-php/lib/FinancialConnections/Account.php diff --git a/plugins/stripe-php/lib/FinancialConnections/AccountOwner.php b/libs/stripe-php/lib/FinancialConnections/AccountOwner.php similarity index 100% rename from plugins/stripe-php/lib/FinancialConnections/AccountOwner.php rename to libs/stripe-php/lib/FinancialConnections/AccountOwner.php diff --git a/plugins/stripe-php/lib/FinancialConnections/AccountOwnership.php b/libs/stripe-php/lib/FinancialConnections/AccountOwnership.php similarity index 100% rename from plugins/stripe-php/lib/FinancialConnections/AccountOwnership.php rename to libs/stripe-php/lib/FinancialConnections/AccountOwnership.php diff --git a/plugins/stripe-php/lib/FinancialConnections/Session.php b/libs/stripe-php/lib/FinancialConnections/Session.php similarity index 100% rename from plugins/stripe-php/lib/FinancialConnections/Session.php rename to libs/stripe-php/lib/FinancialConnections/Session.php diff --git a/plugins/stripe-php/lib/FinancialConnections/Transaction.php b/libs/stripe-php/lib/FinancialConnections/Transaction.php similarity index 100% rename from plugins/stripe-php/lib/FinancialConnections/Transaction.php rename to libs/stripe-php/lib/FinancialConnections/Transaction.php diff --git a/plugins/stripe-php/lib/Forwarding/Request.php b/libs/stripe-php/lib/Forwarding/Request.php similarity index 100% rename from plugins/stripe-php/lib/Forwarding/Request.php rename to libs/stripe-php/lib/Forwarding/Request.php diff --git a/plugins/stripe-php/lib/FundingInstructions.php b/libs/stripe-php/lib/FundingInstructions.php similarity index 100% rename from plugins/stripe-php/lib/FundingInstructions.php rename to libs/stripe-php/lib/FundingInstructions.php diff --git a/plugins/stripe-php/lib/HttpClient/ClientInterface.php b/libs/stripe-php/lib/HttpClient/ClientInterface.php similarity index 100% rename from plugins/stripe-php/lib/HttpClient/ClientInterface.php rename to libs/stripe-php/lib/HttpClient/ClientInterface.php diff --git a/plugins/stripe-php/lib/HttpClient/CurlClient.php b/libs/stripe-php/lib/HttpClient/CurlClient.php similarity index 100% rename from plugins/stripe-php/lib/HttpClient/CurlClient.php rename to libs/stripe-php/lib/HttpClient/CurlClient.php diff --git a/plugins/stripe-php/lib/HttpClient/StreamingClientInterface.php b/libs/stripe-php/lib/HttpClient/StreamingClientInterface.php similarity index 100% rename from plugins/stripe-php/lib/HttpClient/StreamingClientInterface.php rename to libs/stripe-php/lib/HttpClient/StreamingClientInterface.php diff --git a/plugins/stripe-php/lib/Identity/VerificationReport.php b/libs/stripe-php/lib/Identity/VerificationReport.php similarity index 100% rename from plugins/stripe-php/lib/Identity/VerificationReport.php rename to libs/stripe-php/lib/Identity/VerificationReport.php diff --git a/plugins/stripe-php/lib/Identity/VerificationSession.php b/libs/stripe-php/lib/Identity/VerificationSession.php similarity index 100% rename from plugins/stripe-php/lib/Identity/VerificationSession.php rename to libs/stripe-php/lib/Identity/VerificationSession.php diff --git a/plugins/stripe-php/lib/Invoice.php b/libs/stripe-php/lib/Invoice.php similarity index 100% rename from plugins/stripe-php/lib/Invoice.php rename to libs/stripe-php/lib/Invoice.php diff --git a/plugins/stripe-php/lib/InvoiceItem.php b/libs/stripe-php/lib/InvoiceItem.php similarity index 100% rename from plugins/stripe-php/lib/InvoiceItem.php rename to libs/stripe-php/lib/InvoiceItem.php diff --git a/plugins/stripe-php/lib/InvoiceLineItem.php b/libs/stripe-php/lib/InvoiceLineItem.php similarity index 100% rename from plugins/stripe-php/lib/InvoiceLineItem.php rename to libs/stripe-php/lib/InvoiceLineItem.php diff --git a/plugins/stripe-php/lib/InvoicePayment.php b/libs/stripe-php/lib/InvoicePayment.php similarity index 100% rename from plugins/stripe-php/lib/InvoicePayment.php rename to libs/stripe-php/lib/InvoicePayment.php diff --git a/plugins/stripe-php/lib/InvoiceRenderingTemplate.php b/libs/stripe-php/lib/InvoiceRenderingTemplate.php similarity index 100% rename from plugins/stripe-php/lib/InvoiceRenderingTemplate.php rename to libs/stripe-php/lib/InvoiceRenderingTemplate.php diff --git a/plugins/stripe-php/lib/Issuing/Authorization.php b/libs/stripe-php/lib/Issuing/Authorization.php similarity index 100% rename from plugins/stripe-php/lib/Issuing/Authorization.php rename to libs/stripe-php/lib/Issuing/Authorization.php diff --git a/plugins/stripe-php/lib/Issuing/Card.php b/libs/stripe-php/lib/Issuing/Card.php similarity index 100% rename from plugins/stripe-php/lib/Issuing/Card.php rename to libs/stripe-php/lib/Issuing/Card.php diff --git a/plugins/stripe-php/lib/Issuing/CardDetails.php b/libs/stripe-php/lib/Issuing/CardDetails.php similarity index 100% rename from plugins/stripe-php/lib/Issuing/CardDetails.php rename to libs/stripe-php/lib/Issuing/CardDetails.php diff --git a/plugins/stripe-php/lib/Issuing/Cardholder.php b/libs/stripe-php/lib/Issuing/Cardholder.php similarity index 100% rename from plugins/stripe-php/lib/Issuing/Cardholder.php rename to libs/stripe-php/lib/Issuing/Cardholder.php diff --git a/plugins/stripe-php/lib/Issuing/Dispute.php b/libs/stripe-php/lib/Issuing/Dispute.php similarity index 100% rename from plugins/stripe-php/lib/Issuing/Dispute.php rename to libs/stripe-php/lib/Issuing/Dispute.php diff --git a/plugins/stripe-php/lib/Issuing/PersonalizationDesign.php b/libs/stripe-php/lib/Issuing/PersonalizationDesign.php similarity index 100% rename from plugins/stripe-php/lib/Issuing/PersonalizationDesign.php rename to libs/stripe-php/lib/Issuing/PersonalizationDesign.php diff --git a/plugins/stripe-php/lib/Issuing/PhysicalBundle.php b/libs/stripe-php/lib/Issuing/PhysicalBundle.php similarity index 100% rename from plugins/stripe-php/lib/Issuing/PhysicalBundle.php rename to libs/stripe-php/lib/Issuing/PhysicalBundle.php diff --git a/plugins/stripe-php/lib/Issuing/Token.php b/libs/stripe-php/lib/Issuing/Token.php similarity index 100% rename from plugins/stripe-php/lib/Issuing/Token.php rename to libs/stripe-php/lib/Issuing/Token.php diff --git a/plugins/stripe-php/lib/Issuing/Transaction.php b/libs/stripe-php/lib/Issuing/Transaction.php similarity index 100% rename from plugins/stripe-php/lib/Issuing/Transaction.php rename to libs/stripe-php/lib/Issuing/Transaction.php diff --git a/plugins/stripe-php/lib/LineItem.php b/libs/stripe-php/lib/LineItem.php similarity index 100% rename from plugins/stripe-php/lib/LineItem.php rename to libs/stripe-php/lib/LineItem.php diff --git a/plugins/stripe-php/lib/LoginLink.php b/libs/stripe-php/lib/LoginLink.php similarity index 100% rename from plugins/stripe-php/lib/LoginLink.php rename to libs/stripe-php/lib/LoginLink.php diff --git a/plugins/stripe-php/lib/Mandate.php b/libs/stripe-php/lib/Mandate.php similarity index 100% rename from plugins/stripe-php/lib/Mandate.php rename to libs/stripe-php/lib/Mandate.php diff --git a/plugins/stripe-php/lib/OAuth.php b/libs/stripe-php/lib/OAuth.php similarity index 100% rename from plugins/stripe-php/lib/OAuth.php rename to libs/stripe-php/lib/OAuth.php diff --git a/plugins/stripe-php/lib/OAuthErrorObject.php b/libs/stripe-php/lib/OAuthErrorObject.php similarity index 100% rename from plugins/stripe-php/lib/OAuthErrorObject.php rename to libs/stripe-php/lib/OAuthErrorObject.php diff --git a/plugins/stripe-php/lib/PaymentAttemptRecord.php b/libs/stripe-php/lib/PaymentAttemptRecord.php similarity index 100% rename from plugins/stripe-php/lib/PaymentAttemptRecord.php rename to libs/stripe-php/lib/PaymentAttemptRecord.php diff --git a/plugins/stripe-php/lib/PaymentIntent.php b/libs/stripe-php/lib/PaymentIntent.php similarity index 100% rename from plugins/stripe-php/lib/PaymentIntent.php rename to libs/stripe-php/lib/PaymentIntent.php diff --git a/plugins/stripe-php/lib/PaymentIntentAmountDetailsLineItem.php b/libs/stripe-php/lib/PaymentIntentAmountDetailsLineItem.php similarity index 100% rename from plugins/stripe-php/lib/PaymentIntentAmountDetailsLineItem.php rename to libs/stripe-php/lib/PaymentIntentAmountDetailsLineItem.php diff --git a/plugins/stripe-php/lib/PaymentLink.php b/libs/stripe-php/lib/PaymentLink.php similarity index 100% rename from plugins/stripe-php/lib/PaymentLink.php rename to libs/stripe-php/lib/PaymentLink.php diff --git a/plugins/stripe-php/lib/PaymentMethod.php b/libs/stripe-php/lib/PaymentMethod.php similarity index 100% rename from plugins/stripe-php/lib/PaymentMethod.php rename to libs/stripe-php/lib/PaymentMethod.php diff --git a/plugins/stripe-php/lib/PaymentMethodConfiguration.php b/libs/stripe-php/lib/PaymentMethodConfiguration.php similarity index 100% rename from plugins/stripe-php/lib/PaymentMethodConfiguration.php rename to libs/stripe-php/lib/PaymentMethodConfiguration.php diff --git a/plugins/stripe-php/lib/PaymentMethodDomain.php b/libs/stripe-php/lib/PaymentMethodDomain.php similarity index 100% rename from plugins/stripe-php/lib/PaymentMethodDomain.php rename to libs/stripe-php/lib/PaymentMethodDomain.php diff --git a/plugins/stripe-php/lib/PaymentRecord.php b/libs/stripe-php/lib/PaymentRecord.php similarity index 100% rename from plugins/stripe-php/lib/PaymentRecord.php rename to libs/stripe-php/lib/PaymentRecord.php diff --git a/plugins/stripe-php/lib/Payout.php b/libs/stripe-php/lib/Payout.php similarity index 100% rename from plugins/stripe-php/lib/Payout.php rename to libs/stripe-php/lib/Payout.php diff --git a/plugins/stripe-php/lib/Person.php b/libs/stripe-php/lib/Person.php similarity index 100% rename from plugins/stripe-php/lib/Person.php rename to libs/stripe-php/lib/Person.php diff --git a/plugins/stripe-php/lib/Plan.php b/libs/stripe-php/lib/Plan.php similarity index 100% rename from plugins/stripe-php/lib/Plan.php rename to libs/stripe-php/lib/Plan.php diff --git a/plugins/stripe-php/lib/Price.php b/libs/stripe-php/lib/Price.php similarity index 100% rename from plugins/stripe-php/lib/Price.php rename to libs/stripe-php/lib/Price.php diff --git a/plugins/stripe-php/lib/Product.php b/libs/stripe-php/lib/Product.php similarity index 100% rename from plugins/stripe-php/lib/Product.php rename to libs/stripe-php/lib/Product.php diff --git a/plugins/stripe-php/lib/ProductFeature.php b/libs/stripe-php/lib/ProductFeature.php similarity index 100% rename from plugins/stripe-php/lib/ProductFeature.php rename to libs/stripe-php/lib/ProductFeature.php diff --git a/plugins/stripe-php/lib/PromotionCode.php b/libs/stripe-php/lib/PromotionCode.php similarity index 100% rename from plugins/stripe-php/lib/PromotionCode.php rename to libs/stripe-php/lib/PromotionCode.php diff --git a/plugins/stripe-php/lib/Quote.php b/libs/stripe-php/lib/Quote.php similarity index 100% rename from plugins/stripe-php/lib/Quote.php rename to libs/stripe-php/lib/Quote.php diff --git a/plugins/stripe-php/lib/Radar/EarlyFraudWarning.php b/libs/stripe-php/lib/Radar/EarlyFraudWarning.php similarity index 100% rename from plugins/stripe-php/lib/Radar/EarlyFraudWarning.php rename to libs/stripe-php/lib/Radar/EarlyFraudWarning.php diff --git a/plugins/stripe-php/lib/Radar/PaymentEvaluation.php b/libs/stripe-php/lib/Radar/PaymentEvaluation.php similarity index 100% rename from plugins/stripe-php/lib/Radar/PaymentEvaluation.php rename to libs/stripe-php/lib/Radar/PaymentEvaluation.php diff --git a/plugins/stripe-php/lib/Radar/ValueList.php b/libs/stripe-php/lib/Radar/ValueList.php similarity index 100% rename from plugins/stripe-php/lib/Radar/ValueList.php rename to libs/stripe-php/lib/Radar/ValueList.php diff --git a/plugins/stripe-php/lib/Radar/ValueListItem.php b/libs/stripe-php/lib/Radar/ValueListItem.php similarity index 100% rename from plugins/stripe-php/lib/Radar/ValueListItem.php rename to libs/stripe-php/lib/Radar/ValueListItem.php diff --git a/plugins/stripe-php/lib/Reason.php b/libs/stripe-php/lib/Reason.php similarity index 100% rename from plugins/stripe-php/lib/Reason.php rename to libs/stripe-php/lib/Reason.php diff --git a/plugins/stripe-php/lib/RecipientTransfer.php b/libs/stripe-php/lib/RecipientTransfer.php similarity index 100% rename from plugins/stripe-php/lib/RecipientTransfer.php rename to libs/stripe-php/lib/RecipientTransfer.php diff --git a/plugins/stripe-php/lib/Refund.php b/libs/stripe-php/lib/Refund.php similarity index 100% rename from plugins/stripe-php/lib/Refund.php rename to libs/stripe-php/lib/Refund.php diff --git a/plugins/stripe-php/lib/RelatedObject.php b/libs/stripe-php/lib/RelatedObject.php similarity index 100% rename from plugins/stripe-php/lib/RelatedObject.php rename to libs/stripe-php/lib/RelatedObject.php diff --git a/plugins/stripe-php/lib/Reporting/ReportRun.php b/libs/stripe-php/lib/Reporting/ReportRun.php similarity index 100% rename from plugins/stripe-php/lib/Reporting/ReportRun.php rename to libs/stripe-php/lib/Reporting/ReportRun.php diff --git a/plugins/stripe-php/lib/Reporting/ReportType.php b/libs/stripe-php/lib/Reporting/ReportType.php similarity index 100% rename from plugins/stripe-php/lib/Reporting/ReportType.php rename to libs/stripe-php/lib/Reporting/ReportType.php diff --git a/plugins/stripe-php/lib/RequestTelemetry.php b/libs/stripe-php/lib/RequestTelemetry.php similarity index 100% rename from plugins/stripe-php/lib/RequestTelemetry.php rename to libs/stripe-php/lib/RequestTelemetry.php diff --git a/plugins/stripe-php/lib/Reserve/Hold.php b/libs/stripe-php/lib/Reserve/Hold.php similarity index 100% rename from plugins/stripe-php/lib/Reserve/Hold.php rename to libs/stripe-php/lib/Reserve/Hold.php diff --git a/plugins/stripe-php/lib/Reserve/Plan.php b/libs/stripe-php/lib/Reserve/Plan.php similarity index 100% rename from plugins/stripe-php/lib/Reserve/Plan.php rename to libs/stripe-php/lib/Reserve/Plan.php diff --git a/plugins/stripe-php/lib/Reserve/Release.php b/libs/stripe-php/lib/Reserve/Release.php similarity index 100% rename from plugins/stripe-php/lib/Reserve/Release.php rename to libs/stripe-php/lib/Reserve/Release.php diff --git a/plugins/stripe-php/lib/ReserveTransaction.php b/libs/stripe-php/lib/ReserveTransaction.php similarity index 100% rename from plugins/stripe-php/lib/ReserveTransaction.php rename to libs/stripe-php/lib/ReserveTransaction.php diff --git a/plugins/stripe-php/lib/Review.php b/libs/stripe-php/lib/Review.php similarity index 100% rename from plugins/stripe-php/lib/Review.php rename to libs/stripe-php/lib/Review.php diff --git a/plugins/stripe-php/lib/SearchResult.php b/libs/stripe-php/lib/SearchResult.php similarity index 100% rename from plugins/stripe-php/lib/SearchResult.php rename to libs/stripe-php/lib/SearchResult.php diff --git a/plugins/stripe-php/lib/Service/AbstractService.php b/libs/stripe-php/lib/Service/AbstractService.php similarity index 100% rename from plugins/stripe-php/lib/Service/AbstractService.php rename to libs/stripe-php/lib/Service/AbstractService.php diff --git a/plugins/stripe-php/lib/Service/AbstractServiceFactory.php b/libs/stripe-php/lib/Service/AbstractServiceFactory.php similarity index 100% rename from plugins/stripe-php/lib/Service/AbstractServiceFactory.php rename to libs/stripe-php/lib/Service/AbstractServiceFactory.php diff --git a/plugins/stripe-php/lib/Service/AccountLinkService.php b/libs/stripe-php/lib/Service/AccountLinkService.php similarity index 100% rename from plugins/stripe-php/lib/Service/AccountLinkService.php rename to libs/stripe-php/lib/Service/AccountLinkService.php diff --git a/plugins/stripe-php/lib/Service/AccountService.php b/libs/stripe-php/lib/Service/AccountService.php similarity index 100% rename from plugins/stripe-php/lib/Service/AccountService.php rename to libs/stripe-php/lib/Service/AccountService.php diff --git a/plugins/stripe-php/lib/Service/AccountSessionService.php b/libs/stripe-php/lib/Service/AccountSessionService.php similarity index 100% rename from plugins/stripe-php/lib/Service/AccountSessionService.php rename to libs/stripe-php/lib/Service/AccountSessionService.php diff --git a/plugins/stripe-php/lib/Service/ApplePayDomainService.php b/libs/stripe-php/lib/Service/ApplePayDomainService.php similarity index 100% rename from plugins/stripe-php/lib/Service/ApplePayDomainService.php rename to libs/stripe-php/lib/Service/ApplePayDomainService.php diff --git a/plugins/stripe-php/lib/Service/ApplicationFeeService.php b/libs/stripe-php/lib/Service/ApplicationFeeService.php similarity index 100% rename from plugins/stripe-php/lib/Service/ApplicationFeeService.php rename to libs/stripe-php/lib/Service/ApplicationFeeService.php diff --git a/plugins/stripe-php/lib/Service/Apps/AppsServiceFactory.php b/libs/stripe-php/lib/Service/Apps/AppsServiceFactory.php similarity index 100% rename from plugins/stripe-php/lib/Service/Apps/AppsServiceFactory.php rename to libs/stripe-php/lib/Service/Apps/AppsServiceFactory.php diff --git a/plugins/stripe-php/lib/Service/Apps/SecretService.php b/libs/stripe-php/lib/Service/Apps/SecretService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Apps/SecretService.php rename to libs/stripe-php/lib/Service/Apps/SecretService.php diff --git a/plugins/stripe-php/lib/Service/BalanceService.php b/libs/stripe-php/lib/Service/BalanceService.php similarity index 100% rename from plugins/stripe-php/lib/Service/BalanceService.php rename to libs/stripe-php/lib/Service/BalanceService.php diff --git a/plugins/stripe-php/lib/Service/BalanceSettingsService.php b/libs/stripe-php/lib/Service/BalanceSettingsService.php similarity index 100% rename from plugins/stripe-php/lib/Service/BalanceSettingsService.php rename to libs/stripe-php/lib/Service/BalanceSettingsService.php diff --git a/plugins/stripe-php/lib/Service/BalanceTransactionService.php b/libs/stripe-php/lib/Service/BalanceTransactionService.php similarity index 100% rename from plugins/stripe-php/lib/Service/BalanceTransactionService.php rename to libs/stripe-php/lib/Service/BalanceTransactionService.php diff --git a/plugins/stripe-php/lib/Service/Billing/AlertService.php b/libs/stripe-php/lib/Service/Billing/AlertService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Billing/AlertService.php rename to libs/stripe-php/lib/Service/Billing/AlertService.php diff --git a/plugins/stripe-php/lib/Service/Billing/BillingServiceFactory.php b/libs/stripe-php/lib/Service/Billing/BillingServiceFactory.php similarity index 100% rename from plugins/stripe-php/lib/Service/Billing/BillingServiceFactory.php rename to libs/stripe-php/lib/Service/Billing/BillingServiceFactory.php diff --git a/plugins/stripe-php/lib/Service/Billing/CreditBalanceSummaryService.php b/libs/stripe-php/lib/Service/Billing/CreditBalanceSummaryService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Billing/CreditBalanceSummaryService.php rename to libs/stripe-php/lib/Service/Billing/CreditBalanceSummaryService.php diff --git a/plugins/stripe-php/lib/Service/Billing/CreditBalanceTransactionService.php b/libs/stripe-php/lib/Service/Billing/CreditBalanceTransactionService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Billing/CreditBalanceTransactionService.php rename to libs/stripe-php/lib/Service/Billing/CreditBalanceTransactionService.php diff --git a/plugins/stripe-php/lib/Service/Billing/CreditGrantService.php b/libs/stripe-php/lib/Service/Billing/CreditGrantService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Billing/CreditGrantService.php rename to libs/stripe-php/lib/Service/Billing/CreditGrantService.php diff --git a/plugins/stripe-php/lib/Service/Billing/MeterEventAdjustmentService.php b/libs/stripe-php/lib/Service/Billing/MeterEventAdjustmentService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Billing/MeterEventAdjustmentService.php rename to libs/stripe-php/lib/Service/Billing/MeterEventAdjustmentService.php diff --git a/plugins/stripe-php/lib/Service/Billing/MeterEventService.php b/libs/stripe-php/lib/Service/Billing/MeterEventService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Billing/MeterEventService.php rename to libs/stripe-php/lib/Service/Billing/MeterEventService.php diff --git a/plugins/stripe-php/lib/Service/Billing/MeterService.php b/libs/stripe-php/lib/Service/Billing/MeterService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Billing/MeterService.php rename to libs/stripe-php/lib/Service/Billing/MeterService.php diff --git a/plugins/stripe-php/lib/Service/BillingPortal/BillingPortalServiceFactory.php b/libs/stripe-php/lib/Service/BillingPortal/BillingPortalServiceFactory.php similarity index 100% rename from plugins/stripe-php/lib/Service/BillingPortal/BillingPortalServiceFactory.php rename to libs/stripe-php/lib/Service/BillingPortal/BillingPortalServiceFactory.php diff --git a/plugins/stripe-php/lib/Service/BillingPortal/ConfigurationService.php b/libs/stripe-php/lib/Service/BillingPortal/ConfigurationService.php similarity index 100% rename from plugins/stripe-php/lib/Service/BillingPortal/ConfigurationService.php rename to libs/stripe-php/lib/Service/BillingPortal/ConfigurationService.php diff --git a/plugins/stripe-php/lib/Service/BillingPortal/SessionService.php b/libs/stripe-php/lib/Service/BillingPortal/SessionService.php similarity index 100% rename from plugins/stripe-php/lib/Service/BillingPortal/SessionService.php rename to libs/stripe-php/lib/Service/BillingPortal/SessionService.php diff --git a/plugins/stripe-php/lib/Service/ChargeService.php b/libs/stripe-php/lib/Service/ChargeService.php similarity index 100% rename from plugins/stripe-php/lib/Service/ChargeService.php rename to libs/stripe-php/lib/Service/ChargeService.php diff --git a/plugins/stripe-php/lib/Service/Checkout/CheckoutServiceFactory.php b/libs/stripe-php/lib/Service/Checkout/CheckoutServiceFactory.php similarity index 100% rename from plugins/stripe-php/lib/Service/Checkout/CheckoutServiceFactory.php rename to libs/stripe-php/lib/Service/Checkout/CheckoutServiceFactory.php diff --git a/plugins/stripe-php/lib/Service/Checkout/SessionService.php b/libs/stripe-php/lib/Service/Checkout/SessionService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Checkout/SessionService.php rename to libs/stripe-php/lib/Service/Checkout/SessionService.php diff --git a/plugins/stripe-php/lib/Service/Climate/ClimateServiceFactory.php b/libs/stripe-php/lib/Service/Climate/ClimateServiceFactory.php similarity index 100% rename from plugins/stripe-php/lib/Service/Climate/ClimateServiceFactory.php rename to libs/stripe-php/lib/Service/Climate/ClimateServiceFactory.php diff --git a/plugins/stripe-php/lib/Service/Climate/OrderService.php b/libs/stripe-php/lib/Service/Climate/OrderService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Climate/OrderService.php rename to libs/stripe-php/lib/Service/Climate/OrderService.php diff --git a/plugins/stripe-php/lib/Service/Climate/ProductService.php b/libs/stripe-php/lib/Service/Climate/ProductService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Climate/ProductService.php rename to libs/stripe-php/lib/Service/Climate/ProductService.php diff --git a/plugins/stripe-php/lib/Service/Climate/SupplierService.php b/libs/stripe-php/lib/Service/Climate/SupplierService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Climate/SupplierService.php rename to libs/stripe-php/lib/Service/Climate/SupplierService.php diff --git a/plugins/stripe-php/lib/Service/ConfirmationTokenService.php b/libs/stripe-php/lib/Service/ConfirmationTokenService.php similarity index 100% rename from plugins/stripe-php/lib/Service/ConfirmationTokenService.php rename to libs/stripe-php/lib/Service/ConfirmationTokenService.php diff --git a/plugins/stripe-php/lib/Service/CoreServiceFactory.php b/libs/stripe-php/lib/Service/CoreServiceFactory.php similarity index 100% rename from plugins/stripe-php/lib/Service/CoreServiceFactory.php rename to libs/stripe-php/lib/Service/CoreServiceFactory.php diff --git a/plugins/stripe-php/lib/Service/CountrySpecService.php b/libs/stripe-php/lib/Service/CountrySpecService.php similarity index 100% rename from plugins/stripe-php/lib/Service/CountrySpecService.php rename to libs/stripe-php/lib/Service/CountrySpecService.php diff --git a/plugins/stripe-php/lib/Service/CouponService.php b/libs/stripe-php/lib/Service/CouponService.php similarity index 100% rename from plugins/stripe-php/lib/Service/CouponService.php rename to libs/stripe-php/lib/Service/CouponService.php diff --git a/plugins/stripe-php/lib/Service/CreditNoteService.php b/libs/stripe-php/lib/Service/CreditNoteService.php similarity index 100% rename from plugins/stripe-php/lib/Service/CreditNoteService.php rename to libs/stripe-php/lib/Service/CreditNoteService.php diff --git a/plugins/stripe-php/lib/Service/CustomerService.php b/libs/stripe-php/lib/Service/CustomerService.php similarity index 100% rename from plugins/stripe-php/lib/Service/CustomerService.php rename to libs/stripe-php/lib/Service/CustomerService.php diff --git a/plugins/stripe-php/lib/Service/CustomerSessionService.php b/libs/stripe-php/lib/Service/CustomerSessionService.php similarity index 100% rename from plugins/stripe-php/lib/Service/CustomerSessionService.php rename to libs/stripe-php/lib/Service/CustomerSessionService.php diff --git a/plugins/stripe-php/lib/Service/DisputeService.php b/libs/stripe-php/lib/Service/DisputeService.php similarity index 100% rename from plugins/stripe-php/lib/Service/DisputeService.php rename to libs/stripe-php/lib/Service/DisputeService.php diff --git a/plugins/stripe-php/lib/Service/Entitlements/ActiveEntitlementService.php b/libs/stripe-php/lib/Service/Entitlements/ActiveEntitlementService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Entitlements/ActiveEntitlementService.php rename to libs/stripe-php/lib/Service/Entitlements/ActiveEntitlementService.php diff --git a/plugins/stripe-php/lib/Service/Entitlements/EntitlementsServiceFactory.php b/libs/stripe-php/lib/Service/Entitlements/EntitlementsServiceFactory.php similarity index 100% rename from plugins/stripe-php/lib/Service/Entitlements/EntitlementsServiceFactory.php rename to libs/stripe-php/lib/Service/Entitlements/EntitlementsServiceFactory.php diff --git a/plugins/stripe-php/lib/Service/Entitlements/FeatureService.php b/libs/stripe-php/lib/Service/Entitlements/FeatureService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Entitlements/FeatureService.php rename to libs/stripe-php/lib/Service/Entitlements/FeatureService.php diff --git a/plugins/stripe-php/lib/Service/EphemeralKeyService.php b/libs/stripe-php/lib/Service/EphemeralKeyService.php similarity index 100% rename from plugins/stripe-php/lib/Service/EphemeralKeyService.php rename to libs/stripe-php/lib/Service/EphemeralKeyService.php diff --git a/plugins/stripe-php/lib/Service/EventService.php b/libs/stripe-php/lib/Service/EventService.php similarity index 100% rename from plugins/stripe-php/lib/Service/EventService.php rename to libs/stripe-php/lib/Service/EventService.php diff --git a/plugins/stripe-php/lib/Service/ExchangeRateService.php b/libs/stripe-php/lib/Service/ExchangeRateService.php similarity index 100% rename from plugins/stripe-php/lib/Service/ExchangeRateService.php rename to libs/stripe-php/lib/Service/ExchangeRateService.php diff --git a/plugins/stripe-php/lib/Service/FileLinkService.php b/libs/stripe-php/lib/Service/FileLinkService.php similarity index 100% rename from plugins/stripe-php/lib/Service/FileLinkService.php rename to libs/stripe-php/lib/Service/FileLinkService.php diff --git a/plugins/stripe-php/lib/Service/FileService.php b/libs/stripe-php/lib/Service/FileService.php similarity index 100% rename from plugins/stripe-php/lib/Service/FileService.php rename to libs/stripe-php/lib/Service/FileService.php diff --git a/plugins/stripe-php/lib/Service/FinancialConnections/AccountService.php b/libs/stripe-php/lib/Service/FinancialConnections/AccountService.php similarity index 100% rename from plugins/stripe-php/lib/Service/FinancialConnections/AccountService.php rename to libs/stripe-php/lib/Service/FinancialConnections/AccountService.php diff --git a/plugins/stripe-php/lib/Service/FinancialConnections/FinancialConnectionsServiceFactory.php b/libs/stripe-php/lib/Service/FinancialConnections/FinancialConnectionsServiceFactory.php similarity index 100% rename from plugins/stripe-php/lib/Service/FinancialConnections/FinancialConnectionsServiceFactory.php rename to libs/stripe-php/lib/Service/FinancialConnections/FinancialConnectionsServiceFactory.php diff --git a/plugins/stripe-php/lib/Service/FinancialConnections/SessionService.php b/libs/stripe-php/lib/Service/FinancialConnections/SessionService.php similarity index 100% rename from plugins/stripe-php/lib/Service/FinancialConnections/SessionService.php rename to libs/stripe-php/lib/Service/FinancialConnections/SessionService.php diff --git a/plugins/stripe-php/lib/Service/FinancialConnections/TransactionService.php b/libs/stripe-php/lib/Service/FinancialConnections/TransactionService.php similarity index 100% rename from plugins/stripe-php/lib/Service/FinancialConnections/TransactionService.php rename to libs/stripe-php/lib/Service/FinancialConnections/TransactionService.php diff --git a/plugins/stripe-php/lib/Service/Forwarding/ForwardingServiceFactory.php b/libs/stripe-php/lib/Service/Forwarding/ForwardingServiceFactory.php similarity index 100% rename from plugins/stripe-php/lib/Service/Forwarding/ForwardingServiceFactory.php rename to libs/stripe-php/lib/Service/Forwarding/ForwardingServiceFactory.php diff --git a/plugins/stripe-php/lib/Service/Forwarding/RequestService.php b/libs/stripe-php/lib/Service/Forwarding/RequestService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Forwarding/RequestService.php rename to libs/stripe-php/lib/Service/Forwarding/RequestService.php diff --git a/plugins/stripe-php/lib/Service/Identity/IdentityServiceFactory.php b/libs/stripe-php/lib/Service/Identity/IdentityServiceFactory.php similarity index 100% rename from plugins/stripe-php/lib/Service/Identity/IdentityServiceFactory.php rename to libs/stripe-php/lib/Service/Identity/IdentityServiceFactory.php diff --git a/plugins/stripe-php/lib/Service/Identity/VerificationReportService.php b/libs/stripe-php/lib/Service/Identity/VerificationReportService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Identity/VerificationReportService.php rename to libs/stripe-php/lib/Service/Identity/VerificationReportService.php diff --git a/plugins/stripe-php/lib/Service/Identity/VerificationSessionService.php b/libs/stripe-php/lib/Service/Identity/VerificationSessionService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Identity/VerificationSessionService.php rename to libs/stripe-php/lib/Service/Identity/VerificationSessionService.php diff --git a/plugins/stripe-php/lib/Service/InvoiceItemService.php b/libs/stripe-php/lib/Service/InvoiceItemService.php similarity index 100% rename from plugins/stripe-php/lib/Service/InvoiceItemService.php rename to libs/stripe-php/lib/Service/InvoiceItemService.php diff --git a/plugins/stripe-php/lib/Service/InvoicePaymentService.php b/libs/stripe-php/lib/Service/InvoicePaymentService.php similarity index 100% rename from plugins/stripe-php/lib/Service/InvoicePaymentService.php rename to libs/stripe-php/lib/Service/InvoicePaymentService.php diff --git a/plugins/stripe-php/lib/Service/InvoiceRenderingTemplateService.php b/libs/stripe-php/lib/Service/InvoiceRenderingTemplateService.php similarity index 100% rename from plugins/stripe-php/lib/Service/InvoiceRenderingTemplateService.php rename to libs/stripe-php/lib/Service/InvoiceRenderingTemplateService.php diff --git a/plugins/stripe-php/lib/Service/InvoiceService.php b/libs/stripe-php/lib/Service/InvoiceService.php similarity index 100% rename from plugins/stripe-php/lib/Service/InvoiceService.php rename to libs/stripe-php/lib/Service/InvoiceService.php diff --git a/plugins/stripe-php/lib/Service/Issuing/AuthorizationService.php b/libs/stripe-php/lib/Service/Issuing/AuthorizationService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Issuing/AuthorizationService.php rename to libs/stripe-php/lib/Service/Issuing/AuthorizationService.php diff --git a/plugins/stripe-php/lib/Service/Issuing/CardService.php b/libs/stripe-php/lib/Service/Issuing/CardService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Issuing/CardService.php rename to libs/stripe-php/lib/Service/Issuing/CardService.php diff --git a/plugins/stripe-php/lib/Service/Issuing/CardholderService.php b/libs/stripe-php/lib/Service/Issuing/CardholderService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Issuing/CardholderService.php rename to libs/stripe-php/lib/Service/Issuing/CardholderService.php diff --git a/plugins/stripe-php/lib/Service/Issuing/DisputeService.php b/libs/stripe-php/lib/Service/Issuing/DisputeService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Issuing/DisputeService.php rename to libs/stripe-php/lib/Service/Issuing/DisputeService.php diff --git a/plugins/stripe-php/lib/Service/Issuing/IssuingServiceFactory.php b/libs/stripe-php/lib/Service/Issuing/IssuingServiceFactory.php similarity index 100% rename from plugins/stripe-php/lib/Service/Issuing/IssuingServiceFactory.php rename to libs/stripe-php/lib/Service/Issuing/IssuingServiceFactory.php diff --git a/plugins/stripe-php/lib/Service/Issuing/PersonalizationDesignService.php b/libs/stripe-php/lib/Service/Issuing/PersonalizationDesignService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Issuing/PersonalizationDesignService.php rename to libs/stripe-php/lib/Service/Issuing/PersonalizationDesignService.php diff --git a/plugins/stripe-php/lib/Service/Issuing/PhysicalBundleService.php b/libs/stripe-php/lib/Service/Issuing/PhysicalBundleService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Issuing/PhysicalBundleService.php rename to libs/stripe-php/lib/Service/Issuing/PhysicalBundleService.php diff --git a/plugins/stripe-php/lib/Service/Issuing/TokenService.php b/libs/stripe-php/lib/Service/Issuing/TokenService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Issuing/TokenService.php rename to libs/stripe-php/lib/Service/Issuing/TokenService.php diff --git a/plugins/stripe-php/lib/Service/Issuing/TransactionService.php b/libs/stripe-php/lib/Service/Issuing/TransactionService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Issuing/TransactionService.php rename to libs/stripe-php/lib/Service/Issuing/TransactionService.php diff --git a/plugins/stripe-php/lib/Service/MandateService.php b/libs/stripe-php/lib/Service/MandateService.php similarity index 100% rename from plugins/stripe-php/lib/Service/MandateService.php rename to libs/stripe-php/lib/Service/MandateService.php diff --git a/plugins/stripe-php/lib/Service/OAuthService.php b/libs/stripe-php/lib/Service/OAuthService.php similarity index 100% rename from plugins/stripe-php/lib/Service/OAuthService.php rename to libs/stripe-php/lib/Service/OAuthService.php diff --git a/plugins/stripe-php/lib/Service/PaymentAttemptRecordService.php b/libs/stripe-php/lib/Service/PaymentAttemptRecordService.php similarity index 100% rename from plugins/stripe-php/lib/Service/PaymentAttemptRecordService.php rename to libs/stripe-php/lib/Service/PaymentAttemptRecordService.php diff --git a/plugins/stripe-php/lib/Service/PaymentIntentService.php b/libs/stripe-php/lib/Service/PaymentIntentService.php similarity index 100% rename from plugins/stripe-php/lib/Service/PaymentIntentService.php rename to libs/stripe-php/lib/Service/PaymentIntentService.php diff --git a/plugins/stripe-php/lib/Service/PaymentLinkService.php b/libs/stripe-php/lib/Service/PaymentLinkService.php similarity index 100% rename from plugins/stripe-php/lib/Service/PaymentLinkService.php rename to libs/stripe-php/lib/Service/PaymentLinkService.php diff --git a/plugins/stripe-php/lib/Service/PaymentMethodConfigurationService.php b/libs/stripe-php/lib/Service/PaymentMethodConfigurationService.php similarity index 100% rename from plugins/stripe-php/lib/Service/PaymentMethodConfigurationService.php rename to libs/stripe-php/lib/Service/PaymentMethodConfigurationService.php diff --git a/plugins/stripe-php/lib/Service/PaymentMethodDomainService.php b/libs/stripe-php/lib/Service/PaymentMethodDomainService.php similarity index 100% rename from plugins/stripe-php/lib/Service/PaymentMethodDomainService.php rename to libs/stripe-php/lib/Service/PaymentMethodDomainService.php diff --git a/plugins/stripe-php/lib/Service/PaymentMethodService.php b/libs/stripe-php/lib/Service/PaymentMethodService.php similarity index 100% rename from plugins/stripe-php/lib/Service/PaymentMethodService.php rename to libs/stripe-php/lib/Service/PaymentMethodService.php diff --git a/plugins/stripe-php/lib/Service/PaymentRecordService.php b/libs/stripe-php/lib/Service/PaymentRecordService.php similarity index 100% rename from plugins/stripe-php/lib/Service/PaymentRecordService.php rename to libs/stripe-php/lib/Service/PaymentRecordService.php diff --git a/plugins/stripe-php/lib/Service/PayoutService.php b/libs/stripe-php/lib/Service/PayoutService.php similarity index 100% rename from plugins/stripe-php/lib/Service/PayoutService.php rename to libs/stripe-php/lib/Service/PayoutService.php diff --git a/plugins/stripe-php/lib/Service/PlanService.php b/libs/stripe-php/lib/Service/PlanService.php similarity index 100% rename from plugins/stripe-php/lib/Service/PlanService.php rename to libs/stripe-php/lib/Service/PlanService.php diff --git a/plugins/stripe-php/lib/Service/PriceService.php b/libs/stripe-php/lib/Service/PriceService.php similarity index 100% rename from plugins/stripe-php/lib/Service/PriceService.php rename to libs/stripe-php/lib/Service/PriceService.php diff --git a/plugins/stripe-php/lib/Service/ProductService.php b/libs/stripe-php/lib/Service/ProductService.php similarity index 100% rename from plugins/stripe-php/lib/Service/ProductService.php rename to libs/stripe-php/lib/Service/ProductService.php diff --git a/plugins/stripe-php/lib/Service/PromotionCodeService.php b/libs/stripe-php/lib/Service/PromotionCodeService.php similarity index 100% rename from plugins/stripe-php/lib/Service/PromotionCodeService.php rename to libs/stripe-php/lib/Service/PromotionCodeService.php diff --git a/plugins/stripe-php/lib/Service/QuoteService.php b/libs/stripe-php/lib/Service/QuoteService.php similarity index 100% rename from plugins/stripe-php/lib/Service/QuoteService.php rename to libs/stripe-php/lib/Service/QuoteService.php diff --git a/plugins/stripe-php/lib/Service/Radar/EarlyFraudWarningService.php b/libs/stripe-php/lib/Service/Radar/EarlyFraudWarningService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Radar/EarlyFraudWarningService.php rename to libs/stripe-php/lib/Service/Radar/EarlyFraudWarningService.php diff --git a/plugins/stripe-php/lib/Service/Radar/PaymentEvaluationService.php b/libs/stripe-php/lib/Service/Radar/PaymentEvaluationService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Radar/PaymentEvaluationService.php rename to libs/stripe-php/lib/Service/Radar/PaymentEvaluationService.php diff --git a/plugins/stripe-php/lib/Service/Radar/RadarServiceFactory.php b/libs/stripe-php/lib/Service/Radar/RadarServiceFactory.php similarity index 100% rename from plugins/stripe-php/lib/Service/Radar/RadarServiceFactory.php rename to libs/stripe-php/lib/Service/Radar/RadarServiceFactory.php diff --git a/plugins/stripe-php/lib/Service/Radar/ValueListItemService.php b/libs/stripe-php/lib/Service/Radar/ValueListItemService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Radar/ValueListItemService.php rename to libs/stripe-php/lib/Service/Radar/ValueListItemService.php diff --git a/plugins/stripe-php/lib/Service/Radar/ValueListService.php b/libs/stripe-php/lib/Service/Radar/ValueListService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Radar/ValueListService.php rename to libs/stripe-php/lib/Service/Radar/ValueListService.php diff --git a/plugins/stripe-php/lib/Service/RefundService.php b/libs/stripe-php/lib/Service/RefundService.php similarity index 100% rename from plugins/stripe-php/lib/Service/RefundService.php rename to libs/stripe-php/lib/Service/RefundService.php diff --git a/plugins/stripe-php/lib/Service/Reporting/ReportRunService.php b/libs/stripe-php/lib/Service/Reporting/ReportRunService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Reporting/ReportRunService.php rename to libs/stripe-php/lib/Service/Reporting/ReportRunService.php diff --git a/plugins/stripe-php/lib/Service/Reporting/ReportTypeService.php b/libs/stripe-php/lib/Service/Reporting/ReportTypeService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Reporting/ReportTypeService.php rename to libs/stripe-php/lib/Service/Reporting/ReportTypeService.php diff --git a/plugins/stripe-php/lib/Service/Reporting/ReportingServiceFactory.php b/libs/stripe-php/lib/Service/Reporting/ReportingServiceFactory.php similarity index 100% rename from plugins/stripe-php/lib/Service/Reporting/ReportingServiceFactory.php rename to libs/stripe-php/lib/Service/Reporting/ReportingServiceFactory.php diff --git a/plugins/stripe-php/lib/Service/ReviewService.php b/libs/stripe-php/lib/Service/ReviewService.php similarity index 100% rename from plugins/stripe-php/lib/Service/ReviewService.php rename to libs/stripe-php/lib/Service/ReviewService.php diff --git a/plugins/stripe-php/lib/Service/ServiceNavigatorTrait.php b/libs/stripe-php/lib/Service/ServiceNavigatorTrait.php similarity index 100% rename from plugins/stripe-php/lib/Service/ServiceNavigatorTrait.php rename to libs/stripe-php/lib/Service/ServiceNavigatorTrait.php diff --git a/plugins/stripe-php/lib/Service/SetupAttemptService.php b/libs/stripe-php/lib/Service/SetupAttemptService.php similarity index 100% rename from plugins/stripe-php/lib/Service/SetupAttemptService.php rename to libs/stripe-php/lib/Service/SetupAttemptService.php diff --git a/plugins/stripe-php/lib/Service/SetupIntentService.php b/libs/stripe-php/lib/Service/SetupIntentService.php similarity index 100% rename from plugins/stripe-php/lib/Service/SetupIntentService.php rename to libs/stripe-php/lib/Service/SetupIntentService.php diff --git a/plugins/stripe-php/lib/Service/ShippingRateService.php b/libs/stripe-php/lib/Service/ShippingRateService.php similarity index 100% rename from plugins/stripe-php/lib/Service/ShippingRateService.php rename to libs/stripe-php/lib/Service/ShippingRateService.php diff --git a/plugins/stripe-php/lib/Service/Sigma/ScheduledQueryRunService.php b/libs/stripe-php/lib/Service/Sigma/ScheduledQueryRunService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Sigma/ScheduledQueryRunService.php rename to libs/stripe-php/lib/Service/Sigma/ScheduledQueryRunService.php diff --git a/plugins/stripe-php/lib/Service/Sigma/SigmaServiceFactory.php b/libs/stripe-php/lib/Service/Sigma/SigmaServiceFactory.php similarity index 100% rename from plugins/stripe-php/lib/Service/Sigma/SigmaServiceFactory.php rename to libs/stripe-php/lib/Service/Sigma/SigmaServiceFactory.php diff --git a/plugins/stripe-php/lib/Service/SourceService.php b/libs/stripe-php/lib/Service/SourceService.php similarity index 100% rename from plugins/stripe-php/lib/Service/SourceService.php rename to libs/stripe-php/lib/Service/SourceService.php diff --git a/plugins/stripe-php/lib/Service/SubscriptionItemService.php b/libs/stripe-php/lib/Service/SubscriptionItemService.php similarity index 100% rename from plugins/stripe-php/lib/Service/SubscriptionItemService.php rename to libs/stripe-php/lib/Service/SubscriptionItemService.php diff --git a/plugins/stripe-php/lib/Service/SubscriptionScheduleService.php b/libs/stripe-php/lib/Service/SubscriptionScheduleService.php similarity index 100% rename from plugins/stripe-php/lib/Service/SubscriptionScheduleService.php rename to libs/stripe-php/lib/Service/SubscriptionScheduleService.php diff --git a/plugins/stripe-php/lib/Service/SubscriptionService.php b/libs/stripe-php/lib/Service/SubscriptionService.php similarity index 100% rename from plugins/stripe-php/lib/Service/SubscriptionService.php rename to libs/stripe-php/lib/Service/SubscriptionService.php diff --git a/plugins/stripe-php/lib/Service/Tax/AssociationService.php b/libs/stripe-php/lib/Service/Tax/AssociationService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Tax/AssociationService.php rename to libs/stripe-php/lib/Service/Tax/AssociationService.php diff --git a/plugins/stripe-php/lib/Service/Tax/CalculationService.php b/libs/stripe-php/lib/Service/Tax/CalculationService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Tax/CalculationService.php rename to libs/stripe-php/lib/Service/Tax/CalculationService.php diff --git a/plugins/stripe-php/lib/Service/Tax/RegistrationService.php b/libs/stripe-php/lib/Service/Tax/RegistrationService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Tax/RegistrationService.php rename to libs/stripe-php/lib/Service/Tax/RegistrationService.php diff --git a/plugins/stripe-php/lib/Service/Tax/SettingsService.php b/libs/stripe-php/lib/Service/Tax/SettingsService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Tax/SettingsService.php rename to libs/stripe-php/lib/Service/Tax/SettingsService.php diff --git a/plugins/stripe-php/lib/Service/Tax/TaxServiceFactory.php b/libs/stripe-php/lib/Service/Tax/TaxServiceFactory.php similarity index 100% rename from plugins/stripe-php/lib/Service/Tax/TaxServiceFactory.php rename to libs/stripe-php/lib/Service/Tax/TaxServiceFactory.php diff --git a/plugins/stripe-php/lib/Service/Tax/TransactionService.php b/libs/stripe-php/lib/Service/Tax/TransactionService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Tax/TransactionService.php rename to libs/stripe-php/lib/Service/Tax/TransactionService.php diff --git a/plugins/stripe-php/lib/Service/TaxCodeService.php b/libs/stripe-php/lib/Service/TaxCodeService.php similarity index 100% rename from plugins/stripe-php/lib/Service/TaxCodeService.php rename to libs/stripe-php/lib/Service/TaxCodeService.php diff --git a/plugins/stripe-php/lib/Service/TaxIdService.php b/libs/stripe-php/lib/Service/TaxIdService.php similarity index 100% rename from plugins/stripe-php/lib/Service/TaxIdService.php rename to libs/stripe-php/lib/Service/TaxIdService.php diff --git a/plugins/stripe-php/lib/Service/TaxRateService.php b/libs/stripe-php/lib/Service/TaxRateService.php similarity index 100% rename from plugins/stripe-php/lib/Service/TaxRateService.php rename to libs/stripe-php/lib/Service/TaxRateService.php diff --git a/plugins/stripe-php/lib/Service/Terminal/ConfigurationService.php b/libs/stripe-php/lib/Service/Terminal/ConfigurationService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Terminal/ConfigurationService.php rename to libs/stripe-php/lib/Service/Terminal/ConfigurationService.php diff --git a/plugins/stripe-php/lib/Service/Terminal/ConnectionTokenService.php b/libs/stripe-php/lib/Service/Terminal/ConnectionTokenService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Terminal/ConnectionTokenService.php rename to libs/stripe-php/lib/Service/Terminal/ConnectionTokenService.php diff --git a/plugins/stripe-php/lib/Service/Terminal/LocationService.php b/libs/stripe-php/lib/Service/Terminal/LocationService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Terminal/LocationService.php rename to libs/stripe-php/lib/Service/Terminal/LocationService.php diff --git a/plugins/stripe-php/lib/Service/Terminal/OnboardingLinkService.php b/libs/stripe-php/lib/Service/Terminal/OnboardingLinkService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Terminal/OnboardingLinkService.php rename to libs/stripe-php/lib/Service/Terminal/OnboardingLinkService.php diff --git a/plugins/stripe-php/lib/Service/Terminal/ReaderService.php b/libs/stripe-php/lib/Service/Terminal/ReaderService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Terminal/ReaderService.php rename to libs/stripe-php/lib/Service/Terminal/ReaderService.php diff --git a/plugins/stripe-php/lib/Service/Terminal/TerminalServiceFactory.php b/libs/stripe-php/lib/Service/Terminal/TerminalServiceFactory.php similarity index 100% rename from plugins/stripe-php/lib/Service/Terminal/TerminalServiceFactory.php rename to libs/stripe-php/lib/Service/Terminal/TerminalServiceFactory.php diff --git a/plugins/stripe-php/lib/Service/TestHelpers/ConfirmationTokenService.php b/libs/stripe-php/lib/Service/TestHelpers/ConfirmationTokenService.php similarity index 100% rename from plugins/stripe-php/lib/Service/TestHelpers/ConfirmationTokenService.php rename to libs/stripe-php/lib/Service/TestHelpers/ConfirmationTokenService.php diff --git a/plugins/stripe-php/lib/Service/TestHelpers/CustomerService.php b/libs/stripe-php/lib/Service/TestHelpers/CustomerService.php similarity index 100% rename from plugins/stripe-php/lib/Service/TestHelpers/CustomerService.php rename to libs/stripe-php/lib/Service/TestHelpers/CustomerService.php diff --git a/plugins/stripe-php/lib/Service/TestHelpers/Issuing/AuthorizationService.php b/libs/stripe-php/lib/Service/TestHelpers/Issuing/AuthorizationService.php similarity index 100% rename from plugins/stripe-php/lib/Service/TestHelpers/Issuing/AuthorizationService.php rename to libs/stripe-php/lib/Service/TestHelpers/Issuing/AuthorizationService.php diff --git a/plugins/stripe-php/lib/Service/TestHelpers/Issuing/CardService.php b/libs/stripe-php/lib/Service/TestHelpers/Issuing/CardService.php similarity index 100% rename from plugins/stripe-php/lib/Service/TestHelpers/Issuing/CardService.php rename to libs/stripe-php/lib/Service/TestHelpers/Issuing/CardService.php diff --git a/plugins/stripe-php/lib/Service/TestHelpers/Issuing/IssuingServiceFactory.php b/libs/stripe-php/lib/Service/TestHelpers/Issuing/IssuingServiceFactory.php similarity index 100% rename from plugins/stripe-php/lib/Service/TestHelpers/Issuing/IssuingServiceFactory.php rename to libs/stripe-php/lib/Service/TestHelpers/Issuing/IssuingServiceFactory.php diff --git a/plugins/stripe-php/lib/Service/TestHelpers/Issuing/PersonalizationDesignService.php b/libs/stripe-php/lib/Service/TestHelpers/Issuing/PersonalizationDesignService.php similarity index 100% rename from plugins/stripe-php/lib/Service/TestHelpers/Issuing/PersonalizationDesignService.php rename to libs/stripe-php/lib/Service/TestHelpers/Issuing/PersonalizationDesignService.php diff --git a/plugins/stripe-php/lib/Service/TestHelpers/Issuing/TransactionService.php b/libs/stripe-php/lib/Service/TestHelpers/Issuing/TransactionService.php similarity index 100% rename from plugins/stripe-php/lib/Service/TestHelpers/Issuing/TransactionService.php rename to libs/stripe-php/lib/Service/TestHelpers/Issuing/TransactionService.php diff --git a/plugins/stripe-php/lib/Service/TestHelpers/RefundService.php b/libs/stripe-php/lib/Service/TestHelpers/RefundService.php similarity index 100% rename from plugins/stripe-php/lib/Service/TestHelpers/RefundService.php rename to libs/stripe-php/lib/Service/TestHelpers/RefundService.php diff --git a/plugins/stripe-php/lib/Service/TestHelpers/Terminal/ReaderService.php b/libs/stripe-php/lib/Service/TestHelpers/Terminal/ReaderService.php similarity index 100% rename from plugins/stripe-php/lib/Service/TestHelpers/Terminal/ReaderService.php rename to libs/stripe-php/lib/Service/TestHelpers/Terminal/ReaderService.php diff --git a/plugins/stripe-php/lib/Service/TestHelpers/Terminal/TerminalServiceFactory.php b/libs/stripe-php/lib/Service/TestHelpers/Terminal/TerminalServiceFactory.php similarity index 100% rename from plugins/stripe-php/lib/Service/TestHelpers/Terminal/TerminalServiceFactory.php rename to libs/stripe-php/lib/Service/TestHelpers/Terminal/TerminalServiceFactory.php diff --git a/plugins/stripe-php/lib/Service/TestHelpers/TestClockService.php b/libs/stripe-php/lib/Service/TestHelpers/TestClockService.php similarity index 100% rename from plugins/stripe-php/lib/Service/TestHelpers/TestClockService.php rename to libs/stripe-php/lib/Service/TestHelpers/TestClockService.php diff --git a/plugins/stripe-php/lib/Service/TestHelpers/TestHelpersServiceFactory.php b/libs/stripe-php/lib/Service/TestHelpers/TestHelpersServiceFactory.php similarity index 100% rename from plugins/stripe-php/lib/Service/TestHelpers/TestHelpersServiceFactory.php rename to libs/stripe-php/lib/Service/TestHelpers/TestHelpersServiceFactory.php diff --git a/plugins/stripe-php/lib/Service/TestHelpers/Treasury/InboundTransferService.php b/libs/stripe-php/lib/Service/TestHelpers/Treasury/InboundTransferService.php similarity index 100% rename from plugins/stripe-php/lib/Service/TestHelpers/Treasury/InboundTransferService.php rename to libs/stripe-php/lib/Service/TestHelpers/Treasury/InboundTransferService.php diff --git a/plugins/stripe-php/lib/Service/TestHelpers/Treasury/OutboundPaymentService.php b/libs/stripe-php/lib/Service/TestHelpers/Treasury/OutboundPaymentService.php similarity index 100% rename from plugins/stripe-php/lib/Service/TestHelpers/Treasury/OutboundPaymentService.php rename to libs/stripe-php/lib/Service/TestHelpers/Treasury/OutboundPaymentService.php diff --git a/plugins/stripe-php/lib/Service/TestHelpers/Treasury/OutboundTransferService.php b/libs/stripe-php/lib/Service/TestHelpers/Treasury/OutboundTransferService.php similarity index 100% rename from plugins/stripe-php/lib/Service/TestHelpers/Treasury/OutboundTransferService.php rename to libs/stripe-php/lib/Service/TestHelpers/Treasury/OutboundTransferService.php diff --git a/plugins/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedCreditService.php b/libs/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedCreditService.php similarity index 100% rename from plugins/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedCreditService.php rename to libs/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedCreditService.php diff --git a/plugins/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedDebitService.php b/libs/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedDebitService.php similarity index 100% rename from plugins/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedDebitService.php rename to libs/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedDebitService.php diff --git a/plugins/stripe-php/lib/Service/TestHelpers/Treasury/TreasuryServiceFactory.php b/libs/stripe-php/lib/Service/TestHelpers/Treasury/TreasuryServiceFactory.php similarity index 100% rename from plugins/stripe-php/lib/Service/TestHelpers/Treasury/TreasuryServiceFactory.php rename to libs/stripe-php/lib/Service/TestHelpers/Treasury/TreasuryServiceFactory.php diff --git a/plugins/stripe-php/lib/Service/TokenService.php b/libs/stripe-php/lib/Service/TokenService.php similarity index 100% rename from plugins/stripe-php/lib/Service/TokenService.php rename to libs/stripe-php/lib/Service/TokenService.php diff --git a/plugins/stripe-php/lib/Service/TopupService.php b/libs/stripe-php/lib/Service/TopupService.php similarity index 100% rename from plugins/stripe-php/lib/Service/TopupService.php rename to libs/stripe-php/lib/Service/TopupService.php diff --git a/plugins/stripe-php/lib/Service/TransferService.php b/libs/stripe-php/lib/Service/TransferService.php similarity index 100% rename from plugins/stripe-php/lib/Service/TransferService.php rename to libs/stripe-php/lib/Service/TransferService.php diff --git a/plugins/stripe-php/lib/Service/Treasury/CreditReversalService.php b/libs/stripe-php/lib/Service/Treasury/CreditReversalService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Treasury/CreditReversalService.php rename to libs/stripe-php/lib/Service/Treasury/CreditReversalService.php diff --git a/plugins/stripe-php/lib/Service/Treasury/DebitReversalService.php b/libs/stripe-php/lib/Service/Treasury/DebitReversalService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Treasury/DebitReversalService.php rename to libs/stripe-php/lib/Service/Treasury/DebitReversalService.php diff --git a/plugins/stripe-php/lib/Service/Treasury/FinancialAccountService.php b/libs/stripe-php/lib/Service/Treasury/FinancialAccountService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Treasury/FinancialAccountService.php rename to libs/stripe-php/lib/Service/Treasury/FinancialAccountService.php diff --git a/plugins/stripe-php/lib/Service/Treasury/InboundTransferService.php b/libs/stripe-php/lib/Service/Treasury/InboundTransferService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Treasury/InboundTransferService.php rename to libs/stripe-php/lib/Service/Treasury/InboundTransferService.php diff --git a/plugins/stripe-php/lib/Service/Treasury/OutboundPaymentService.php b/libs/stripe-php/lib/Service/Treasury/OutboundPaymentService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Treasury/OutboundPaymentService.php rename to libs/stripe-php/lib/Service/Treasury/OutboundPaymentService.php diff --git a/plugins/stripe-php/lib/Service/Treasury/OutboundTransferService.php b/libs/stripe-php/lib/Service/Treasury/OutboundTransferService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Treasury/OutboundTransferService.php rename to libs/stripe-php/lib/Service/Treasury/OutboundTransferService.php diff --git a/plugins/stripe-php/lib/Service/Treasury/ReceivedCreditService.php b/libs/stripe-php/lib/Service/Treasury/ReceivedCreditService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Treasury/ReceivedCreditService.php rename to libs/stripe-php/lib/Service/Treasury/ReceivedCreditService.php diff --git a/plugins/stripe-php/lib/Service/Treasury/ReceivedDebitService.php b/libs/stripe-php/lib/Service/Treasury/ReceivedDebitService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Treasury/ReceivedDebitService.php rename to libs/stripe-php/lib/Service/Treasury/ReceivedDebitService.php diff --git a/plugins/stripe-php/lib/Service/Treasury/TransactionEntryService.php b/libs/stripe-php/lib/Service/Treasury/TransactionEntryService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Treasury/TransactionEntryService.php rename to libs/stripe-php/lib/Service/Treasury/TransactionEntryService.php diff --git a/plugins/stripe-php/lib/Service/Treasury/TransactionService.php b/libs/stripe-php/lib/Service/Treasury/TransactionService.php similarity index 100% rename from plugins/stripe-php/lib/Service/Treasury/TransactionService.php rename to libs/stripe-php/lib/Service/Treasury/TransactionService.php diff --git a/plugins/stripe-php/lib/Service/Treasury/TreasuryServiceFactory.php b/libs/stripe-php/lib/Service/Treasury/TreasuryServiceFactory.php similarity index 100% rename from plugins/stripe-php/lib/Service/Treasury/TreasuryServiceFactory.php rename to libs/stripe-php/lib/Service/Treasury/TreasuryServiceFactory.php diff --git a/plugins/stripe-php/lib/Service/V2/Billing/BillingServiceFactory.php b/libs/stripe-php/lib/Service/V2/Billing/BillingServiceFactory.php similarity index 100% rename from plugins/stripe-php/lib/Service/V2/Billing/BillingServiceFactory.php rename to libs/stripe-php/lib/Service/V2/Billing/BillingServiceFactory.php diff --git a/plugins/stripe-php/lib/Service/V2/Billing/MeterEventAdjustmentService.php b/libs/stripe-php/lib/Service/V2/Billing/MeterEventAdjustmentService.php similarity index 100% rename from plugins/stripe-php/lib/Service/V2/Billing/MeterEventAdjustmentService.php rename to libs/stripe-php/lib/Service/V2/Billing/MeterEventAdjustmentService.php diff --git a/plugins/stripe-php/lib/Service/V2/Billing/MeterEventService.php b/libs/stripe-php/lib/Service/V2/Billing/MeterEventService.php similarity index 100% rename from plugins/stripe-php/lib/Service/V2/Billing/MeterEventService.php rename to libs/stripe-php/lib/Service/V2/Billing/MeterEventService.php diff --git a/plugins/stripe-php/lib/Service/V2/Billing/MeterEventSessionService.php b/libs/stripe-php/lib/Service/V2/Billing/MeterEventSessionService.php similarity index 100% rename from plugins/stripe-php/lib/Service/V2/Billing/MeterEventSessionService.php rename to libs/stripe-php/lib/Service/V2/Billing/MeterEventSessionService.php diff --git a/plugins/stripe-php/lib/Service/V2/Billing/MeterEventStreamService.php b/libs/stripe-php/lib/Service/V2/Billing/MeterEventStreamService.php similarity index 100% rename from plugins/stripe-php/lib/Service/V2/Billing/MeterEventStreamService.php rename to libs/stripe-php/lib/Service/V2/Billing/MeterEventStreamService.php diff --git a/plugins/stripe-php/lib/Service/V2/Core/AccountLinkService.php b/libs/stripe-php/lib/Service/V2/Core/AccountLinkService.php similarity index 100% rename from plugins/stripe-php/lib/Service/V2/Core/AccountLinkService.php rename to libs/stripe-php/lib/Service/V2/Core/AccountLinkService.php diff --git a/plugins/stripe-php/lib/Service/V2/Core/AccountService.php b/libs/stripe-php/lib/Service/V2/Core/AccountService.php similarity index 100% rename from plugins/stripe-php/lib/Service/V2/Core/AccountService.php rename to libs/stripe-php/lib/Service/V2/Core/AccountService.php diff --git a/plugins/stripe-php/lib/Service/V2/Core/AccountTokenService.php b/libs/stripe-php/lib/Service/V2/Core/AccountTokenService.php similarity index 100% rename from plugins/stripe-php/lib/Service/V2/Core/AccountTokenService.php rename to libs/stripe-php/lib/Service/V2/Core/AccountTokenService.php diff --git a/plugins/stripe-php/lib/Service/V2/Core/Accounts/PersonService.php b/libs/stripe-php/lib/Service/V2/Core/Accounts/PersonService.php similarity index 100% rename from plugins/stripe-php/lib/Service/V2/Core/Accounts/PersonService.php rename to libs/stripe-php/lib/Service/V2/Core/Accounts/PersonService.php diff --git a/plugins/stripe-php/lib/Service/V2/Core/Accounts/PersonTokenService.php b/libs/stripe-php/lib/Service/V2/Core/Accounts/PersonTokenService.php similarity index 100% rename from plugins/stripe-php/lib/Service/V2/Core/Accounts/PersonTokenService.php rename to libs/stripe-php/lib/Service/V2/Core/Accounts/PersonTokenService.php diff --git a/plugins/stripe-php/lib/Service/V2/Core/CoreServiceFactory.php b/libs/stripe-php/lib/Service/V2/Core/CoreServiceFactory.php similarity index 100% rename from plugins/stripe-php/lib/Service/V2/Core/CoreServiceFactory.php rename to libs/stripe-php/lib/Service/V2/Core/CoreServiceFactory.php diff --git a/plugins/stripe-php/lib/Service/V2/Core/EventDestinationService.php b/libs/stripe-php/lib/Service/V2/Core/EventDestinationService.php similarity index 100% rename from plugins/stripe-php/lib/Service/V2/Core/EventDestinationService.php rename to libs/stripe-php/lib/Service/V2/Core/EventDestinationService.php diff --git a/plugins/stripe-php/lib/Service/V2/Core/EventService.php b/libs/stripe-php/lib/Service/V2/Core/EventService.php similarity index 100% rename from plugins/stripe-php/lib/Service/V2/Core/EventService.php rename to libs/stripe-php/lib/Service/V2/Core/EventService.php diff --git a/plugins/stripe-php/lib/Service/V2/V2ServiceFactory.php b/libs/stripe-php/lib/Service/V2/V2ServiceFactory.php similarity index 100% rename from plugins/stripe-php/lib/Service/V2/V2ServiceFactory.php rename to libs/stripe-php/lib/Service/V2/V2ServiceFactory.php diff --git a/plugins/stripe-php/lib/Service/WebhookEndpointService.php b/libs/stripe-php/lib/Service/WebhookEndpointService.php similarity index 100% rename from plugins/stripe-php/lib/Service/WebhookEndpointService.php rename to libs/stripe-php/lib/Service/WebhookEndpointService.php diff --git a/plugins/stripe-php/lib/SetupAttempt.php b/libs/stripe-php/lib/SetupAttempt.php similarity index 100% rename from plugins/stripe-php/lib/SetupAttempt.php rename to libs/stripe-php/lib/SetupAttempt.php diff --git a/plugins/stripe-php/lib/SetupIntent.php b/libs/stripe-php/lib/SetupIntent.php similarity index 100% rename from plugins/stripe-php/lib/SetupIntent.php rename to libs/stripe-php/lib/SetupIntent.php diff --git a/plugins/stripe-php/lib/ShippingRate.php b/libs/stripe-php/lib/ShippingRate.php similarity index 100% rename from plugins/stripe-php/lib/ShippingRate.php rename to libs/stripe-php/lib/ShippingRate.php diff --git a/plugins/stripe-php/lib/Sigma/ScheduledQueryRun.php b/libs/stripe-php/lib/Sigma/ScheduledQueryRun.php similarity index 100% rename from plugins/stripe-php/lib/Sigma/ScheduledQueryRun.php rename to libs/stripe-php/lib/Sigma/ScheduledQueryRun.php diff --git a/plugins/stripe-php/lib/SingletonApiResource.php b/libs/stripe-php/lib/SingletonApiResource.php similarity index 100% rename from plugins/stripe-php/lib/SingletonApiResource.php rename to libs/stripe-php/lib/SingletonApiResource.php diff --git a/plugins/stripe-php/lib/Source.php b/libs/stripe-php/lib/Source.php similarity index 100% rename from plugins/stripe-php/lib/Source.php rename to libs/stripe-php/lib/Source.php diff --git a/plugins/stripe-php/lib/SourceMandateNotification.php b/libs/stripe-php/lib/SourceMandateNotification.php similarity index 100% rename from plugins/stripe-php/lib/SourceMandateNotification.php rename to libs/stripe-php/lib/SourceMandateNotification.php diff --git a/plugins/stripe-php/lib/SourceTransaction.php b/libs/stripe-php/lib/SourceTransaction.php similarity index 100% rename from plugins/stripe-php/lib/SourceTransaction.php rename to libs/stripe-php/lib/SourceTransaction.php diff --git a/plugins/stripe-php/lib/Stripe.php b/libs/stripe-php/lib/Stripe.php similarity index 100% rename from plugins/stripe-php/lib/Stripe.php rename to libs/stripe-php/lib/Stripe.php diff --git a/plugins/stripe-php/lib/StripeClient.php b/libs/stripe-php/lib/StripeClient.php similarity index 100% rename from plugins/stripe-php/lib/StripeClient.php rename to libs/stripe-php/lib/StripeClient.php diff --git a/plugins/stripe-php/lib/StripeClientInterface.php b/libs/stripe-php/lib/StripeClientInterface.php similarity index 100% rename from plugins/stripe-php/lib/StripeClientInterface.php rename to libs/stripe-php/lib/StripeClientInterface.php diff --git a/plugins/stripe-php/lib/StripeContext.php b/libs/stripe-php/lib/StripeContext.php similarity index 100% rename from plugins/stripe-php/lib/StripeContext.php rename to libs/stripe-php/lib/StripeContext.php diff --git a/plugins/stripe-php/lib/StripeObject.php b/libs/stripe-php/lib/StripeObject.php similarity index 100% rename from plugins/stripe-php/lib/StripeObject.php rename to libs/stripe-php/lib/StripeObject.php diff --git a/plugins/stripe-php/lib/StripeStreamingClientInterface.php b/libs/stripe-php/lib/StripeStreamingClientInterface.php similarity index 100% rename from plugins/stripe-php/lib/StripeStreamingClientInterface.php rename to libs/stripe-php/lib/StripeStreamingClientInterface.php diff --git a/plugins/stripe-php/lib/Subscription.php b/libs/stripe-php/lib/Subscription.php similarity index 100% rename from plugins/stripe-php/lib/Subscription.php rename to libs/stripe-php/lib/Subscription.php diff --git a/plugins/stripe-php/lib/SubscriptionItem.php b/libs/stripe-php/lib/SubscriptionItem.php similarity index 100% rename from plugins/stripe-php/lib/SubscriptionItem.php rename to libs/stripe-php/lib/SubscriptionItem.php diff --git a/plugins/stripe-php/lib/SubscriptionSchedule.php b/libs/stripe-php/lib/SubscriptionSchedule.php similarity index 100% rename from plugins/stripe-php/lib/SubscriptionSchedule.php rename to libs/stripe-php/lib/SubscriptionSchedule.php diff --git a/plugins/stripe-php/lib/Tax/Association.php b/libs/stripe-php/lib/Tax/Association.php similarity index 100% rename from plugins/stripe-php/lib/Tax/Association.php rename to libs/stripe-php/lib/Tax/Association.php diff --git a/plugins/stripe-php/lib/Tax/Calculation.php b/libs/stripe-php/lib/Tax/Calculation.php similarity index 100% rename from plugins/stripe-php/lib/Tax/Calculation.php rename to libs/stripe-php/lib/Tax/Calculation.php diff --git a/plugins/stripe-php/lib/Tax/CalculationLineItem.php b/libs/stripe-php/lib/Tax/CalculationLineItem.php similarity index 100% rename from plugins/stripe-php/lib/Tax/CalculationLineItem.php rename to libs/stripe-php/lib/Tax/CalculationLineItem.php diff --git a/plugins/stripe-php/lib/Tax/Registration.php b/libs/stripe-php/lib/Tax/Registration.php similarity index 100% rename from plugins/stripe-php/lib/Tax/Registration.php rename to libs/stripe-php/lib/Tax/Registration.php diff --git a/plugins/stripe-php/lib/Tax/Settings.php b/libs/stripe-php/lib/Tax/Settings.php similarity index 100% rename from plugins/stripe-php/lib/Tax/Settings.php rename to libs/stripe-php/lib/Tax/Settings.php diff --git a/plugins/stripe-php/lib/Tax/Transaction.php b/libs/stripe-php/lib/Tax/Transaction.php similarity index 100% rename from plugins/stripe-php/lib/Tax/Transaction.php rename to libs/stripe-php/lib/Tax/Transaction.php diff --git a/plugins/stripe-php/lib/Tax/TransactionLineItem.php b/libs/stripe-php/lib/Tax/TransactionLineItem.php similarity index 100% rename from plugins/stripe-php/lib/Tax/TransactionLineItem.php rename to libs/stripe-php/lib/Tax/TransactionLineItem.php diff --git a/plugins/stripe-php/lib/TaxCode.php b/libs/stripe-php/lib/TaxCode.php similarity index 100% rename from plugins/stripe-php/lib/TaxCode.php rename to libs/stripe-php/lib/TaxCode.php diff --git a/plugins/stripe-php/lib/TaxDeductedAtSource.php b/libs/stripe-php/lib/TaxDeductedAtSource.php similarity index 100% rename from plugins/stripe-php/lib/TaxDeductedAtSource.php rename to libs/stripe-php/lib/TaxDeductedAtSource.php diff --git a/plugins/stripe-php/lib/TaxId.php b/libs/stripe-php/lib/TaxId.php similarity index 100% rename from plugins/stripe-php/lib/TaxId.php rename to libs/stripe-php/lib/TaxId.php diff --git a/plugins/stripe-php/lib/TaxRate.php b/libs/stripe-php/lib/TaxRate.php similarity index 100% rename from plugins/stripe-php/lib/TaxRate.php rename to libs/stripe-php/lib/TaxRate.php diff --git a/plugins/stripe-php/lib/Terminal/Configuration.php b/libs/stripe-php/lib/Terminal/Configuration.php similarity index 100% rename from plugins/stripe-php/lib/Terminal/Configuration.php rename to libs/stripe-php/lib/Terminal/Configuration.php diff --git a/plugins/stripe-php/lib/Terminal/ConnectionToken.php b/libs/stripe-php/lib/Terminal/ConnectionToken.php similarity index 100% rename from plugins/stripe-php/lib/Terminal/ConnectionToken.php rename to libs/stripe-php/lib/Terminal/ConnectionToken.php diff --git a/plugins/stripe-php/lib/Terminal/Location.php b/libs/stripe-php/lib/Terminal/Location.php similarity index 100% rename from plugins/stripe-php/lib/Terminal/Location.php rename to libs/stripe-php/lib/Terminal/Location.php diff --git a/plugins/stripe-php/lib/Terminal/OnboardingLink.php b/libs/stripe-php/lib/Terminal/OnboardingLink.php similarity index 100% rename from plugins/stripe-php/lib/Terminal/OnboardingLink.php rename to libs/stripe-php/lib/Terminal/OnboardingLink.php diff --git a/plugins/stripe-php/lib/Terminal/Reader.php b/libs/stripe-php/lib/Terminal/Reader.php similarity index 100% rename from plugins/stripe-php/lib/Terminal/Reader.php rename to libs/stripe-php/lib/Terminal/Reader.php diff --git a/plugins/stripe-php/lib/TestHelpers/TestClock.php b/libs/stripe-php/lib/TestHelpers/TestClock.php similarity index 100% rename from plugins/stripe-php/lib/TestHelpers/TestClock.php rename to libs/stripe-php/lib/TestHelpers/TestClock.php diff --git a/plugins/stripe-php/lib/Token.php b/libs/stripe-php/lib/Token.php similarity index 100% rename from plugins/stripe-php/lib/Token.php rename to libs/stripe-php/lib/Token.php diff --git a/plugins/stripe-php/lib/Topup.php b/libs/stripe-php/lib/Topup.php similarity index 100% rename from plugins/stripe-php/lib/Topup.php rename to libs/stripe-php/lib/Topup.php diff --git a/plugins/stripe-php/lib/Transfer.php b/libs/stripe-php/lib/Transfer.php similarity index 100% rename from plugins/stripe-php/lib/Transfer.php rename to libs/stripe-php/lib/Transfer.php diff --git a/plugins/stripe-php/lib/TransferReversal.php b/libs/stripe-php/lib/TransferReversal.php similarity index 100% rename from plugins/stripe-php/lib/TransferReversal.php rename to libs/stripe-php/lib/TransferReversal.php diff --git a/plugins/stripe-php/lib/Treasury/CreditReversal.php b/libs/stripe-php/lib/Treasury/CreditReversal.php similarity index 100% rename from plugins/stripe-php/lib/Treasury/CreditReversal.php rename to libs/stripe-php/lib/Treasury/CreditReversal.php diff --git a/plugins/stripe-php/lib/Treasury/DebitReversal.php b/libs/stripe-php/lib/Treasury/DebitReversal.php similarity index 100% rename from plugins/stripe-php/lib/Treasury/DebitReversal.php rename to libs/stripe-php/lib/Treasury/DebitReversal.php diff --git a/plugins/stripe-php/lib/Treasury/FinancialAccount.php b/libs/stripe-php/lib/Treasury/FinancialAccount.php similarity index 100% rename from plugins/stripe-php/lib/Treasury/FinancialAccount.php rename to libs/stripe-php/lib/Treasury/FinancialAccount.php diff --git a/plugins/stripe-php/lib/Treasury/FinancialAccountFeatures.php b/libs/stripe-php/lib/Treasury/FinancialAccountFeatures.php similarity index 100% rename from plugins/stripe-php/lib/Treasury/FinancialAccountFeatures.php rename to libs/stripe-php/lib/Treasury/FinancialAccountFeatures.php diff --git a/plugins/stripe-php/lib/Treasury/InboundTransfer.php b/libs/stripe-php/lib/Treasury/InboundTransfer.php similarity index 100% rename from plugins/stripe-php/lib/Treasury/InboundTransfer.php rename to libs/stripe-php/lib/Treasury/InboundTransfer.php diff --git a/plugins/stripe-php/lib/Treasury/OutboundPayment.php b/libs/stripe-php/lib/Treasury/OutboundPayment.php similarity index 100% rename from plugins/stripe-php/lib/Treasury/OutboundPayment.php rename to libs/stripe-php/lib/Treasury/OutboundPayment.php diff --git a/plugins/stripe-php/lib/Treasury/OutboundTransfer.php b/libs/stripe-php/lib/Treasury/OutboundTransfer.php similarity index 100% rename from plugins/stripe-php/lib/Treasury/OutboundTransfer.php rename to libs/stripe-php/lib/Treasury/OutboundTransfer.php diff --git a/plugins/stripe-php/lib/Treasury/ReceivedCredit.php b/libs/stripe-php/lib/Treasury/ReceivedCredit.php similarity index 100% rename from plugins/stripe-php/lib/Treasury/ReceivedCredit.php rename to libs/stripe-php/lib/Treasury/ReceivedCredit.php diff --git a/plugins/stripe-php/lib/Treasury/ReceivedDebit.php b/libs/stripe-php/lib/Treasury/ReceivedDebit.php similarity index 100% rename from plugins/stripe-php/lib/Treasury/ReceivedDebit.php rename to libs/stripe-php/lib/Treasury/ReceivedDebit.php diff --git a/plugins/stripe-php/lib/Treasury/Transaction.php b/libs/stripe-php/lib/Treasury/Transaction.php similarity index 100% rename from plugins/stripe-php/lib/Treasury/Transaction.php rename to libs/stripe-php/lib/Treasury/Transaction.php diff --git a/plugins/stripe-php/lib/Treasury/TransactionEntry.php b/libs/stripe-php/lib/Treasury/TransactionEntry.php similarity index 100% rename from plugins/stripe-php/lib/Treasury/TransactionEntry.php rename to libs/stripe-php/lib/Treasury/TransactionEntry.php diff --git a/plugins/stripe-php/lib/Util/ApiVersion.php b/libs/stripe-php/lib/Util/ApiVersion.php similarity index 100% rename from plugins/stripe-php/lib/Util/ApiVersion.php rename to libs/stripe-php/lib/Util/ApiVersion.php diff --git a/plugins/stripe-php/lib/Util/CaseInsensitiveArray.php b/libs/stripe-php/lib/Util/CaseInsensitiveArray.php similarity index 100% rename from plugins/stripe-php/lib/Util/CaseInsensitiveArray.php rename to libs/stripe-php/lib/Util/CaseInsensitiveArray.php diff --git a/plugins/stripe-php/lib/Util/DefaultLogger.php b/libs/stripe-php/lib/Util/DefaultLogger.php similarity index 100% rename from plugins/stripe-php/lib/Util/DefaultLogger.php rename to libs/stripe-php/lib/Util/DefaultLogger.php diff --git a/plugins/stripe-php/lib/Util/EventNotificationTypes.php b/libs/stripe-php/lib/Util/EventNotificationTypes.php similarity index 100% rename from plugins/stripe-php/lib/Util/EventNotificationTypes.php rename to libs/stripe-php/lib/Util/EventNotificationTypes.php diff --git a/plugins/stripe-php/lib/Util/EventTypes.php b/libs/stripe-php/lib/Util/EventTypes.php similarity index 100% rename from plugins/stripe-php/lib/Util/EventTypes.php rename to libs/stripe-php/lib/Util/EventTypes.php diff --git a/plugins/stripe-php/lib/Util/LoggerInterface.php b/libs/stripe-php/lib/Util/LoggerInterface.php similarity index 100% rename from plugins/stripe-php/lib/Util/LoggerInterface.php rename to libs/stripe-php/lib/Util/LoggerInterface.php diff --git a/plugins/stripe-php/lib/Util/ObjectTypes.php b/libs/stripe-php/lib/Util/ObjectTypes.php similarity index 100% rename from plugins/stripe-php/lib/Util/ObjectTypes.php rename to libs/stripe-php/lib/Util/ObjectTypes.php diff --git a/plugins/stripe-php/lib/Util/RandomGenerator.php b/libs/stripe-php/lib/Util/RandomGenerator.php similarity index 100% rename from plugins/stripe-php/lib/Util/RandomGenerator.php rename to libs/stripe-php/lib/Util/RandomGenerator.php diff --git a/plugins/stripe-php/lib/Util/RequestOptions.php b/libs/stripe-php/lib/Util/RequestOptions.php similarity index 100% rename from plugins/stripe-php/lib/Util/RequestOptions.php rename to libs/stripe-php/lib/Util/RequestOptions.php diff --git a/plugins/stripe-php/lib/Util/Set.php b/libs/stripe-php/lib/Util/Set.php similarity index 100% rename from plugins/stripe-php/lib/Util/Set.php rename to libs/stripe-php/lib/Util/Set.php diff --git a/plugins/stripe-php/lib/Util/Util.php b/libs/stripe-php/lib/Util/Util.php similarity index 100% rename from plugins/stripe-php/lib/Util/Util.php rename to libs/stripe-php/lib/Util/Util.php diff --git a/plugins/stripe-php/lib/V2/Billing/MeterEvent.php b/libs/stripe-php/lib/V2/Billing/MeterEvent.php similarity index 100% rename from plugins/stripe-php/lib/V2/Billing/MeterEvent.php rename to libs/stripe-php/lib/V2/Billing/MeterEvent.php diff --git a/plugins/stripe-php/lib/V2/Billing/MeterEventAdjustment.php b/libs/stripe-php/lib/V2/Billing/MeterEventAdjustment.php similarity index 100% rename from plugins/stripe-php/lib/V2/Billing/MeterEventAdjustment.php rename to libs/stripe-php/lib/V2/Billing/MeterEventAdjustment.php diff --git a/plugins/stripe-php/lib/V2/Billing/MeterEventSession.php b/libs/stripe-php/lib/V2/Billing/MeterEventSession.php similarity index 100% rename from plugins/stripe-php/lib/V2/Billing/MeterEventSession.php rename to libs/stripe-php/lib/V2/Billing/MeterEventSession.php diff --git a/plugins/stripe-php/lib/V2/Collection.php b/libs/stripe-php/lib/V2/Collection.php similarity index 100% rename from plugins/stripe-php/lib/V2/Collection.php rename to libs/stripe-php/lib/V2/Collection.php diff --git a/plugins/stripe-php/lib/V2/Core/Account.php b/libs/stripe-php/lib/V2/Core/Account.php similarity index 100% rename from plugins/stripe-php/lib/V2/Core/Account.php rename to libs/stripe-php/lib/V2/Core/Account.php diff --git a/plugins/stripe-php/lib/V2/Core/AccountLink.php b/libs/stripe-php/lib/V2/Core/AccountLink.php similarity index 100% rename from plugins/stripe-php/lib/V2/Core/AccountLink.php rename to libs/stripe-php/lib/V2/Core/AccountLink.php diff --git a/plugins/stripe-php/lib/V2/Core/AccountPerson.php b/libs/stripe-php/lib/V2/Core/AccountPerson.php similarity index 100% rename from plugins/stripe-php/lib/V2/Core/AccountPerson.php rename to libs/stripe-php/lib/V2/Core/AccountPerson.php diff --git a/plugins/stripe-php/lib/V2/Core/AccountPersonToken.php b/libs/stripe-php/lib/V2/Core/AccountPersonToken.php similarity index 100% rename from plugins/stripe-php/lib/V2/Core/AccountPersonToken.php rename to libs/stripe-php/lib/V2/Core/AccountPersonToken.php diff --git a/plugins/stripe-php/lib/V2/Core/AccountToken.php b/libs/stripe-php/lib/V2/Core/AccountToken.php similarity index 100% rename from plugins/stripe-php/lib/V2/Core/AccountToken.php rename to libs/stripe-php/lib/V2/Core/AccountToken.php diff --git a/plugins/stripe-php/lib/V2/Core/Event.php b/libs/stripe-php/lib/V2/Core/Event.php similarity index 100% rename from plugins/stripe-php/lib/V2/Core/Event.php rename to libs/stripe-php/lib/V2/Core/Event.php diff --git a/plugins/stripe-php/lib/V2/Core/EventDestination.php b/libs/stripe-php/lib/V2/Core/EventDestination.php similarity index 100% rename from plugins/stripe-php/lib/V2/Core/EventDestination.php rename to libs/stripe-php/lib/V2/Core/EventDestination.php diff --git a/plugins/stripe-php/lib/V2/Core/EventNotification.php b/libs/stripe-php/lib/V2/Core/EventNotification.php similarity index 100% rename from plugins/stripe-php/lib/V2/Core/EventNotification.php rename to libs/stripe-php/lib/V2/Core/EventNotification.php diff --git a/plugins/stripe-php/lib/V2/DeletedObject.php b/libs/stripe-php/lib/V2/DeletedObject.php similarity index 100% rename from plugins/stripe-php/lib/V2/DeletedObject.php rename to libs/stripe-php/lib/V2/DeletedObject.php diff --git a/plugins/stripe-php/lib/Webhook.php b/libs/stripe-php/lib/Webhook.php similarity index 100% rename from plugins/stripe-php/lib/Webhook.php rename to libs/stripe-php/lib/Webhook.php diff --git a/plugins/stripe-php/lib/WebhookEndpoint.php b/libs/stripe-php/lib/WebhookEndpoint.php similarity index 100% rename from plugins/stripe-php/lib/WebhookEndpoint.php rename to libs/stripe-php/lib/WebhookEndpoint.php diff --git a/plugins/stripe-php/lib/WebhookSignature.php b/libs/stripe-php/lib/WebhookSignature.php similarity index 100% rename from plugins/stripe-php/lib/WebhookSignature.php rename to libs/stripe-php/lib/WebhookSignature.php diff --git a/plugins/tempusdominus-bootstrap-4/css/tempusdominus-bootstrap-4.min.css b/libs/tempusdominus-bootstrap-4/css/tempusdominus-bootstrap-4.min.css similarity index 100% rename from plugins/tempusdominus-bootstrap-4/css/tempusdominus-bootstrap-4.min.css rename to libs/tempusdominus-bootstrap-4/css/tempusdominus-bootstrap-4.min.css diff --git a/plugins/tempusdominus-bootstrap-4/js/tempusdominus-bootstrap-4.min.js b/libs/tempusdominus-bootstrap-4/js/tempusdominus-bootstrap-4.min.js similarity index 100% rename from plugins/tempusdominus-bootstrap-4/js/tempusdominus-bootstrap-4.min.js rename to libs/tempusdominus-bootstrap-4/js/tempusdominus-bootstrap-4.min.js diff --git a/plugins/tinymce/icons/default/icons.min.js b/libs/tinymce/icons/default/icons.min.js similarity index 100% rename from plugins/tinymce/icons/default/icons.min.js rename to libs/tinymce/icons/default/icons.min.js diff --git a/plugins/tinymce/langs/README.md b/libs/tinymce/langs/README.md similarity index 100% rename from plugins/tinymce/langs/README.md rename to libs/tinymce/langs/README.md diff --git a/plugins/tinymce/license.md b/libs/tinymce/license.md similarity index 100% rename from plugins/tinymce/license.md rename to libs/tinymce/license.md diff --git a/plugins/tinymce/models/dom/model.min.js b/libs/tinymce/models/dom/model.min.js similarity index 100% rename from plugins/tinymce/models/dom/model.min.js rename to libs/tinymce/models/dom/model.min.js diff --git a/plugins/tinymce/notices.txt b/libs/tinymce/notices.txt similarity index 100% rename from plugins/tinymce/notices.txt rename to libs/tinymce/notices.txt diff --git a/plugins/tinymce/plugins/accordion/plugin.min.js b/libs/tinymce/plugins/accordion/plugin.min.js similarity index 100% rename from plugins/tinymce/plugins/accordion/plugin.min.js rename to libs/tinymce/plugins/accordion/plugin.min.js diff --git a/plugins/tinymce/plugins/advlist/plugin.min.js b/libs/tinymce/plugins/advlist/plugin.min.js similarity index 100% rename from plugins/tinymce/plugins/advlist/plugin.min.js rename to libs/tinymce/plugins/advlist/plugin.min.js diff --git a/plugins/tinymce/plugins/anchor/plugin.min.js b/libs/tinymce/plugins/anchor/plugin.min.js similarity index 100% rename from plugins/tinymce/plugins/anchor/plugin.min.js rename to libs/tinymce/plugins/anchor/plugin.min.js diff --git a/plugins/tinymce/plugins/autolink/plugin.min.js b/libs/tinymce/plugins/autolink/plugin.min.js similarity index 100% rename from plugins/tinymce/plugins/autolink/plugin.min.js rename to libs/tinymce/plugins/autolink/plugin.min.js diff --git a/plugins/tinymce/plugins/autoresize/plugin.min.js b/libs/tinymce/plugins/autoresize/plugin.min.js similarity index 100% rename from plugins/tinymce/plugins/autoresize/plugin.min.js rename to libs/tinymce/plugins/autoresize/plugin.min.js diff --git a/plugins/tinymce/plugins/autosave/plugin.min.js b/libs/tinymce/plugins/autosave/plugin.min.js similarity index 100% rename from plugins/tinymce/plugins/autosave/plugin.min.js rename to libs/tinymce/plugins/autosave/plugin.min.js diff --git a/plugins/tinymce/plugins/charmap/plugin.min.js b/libs/tinymce/plugins/charmap/plugin.min.js similarity index 100% rename from plugins/tinymce/plugins/charmap/plugin.min.js rename to libs/tinymce/plugins/charmap/plugin.min.js diff --git a/plugins/tinymce/plugins/code/plugin.min.js b/libs/tinymce/plugins/code/plugin.min.js similarity index 100% rename from plugins/tinymce/plugins/code/plugin.min.js rename to libs/tinymce/plugins/code/plugin.min.js diff --git a/plugins/tinymce/plugins/codesample/plugin.min.js b/libs/tinymce/plugins/codesample/plugin.min.js similarity index 100% rename from plugins/tinymce/plugins/codesample/plugin.min.js rename to libs/tinymce/plugins/codesample/plugin.min.js diff --git a/plugins/tinymce/plugins/directionality/plugin.min.js b/libs/tinymce/plugins/directionality/plugin.min.js similarity index 100% rename from plugins/tinymce/plugins/directionality/plugin.min.js rename to libs/tinymce/plugins/directionality/plugin.min.js diff --git a/plugins/tinymce/plugins/emoticons/js/emojiimages.js b/libs/tinymce/plugins/emoticons/js/emojiimages.js similarity index 100% rename from plugins/tinymce/plugins/emoticons/js/emojiimages.js rename to libs/tinymce/plugins/emoticons/js/emojiimages.js diff --git a/plugins/tinymce/plugins/emoticons/js/emojiimages.min.js b/libs/tinymce/plugins/emoticons/js/emojiimages.min.js similarity index 100% rename from plugins/tinymce/plugins/emoticons/js/emojiimages.min.js rename to libs/tinymce/plugins/emoticons/js/emojiimages.min.js diff --git a/plugins/tinymce/plugins/emoticons/js/emojis.js b/libs/tinymce/plugins/emoticons/js/emojis.js similarity index 100% rename from plugins/tinymce/plugins/emoticons/js/emojis.js rename to libs/tinymce/plugins/emoticons/js/emojis.js diff --git a/plugins/tinymce/plugins/emoticons/js/emojis.min.js b/libs/tinymce/plugins/emoticons/js/emojis.min.js similarity index 100% rename from plugins/tinymce/plugins/emoticons/js/emojis.min.js rename to libs/tinymce/plugins/emoticons/js/emojis.min.js diff --git a/plugins/tinymce/plugins/emoticons/plugin.min.js b/libs/tinymce/plugins/emoticons/plugin.min.js similarity index 100% rename from plugins/tinymce/plugins/emoticons/plugin.min.js rename to libs/tinymce/plugins/emoticons/plugin.min.js diff --git a/plugins/tinymce/plugins/fullscreen/plugin.min.js b/libs/tinymce/plugins/fullscreen/plugin.min.js similarity index 100% rename from plugins/tinymce/plugins/fullscreen/plugin.min.js rename to libs/tinymce/plugins/fullscreen/plugin.min.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/ar.js b/libs/tinymce/plugins/help/js/i18n/keynav/ar.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/ar.js rename to libs/tinymce/plugins/help/js/i18n/keynav/ar.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/bg-BG.js b/libs/tinymce/plugins/help/js/i18n/keynav/bg-BG.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/bg-BG.js rename to libs/tinymce/plugins/help/js/i18n/keynav/bg-BG.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/bg_BG.js b/libs/tinymce/plugins/help/js/i18n/keynav/bg_BG.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/bg_BG.js rename to libs/tinymce/plugins/help/js/i18n/keynav/bg_BG.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/ca.js b/libs/tinymce/plugins/help/js/i18n/keynav/ca.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/ca.js rename to libs/tinymce/plugins/help/js/i18n/keynav/ca.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/cs.js b/libs/tinymce/plugins/help/js/i18n/keynav/cs.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/cs.js rename to libs/tinymce/plugins/help/js/i18n/keynav/cs.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/da.js b/libs/tinymce/plugins/help/js/i18n/keynav/da.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/da.js rename to libs/tinymce/plugins/help/js/i18n/keynav/da.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/de.js b/libs/tinymce/plugins/help/js/i18n/keynav/de.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/de.js rename to libs/tinymce/plugins/help/js/i18n/keynav/de.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/el.js b/libs/tinymce/plugins/help/js/i18n/keynav/el.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/el.js rename to libs/tinymce/plugins/help/js/i18n/keynav/el.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/en.js b/libs/tinymce/plugins/help/js/i18n/keynav/en.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/en.js rename to libs/tinymce/plugins/help/js/i18n/keynav/en.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/es.js b/libs/tinymce/plugins/help/js/i18n/keynav/es.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/es.js rename to libs/tinymce/plugins/help/js/i18n/keynav/es.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/eu.js b/libs/tinymce/plugins/help/js/i18n/keynav/eu.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/eu.js rename to libs/tinymce/plugins/help/js/i18n/keynav/eu.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/fa.js b/libs/tinymce/plugins/help/js/i18n/keynav/fa.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/fa.js rename to libs/tinymce/plugins/help/js/i18n/keynav/fa.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/fi.js b/libs/tinymce/plugins/help/js/i18n/keynav/fi.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/fi.js rename to libs/tinymce/plugins/help/js/i18n/keynav/fi.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/fr-FR.js b/libs/tinymce/plugins/help/js/i18n/keynav/fr-FR.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/fr-FR.js rename to libs/tinymce/plugins/help/js/i18n/keynav/fr-FR.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/fr_FR.js b/libs/tinymce/plugins/help/js/i18n/keynav/fr_FR.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/fr_FR.js rename to libs/tinymce/plugins/help/js/i18n/keynav/fr_FR.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/he-IL.js b/libs/tinymce/plugins/help/js/i18n/keynav/he-IL.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/he-IL.js rename to libs/tinymce/plugins/help/js/i18n/keynav/he-IL.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/he_IL.js b/libs/tinymce/plugins/help/js/i18n/keynav/he_IL.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/he_IL.js rename to libs/tinymce/plugins/help/js/i18n/keynav/he_IL.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/hi.js b/libs/tinymce/plugins/help/js/i18n/keynav/hi.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/hi.js rename to libs/tinymce/plugins/help/js/i18n/keynav/hi.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/hr.js b/libs/tinymce/plugins/help/js/i18n/keynav/hr.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/hr.js rename to libs/tinymce/plugins/help/js/i18n/keynav/hr.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/hu-HU.js b/libs/tinymce/plugins/help/js/i18n/keynav/hu-HU.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/hu-HU.js rename to libs/tinymce/plugins/help/js/i18n/keynav/hu-HU.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/hu_HU.js b/libs/tinymce/plugins/help/js/i18n/keynav/hu_HU.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/hu_HU.js rename to libs/tinymce/plugins/help/js/i18n/keynav/hu_HU.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/id.js b/libs/tinymce/plugins/help/js/i18n/keynav/id.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/id.js rename to libs/tinymce/plugins/help/js/i18n/keynav/id.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/it.js b/libs/tinymce/plugins/help/js/i18n/keynav/it.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/it.js rename to libs/tinymce/plugins/help/js/i18n/keynav/it.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/ja.js b/libs/tinymce/plugins/help/js/i18n/keynav/ja.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/ja.js rename to libs/tinymce/plugins/help/js/i18n/keynav/ja.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/kk.js b/libs/tinymce/plugins/help/js/i18n/keynav/kk.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/kk.js rename to libs/tinymce/plugins/help/js/i18n/keynav/kk.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/ko-KR.js b/libs/tinymce/plugins/help/js/i18n/keynav/ko-KR.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/ko-KR.js rename to libs/tinymce/plugins/help/js/i18n/keynav/ko-KR.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/ko_KR.js b/libs/tinymce/plugins/help/js/i18n/keynav/ko_KR.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/ko_KR.js rename to libs/tinymce/plugins/help/js/i18n/keynav/ko_KR.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/ms.js b/libs/tinymce/plugins/help/js/i18n/keynav/ms.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/ms.js rename to libs/tinymce/plugins/help/js/i18n/keynav/ms.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/nb-NO.js b/libs/tinymce/plugins/help/js/i18n/keynav/nb-NO.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/nb-NO.js rename to libs/tinymce/plugins/help/js/i18n/keynav/nb-NO.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/nb_NO.js b/libs/tinymce/plugins/help/js/i18n/keynav/nb_NO.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/nb_NO.js rename to libs/tinymce/plugins/help/js/i18n/keynav/nb_NO.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/nl.js b/libs/tinymce/plugins/help/js/i18n/keynav/nl.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/nl.js rename to libs/tinymce/plugins/help/js/i18n/keynav/nl.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/pl.js b/libs/tinymce/plugins/help/js/i18n/keynav/pl.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/pl.js rename to libs/tinymce/plugins/help/js/i18n/keynav/pl.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/pt-BR.js b/libs/tinymce/plugins/help/js/i18n/keynav/pt-BR.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/pt-BR.js rename to libs/tinymce/plugins/help/js/i18n/keynav/pt-BR.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/pt-PT.js b/libs/tinymce/plugins/help/js/i18n/keynav/pt-PT.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/pt-PT.js rename to libs/tinymce/plugins/help/js/i18n/keynav/pt-PT.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/pt_BR.js b/libs/tinymce/plugins/help/js/i18n/keynav/pt_BR.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/pt_BR.js rename to libs/tinymce/plugins/help/js/i18n/keynav/pt_BR.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/pt_PT.js b/libs/tinymce/plugins/help/js/i18n/keynav/pt_PT.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/pt_PT.js rename to libs/tinymce/plugins/help/js/i18n/keynav/pt_PT.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/ro.js b/libs/tinymce/plugins/help/js/i18n/keynav/ro.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/ro.js rename to libs/tinymce/plugins/help/js/i18n/keynav/ro.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/ru.js b/libs/tinymce/plugins/help/js/i18n/keynav/ru.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/ru.js rename to libs/tinymce/plugins/help/js/i18n/keynav/ru.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/sk.js b/libs/tinymce/plugins/help/js/i18n/keynav/sk.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/sk.js rename to libs/tinymce/plugins/help/js/i18n/keynav/sk.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/sl-SI.js b/libs/tinymce/plugins/help/js/i18n/keynav/sl-SI.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/sl-SI.js rename to libs/tinymce/plugins/help/js/i18n/keynav/sl-SI.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/sl_SI.js b/libs/tinymce/plugins/help/js/i18n/keynav/sl_SI.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/sl_SI.js rename to libs/tinymce/plugins/help/js/i18n/keynav/sl_SI.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/sv-SE.js b/libs/tinymce/plugins/help/js/i18n/keynav/sv-SE.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/sv-SE.js rename to libs/tinymce/plugins/help/js/i18n/keynav/sv-SE.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/sv_SE.js b/libs/tinymce/plugins/help/js/i18n/keynav/sv_SE.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/sv_SE.js rename to libs/tinymce/plugins/help/js/i18n/keynav/sv_SE.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/th-TH.js b/libs/tinymce/plugins/help/js/i18n/keynav/th-TH.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/th-TH.js rename to libs/tinymce/plugins/help/js/i18n/keynav/th-TH.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/th_TH.js b/libs/tinymce/plugins/help/js/i18n/keynav/th_TH.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/th_TH.js rename to libs/tinymce/plugins/help/js/i18n/keynav/th_TH.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/tr.js b/libs/tinymce/plugins/help/js/i18n/keynav/tr.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/tr.js rename to libs/tinymce/plugins/help/js/i18n/keynav/tr.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/uk.js b/libs/tinymce/plugins/help/js/i18n/keynav/uk.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/uk.js rename to libs/tinymce/plugins/help/js/i18n/keynav/uk.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/vi.js b/libs/tinymce/plugins/help/js/i18n/keynav/vi.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/vi.js rename to libs/tinymce/plugins/help/js/i18n/keynav/vi.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/zh-CN.js b/libs/tinymce/plugins/help/js/i18n/keynav/zh-CN.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/zh-CN.js rename to libs/tinymce/plugins/help/js/i18n/keynav/zh-CN.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/zh-TW.js b/libs/tinymce/plugins/help/js/i18n/keynav/zh-TW.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/zh-TW.js rename to libs/tinymce/plugins/help/js/i18n/keynav/zh-TW.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/zh_CN.js b/libs/tinymce/plugins/help/js/i18n/keynav/zh_CN.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/zh_CN.js rename to libs/tinymce/plugins/help/js/i18n/keynav/zh_CN.js diff --git a/plugins/tinymce/plugins/help/js/i18n/keynav/zh_TW.js b/libs/tinymce/plugins/help/js/i18n/keynav/zh_TW.js similarity index 100% rename from plugins/tinymce/plugins/help/js/i18n/keynav/zh_TW.js rename to libs/tinymce/plugins/help/js/i18n/keynav/zh_TW.js diff --git a/plugins/tinymce/plugins/help/plugin.min.js b/libs/tinymce/plugins/help/plugin.min.js similarity index 100% rename from plugins/tinymce/plugins/help/plugin.min.js rename to libs/tinymce/plugins/help/plugin.min.js diff --git a/plugins/tinymce/plugins/image/plugin.min.js b/libs/tinymce/plugins/image/plugin.min.js similarity index 100% rename from plugins/tinymce/plugins/image/plugin.min.js rename to libs/tinymce/plugins/image/plugin.min.js diff --git a/plugins/tinymce/plugins/importcss/plugin.min.js b/libs/tinymce/plugins/importcss/plugin.min.js similarity index 100% rename from plugins/tinymce/plugins/importcss/plugin.min.js rename to libs/tinymce/plugins/importcss/plugin.min.js diff --git a/plugins/tinymce/plugins/insertdatetime/plugin.min.js b/libs/tinymce/plugins/insertdatetime/plugin.min.js similarity index 100% rename from plugins/tinymce/plugins/insertdatetime/plugin.min.js rename to libs/tinymce/plugins/insertdatetime/plugin.min.js diff --git a/plugins/tinymce/plugins/link/plugin.min.js b/libs/tinymce/plugins/link/plugin.min.js similarity index 100% rename from plugins/tinymce/plugins/link/plugin.min.js rename to libs/tinymce/plugins/link/plugin.min.js diff --git a/plugins/tinymce/plugins/lists/plugin.min.js b/libs/tinymce/plugins/lists/plugin.min.js similarity index 100% rename from plugins/tinymce/plugins/lists/plugin.min.js rename to libs/tinymce/plugins/lists/plugin.min.js diff --git a/plugins/tinymce/plugins/media/plugin.min.js b/libs/tinymce/plugins/media/plugin.min.js similarity index 100% rename from plugins/tinymce/plugins/media/plugin.min.js rename to libs/tinymce/plugins/media/plugin.min.js diff --git a/plugins/tinymce/plugins/nonbreaking/plugin.min.js b/libs/tinymce/plugins/nonbreaking/plugin.min.js similarity index 100% rename from plugins/tinymce/plugins/nonbreaking/plugin.min.js rename to libs/tinymce/plugins/nonbreaking/plugin.min.js diff --git a/plugins/tinymce/plugins/pagebreak/plugin.min.js b/libs/tinymce/plugins/pagebreak/plugin.min.js similarity index 100% rename from plugins/tinymce/plugins/pagebreak/plugin.min.js rename to libs/tinymce/plugins/pagebreak/plugin.min.js diff --git a/plugins/tinymce/plugins/preview/plugin.min.js b/libs/tinymce/plugins/preview/plugin.min.js similarity index 100% rename from plugins/tinymce/plugins/preview/plugin.min.js rename to libs/tinymce/plugins/preview/plugin.min.js diff --git a/plugins/tinymce/plugins/quickbars/plugin.min.js b/libs/tinymce/plugins/quickbars/plugin.min.js similarity index 100% rename from plugins/tinymce/plugins/quickbars/plugin.min.js rename to libs/tinymce/plugins/quickbars/plugin.min.js diff --git a/plugins/tinymce/plugins/save/plugin.min.js b/libs/tinymce/plugins/save/plugin.min.js similarity index 100% rename from plugins/tinymce/plugins/save/plugin.min.js rename to libs/tinymce/plugins/save/plugin.min.js diff --git a/plugins/tinymce/plugins/searchreplace/plugin.min.js b/libs/tinymce/plugins/searchreplace/plugin.min.js similarity index 100% rename from plugins/tinymce/plugins/searchreplace/plugin.min.js rename to libs/tinymce/plugins/searchreplace/plugin.min.js diff --git a/plugins/tinymce/plugins/table/plugin.min.js b/libs/tinymce/plugins/table/plugin.min.js similarity index 100% rename from plugins/tinymce/plugins/table/plugin.min.js rename to libs/tinymce/plugins/table/plugin.min.js diff --git a/plugins/tinymce/plugins/visualblocks/plugin.min.js b/libs/tinymce/plugins/visualblocks/plugin.min.js similarity index 100% rename from plugins/tinymce/plugins/visualblocks/plugin.min.js rename to libs/tinymce/plugins/visualblocks/plugin.min.js diff --git a/plugins/tinymce/plugins/visualchars/plugin.min.js b/libs/tinymce/plugins/visualchars/plugin.min.js similarity index 100% rename from plugins/tinymce/plugins/visualchars/plugin.min.js rename to libs/tinymce/plugins/visualchars/plugin.min.js diff --git a/plugins/tinymce/plugins/wordcount/plugin.min.js b/libs/tinymce/plugins/wordcount/plugin.min.js similarity index 100% rename from plugins/tinymce/plugins/wordcount/plugin.min.js rename to libs/tinymce/plugins/wordcount/plugin.min.js diff --git a/plugins/tinymce/skins/content/dark/content.js b/libs/tinymce/skins/content/dark/content.js similarity index 100% rename from plugins/tinymce/skins/content/dark/content.js rename to libs/tinymce/skins/content/dark/content.js diff --git a/plugins/tinymce/skins/content/dark/content.min.css b/libs/tinymce/skins/content/dark/content.min.css similarity index 100% rename from plugins/tinymce/skins/content/dark/content.min.css rename to libs/tinymce/skins/content/dark/content.min.css diff --git a/plugins/tinymce/skins/content/default/content.js b/libs/tinymce/skins/content/default/content.js similarity index 100% rename from plugins/tinymce/skins/content/default/content.js rename to libs/tinymce/skins/content/default/content.js diff --git a/plugins/tinymce/skins/content/default/content.min.css b/libs/tinymce/skins/content/default/content.min.css similarity index 100% rename from plugins/tinymce/skins/content/default/content.min.css rename to libs/tinymce/skins/content/default/content.min.css diff --git a/plugins/tinymce/skins/content/document/content.js b/libs/tinymce/skins/content/document/content.js similarity index 100% rename from plugins/tinymce/skins/content/document/content.js rename to libs/tinymce/skins/content/document/content.js diff --git a/plugins/tinymce/skins/content/document/content.min.css b/libs/tinymce/skins/content/document/content.min.css similarity index 100% rename from plugins/tinymce/skins/content/document/content.min.css rename to libs/tinymce/skins/content/document/content.min.css diff --git a/plugins/tinymce/skins/content/tinymce-5-dark/content.js b/libs/tinymce/skins/content/tinymce-5-dark/content.js similarity index 100% rename from plugins/tinymce/skins/content/tinymce-5-dark/content.js rename to libs/tinymce/skins/content/tinymce-5-dark/content.js diff --git a/plugins/tinymce/skins/content/tinymce-5-dark/content.min.css b/libs/tinymce/skins/content/tinymce-5-dark/content.min.css similarity index 100% rename from plugins/tinymce/skins/content/tinymce-5-dark/content.min.css rename to libs/tinymce/skins/content/tinymce-5-dark/content.min.css diff --git a/plugins/tinymce/skins/content/tinymce-5/content.js b/libs/tinymce/skins/content/tinymce-5/content.js similarity index 100% rename from plugins/tinymce/skins/content/tinymce-5/content.js rename to libs/tinymce/skins/content/tinymce-5/content.js diff --git a/plugins/tinymce/skins/content/tinymce-5/content.min.css b/libs/tinymce/skins/content/tinymce-5/content.min.css similarity index 100% rename from plugins/tinymce/skins/content/tinymce-5/content.min.css rename to libs/tinymce/skins/content/tinymce-5/content.min.css diff --git a/plugins/tinymce/skins/content/writer/content.js b/libs/tinymce/skins/content/writer/content.js similarity index 100% rename from plugins/tinymce/skins/content/writer/content.js rename to libs/tinymce/skins/content/writer/content.js diff --git a/plugins/tinymce/skins/content/writer/content.min.css b/libs/tinymce/skins/content/writer/content.min.css similarity index 100% rename from plugins/tinymce/skins/content/writer/content.min.css rename to libs/tinymce/skins/content/writer/content.min.css diff --git a/plugins/tinymce/skins/ui/oxide-dark/content.inline.js b/libs/tinymce/skins/ui/oxide-dark/content.inline.js similarity index 100% rename from plugins/tinymce/skins/ui/oxide-dark/content.inline.js rename to libs/tinymce/skins/ui/oxide-dark/content.inline.js diff --git a/plugins/tinymce/skins/ui/oxide-dark/content.inline.min.css b/libs/tinymce/skins/ui/oxide-dark/content.inline.min.css similarity index 100% rename from plugins/tinymce/skins/ui/oxide-dark/content.inline.min.css rename to libs/tinymce/skins/ui/oxide-dark/content.inline.min.css diff --git a/plugins/tinymce/skins/ui/oxide-dark/content.js b/libs/tinymce/skins/ui/oxide-dark/content.js similarity index 100% rename from plugins/tinymce/skins/ui/oxide-dark/content.js rename to libs/tinymce/skins/ui/oxide-dark/content.js diff --git a/plugins/tinymce/skins/ui/oxide-dark/content.min.css b/libs/tinymce/skins/ui/oxide-dark/content.min.css similarity index 100% rename from plugins/tinymce/skins/ui/oxide-dark/content.min.css rename to libs/tinymce/skins/ui/oxide-dark/content.min.css diff --git a/plugins/tinymce/skins/ui/oxide-dark/skin.js b/libs/tinymce/skins/ui/oxide-dark/skin.js similarity index 100% rename from plugins/tinymce/skins/ui/oxide-dark/skin.js rename to libs/tinymce/skins/ui/oxide-dark/skin.js diff --git a/plugins/tinymce/skins/ui/oxide-dark/skin.min.css b/libs/tinymce/skins/ui/oxide-dark/skin.min.css similarity index 100% rename from plugins/tinymce/skins/ui/oxide-dark/skin.min.css rename to libs/tinymce/skins/ui/oxide-dark/skin.min.css diff --git a/plugins/tinymce/skins/ui/oxide-dark/skin.shadowdom.js b/libs/tinymce/skins/ui/oxide-dark/skin.shadowdom.js similarity index 100% rename from plugins/tinymce/skins/ui/oxide-dark/skin.shadowdom.js rename to libs/tinymce/skins/ui/oxide-dark/skin.shadowdom.js diff --git a/plugins/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css b/libs/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css similarity index 100% rename from plugins/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css rename to libs/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css diff --git a/plugins/tinymce/skins/ui/oxide/content.inline.js b/libs/tinymce/skins/ui/oxide/content.inline.js similarity index 100% rename from plugins/tinymce/skins/ui/oxide/content.inline.js rename to libs/tinymce/skins/ui/oxide/content.inline.js diff --git a/plugins/tinymce/skins/ui/oxide/content.inline.min.css b/libs/tinymce/skins/ui/oxide/content.inline.min.css similarity index 100% rename from plugins/tinymce/skins/ui/oxide/content.inline.min.css rename to libs/tinymce/skins/ui/oxide/content.inline.min.css diff --git a/plugins/tinymce/skins/ui/oxide/content.js b/libs/tinymce/skins/ui/oxide/content.js similarity index 100% rename from plugins/tinymce/skins/ui/oxide/content.js rename to libs/tinymce/skins/ui/oxide/content.js diff --git a/plugins/tinymce/skins/ui/oxide/content.min.css b/libs/tinymce/skins/ui/oxide/content.min.css similarity index 100% rename from plugins/tinymce/skins/ui/oxide/content.min.css rename to libs/tinymce/skins/ui/oxide/content.min.css diff --git a/plugins/tinymce/skins/ui/oxide/skin.js b/libs/tinymce/skins/ui/oxide/skin.js similarity index 100% rename from plugins/tinymce/skins/ui/oxide/skin.js rename to libs/tinymce/skins/ui/oxide/skin.js diff --git a/plugins/tinymce/skins/ui/oxide/skin.min.css b/libs/tinymce/skins/ui/oxide/skin.min.css similarity index 100% rename from plugins/tinymce/skins/ui/oxide/skin.min.css rename to libs/tinymce/skins/ui/oxide/skin.min.css diff --git a/plugins/tinymce/skins/ui/oxide/skin.shadowdom.js b/libs/tinymce/skins/ui/oxide/skin.shadowdom.js similarity index 100% rename from plugins/tinymce/skins/ui/oxide/skin.shadowdom.js rename to libs/tinymce/skins/ui/oxide/skin.shadowdom.js diff --git a/plugins/tinymce/skins/ui/oxide/skin.shadowdom.min.css b/libs/tinymce/skins/ui/oxide/skin.shadowdom.min.css similarity index 100% rename from plugins/tinymce/skins/ui/oxide/skin.shadowdom.min.css rename to libs/tinymce/skins/ui/oxide/skin.shadowdom.min.css diff --git a/plugins/tinymce/skins/ui/tinymce-5-dark/content.inline.js b/libs/tinymce/skins/ui/tinymce-5-dark/content.inline.js similarity index 100% rename from plugins/tinymce/skins/ui/tinymce-5-dark/content.inline.js rename to libs/tinymce/skins/ui/tinymce-5-dark/content.inline.js diff --git a/plugins/tinymce/skins/ui/tinymce-5-dark/content.inline.min.css b/libs/tinymce/skins/ui/tinymce-5-dark/content.inline.min.css similarity index 100% rename from plugins/tinymce/skins/ui/tinymce-5-dark/content.inline.min.css rename to libs/tinymce/skins/ui/tinymce-5-dark/content.inline.min.css diff --git a/plugins/tinymce/skins/ui/tinymce-5-dark/content.js b/libs/tinymce/skins/ui/tinymce-5-dark/content.js similarity index 100% rename from plugins/tinymce/skins/ui/tinymce-5-dark/content.js rename to libs/tinymce/skins/ui/tinymce-5-dark/content.js diff --git a/plugins/tinymce/skins/ui/tinymce-5-dark/content.min.css b/libs/tinymce/skins/ui/tinymce-5-dark/content.min.css similarity index 100% rename from plugins/tinymce/skins/ui/tinymce-5-dark/content.min.css rename to libs/tinymce/skins/ui/tinymce-5-dark/content.min.css diff --git a/plugins/tinymce/skins/ui/tinymce-5-dark/skin.js b/libs/tinymce/skins/ui/tinymce-5-dark/skin.js similarity index 100% rename from plugins/tinymce/skins/ui/tinymce-5-dark/skin.js rename to libs/tinymce/skins/ui/tinymce-5-dark/skin.js diff --git a/plugins/tinymce/skins/ui/tinymce-5-dark/skin.min.css b/libs/tinymce/skins/ui/tinymce-5-dark/skin.min.css similarity index 100% rename from plugins/tinymce/skins/ui/tinymce-5-dark/skin.min.css rename to libs/tinymce/skins/ui/tinymce-5-dark/skin.min.css diff --git a/plugins/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.js b/libs/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.js similarity index 100% rename from plugins/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.js rename to libs/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.js diff --git a/plugins/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css b/libs/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css similarity index 100% rename from plugins/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css rename to libs/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css diff --git a/plugins/tinymce/skins/ui/tinymce-5/content.inline.js b/libs/tinymce/skins/ui/tinymce-5/content.inline.js similarity index 100% rename from plugins/tinymce/skins/ui/tinymce-5/content.inline.js rename to libs/tinymce/skins/ui/tinymce-5/content.inline.js diff --git a/plugins/tinymce/skins/ui/tinymce-5/content.inline.min.css b/libs/tinymce/skins/ui/tinymce-5/content.inline.min.css similarity index 100% rename from plugins/tinymce/skins/ui/tinymce-5/content.inline.min.css rename to libs/tinymce/skins/ui/tinymce-5/content.inline.min.css diff --git a/plugins/tinymce/skins/ui/tinymce-5/content.js b/libs/tinymce/skins/ui/tinymce-5/content.js similarity index 100% rename from plugins/tinymce/skins/ui/tinymce-5/content.js rename to libs/tinymce/skins/ui/tinymce-5/content.js diff --git a/plugins/tinymce/skins/ui/tinymce-5/content.min.css b/libs/tinymce/skins/ui/tinymce-5/content.min.css similarity index 100% rename from plugins/tinymce/skins/ui/tinymce-5/content.min.css rename to libs/tinymce/skins/ui/tinymce-5/content.min.css diff --git a/plugins/tinymce/skins/ui/tinymce-5/skin.js b/libs/tinymce/skins/ui/tinymce-5/skin.js similarity index 100% rename from plugins/tinymce/skins/ui/tinymce-5/skin.js rename to libs/tinymce/skins/ui/tinymce-5/skin.js diff --git a/plugins/tinymce/skins/ui/tinymce-5/skin.min.css b/libs/tinymce/skins/ui/tinymce-5/skin.min.css similarity index 100% rename from plugins/tinymce/skins/ui/tinymce-5/skin.min.css rename to libs/tinymce/skins/ui/tinymce-5/skin.min.css diff --git a/plugins/tinymce/skins/ui/tinymce-5/skin.shadowdom.js b/libs/tinymce/skins/ui/tinymce-5/skin.shadowdom.js similarity index 100% rename from plugins/tinymce/skins/ui/tinymce-5/skin.shadowdom.js rename to libs/tinymce/skins/ui/tinymce-5/skin.shadowdom.js diff --git a/plugins/tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css b/libs/tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css similarity index 100% rename from plugins/tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css rename to libs/tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css diff --git a/plugins/tinymce/themes/silver/theme.min.js b/libs/tinymce/themes/silver/theme.min.js similarity index 100% rename from plugins/tinymce/themes/silver/theme.min.js rename to libs/tinymce/themes/silver/theme.min.js diff --git a/plugins/tinymce/tinymce.d.ts b/libs/tinymce/tinymce.d.ts similarity index 100% rename from plugins/tinymce/tinymce.d.ts rename to libs/tinymce/tinymce.d.ts diff --git a/plugins/tinymce/tinymce.min.js b/libs/tinymce/tinymce.min.js similarity index 100% rename from plugins/tinymce/tinymce.min.js rename to libs/tinymce/tinymce.min.js diff --git a/plugins/toastr/toastr.min.css b/libs/toastr/toastr.min.css similarity index 100% rename from plugins/toastr/toastr.min.css rename to libs/toastr/toastr.min.css diff --git a/plugins/toastr/toastr.min.js b/libs/toastr/toastr.min.js similarity index 100% rename from plugins/toastr/toastr.min.js rename to libs/toastr/toastr.min.js diff --git a/plugins/totp/totp.php b/libs/totp/totp.php similarity index 100% rename from plugins/totp/totp.php rename to libs/totp/totp.php diff --git a/plugins/vendor/autoload.php b/libs/vendor/autoload.php similarity index 100% rename from plugins/vendor/autoload.php rename to libs/vendor/autoload.php diff --git a/plugins/vendor/bin/carbon b/libs/vendor/bin/carbon similarity index 100% rename from plugins/vendor/bin/carbon rename to libs/vendor/bin/carbon diff --git a/plugins/vendor/carbonphp/carbon-doctrine-types/LICENSE b/libs/vendor/carbonphp/carbon-doctrine-types/LICENSE similarity index 100% rename from plugins/vendor/carbonphp/carbon-doctrine-types/LICENSE rename to libs/vendor/carbonphp/carbon-doctrine-types/LICENSE diff --git a/plugins/vendor/carbonphp/carbon-doctrine-types/README.md b/libs/vendor/carbonphp/carbon-doctrine-types/README.md similarity index 100% rename from plugins/vendor/carbonphp/carbon-doctrine-types/README.md rename to libs/vendor/carbonphp/carbon-doctrine-types/README.md diff --git a/plugins/vendor/carbonphp/carbon-doctrine-types/composer.json b/libs/vendor/carbonphp/carbon-doctrine-types/composer.json similarity index 100% rename from plugins/vendor/carbonphp/carbon-doctrine-types/composer.json rename to libs/vendor/carbonphp/carbon-doctrine-types/composer.json diff --git a/plugins/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonDoctrineType.php b/libs/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonDoctrineType.php similarity index 100% rename from plugins/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonDoctrineType.php rename to libs/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonDoctrineType.php diff --git a/plugins/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonImmutableType.php b/libs/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonImmutableType.php similarity index 100% rename from plugins/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonImmutableType.php rename to libs/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonImmutableType.php diff --git a/plugins/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonType.php b/libs/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonType.php similarity index 100% rename from plugins/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonType.php rename to libs/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonType.php diff --git a/plugins/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonTypeConverter.php b/libs/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonTypeConverter.php similarity index 100% rename from plugins/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonTypeConverter.php rename to libs/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonTypeConverter.php diff --git a/plugins/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeDefaultPrecision.php b/libs/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeDefaultPrecision.php similarity index 100% rename from plugins/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeDefaultPrecision.php rename to libs/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeDefaultPrecision.php diff --git a/plugins/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeImmutableType.php b/libs/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeImmutableType.php similarity index 100% rename from plugins/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeImmutableType.php rename to libs/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeImmutableType.php diff --git a/plugins/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeType.php b/libs/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeType.php similarity index 100% rename from plugins/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeType.php rename to libs/vendor/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeType.php diff --git a/plugins/vendor/composer/ClassLoader.php b/libs/vendor/composer/ClassLoader.php similarity index 100% rename from plugins/vendor/composer/ClassLoader.php rename to libs/vendor/composer/ClassLoader.php diff --git a/plugins/vendor/composer/InstalledVersions.php b/libs/vendor/composer/InstalledVersions.php similarity index 100% rename from plugins/vendor/composer/InstalledVersions.php rename to libs/vendor/composer/InstalledVersions.php diff --git a/plugins/vendor/composer/LICENSE b/libs/vendor/composer/LICENSE similarity index 100% rename from plugins/vendor/composer/LICENSE rename to libs/vendor/composer/LICENSE diff --git a/plugins/vendor/composer/autoload_classmap.php b/libs/vendor/composer/autoload_classmap.php similarity index 100% rename from plugins/vendor/composer/autoload_classmap.php rename to libs/vendor/composer/autoload_classmap.php diff --git a/plugins/vendor/composer/autoload_files.php b/libs/vendor/composer/autoload_files.php similarity index 100% rename from plugins/vendor/composer/autoload_files.php rename to libs/vendor/composer/autoload_files.php diff --git a/plugins/vendor/composer/autoload_namespaces.php b/libs/vendor/composer/autoload_namespaces.php similarity index 100% rename from plugins/vendor/composer/autoload_namespaces.php rename to libs/vendor/composer/autoload_namespaces.php diff --git a/plugins/vendor/composer/autoload_psr4.php b/libs/vendor/composer/autoload_psr4.php similarity index 100% rename from plugins/vendor/composer/autoload_psr4.php rename to libs/vendor/composer/autoload_psr4.php diff --git a/plugins/vendor/composer/autoload_real.php b/libs/vendor/composer/autoload_real.php similarity index 100% rename from plugins/vendor/composer/autoload_real.php rename to libs/vendor/composer/autoload_real.php diff --git a/plugins/vendor/composer/autoload_static.php b/libs/vendor/composer/autoload_static.php similarity index 100% rename from plugins/vendor/composer/autoload_static.php rename to libs/vendor/composer/autoload_static.php diff --git a/plugins/vendor/composer/installed.json b/libs/vendor/composer/installed.json similarity index 100% rename from plugins/vendor/composer/installed.json rename to libs/vendor/composer/installed.json diff --git a/plugins/vendor/composer/installed.php b/libs/vendor/composer/installed.php similarity index 100% rename from plugins/vendor/composer/installed.php rename to libs/vendor/composer/installed.php diff --git a/plugins/vendor/composer/platform_check.php b/libs/vendor/composer/platform_check.php similarity index 100% rename from plugins/vendor/composer/platform_check.php rename to libs/vendor/composer/platform_check.php diff --git a/plugins/vendor/directorytree/imapengine/composer.json b/libs/vendor/directorytree/imapengine/composer.json similarity index 100% rename from plugins/vendor/directorytree/imapengine/composer.json rename to libs/vendor/directorytree/imapengine/composer.json diff --git a/plugins/vendor/directorytree/imapengine/src/Address.php b/libs/vendor/directorytree/imapengine/src/Address.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Address.php rename to libs/vendor/directorytree/imapengine/src/Address.php diff --git a/plugins/vendor/directorytree/imapengine/src/Attachment.php b/libs/vendor/directorytree/imapengine/src/Attachment.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Attachment.php rename to libs/vendor/directorytree/imapengine/src/Attachment.php diff --git a/plugins/vendor/directorytree/imapengine/src/BodyStructureCollection.php b/libs/vendor/directorytree/imapengine/src/BodyStructureCollection.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/BodyStructureCollection.php rename to libs/vendor/directorytree/imapengine/src/BodyStructureCollection.php diff --git a/plugins/vendor/directorytree/imapengine/src/BodyStructurePart.php b/libs/vendor/directorytree/imapengine/src/BodyStructurePart.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/BodyStructurePart.php rename to libs/vendor/directorytree/imapengine/src/BodyStructurePart.php diff --git a/plugins/vendor/directorytree/imapengine/src/Collections/FolderCollection.php b/libs/vendor/directorytree/imapengine/src/Collections/FolderCollection.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Collections/FolderCollection.php rename to libs/vendor/directorytree/imapengine/src/Collections/FolderCollection.php diff --git a/plugins/vendor/directorytree/imapengine/src/Collections/MessageCollection.php b/libs/vendor/directorytree/imapengine/src/Collections/MessageCollection.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Collections/MessageCollection.php rename to libs/vendor/directorytree/imapengine/src/Collections/MessageCollection.php diff --git a/plugins/vendor/directorytree/imapengine/src/Collections/PaginatedCollection.php b/libs/vendor/directorytree/imapengine/src/Collections/PaginatedCollection.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Collections/PaginatedCollection.php rename to libs/vendor/directorytree/imapengine/src/Collections/PaginatedCollection.php diff --git a/plugins/vendor/directorytree/imapengine/src/Collections/ResponseCollection.php b/libs/vendor/directorytree/imapengine/src/Collections/ResponseCollection.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Collections/ResponseCollection.php rename to libs/vendor/directorytree/imapengine/src/Collections/ResponseCollection.php diff --git a/plugins/vendor/directorytree/imapengine/src/ComparesFolders.php b/libs/vendor/directorytree/imapengine/src/ComparesFolders.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/ComparesFolders.php rename to libs/vendor/directorytree/imapengine/src/ComparesFolders.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/ConnectionInterface.php b/libs/vendor/directorytree/imapengine/src/Connection/ConnectionInterface.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/ConnectionInterface.php rename to libs/vendor/directorytree/imapengine/src/Connection/ConnectionInterface.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/ImapCommand.php b/libs/vendor/directorytree/imapengine/src/Connection/ImapCommand.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/ImapCommand.php rename to libs/vendor/directorytree/imapengine/src/Connection/ImapCommand.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/ImapConnection.php b/libs/vendor/directorytree/imapengine/src/Connection/ImapConnection.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/ImapConnection.php rename to libs/vendor/directorytree/imapengine/src/Connection/ImapConnection.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/ImapParser.php b/libs/vendor/directorytree/imapengine/src/Connection/ImapParser.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/ImapParser.php rename to libs/vendor/directorytree/imapengine/src/Connection/ImapParser.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/ImapQueryBuilder.php b/libs/vendor/directorytree/imapengine/src/Connection/ImapQueryBuilder.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/ImapQueryBuilder.php rename to libs/vendor/directorytree/imapengine/src/Connection/ImapQueryBuilder.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/ImapTokenizer.php b/libs/vendor/directorytree/imapengine/src/Connection/ImapTokenizer.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/ImapTokenizer.php rename to libs/vendor/directorytree/imapengine/src/Connection/ImapTokenizer.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Loggers/EchoLogger.php b/libs/vendor/directorytree/imapengine/src/Connection/Loggers/EchoLogger.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Loggers/EchoLogger.php rename to libs/vendor/directorytree/imapengine/src/Connection/Loggers/EchoLogger.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Loggers/FileLogger.php b/libs/vendor/directorytree/imapengine/src/Connection/Loggers/FileLogger.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Loggers/FileLogger.php rename to libs/vendor/directorytree/imapengine/src/Connection/Loggers/FileLogger.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Loggers/Logger.php b/libs/vendor/directorytree/imapengine/src/Connection/Loggers/Logger.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Loggers/Logger.php rename to libs/vendor/directorytree/imapengine/src/Connection/Loggers/Logger.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Loggers/LoggerInterface.php b/libs/vendor/directorytree/imapengine/src/Connection/Loggers/LoggerInterface.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Loggers/LoggerInterface.php rename to libs/vendor/directorytree/imapengine/src/Connection/Loggers/LoggerInterface.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Loggers/RayLogger.php b/libs/vendor/directorytree/imapengine/src/Connection/Loggers/RayLogger.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Loggers/RayLogger.php rename to libs/vendor/directorytree/imapengine/src/Connection/Loggers/RayLogger.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/RawQueryValue.php b/libs/vendor/directorytree/imapengine/src/Connection/RawQueryValue.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/RawQueryValue.php rename to libs/vendor/directorytree/imapengine/src/Connection/RawQueryValue.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Responses/ContinuationResponse.php b/libs/vendor/directorytree/imapengine/src/Connection/Responses/ContinuationResponse.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Responses/ContinuationResponse.php rename to libs/vendor/directorytree/imapengine/src/Connection/Responses/ContinuationResponse.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Responses/Data/Data.php b/libs/vendor/directorytree/imapengine/src/Connection/Responses/Data/Data.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Responses/Data/Data.php rename to libs/vendor/directorytree/imapengine/src/Connection/Responses/Data/Data.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Responses/Data/ListData.php b/libs/vendor/directorytree/imapengine/src/Connection/Responses/Data/ListData.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Responses/Data/ListData.php rename to libs/vendor/directorytree/imapengine/src/Connection/Responses/Data/ListData.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Responses/Data/ResponseCodeData.php b/libs/vendor/directorytree/imapengine/src/Connection/Responses/Data/ResponseCodeData.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Responses/Data/ResponseCodeData.php rename to libs/vendor/directorytree/imapengine/src/Connection/Responses/Data/ResponseCodeData.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Responses/HasTokens.php b/libs/vendor/directorytree/imapengine/src/Connection/Responses/HasTokens.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Responses/HasTokens.php rename to libs/vendor/directorytree/imapengine/src/Connection/Responses/HasTokens.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Responses/MessageResponseParser.php b/libs/vendor/directorytree/imapengine/src/Connection/Responses/MessageResponseParser.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Responses/MessageResponseParser.php rename to libs/vendor/directorytree/imapengine/src/Connection/Responses/MessageResponseParser.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Responses/Response.php b/libs/vendor/directorytree/imapengine/src/Connection/Responses/Response.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Responses/Response.php rename to libs/vendor/directorytree/imapengine/src/Connection/Responses/Response.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Responses/TaggedResponse.php b/libs/vendor/directorytree/imapengine/src/Connection/Responses/TaggedResponse.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Responses/TaggedResponse.php rename to libs/vendor/directorytree/imapengine/src/Connection/Responses/TaggedResponse.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Responses/UntaggedResponse.php b/libs/vendor/directorytree/imapengine/src/Connection/Responses/UntaggedResponse.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Responses/UntaggedResponse.php rename to libs/vendor/directorytree/imapengine/src/Connection/Responses/UntaggedResponse.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Result.php b/libs/vendor/directorytree/imapengine/src/Connection/Result.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Result.php rename to libs/vendor/directorytree/imapengine/src/Connection/Result.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Streams/FakeStream.php b/libs/vendor/directorytree/imapengine/src/Connection/Streams/FakeStream.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Streams/FakeStream.php rename to libs/vendor/directorytree/imapengine/src/Connection/Streams/FakeStream.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Streams/ImapStream.php b/libs/vendor/directorytree/imapengine/src/Connection/Streams/ImapStream.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Streams/ImapStream.php rename to libs/vendor/directorytree/imapengine/src/Connection/Streams/ImapStream.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Streams/StreamInterface.php b/libs/vendor/directorytree/imapengine/src/Connection/Streams/StreamInterface.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Streams/StreamInterface.php rename to libs/vendor/directorytree/imapengine/src/Connection/Streams/StreamInterface.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Tokens/Atom.php b/libs/vendor/directorytree/imapengine/src/Connection/Tokens/Atom.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Tokens/Atom.php rename to libs/vendor/directorytree/imapengine/src/Connection/Tokens/Atom.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Tokens/Crlf.php b/libs/vendor/directorytree/imapengine/src/Connection/Tokens/Crlf.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Tokens/Crlf.php rename to libs/vendor/directorytree/imapengine/src/Connection/Tokens/Crlf.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Tokens/EmailAddress.php b/libs/vendor/directorytree/imapengine/src/Connection/Tokens/EmailAddress.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Tokens/EmailAddress.php rename to libs/vendor/directorytree/imapengine/src/Connection/Tokens/EmailAddress.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Tokens/ListClose.php b/libs/vendor/directorytree/imapengine/src/Connection/Tokens/ListClose.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Tokens/ListClose.php rename to libs/vendor/directorytree/imapengine/src/Connection/Tokens/ListClose.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Tokens/ListOpen.php b/libs/vendor/directorytree/imapengine/src/Connection/Tokens/ListOpen.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Tokens/ListOpen.php rename to libs/vendor/directorytree/imapengine/src/Connection/Tokens/ListOpen.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Tokens/Literal.php b/libs/vendor/directorytree/imapengine/src/Connection/Tokens/Literal.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Tokens/Literal.php rename to libs/vendor/directorytree/imapengine/src/Connection/Tokens/Literal.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Tokens/Nil.php b/libs/vendor/directorytree/imapengine/src/Connection/Tokens/Nil.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Tokens/Nil.php rename to libs/vendor/directorytree/imapengine/src/Connection/Tokens/Nil.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Tokens/Number.php b/libs/vendor/directorytree/imapengine/src/Connection/Tokens/Number.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Tokens/Number.php rename to libs/vendor/directorytree/imapengine/src/Connection/Tokens/Number.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Tokens/QuotedString.php b/libs/vendor/directorytree/imapengine/src/Connection/Tokens/QuotedString.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Tokens/QuotedString.php rename to libs/vendor/directorytree/imapengine/src/Connection/Tokens/QuotedString.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Tokens/ResponseCodeClose.php b/libs/vendor/directorytree/imapengine/src/Connection/Tokens/ResponseCodeClose.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Tokens/ResponseCodeClose.php rename to libs/vendor/directorytree/imapengine/src/Connection/Tokens/ResponseCodeClose.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Tokens/ResponseCodeOpen.php b/libs/vendor/directorytree/imapengine/src/Connection/Tokens/ResponseCodeOpen.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Tokens/ResponseCodeOpen.php rename to libs/vendor/directorytree/imapengine/src/Connection/Tokens/ResponseCodeOpen.php diff --git a/plugins/vendor/directorytree/imapengine/src/Connection/Tokens/Token.php b/libs/vendor/directorytree/imapengine/src/Connection/Tokens/Token.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Connection/Tokens/Token.php rename to libs/vendor/directorytree/imapengine/src/Connection/Tokens/Token.php diff --git a/plugins/vendor/directorytree/imapengine/src/ContentDisposition.php b/libs/vendor/directorytree/imapengine/src/ContentDisposition.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/ContentDisposition.php rename to libs/vendor/directorytree/imapengine/src/ContentDisposition.php diff --git a/plugins/vendor/directorytree/imapengine/src/DraftMessage.php b/libs/vendor/directorytree/imapengine/src/DraftMessage.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/DraftMessage.php rename to libs/vendor/directorytree/imapengine/src/DraftMessage.php diff --git a/plugins/vendor/directorytree/imapengine/src/Enums/ContentDispositionType.php b/libs/vendor/directorytree/imapengine/src/Enums/ContentDispositionType.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Enums/ContentDispositionType.php rename to libs/vendor/directorytree/imapengine/src/Enums/ContentDispositionType.php diff --git a/plugins/vendor/directorytree/imapengine/src/Enums/ImapFetchIdentifier.php b/libs/vendor/directorytree/imapengine/src/Enums/ImapFetchIdentifier.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Enums/ImapFetchIdentifier.php rename to libs/vendor/directorytree/imapengine/src/Enums/ImapFetchIdentifier.php diff --git a/plugins/vendor/directorytree/imapengine/src/Enums/ImapFlag.php b/libs/vendor/directorytree/imapengine/src/Enums/ImapFlag.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Enums/ImapFlag.php rename to libs/vendor/directorytree/imapengine/src/Enums/ImapFlag.php diff --git a/plugins/vendor/directorytree/imapengine/src/Enums/ImapSearchKey.php b/libs/vendor/directorytree/imapengine/src/Enums/ImapSearchKey.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Enums/ImapSearchKey.php rename to libs/vendor/directorytree/imapengine/src/Enums/ImapSearchKey.php diff --git a/plugins/vendor/directorytree/imapengine/src/Enums/ImapSortKey.php b/libs/vendor/directorytree/imapengine/src/Enums/ImapSortKey.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Enums/ImapSortKey.php rename to libs/vendor/directorytree/imapengine/src/Enums/ImapSortKey.php diff --git a/plugins/vendor/directorytree/imapengine/src/Exceptions/Exception.php b/libs/vendor/directorytree/imapengine/src/Exceptions/Exception.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Exceptions/Exception.php rename to libs/vendor/directorytree/imapengine/src/Exceptions/Exception.php diff --git a/plugins/vendor/directorytree/imapengine/src/Exceptions/ImapCapabilityException.php b/libs/vendor/directorytree/imapengine/src/Exceptions/ImapCapabilityException.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Exceptions/ImapCapabilityException.php rename to libs/vendor/directorytree/imapengine/src/Exceptions/ImapCapabilityException.php diff --git a/plugins/vendor/directorytree/imapengine/src/Exceptions/ImapCommandException.php b/libs/vendor/directorytree/imapengine/src/Exceptions/ImapCommandException.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Exceptions/ImapCommandException.php rename to libs/vendor/directorytree/imapengine/src/Exceptions/ImapCommandException.php diff --git a/plugins/vendor/directorytree/imapengine/src/Exceptions/ImapConnectionClosedException.php b/libs/vendor/directorytree/imapengine/src/Exceptions/ImapConnectionClosedException.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Exceptions/ImapConnectionClosedException.php rename to libs/vendor/directorytree/imapengine/src/Exceptions/ImapConnectionClosedException.php diff --git a/plugins/vendor/directorytree/imapengine/src/Exceptions/ImapConnectionException.php b/libs/vendor/directorytree/imapengine/src/Exceptions/ImapConnectionException.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Exceptions/ImapConnectionException.php rename to libs/vendor/directorytree/imapengine/src/Exceptions/ImapConnectionException.php diff --git a/plugins/vendor/directorytree/imapengine/src/Exceptions/ImapConnectionFailedException.php b/libs/vendor/directorytree/imapengine/src/Exceptions/ImapConnectionFailedException.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Exceptions/ImapConnectionFailedException.php rename to libs/vendor/directorytree/imapengine/src/Exceptions/ImapConnectionFailedException.php diff --git a/plugins/vendor/directorytree/imapengine/src/Exceptions/ImapConnectionTimedOutException.php b/libs/vendor/directorytree/imapengine/src/Exceptions/ImapConnectionTimedOutException.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Exceptions/ImapConnectionTimedOutException.php rename to libs/vendor/directorytree/imapengine/src/Exceptions/ImapConnectionTimedOutException.php diff --git a/plugins/vendor/directorytree/imapengine/src/Exceptions/ImapParserException.php b/libs/vendor/directorytree/imapengine/src/Exceptions/ImapParserException.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Exceptions/ImapParserException.php rename to libs/vendor/directorytree/imapengine/src/Exceptions/ImapParserException.php diff --git a/plugins/vendor/directorytree/imapengine/src/Exceptions/ImapResponseException.php b/libs/vendor/directorytree/imapengine/src/Exceptions/ImapResponseException.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Exceptions/ImapResponseException.php rename to libs/vendor/directorytree/imapengine/src/Exceptions/ImapResponseException.php diff --git a/plugins/vendor/directorytree/imapengine/src/Exceptions/ImapStreamException.php b/libs/vendor/directorytree/imapengine/src/Exceptions/ImapStreamException.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Exceptions/ImapStreamException.php rename to libs/vendor/directorytree/imapengine/src/Exceptions/ImapStreamException.php diff --git a/plugins/vendor/directorytree/imapengine/src/Exceptions/RuntimeException.php b/libs/vendor/directorytree/imapengine/src/Exceptions/RuntimeException.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Exceptions/RuntimeException.php rename to libs/vendor/directorytree/imapengine/src/Exceptions/RuntimeException.php diff --git a/plugins/vendor/directorytree/imapengine/src/FileMessage.php b/libs/vendor/directorytree/imapengine/src/FileMessage.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/FileMessage.php rename to libs/vendor/directorytree/imapengine/src/FileMessage.php diff --git a/plugins/vendor/directorytree/imapengine/src/FlaggableInterface.php b/libs/vendor/directorytree/imapengine/src/FlaggableInterface.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/FlaggableInterface.php rename to libs/vendor/directorytree/imapengine/src/FlaggableInterface.php diff --git a/plugins/vendor/directorytree/imapengine/src/Folder.php b/libs/vendor/directorytree/imapengine/src/Folder.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Folder.php rename to libs/vendor/directorytree/imapengine/src/Folder.php diff --git a/plugins/vendor/directorytree/imapengine/src/FolderInterface.php b/libs/vendor/directorytree/imapengine/src/FolderInterface.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/FolderInterface.php rename to libs/vendor/directorytree/imapengine/src/FolderInterface.php diff --git a/plugins/vendor/directorytree/imapengine/src/FolderRepository.php b/libs/vendor/directorytree/imapengine/src/FolderRepository.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/FolderRepository.php rename to libs/vendor/directorytree/imapengine/src/FolderRepository.php diff --git a/plugins/vendor/directorytree/imapengine/src/FolderRepositoryInterface.php b/libs/vendor/directorytree/imapengine/src/FolderRepositoryInterface.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/FolderRepositoryInterface.php rename to libs/vendor/directorytree/imapengine/src/FolderRepositoryInterface.php diff --git a/plugins/vendor/directorytree/imapengine/src/HasFlags.php b/libs/vendor/directorytree/imapengine/src/HasFlags.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/HasFlags.php rename to libs/vendor/directorytree/imapengine/src/HasFlags.php diff --git a/plugins/vendor/directorytree/imapengine/src/HasMessageAccessors.php b/libs/vendor/directorytree/imapengine/src/HasMessageAccessors.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/HasMessageAccessors.php rename to libs/vendor/directorytree/imapengine/src/HasMessageAccessors.php diff --git a/plugins/vendor/directorytree/imapengine/src/HasParsedMessage.php b/libs/vendor/directorytree/imapengine/src/HasParsedMessage.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/HasParsedMessage.php rename to libs/vendor/directorytree/imapengine/src/HasParsedMessage.php diff --git a/plugins/vendor/directorytree/imapengine/src/Idle.php b/libs/vendor/directorytree/imapengine/src/Idle.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Idle.php rename to libs/vendor/directorytree/imapengine/src/Idle.php diff --git a/plugins/vendor/directorytree/imapengine/src/Mailbox.php b/libs/vendor/directorytree/imapengine/src/Mailbox.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Mailbox.php rename to libs/vendor/directorytree/imapengine/src/Mailbox.php diff --git a/plugins/vendor/directorytree/imapengine/src/MailboxInterface.php b/libs/vendor/directorytree/imapengine/src/MailboxInterface.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/MailboxInterface.php rename to libs/vendor/directorytree/imapengine/src/MailboxInterface.php diff --git a/plugins/vendor/directorytree/imapengine/src/Mbox.php b/libs/vendor/directorytree/imapengine/src/Mbox.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Mbox.php rename to libs/vendor/directorytree/imapengine/src/Mbox.php diff --git a/plugins/vendor/directorytree/imapengine/src/Message.php b/libs/vendor/directorytree/imapengine/src/Message.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Message.php rename to libs/vendor/directorytree/imapengine/src/Message.php diff --git a/plugins/vendor/directorytree/imapengine/src/MessageInterface.php b/libs/vendor/directorytree/imapengine/src/MessageInterface.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/MessageInterface.php rename to libs/vendor/directorytree/imapengine/src/MessageInterface.php diff --git a/plugins/vendor/directorytree/imapengine/src/MessageParser.php b/libs/vendor/directorytree/imapengine/src/MessageParser.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/MessageParser.php rename to libs/vendor/directorytree/imapengine/src/MessageParser.php diff --git a/plugins/vendor/directorytree/imapengine/src/MessageQuery.php b/libs/vendor/directorytree/imapengine/src/MessageQuery.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/MessageQuery.php rename to libs/vendor/directorytree/imapengine/src/MessageQuery.php diff --git a/plugins/vendor/directorytree/imapengine/src/MessageQueryInterface.php b/libs/vendor/directorytree/imapengine/src/MessageQueryInterface.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/MessageQueryInterface.php rename to libs/vendor/directorytree/imapengine/src/MessageQueryInterface.php diff --git a/plugins/vendor/directorytree/imapengine/src/Pagination/LengthAwarePaginator.php b/libs/vendor/directorytree/imapengine/src/Pagination/LengthAwarePaginator.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Pagination/LengthAwarePaginator.php rename to libs/vendor/directorytree/imapengine/src/Pagination/LengthAwarePaginator.php diff --git a/plugins/vendor/directorytree/imapengine/src/Poll.php b/libs/vendor/directorytree/imapengine/src/Poll.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Poll.php rename to libs/vendor/directorytree/imapengine/src/Poll.php diff --git a/plugins/vendor/directorytree/imapengine/src/QueriesMessages.php b/libs/vendor/directorytree/imapengine/src/QueriesMessages.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/QueriesMessages.php rename to libs/vendor/directorytree/imapengine/src/QueriesMessages.php diff --git a/plugins/vendor/directorytree/imapengine/src/Support/BodyPartDecoder.php b/libs/vendor/directorytree/imapengine/src/Support/BodyPartDecoder.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Support/BodyPartDecoder.php rename to libs/vendor/directorytree/imapengine/src/Support/BodyPartDecoder.php diff --git a/plugins/vendor/directorytree/imapengine/src/Support/ForwardsCalls.php b/libs/vendor/directorytree/imapengine/src/Support/ForwardsCalls.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Support/ForwardsCalls.php rename to libs/vendor/directorytree/imapengine/src/Support/ForwardsCalls.php diff --git a/plugins/vendor/directorytree/imapengine/src/Support/LazyBodyPartStream.php b/libs/vendor/directorytree/imapengine/src/Support/LazyBodyPartStream.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Support/LazyBodyPartStream.php rename to libs/vendor/directorytree/imapengine/src/Support/LazyBodyPartStream.php diff --git a/plugins/vendor/directorytree/imapengine/src/Support/MimeMessage.php b/libs/vendor/directorytree/imapengine/src/Support/MimeMessage.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Support/MimeMessage.php rename to libs/vendor/directorytree/imapengine/src/Support/MimeMessage.php diff --git a/plugins/vendor/directorytree/imapengine/src/Support/Str.php b/libs/vendor/directorytree/imapengine/src/Support/Str.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Support/Str.php rename to libs/vendor/directorytree/imapengine/src/Support/Str.php diff --git a/plugins/vendor/directorytree/imapengine/src/Testing/FakeFolder.php b/libs/vendor/directorytree/imapengine/src/Testing/FakeFolder.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Testing/FakeFolder.php rename to libs/vendor/directorytree/imapengine/src/Testing/FakeFolder.php diff --git a/plugins/vendor/directorytree/imapengine/src/Testing/FakeFolderRepository.php b/libs/vendor/directorytree/imapengine/src/Testing/FakeFolderRepository.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Testing/FakeFolderRepository.php rename to libs/vendor/directorytree/imapengine/src/Testing/FakeFolderRepository.php diff --git a/plugins/vendor/directorytree/imapengine/src/Testing/FakeMailbox.php b/libs/vendor/directorytree/imapengine/src/Testing/FakeMailbox.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Testing/FakeMailbox.php rename to libs/vendor/directorytree/imapengine/src/Testing/FakeMailbox.php diff --git a/plugins/vendor/directorytree/imapengine/src/Testing/FakeMessage.php b/libs/vendor/directorytree/imapengine/src/Testing/FakeMessage.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Testing/FakeMessage.php rename to libs/vendor/directorytree/imapengine/src/Testing/FakeMessage.php diff --git a/plugins/vendor/directorytree/imapengine/src/Testing/FakeMessageQuery.php b/libs/vendor/directorytree/imapengine/src/Testing/FakeMessageQuery.php similarity index 100% rename from plugins/vendor/directorytree/imapengine/src/Testing/FakeMessageQuery.php rename to libs/vendor/directorytree/imapengine/src/Testing/FakeMessageQuery.php diff --git a/plugins/vendor/doctrine/lexer/LICENSE b/libs/vendor/doctrine/lexer/LICENSE similarity index 100% rename from plugins/vendor/doctrine/lexer/LICENSE rename to libs/vendor/doctrine/lexer/LICENSE diff --git a/plugins/vendor/doctrine/lexer/README.md b/libs/vendor/doctrine/lexer/README.md similarity index 100% rename from plugins/vendor/doctrine/lexer/README.md rename to libs/vendor/doctrine/lexer/README.md diff --git a/plugins/vendor/doctrine/lexer/UPGRADE.md b/libs/vendor/doctrine/lexer/UPGRADE.md similarity index 100% rename from plugins/vendor/doctrine/lexer/UPGRADE.md rename to libs/vendor/doctrine/lexer/UPGRADE.md diff --git a/plugins/vendor/doctrine/lexer/composer.json b/libs/vendor/doctrine/lexer/composer.json similarity index 100% rename from plugins/vendor/doctrine/lexer/composer.json rename to libs/vendor/doctrine/lexer/composer.json diff --git a/plugins/vendor/doctrine/lexer/src/AbstractLexer.php b/libs/vendor/doctrine/lexer/src/AbstractLexer.php similarity index 100% rename from plugins/vendor/doctrine/lexer/src/AbstractLexer.php rename to libs/vendor/doctrine/lexer/src/AbstractLexer.php diff --git a/plugins/vendor/doctrine/lexer/src/Token.php b/libs/vendor/doctrine/lexer/src/Token.php similarity index 100% rename from plugins/vendor/doctrine/lexer/src/Token.php rename to libs/vendor/doctrine/lexer/src/Token.php diff --git a/plugins/vendor/egulias/email-validator/CONTRIBUTING.md b/libs/vendor/egulias/email-validator/CONTRIBUTING.md similarity index 100% rename from plugins/vendor/egulias/email-validator/CONTRIBUTING.md rename to libs/vendor/egulias/email-validator/CONTRIBUTING.md diff --git a/plugins/vendor/egulias/email-validator/LICENSE b/libs/vendor/egulias/email-validator/LICENSE similarity index 100% rename from plugins/vendor/egulias/email-validator/LICENSE rename to libs/vendor/egulias/email-validator/LICENSE diff --git a/plugins/vendor/egulias/email-validator/composer.json b/libs/vendor/egulias/email-validator/composer.json similarity index 100% rename from plugins/vendor/egulias/email-validator/composer.json rename to libs/vendor/egulias/email-validator/composer.json diff --git a/plugins/vendor/egulias/email-validator/src/EmailLexer.php b/libs/vendor/egulias/email-validator/src/EmailLexer.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/EmailLexer.php rename to libs/vendor/egulias/email-validator/src/EmailLexer.php diff --git a/plugins/vendor/egulias/email-validator/src/EmailParser.php b/libs/vendor/egulias/email-validator/src/EmailParser.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/EmailParser.php rename to libs/vendor/egulias/email-validator/src/EmailParser.php diff --git a/plugins/vendor/egulias/email-validator/src/EmailValidator.php b/libs/vendor/egulias/email-validator/src/EmailValidator.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/EmailValidator.php rename to libs/vendor/egulias/email-validator/src/EmailValidator.php diff --git a/plugins/vendor/egulias/email-validator/src/MessageIDParser.php b/libs/vendor/egulias/email-validator/src/MessageIDParser.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/MessageIDParser.php rename to libs/vendor/egulias/email-validator/src/MessageIDParser.php diff --git a/plugins/vendor/egulias/email-validator/src/Parser.php b/libs/vendor/egulias/email-validator/src/Parser.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Parser.php rename to libs/vendor/egulias/email-validator/src/Parser.php diff --git a/plugins/vendor/egulias/email-validator/src/Parser/Comment.php b/libs/vendor/egulias/email-validator/src/Parser/Comment.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Parser/Comment.php rename to libs/vendor/egulias/email-validator/src/Parser/Comment.php diff --git a/plugins/vendor/egulias/email-validator/src/Parser/CommentStrategy/CommentStrategy.php b/libs/vendor/egulias/email-validator/src/Parser/CommentStrategy/CommentStrategy.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Parser/CommentStrategy/CommentStrategy.php rename to libs/vendor/egulias/email-validator/src/Parser/CommentStrategy/CommentStrategy.php diff --git a/plugins/vendor/egulias/email-validator/src/Parser/CommentStrategy/DomainComment.php b/libs/vendor/egulias/email-validator/src/Parser/CommentStrategy/DomainComment.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Parser/CommentStrategy/DomainComment.php rename to libs/vendor/egulias/email-validator/src/Parser/CommentStrategy/DomainComment.php diff --git a/plugins/vendor/egulias/email-validator/src/Parser/CommentStrategy/LocalComment.php b/libs/vendor/egulias/email-validator/src/Parser/CommentStrategy/LocalComment.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Parser/CommentStrategy/LocalComment.php rename to libs/vendor/egulias/email-validator/src/Parser/CommentStrategy/LocalComment.php diff --git a/plugins/vendor/egulias/email-validator/src/Parser/DomainLiteral.php b/libs/vendor/egulias/email-validator/src/Parser/DomainLiteral.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Parser/DomainLiteral.php rename to libs/vendor/egulias/email-validator/src/Parser/DomainLiteral.php diff --git a/plugins/vendor/egulias/email-validator/src/Parser/DomainPart.php b/libs/vendor/egulias/email-validator/src/Parser/DomainPart.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Parser/DomainPart.php rename to libs/vendor/egulias/email-validator/src/Parser/DomainPart.php diff --git a/plugins/vendor/egulias/email-validator/src/Parser/DoubleQuote.php b/libs/vendor/egulias/email-validator/src/Parser/DoubleQuote.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Parser/DoubleQuote.php rename to libs/vendor/egulias/email-validator/src/Parser/DoubleQuote.php diff --git a/plugins/vendor/egulias/email-validator/src/Parser/FoldingWhiteSpace.php b/libs/vendor/egulias/email-validator/src/Parser/FoldingWhiteSpace.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Parser/FoldingWhiteSpace.php rename to libs/vendor/egulias/email-validator/src/Parser/FoldingWhiteSpace.php diff --git a/plugins/vendor/egulias/email-validator/src/Parser/IDLeftPart.php b/libs/vendor/egulias/email-validator/src/Parser/IDLeftPart.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Parser/IDLeftPart.php rename to libs/vendor/egulias/email-validator/src/Parser/IDLeftPart.php diff --git a/plugins/vendor/egulias/email-validator/src/Parser/IDRightPart.php b/libs/vendor/egulias/email-validator/src/Parser/IDRightPart.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Parser/IDRightPart.php rename to libs/vendor/egulias/email-validator/src/Parser/IDRightPart.php diff --git a/plugins/vendor/egulias/email-validator/src/Parser/LocalPart.php b/libs/vendor/egulias/email-validator/src/Parser/LocalPart.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Parser/LocalPart.php rename to libs/vendor/egulias/email-validator/src/Parser/LocalPart.php diff --git a/plugins/vendor/egulias/email-validator/src/Parser/PartParser.php b/libs/vendor/egulias/email-validator/src/Parser/PartParser.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Parser/PartParser.php rename to libs/vendor/egulias/email-validator/src/Parser/PartParser.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/InvalidEmail.php b/libs/vendor/egulias/email-validator/src/Result/InvalidEmail.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/InvalidEmail.php rename to libs/vendor/egulias/email-validator/src/Result/InvalidEmail.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/MultipleErrors.php b/libs/vendor/egulias/email-validator/src/Result/MultipleErrors.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/MultipleErrors.php rename to libs/vendor/egulias/email-validator/src/Result/MultipleErrors.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/AtextAfterCFWS.php b/libs/vendor/egulias/email-validator/src/Result/Reason/AtextAfterCFWS.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/AtextAfterCFWS.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/AtextAfterCFWS.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/CRLFAtTheEnd.php b/libs/vendor/egulias/email-validator/src/Result/Reason/CRLFAtTheEnd.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/CRLFAtTheEnd.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/CRLFAtTheEnd.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/CRLFX2.php b/libs/vendor/egulias/email-validator/src/Result/Reason/CRLFX2.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/CRLFX2.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/CRLFX2.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/CRNoLF.php b/libs/vendor/egulias/email-validator/src/Result/Reason/CRNoLF.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/CRNoLF.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/CRNoLF.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/CharNotAllowed.php b/libs/vendor/egulias/email-validator/src/Result/Reason/CharNotAllowed.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/CharNotAllowed.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/CharNotAllowed.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/CommaInDomain.php b/libs/vendor/egulias/email-validator/src/Result/Reason/CommaInDomain.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/CommaInDomain.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/CommaInDomain.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/CommentsInIDRight.php b/libs/vendor/egulias/email-validator/src/Result/Reason/CommentsInIDRight.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/CommentsInIDRight.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/CommentsInIDRight.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/ConsecutiveAt.php b/libs/vendor/egulias/email-validator/src/Result/Reason/ConsecutiveAt.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/ConsecutiveAt.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/ConsecutiveAt.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/ConsecutiveDot.php b/libs/vendor/egulias/email-validator/src/Result/Reason/ConsecutiveDot.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/ConsecutiveDot.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/ConsecutiveDot.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/DetailedReason.php b/libs/vendor/egulias/email-validator/src/Result/Reason/DetailedReason.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/DetailedReason.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/DetailedReason.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/DomainAcceptsNoMail.php b/libs/vendor/egulias/email-validator/src/Result/Reason/DomainAcceptsNoMail.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/DomainAcceptsNoMail.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/DomainAcceptsNoMail.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/DomainHyphened.php b/libs/vendor/egulias/email-validator/src/Result/Reason/DomainHyphened.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/DomainHyphened.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/DomainHyphened.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/DomainTooLong.php b/libs/vendor/egulias/email-validator/src/Result/Reason/DomainTooLong.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/DomainTooLong.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/DomainTooLong.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/DotAtEnd.php b/libs/vendor/egulias/email-validator/src/Result/Reason/DotAtEnd.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/DotAtEnd.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/DotAtEnd.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/DotAtStart.php b/libs/vendor/egulias/email-validator/src/Result/Reason/DotAtStart.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/DotAtStart.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/DotAtStart.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/EmptyReason.php b/libs/vendor/egulias/email-validator/src/Result/Reason/EmptyReason.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/EmptyReason.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/EmptyReason.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/ExceptionFound.php b/libs/vendor/egulias/email-validator/src/Result/Reason/ExceptionFound.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/ExceptionFound.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/ExceptionFound.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/ExpectingATEXT.php b/libs/vendor/egulias/email-validator/src/Result/Reason/ExpectingATEXT.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/ExpectingATEXT.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/ExpectingATEXT.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/ExpectingCTEXT.php b/libs/vendor/egulias/email-validator/src/Result/Reason/ExpectingCTEXT.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/ExpectingCTEXT.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/ExpectingCTEXT.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/ExpectingDTEXT.php b/libs/vendor/egulias/email-validator/src/Result/Reason/ExpectingDTEXT.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/ExpectingDTEXT.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/ExpectingDTEXT.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/ExpectingDomainLiteralClose.php b/libs/vendor/egulias/email-validator/src/Result/Reason/ExpectingDomainLiteralClose.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/ExpectingDomainLiteralClose.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/ExpectingDomainLiteralClose.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/LabelTooLong.php b/libs/vendor/egulias/email-validator/src/Result/Reason/LabelTooLong.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/LabelTooLong.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/LabelTooLong.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/LocalOrReservedDomain.php b/libs/vendor/egulias/email-validator/src/Result/Reason/LocalOrReservedDomain.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/LocalOrReservedDomain.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/LocalOrReservedDomain.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/NoDNSRecord.php b/libs/vendor/egulias/email-validator/src/Result/Reason/NoDNSRecord.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/NoDNSRecord.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/NoDNSRecord.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/NoDomainPart.php b/libs/vendor/egulias/email-validator/src/Result/Reason/NoDomainPart.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/NoDomainPart.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/NoDomainPart.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/NoLocalPart.php b/libs/vendor/egulias/email-validator/src/Result/Reason/NoLocalPart.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/NoLocalPart.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/NoLocalPart.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/RFCWarnings.php b/libs/vendor/egulias/email-validator/src/Result/Reason/RFCWarnings.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/RFCWarnings.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/RFCWarnings.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/Reason.php b/libs/vendor/egulias/email-validator/src/Result/Reason/Reason.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/Reason.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/Reason.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/SpoofEmail.php b/libs/vendor/egulias/email-validator/src/Result/Reason/SpoofEmail.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/SpoofEmail.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/SpoofEmail.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/UnOpenedComment.php b/libs/vendor/egulias/email-validator/src/Result/Reason/UnOpenedComment.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/UnOpenedComment.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/UnOpenedComment.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/UnableToGetDNSRecord.php b/libs/vendor/egulias/email-validator/src/Result/Reason/UnableToGetDNSRecord.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/UnableToGetDNSRecord.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/UnableToGetDNSRecord.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/UnclosedComment.php b/libs/vendor/egulias/email-validator/src/Result/Reason/UnclosedComment.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/UnclosedComment.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/UnclosedComment.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/UnclosedQuotedString.php b/libs/vendor/egulias/email-validator/src/Result/Reason/UnclosedQuotedString.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/UnclosedQuotedString.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/UnclosedQuotedString.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Reason/UnusualElements.php b/libs/vendor/egulias/email-validator/src/Result/Reason/UnusualElements.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Reason/UnusualElements.php rename to libs/vendor/egulias/email-validator/src/Result/Reason/UnusualElements.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/Result.php b/libs/vendor/egulias/email-validator/src/Result/Result.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/Result.php rename to libs/vendor/egulias/email-validator/src/Result/Result.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/SpoofEmail.php b/libs/vendor/egulias/email-validator/src/Result/SpoofEmail.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/SpoofEmail.php rename to libs/vendor/egulias/email-validator/src/Result/SpoofEmail.php diff --git a/plugins/vendor/egulias/email-validator/src/Result/ValidEmail.php b/libs/vendor/egulias/email-validator/src/Result/ValidEmail.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Result/ValidEmail.php rename to libs/vendor/egulias/email-validator/src/Result/ValidEmail.php diff --git a/plugins/vendor/egulias/email-validator/src/Validation/DNSCheckValidation.php b/libs/vendor/egulias/email-validator/src/Validation/DNSCheckValidation.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Validation/DNSCheckValidation.php rename to libs/vendor/egulias/email-validator/src/Validation/DNSCheckValidation.php diff --git a/plugins/vendor/egulias/email-validator/src/Validation/DNSGetRecordWrapper.php b/libs/vendor/egulias/email-validator/src/Validation/DNSGetRecordWrapper.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Validation/DNSGetRecordWrapper.php rename to libs/vendor/egulias/email-validator/src/Validation/DNSGetRecordWrapper.php diff --git a/plugins/vendor/egulias/email-validator/src/Validation/DNSRecords.php b/libs/vendor/egulias/email-validator/src/Validation/DNSRecords.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Validation/DNSRecords.php rename to libs/vendor/egulias/email-validator/src/Validation/DNSRecords.php diff --git a/plugins/vendor/egulias/email-validator/src/Validation/EmailValidation.php b/libs/vendor/egulias/email-validator/src/Validation/EmailValidation.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Validation/EmailValidation.php rename to libs/vendor/egulias/email-validator/src/Validation/EmailValidation.php diff --git a/plugins/vendor/egulias/email-validator/src/Validation/Exception/EmptyValidationList.php b/libs/vendor/egulias/email-validator/src/Validation/Exception/EmptyValidationList.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Validation/Exception/EmptyValidationList.php rename to libs/vendor/egulias/email-validator/src/Validation/Exception/EmptyValidationList.php diff --git a/plugins/vendor/egulias/email-validator/src/Validation/Extra/SpoofCheckValidation.php b/libs/vendor/egulias/email-validator/src/Validation/Extra/SpoofCheckValidation.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Validation/Extra/SpoofCheckValidation.php rename to libs/vendor/egulias/email-validator/src/Validation/Extra/SpoofCheckValidation.php diff --git a/plugins/vendor/egulias/email-validator/src/Validation/MessageIDValidation.php b/libs/vendor/egulias/email-validator/src/Validation/MessageIDValidation.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Validation/MessageIDValidation.php rename to libs/vendor/egulias/email-validator/src/Validation/MessageIDValidation.php diff --git a/plugins/vendor/egulias/email-validator/src/Validation/MultipleValidationWithAnd.php b/libs/vendor/egulias/email-validator/src/Validation/MultipleValidationWithAnd.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Validation/MultipleValidationWithAnd.php rename to libs/vendor/egulias/email-validator/src/Validation/MultipleValidationWithAnd.php diff --git a/plugins/vendor/egulias/email-validator/src/Validation/NoRFCWarningsValidation.php b/libs/vendor/egulias/email-validator/src/Validation/NoRFCWarningsValidation.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Validation/NoRFCWarningsValidation.php rename to libs/vendor/egulias/email-validator/src/Validation/NoRFCWarningsValidation.php diff --git a/plugins/vendor/egulias/email-validator/src/Validation/RFCValidation.php b/libs/vendor/egulias/email-validator/src/Validation/RFCValidation.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Validation/RFCValidation.php rename to libs/vendor/egulias/email-validator/src/Validation/RFCValidation.php diff --git a/plugins/vendor/egulias/email-validator/src/Warning/AddressLiteral.php b/libs/vendor/egulias/email-validator/src/Warning/AddressLiteral.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Warning/AddressLiteral.php rename to libs/vendor/egulias/email-validator/src/Warning/AddressLiteral.php diff --git a/plugins/vendor/egulias/email-validator/src/Warning/CFWSNearAt.php b/libs/vendor/egulias/email-validator/src/Warning/CFWSNearAt.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Warning/CFWSNearAt.php rename to libs/vendor/egulias/email-validator/src/Warning/CFWSNearAt.php diff --git a/plugins/vendor/egulias/email-validator/src/Warning/CFWSWithFWS.php b/libs/vendor/egulias/email-validator/src/Warning/CFWSWithFWS.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Warning/CFWSWithFWS.php rename to libs/vendor/egulias/email-validator/src/Warning/CFWSWithFWS.php diff --git a/plugins/vendor/egulias/email-validator/src/Warning/Comment.php b/libs/vendor/egulias/email-validator/src/Warning/Comment.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Warning/Comment.php rename to libs/vendor/egulias/email-validator/src/Warning/Comment.php diff --git a/plugins/vendor/egulias/email-validator/src/Warning/DeprecatedComment.php b/libs/vendor/egulias/email-validator/src/Warning/DeprecatedComment.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Warning/DeprecatedComment.php rename to libs/vendor/egulias/email-validator/src/Warning/DeprecatedComment.php diff --git a/plugins/vendor/egulias/email-validator/src/Warning/DomainLiteral.php b/libs/vendor/egulias/email-validator/src/Warning/DomainLiteral.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Warning/DomainLiteral.php rename to libs/vendor/egulias/email-validator/src/Warning/DomainLiteral.php diff --git a/plugins/vendor/egulias/email-validator/src/Warning/EmailTooLong.php b/libs/vendor/egulias/email-validator/src/Warning/EmailTooLong.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Warning/EmailTooLong.php rename to libs/vendor/egulias/email-validator/src/Warning/EmailTooLong.php diff --git a/plugins/vendor/egulias/email-validator/src/Warning/IPV6BadChar.php b/libs/vendor/egulias/email-validator/src/Warning/IPV6BadChar.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Warning/IPV6BadChar.php rename to libs/vendor/egulias/email-validator/src/Warning/IPV6BadChar.php diff --git a/plugins/vendor/egulias/email-validator/src/Warning/IPV6ColonEnd.php b/libs/vendor/egulias/email-validator/src/Warning/IPV6ColonEnd.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Warning/IPV6ColonEnd.php rename to libs/vendor/egulias/email-validator/src/Warning/IPV6ColonEnd.php diff --git a/plugins/vendor/egulias/email-validator/src/Warning/IPV6ColonStart.php b/libs/vendor/egulias/email-validator/src/Warning/IPV6ColonStart.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Warning/IPV6ColonStart.php rename to libs/vendor/egulias/email-validator/src/Warning/IPV6ColonStart.php diff --git a/plugins/vendor/egulias/email-validator/src/Warning/IPV6Deprecated.php b/libs/vendor/egulias/email-validator/src/Warning/IPV6Deprecated.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Warning/IPV6Deprecated.php rename to libs/vendor/egulias/email-validator/src/Warning/IPV6Deprecated.php diff --git a/plugins/vendor/egulias/email-validator/src/Warning/IPV6DoubleColon.php b/libs/vendor/egulias/email-validator/src/Warning/IPV6DoubleColon.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Warning/IPV6DoubleColon.php rename to libs/vendor/egulias/email-validator/src/Warning/IPV6DoubleColon.php diff --git a/plugins/vendor/egulias/email-validator/src/Warning/IPV6GroupCount.php b/libs/vendor/egulias/email-validator/src/Warning/IPV6GroupCount.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Warning/IPV6GroupCount.php rename to libs/vendor/egulias/email-validator/src/Warning/IPV6GroupCount.php diff --git a/plugins/vendor/egulias/email-validator/src/Warning/IPV6MaxGroups.php b/libs/vendor/egulias/email-validator/src/Warning/IPV6MaxGroups.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Warning/IPV6MaxGroups.php rename to libs/vendor/egulias/email-validator/src/Warning/IPV6MaxGroups.php diff --git a/plugins/vendor/egulias/email-validator/src/Warning/LocalTooLong.php b/libs/vendor/egulias/email-validator/src/Warning/LocalTooLong.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Warning/LocalTooLong.php rename to libs/vendor/egulias/email-validator/src/Warning/LocalTooLong.php diff --git a/plugins/vendor/egulias/email-validator/src/Warning/NoDNSMXRecord.php b/libs/vendor/egulias/email-validator/src/Warning/NoDNSMXRecord.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Warning/NoDNSMXRecord.php rename to libs/vendor/egulias/email-validator/src/Warning/NoDNSMXRecord.php diff --git a/plugins/vendor/egulias/email-validator/src/Warning/ObsoleteDTEXT.php b/libs/vendor/egulias/email-validator/src/Warning/ObsoleteDTEXT.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Warning/ObsoleteDTEXT.php rename to libs/vendor/egulias/email-validator/src/Warning/ObsoleteDTEXT.php diff --git a/plugins/vendor/egulias/email-validator/src/Warning/QuotedPart.php b/libs/vendor/egulias/email-validator/src/Warning/QuotedPart.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Warning/QuotedPart.php rename to libs/vendor/egulias/email-validator/src/Warning/QuotedPart.php diff --git a/plugins/vendor/egulias/email-validator/src/Warning/QuotedString.php b/libs/vendor/egulias/email-validator/src/Warning/QuotedString.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Warning/QuotedString.php rename to libs/vendor/egulias/email-validator/src/Warning/QuotedString.php diff --git a/plugins/vendor/egulias/email-validator/src/Warning/TLD.php b/libs/vendor/egulias/email-validator/src/Warning/TLD.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Warning/TLD.php rename to libs/vendor/egulias/email-validator/src/Warning/TLD.php diff --git a/plugins/vendor/egulias/email-validator/src/Warning/Warning.php b/libs/vendor/egulias/email-validator/src/Warning/Warning.php similarity index 100% rename from plugins/vendor/egulias/email-validator/src/Warning/Warning.php rename to libs/vendor/egulias/email-validator/src/Warning/Warning.php diff --git a/plugins/vendor/guzzlehttp/psr7/CHANGELOG.md b/libs/vendor/guzzlehttp/psr7/CHANGELOG.md similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/CHANGELOG.md rename to libs/vendor/guzzlehttp/psr7/CHANGELOG.md diff --git a/plugins/vendor/guzzlehttp/psr7/LICENSE b/libs/vendor/guzzlehttp/psr7/LICENSE similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/LICENSE rename to libs/vendor/guzzlehttp/psr7/LICENSE diff --git a/plugins/vendor/guzzlehttp/psr7/README.md b/libs/vendor/guzzlehttp/psr7/README.md similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/README.md rename to libs/vendor/guzzlehttp/psr7/README.md diff --git a/plugins/vendor/guzzlehttp/psr7/UPGRADING.md b/libs/vendor/guzzlehttp/psr7/UPGRADING.md similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/UPGRADING.md rename to libs/vendor/guzzlehttp/psr7/UPGRADING.md diff --git a/plugins/vendor/guzzlehttp/psr7/composer.json b/libs/vendor/guzzlehttp/psr7/composer.json similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/composer.json rename to libs/vendor/guzzlehttp/psr7/composer.json diff --git a/plugins/vendor/guzzlehttp/psr7/src/AppendStream.php b/libs/vendor/guzzlehttp/psr7/src/AppendStream.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/AppendStream.php rename to libs/vendor/guzzlehttp/psr7/src/AppendStream.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/BufferStream.php b/libs/vendor/guzzlehttp/psr7/src/BufferStream.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/BufferStream.php rename to libs/vendor/guzzlehttp/psr7/src/BufferStream.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/CachingStream.php b/libs/vendor/guzzlehttp/psr7/src/CachingStream.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/CachingStream.php rename to libs/vendor/guzzlehttp/psr7/src/CachingStream.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/DroppingStream.php b/libs/vendor/guzzlehttp/psr7/src/DroppingStream.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/DroppingStream.php rename to libs/vendor/guzzlehttp/psr7/src/DroppingStream.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/Exception/MalformedUriException.php b/libs/vendor/guzzlehttp/psr7/src/Exception/MalformedUriException.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/Exception/MalformedUriException.php rename to libs/vendor/guzzlehttp/psr7/src/Exception/MalformedUriException.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/FnStream.php b/libs/vendor/guzzlehttp/psr7/src/FnStream.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/FnStream.php rename to libs/vendor/guzzlehttp/psr7/src/FnStream.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/Header.php b/libs/vendor/guzzlehttp/psr7/src/Header.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/Header.php rename to libs/vendor/guzzlehttp/psr7/src/Header.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/HttpFactory.php b/libs/vendor/guzzlehttp/psr7/src/HttpFactory.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/HttpFactory.php rename to libs/vendor/guzzlehttp/psr7/src/HttpFactory.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/InflateStream.php b/libs/vendor/guzzlehttp/psr7/src/InflateStream.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/InflateStream.php rename to libs/vendor/guzzlehttp/psr7/src/InflateStream.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/LazyOpenStream.php b/libs/vendor/guzzlehttp/psr7/src/LazyOpenStream.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/LazyOpenStream.php rename to libs/vendor/guzzlehttp/psr7/src/LazyOpenStream.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/LimitStream.php b/libs/vendor/guzzlehttp/psr7/src/LimitStream.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/LimitStream.php rename to libs/vendor/guzzlehttp/psr7/src/LimitStream.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/Message.php b/libs/vendor/guzzlehttp/psr7/src/Message.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/Message.php rename to libs/vendor/guzzlehttp/psr7/src/Message.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/MessageTrait.php b/libs/vendor/guzzlehttp/psr7/src/MessageTrait.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/MessageTrait.php rename to libs/vendor/guzzlehttp/psr7/src/MessageTrait.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/MimeType.php b/libs/vendor/guzzlehttp/psr7/src/MimeType.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/MimeType.php rename to libs/vendor/guzzlehttp/psr7/src/MimeType.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/MultipartStream.php b/libs/vendor/guzzlehttp/psr7/src/MultipartStream.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/MultipartStream.php rename to libs/vendor/guzzlehttp/psr7/src/MultipartStream.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/NoSeekStream.php b/libs/vendor/guzzlehttp/psr7/src/NoSeekStream.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/NoSeekStream.php rename to libs/vendor/guzzlehttp/psr7/src/NoSeekStream.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/PumpStream.php b/libs/vendor/guzzlehttp/psr7/src/PumpStream.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/PumpStream.php rename to libs/vendor/guzzlehttp/psr7/src/PumpStream.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/Query.php b/libs/vendor/guzzlehttp/psr7/src/Query.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/Query.php rename to libs/vendor/guzzlehttp/psr7/src/Query.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/Request.php b/libs/vendor/guzzlehttp/psr7/src/Request.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/Request.php rename to libs/vendor/guzzlehttp/psr7/src/Request.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/Response.php b/libs/vendor/guzzlehttp/psr7/src/Response.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/Response.php rename to libs/vendor/guzzlehttp/psr7/src/Response.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/Rfc3986.php b/libs/vendor/guzzlehttp/psr7/src/Rfc3986.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/Rfc3986.php rename to libs/vendor/guzzlehttp/psr7/src/Rfc3986.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/Rfc7230.php b/libs/vendor/guzzlehttp/psr7/src/Rfc7230.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/Rfc7230.php rename to libs/vendor/guzzlehttp/psr7/src/Rfc7230.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/ServerRequest.php b/libs/vendor/guzzlehttp/psr7/src/ServerRequest.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/ServerRequest.php rename to libs/vendor/guzzlehttp/psr7/src/ServerRequest.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/Stream.php b/libs/vendor/guzzlehttp/psr7/src/Stream.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/Stream.php rename to libs/vendor/guzzlehttp/psr7/src/Stream.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php b/libs/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php rename to libs/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/StreamWrapper.php b/libs/vendor/guzzlehttp/psr7/src/StreamWrapper.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/StreamWrapper.php rename to libs/vendor/guzzlehttp/psr7/src/StreamWrapper.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/UploadedFile.php b/libs/vendor/guzzlehttp/psr7/src/UploadedFile.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/UploadedFile.php rename to libs/vendor/guzzlehttp/psr7/src/UploadedFile.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/Uri.php b/libs/vendor/guzzlehttp/psr7/src/Uri.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/Uri.php rename to libs/vendor/guzzlehttp/psr7/src/Uri.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/UriComparator.php b/libs/vendor/guzzlehttp/psr7/src/UriComparator.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/UriComparator.php rename to libs/vendor/guzzlehttp/psr7/src/UriComparator.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/UriNormalizer.php b/libs/vendor/guzzlehttp/psr7/src/UriNormalizer.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/UriNormalizer.php rename to libs/vendor/guzzlehttp/psr7/src/UriNormalizer.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/UriResolver.php b/libs/vendor/guzzlehttp/psr7/src/UriResolver.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/UriResolver.php rename to libs/vendor/guzzlehttp/psr7/src/UriResolver.php diff --git a/plugins/vendor/guzzlehttp/psr7/src/Utils.php b/libs/vendor/guzzlehttp/psr7/src/Utils.php similarity index 100% rename from plugins/vendor/guzzlehttp/psr7/src/Utils.php rename to libs/vendor/guzzlehttp/psr7/src/Utils.php diff --git a/plugins/vendor/illuminate/collections/Arr.php b/libs/vendor/illuminate/collections/Arr.php similarity index 100% rename from plugins/vendor/illuminate/collections/Arr.php rename to libs/vendor/illuminate/collections/Arr.php diff --git a/plugins/vendor/illuminate/collections/Collection.php b/libs/vendor/illuminate/collections/Collection.php similarity index 100% rename from plugins/vendor/illuminate/collections/Collection.php rename to libs/vendor/illuminate/collections/Collection.php diff --git a/plugins/vendor/illuminate/collections/Enumerable.php b/libs/vendor/illuminate/collections/Enumerable.php similarity index 100% rename from plugins/vendor/illuminate/collections/Enumerable.php rename to libs/vendor/illuminate/collections/Enumerable.php diff --git a/plugins/vendor/illuminate/collections/HigherOrderCollectionProxy.php b/libs/vendor/illuminate/collections/HigherOrderCollectionProxy.php similarity index 100% rename from plugins/vendor/illuminate/collections/HigherOrderCollectionProxy.php rename to libs/vendor/illuminate/collections/HigherOrderCollectionProxy.php diff --git a/plugins/vendor/illuminate/collections/ItemNotFoundException.php b/libs/vendor/illuminate/collections/ItemNotFoundException.php similarity index 100% rename from plugins/vendor/illuminate/collections/ItemNotFoundException.php rename to libs/vendor/illuminate/collections/ItemNotFoundException.php diff --git a/plugins/vendor/illuminate/collections/LICENSE.md b/libs/vendor/illuminate/collections/LICENSE.md similarity index 100% rename from plugins/vendor/illuminate/collections/LICENSE.md rename to libs/vendor/illuminate/collections/LICENSE.md diff --git a/plugins/vendor/illuminate/collections/LazyCollection.php b/libs/vendor/illuminate/collections/LazyCollection.php similarity index 100% rename from plugins/vendor/illuminate/collections/LazyCollection.php rename to libs/vendor/illuminate/collections/LazyCollection.php diff --git a/plugins/vendor/illuminate/collections/MultipleItemsFoundException.php b/libs/vendor/illuminate/collections/MultipleItemsFoundException.php similarity index 100% rename from plugins/vendor/illuminate/collections/MultipleItemsFoundException.php rename to libs/vendor/illuminate/collections/MultipleItemsFoundException.php diff --git a/plugins/vendor/illuminate/collections/Traits/EnumeratesValues.php b/libs/vendor/illuminate/collections/Traits/EnumeratesValues.php similarity index 100% rename from plugins/vendor/illuminate/collections/Traits/EnumeratesValues.php rename to libs/vendor/illuminate/collections/Traits/EnumeratesValues.php diff --git a/plugins/vendor/illuminate/collections/Traits/TransformsToResourceCollection.php b/libs/vendor/illuminate/collections/Traits/TransformsToResourceCollection.php similarity index 100% rename from plugins/vendor/illuminate/collections/Traits/TransformsToResourceCollection.php rename to libs/vendor/illuminate/collections/Traits/TransformsToResourceCollection.php diff --git a/plugins/vendor/illuminate/collections/composer.json b/libs/vendor/illuminate/collections/composer.json similarity index 100% rename from plugins/vendor/illuminate/collections/composer.json rename to libs/vendor/illuminate/collections/composer.json diff --git a/plugins/vendor/illuminate/collections/functions.php b/libs/vendor/illuminate/collections/functions.php similarity index 100% rename from plugins/vendor/illuminate/collections/functions.php rename to libs/vendor/illuminate/collections/functions.php diff --git a/plugins/vendor/illuminate/collections/helpers.php b/libs/vendor/illuminate/collections/helpers.php similarity index 100% rename from plugins/vendor/illuminate/collections/helpers.php rename to libs/vendor/illuminate/collections/helpers.php diff --git a/plugins/vendor/illuminate/conditionable/HigherOrderWhenProxy.php b/libs/vendor/illuminate/conditionable/HigherOrderWhenProxy.php similarity index 100% rename from plugins/vendor/illuminate/conditionable/HigherOrderWhenProxy.php rename to libs/vendor/illuminate/conditionable/HigherOrderWhenProxy.php diff --git a/plugins/vendor/illuminate/conditionable/LICENSE.md b/libs/vendor/illuminate/conditionable/LICENSE.md similarity index 100% rename from plugins/vendor/illuminate/conditionable/LICENSE.md rename to libs/vendor/illuminate/conditionable/LICENSE.md diff --git a/plugins/vendor/illuminate/conditionable/Traits/Conditionable.php b/libs/vendor/illuminate/conditionable/Traits/Conditionable.php similarity index 100% rename from plugins/vendor/illuminate/conditionable/Traits/Conditionable.php rename to libs/vendor/illuminate/conditionable/Traits/Conditionable.php diff --git a/plugins/vendor/illuminate/conditionable/composer.json b/libs/vendor/illuminate/conditionable/composer.json similarity index 100% rename from plugins/vendor/illuminate/conditionable/composer.json rename to libs/vendor/illuminate/conditionable/composer.json diff --git a/plugins/vendor/illuminate/contracts/Auth/Access/Authorizable.php b/libs/vendor/illuminate/contracts/Auth/Access/Authorizable.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Auth/Access/Authorizable.php rename to libs/vendor/illuminate/contracts/Auth/Access/Authorizable.php diff --git a/plugins/vendor/illuminate/contracts/Auth/Access/Gate.php b/libs/vendor/illuminate/contracts/Auth/Access/Gate.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Auth/Access/Gate.php rename to libs/vendor/illuminate/contracts/Auth/Access/Gate.php diff --git a/plugins/vendor/illuminate/contracts/Auth/Authenticatable.php b/libs/vendor/illuminate/contracts/Auth/Authenticatable.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Auth/Authenticatable.php rename to libs/vendor/illuminate/contracts/Auth/Authenticatable.php diff --git a/plugins/vendor/illuminate/contracts/Auth/CanResetPassword.php b/libs/vendor/illuminate/contracts/Auth/CanResetPassword.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Auth/CanResetPassword.php rename to libs/vendor/illuminate/contracts/Auth/CanResetPassword.php diff --git a/plugins/vendor/illuminate/contracts/Auth/Factory.php b/libs/vendor/illuminate/contracts/Auth/Factory.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Auth/Factory.php rename to libs/vendor/illuminate/contracts/Auth/Factory.php diff --git a/plugins/vendor/illuminate/contracts/Auth/Guard.php b/libs/vendor/illuminate/contracts/Auth/Guard.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Auth/Guard.php rename to libs/vendor/illuminate/contracts/Auth/Guard.php diff --git a/plugins/vendor/illuminate/contracts/Auth/Middleware/AuthenticatesRequests.php b/libs/vendor/illuminate/contracts/Auth/Middleware/AuthenticatesRequests.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Auth/Middleware/AuthenticatesRequests.php rename to libs/vendor/illuminate/contracts/Auth/Middleware/AuthenticatesRequests.php diff --git a/plugins/vendor/illuminate/contracts/Auth/MustVerifyEmail.php b/libs/vendor/illuminate/contracts/Auth/MustVerifyEmail.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Auth/MustVerifyEmail.php rename to libs/vendor/illuminate/contracts/Auth/MustVerifyEmail.php diff --git a/plugins/vendor/illuminate/contracts/Auth/PasswordBroker.php b/libs/vendor/illuminate/contracts/Auth/PasswordBroker.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Auth/PasswordBroker.php rename to libs/vendor/illuminate/contracts/Auth/PasswordBroker.php diff --git a/plugins/vendor/illuminate/contracts/Auth/PasswordBrokerFactory.php b/libs/vendor/illuminate/contracts/Auth/PasswordBrokerFactory.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Auth/PasswordBrokerFactory.php rename to libs/vendor/illuminate/contracts/Auth/PasswordBrokerFactory.php diff --git a/plugins/vendor/illuminate/contracts/Auth/StatefulGuard.php b/libs/vendor/illuminate/contracts/Auth/StatefulGuard.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Auth/StatefulGuard.php rename to libs/vendor/illuminate/contracts/Auth/StatefulGuard.php diff --git a/plugins/vendor/illuminate/contracts/Auth/SupportsBasicAuth.php b/libs/vendor/illuminate/contracts/Auth/SupportsBasicAuth.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Auth/SupportsBasicAuth.php rename to libs/vendor/illuminate/contracts/Auth/SupportsBasicAuth.php diff --git a/plugins/vendor/illuminate/contracts/Auth/UserProvider.php b/libs/vendor/illuminate/contracts/Auth/UserProvider.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Auth/UserProvider.php rename to libs/vendor/illuminate/contracts/Auth/UserProvider.php diff --git a/plugins/vendor/illuminate/contracts/Broadcasting/Broadcaster.php b/libs/vendor/illuminate/contracts/Broadcasting/Broadcaster.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Broadcasting/Broadcaster.php rename to libs/vendor/illuminate/contracts/Broadcasting/Broadcaster.php diff --git a/plugins/vendor/illuminate/contracts/Broadcasting/Factory.php b/libs/vendor/illuminate/contracts/Broadcasting/Factory.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Broadcasting/Factory.php rename to libs/vendor/illuminate/contracts/Broadcasting/Factory.php diff --git a/plugins/vendor/illuminate/contracts/Broadcasting/HasBroadcastChannel.php b/libs/vendor/illuminate/contracts/Broadcasting/HasBroadcastChannel.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Broadcasting/HasBroadcastChannel.php rename to libs/vendor/illuminate/contracts/Broadcasting/HasBroadcastChannel.php diff --git a/plugins/vendor/illuminate/contracts/Broadcasting/ShouldBeUnique.php b/libs/vendor/illuminate/contracts/Broadcasting/ShouldBeUnique.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Broadcasting/ShouldBeUnique.php rename to libs/vendor/illuminate/contracts/Broadcasting/ShouldBeUnique.php diff --git a/plugins/vendor/illuminate/contracts/Broadcasting/ShouldBroadcast.php b/libs/vendor/illuminate/contracts/Broadcasting/ShouldBroadcast.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Broadcasting/ShouldBroadcast.php rename to libs/vendor/illuminate/contracts/Broadcasting/ShouldBroadcast.php diff --git a/plugins/vendor/illuminate/contracts/Broadcasting/ShouldBroadcastNow.php b/libs/vendor/illuminate/contracts/Broadcasting/ShouldBroadcastNow.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Broadcasting/ShouldBroadcastNow.php rename to libs/vendor/illuminate/contracts/Broadcasting/ShouldBroadcastNow.php diff --git a/plugins/vendor/illuminate/contracts/Broadcasting/ShouldRescue.php b/libs/vendor/illuminate/contracts/Broadcasting/ShouldRescue.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Broadcasting/ShouldRescue.php rename to libs/vendor/illuminate/contracts/Broadcasting/ShouldRescue.php diff --git a/plugins/vendor/illuminate/contracts/Bus/Dispatcher.php b/libs/vendor/illuminate/contracts/Bus/Dispatcher.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Bus/Dispatcher.php rename to libs/vendor/illuminate/contracts/Bus/Dispatcher.php diff --git a/plugins/vendor/illuminate/contracts/Bus/QueueingDispatcher.php b/libs/vendor/illuminate/contracts/Bus/QueueingDispatcher.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Bus/QueueingDispatcher.php rename to libs/vendor/illuminate/contracts/Bus/QueueingDispatcher.php diff --git a/plugins/vendor/illuminate/contracts/Cache/Factory.php b/libs/vendor/illuminate/contracts/Cache/Factory.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Cache/Factory.php rename to libs/vendor/illuminate/contracts/Cache/Factory.php diff --git a/plugins/vendor/illuminate/contracts/Cache/Lock.php b/libs/vendor/illuminate/contracts/Cache/Lock.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Cache/Lock.php rename to libs/vendor/illuminate/contracts/Cache/Lock.php diff --git a/plugins/vendor/illuminate/contracts/Cache/LockProvider.php b/libs/vendor/illuminate/contracts/Cache/LockProvider.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Cache/LockProvider.php rename to libs/vendor/illuminate/contracts/Cache/LockProvider.php diff --git a/plugins/vendor/illuminate/contracts/Cache/LockTimeoutException.php b/libs/vendor/illuminate/contracts/Cache/LockTimeoutException.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Cache/LockTimeoutException.php rename to libs/vendor/illuminate/contracts/Cache/LockTimeoutException.php diff --git a/plugins/vendor/illuminate/contracts/Cache/Repository.php b/libs/vendor/illuminate/contracts/Cache/Repository.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Cache/Repository.php rename to libs/vendor/illuminate/contracts/Cache/Repository.php diff --git a/plugins/vendor/illuminate/contracts/Cache/Store.php b/libs/vendor/illuminate/contracts/Cache/Store.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Cache/Store.php rename to libs/vendor/illuminate/contracts/Cache/Store.php diff --git a/plugins/vendor/illuminate/contracts/Concurrency/Driver.php b/libs/vendor/illuminate/contracts/Concurrency/Driver.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Concurrency/Driver.php rename to libs/vendor/illuminate/contracts/Concurrency/Driver.php diff --git a/plugins/vendor/illuminate/contracts/Config/Repository.php b/libs/vendor/illuminate/contracts/Config/Repository.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Config/Repository.php rename to libs/vendor/illuminate/contracts/Config/Repository.php diff --git a/plugins/vendor/illuminate/contracts/Console/Application.php b/libs/vendor/illuminate/contracts/Console/Application.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Console/Application.php rename to libs/vendor/illuminate/contracts/Console/Application.php diff --git a/plugins/vendor/illuminate/contracts/Console/Isolatable.php b/libs/vendor/illuminate/contracts/Console/Isolatable.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Console/Isolatable.php rename to libs/vendor/illuminate/contracts/Console/Isolatable.php diff --git a/plugins/vendor/illuminate/contracts/Console/Kernel.php b/libs/vendor/illuminate/contracts/Console/Kernel.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Console/Kernel.php rename to libs/vendor/illuminate/contracts/Console/Kernel.php diff --git a/plugins/vendor/illuminate/contracts/Console/PromptsForMissingInput.php b/libs/vendor/illuminate/contracts/Console/PromptsForMissingInput.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Console/PromptsForMissingInput.php rename to libs/vendor/illuminate/contracts/Console/PromptsForMissingInput.php diff --git a/plugins/vendor/illuminate/contracts/Container/BindingResolutionException.php b/libs/vendor/illuminate/contracts/Container/BindingResolutionException.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Container/BindingResolutionException.php rename to libs/vendor/illuminate/contracts/Container/BindingResolutionException.php diff --git a/plugins/vendor/illuminate/contracts/Container/CircularDependencyException.php b/libs/vendor/illuminate/contracts/Container/CircularDependencyException.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Container/CircularDependencyException.php rename to libs/vendor/illuminate/contracts/Container/CircularDependencyException.php diff --git a/plugins/vendor/illuminate/contracts/Container/Container.php b/libs/vendor/illuminate/contracts/Container/Container.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Container/Container.php rename to libs/vendor/illuminate/contracts/Container/Container.php diff --git a/plugins/vendor/illuminate/contracts/Container/ContextualAttribute.php b/libs/vendor/illuminate/contracts/Container/ContextualAttribute.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Container/ContextualAttribute.php rename to libs/vendor/illuminate/contracts/Container/ContextualAttribute.php diff --git a/plugins/vendor/illuminate/contracts/Container/ContextualBindingBuilder.php b/libs/vendor/illuminate/contracts/Container/ContextualBindingBuilder.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Container/ContextualBindingBuilder.php rename to libs/vendor/illuminate/contracts/Container/ContextualBindingBuilder.php diff --git a/plugins/vendor/illuminate/contracts/Container/SelfBuilding.php b/libs/vendor/illuminate/contracts/Container/SelfBuilding.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Container/SelfBuilding.php rename to libs/vendor/illuminate/contracts/Container/SelfBuilding.php diff --git a/plugins/vendor/illuminate/contracts/Cookie/Factory.php b/libs/vendor/illuminate/contracts/Cookie/Factory.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Cookie/Factory.php rename to libs/vendor/illuminate/contracts/Cookie/Factory.php diff --git a/plugins/vendor/illuminate/contracts/Cookie/QueueingFactory.php b/libs/vendor/illuminate/contracts/Cookie/QueueingFactory.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Cookie/QueueingFactory.php rename to libs/vendor/illuminate/contracts/Cookie/QueueingFactory.php diff --git a/plugins/vendor/illuminate/contracts/Database/ConcurrencyErrorDetector.php b/libs/vendor/illuminate/contracts/Database/ConcurrencyErrorDetector.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Database/ConcurrencyErrorDetector.php rename to libs/vendor/illuminate/contracts/Database/ConcurrencyErrorDetector.php diff --git a/plugins/vendor/illuminate/contracts/Database/Eloquent/Builder.php b/libs/vendor/illuminate/contracts/Database/Eloquent/Builder.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Database/Eloquent/Builder.php rename to libs/vendor/illuminate/contracts/Database/Eloquent/Builder.php diff --git a/plugins/vendor/illuminate/contracts/Database/Eloquent/Castable.php b/libs/vendor/illuminate/contracts/Database/Eloquent/Castable.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Database/Eloquent/Castable.php rename to libs/vendor/illuminate/contracts/Database/Eloquent/Castable.php diff --git a/plugins/vendor/illuminate/contracts/Database/Eloquent/CastsAttributes.php b/libs/vendor/illuminate/contracts/Database/Eloquent/CastsAttributes.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Database/Eloquent/CastsAttributes.php rename to libs/vendor/illuminate/contracts/Database/Eloquent/CastsAttributes.php diff --git a/plugins/vendor/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php b/libs/vendor/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php rename to libs/vendor/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php diff --git a/plugins/vendor/illuminate/contracts/Database/Eloquent/ComparesCastableAttributes.php b/libs/vendor/illuminate/contracts/Database/Eloquent/ComparesCastableAttributes.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Database/Eloquent/ComparesCastableAttributes.php rename to libs/vendor/illuminate/contracts/Database/Eloquent/ComparesCastableAttributes.php diff --git a/plugins/vendor/illuminate/contracts/Database/Eloquent/DeviatesCastableAttributes.php b/libs/vendor/illuminate/contracts/Database/Eloquent/DeviatesCastableAttributes.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Database/Eloquent/DeviatesCastableAttributes.php rename to libs/vendor/illuminate/contracts/Database/Eloquent/DeviatesCastableAttributes.php diff --git a/plugins/vendor/illuminate/contracts/Database/Eloquent/SerializesCastableAttributes.php b/libs/vendor/illuminate/contracts/Database/Eloquent/SerializesCastableAttributes.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Database/Eloquent/SerializesCastableAttributes.php rename to libs/vendor/illuminate/contracts/Database/Eloquent/SerializesCastableAttributes.php diff --git a/plugins/vendor/illuminate/contracts/Database/Eloquent/SupportsPartialRelations.php b/libs/vendor/illuminate/contracts/Database/Eloquent/SupportsPartialRelations.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Database/Eloquent/SupportsPartialRelations.php rename to libs/vendor/illuminate/contracts/Database/Eloquent/SupportsPartialRelations.php diff --git a/plugins/vendor/illuminate/contracts/Database/Events/MigrationEvent.php b/libs/vendor/illuminate/contracts/Database/Events/MigrationEvent.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Database/Events/MigrationEvent.php rename to libs/vendor/illuminate/contracts/Database/Events/MigrationEvent.php diff --git a/plugins/vendor/illuminate/contracts/Database/LostConnectionDetector.php b/libs/vendor/illuminate/contracts/Database/LostConnectionDetector.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Database/LostConnectionDetector.php rename to libs/vendor/illuminate/contracts/Database/LostConnectionDetector.php diff --git a/plugins/vendor/illuminate/contracts/Database/ModelIdentifier.php b/libs/vendor/illuminate/contracts/Database/ModelIdentifier.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Database/ModelIdentifier.php rename to libs/vendor/illuminate/contracts/Database/ModelIdentifier.php diff --git a/plugins/vendor/illuminate/contracts/Database/Query/Builder.php b/libs/vendor/illuminate/contracts/Database/Query/Builder.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Database/Query/Builder.php rename to libs/vendor/illuminate/contracts/Database/Query/Builder.php diff --git a/plugins/vendor/illuminate/contracts/Database/Query/ConditionExpression.php b/libs/vendor/illuminate/contracts/Database/Query/ConditionExpression.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Database/Query/ConditionExpression.php rename to libs/vendor/illuminate/contracts/Database/Query/ConditionExpression.php diff --git a/plugins/vendor/illuminate/contracts/Database/Query/Expression.php b/libs/vendor/illuminate/contracts/Database/Query/Expression.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Database/Query/Expression.php rename to libs/vendor/illuminate/contracts/Database/Query/Expression.php diff --git a/plugins/vendor/illuminate/contracts/Debug/ExceptionHandler.php b/libs/vendor/illuminate/contracts/Debug/ExceptionHandler.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Debug/ExceptionHandler.php rename to libs/vendor/illuminate/contracts/Debug/ExceptionHandler.php diff --git a/plugins/vendor/illuminate/contracts/Debug/ShouldntReport.php b/libs/vendor/illuminate/contracts/Debug/ShouldntReport.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Debug/ShouldntReport.php rename to libs/vendor/illuminate/contracts/Debug/ShouldntReport.php diff --git a/plugins/vendor/illuminate/contracts/Encryption/DecryptException.php b/libs/vendor/illuminate/contracts/Encryption/DecryptException.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Encryption/DecryptException.php rename to libs/vendor/illuminate/contracts/Encryption/DecryptException.php diff --git a/plugins/vendor/illuminate/contracts/Encryption/EncryptException.php b/libs/vendor/illuminate/contracts/Encryption/EncryptException.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Encryption/EncryptException.php rename to libs/vendor/illuminate/contracts/Encryption/EncryptException.php diff --git a/plugins/vendor/illuminate/contracts/Encryption/Encrypter.php b/libs/vendor/illuminate/contracts/Encryption/Encrypter.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Encryption/Encrypter.php rename to libs/vendor/illuminate/contracts/Encryption/Encrypter.php diff --git a/plugins/vendor/illuminate/contracts/Encryption/StringEncrypter.php b/libs/vendor/illuminate/contracts/Encryption/StringEncrypter.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Encryption/StringEncrypter.php rename to libs/vendor/illuminate/contracts/Encryption/StringEncrypter.php diff --git a/plugins/vendor/illuminate/contracts/Events/Dispatcher.php b/libs/vendor/illuminate/contracts/Events/Dispatcher.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Events/Dispatcher.php rename to libs/vendor/illuminate/contracts/Events/Dispatcher.php diff --git a/plugins/vendor/illuminate/contracts/Events/ShouldDispatchAfterCommit.php b/libs/vendor/illuminate/contracts/Events/ShouldDispatchAfterCommit.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Events/ShouldDispatchAfterCommit.php rename to libs/vendor/illuminate/contracts/Events/ShouldDispatchAfterCommit.php diff --git a/plugins/vendor/illuminate/contracts/Events/ShouldHandleEventsAfterCommit.php b/libs/vendor/illuminate/contracts/Events/ShouldHandleEventsAfterCommit.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Events/ShouldHandleEventsAfterCommit.php rename to libs/vendor/illuminate/contracts/Events/ShouldHandleEventsAfterCommit.php diff --git a/plugins/vendor/illuminate/contracts/Filesystem/Cloud.php b/libs/vendor/illuminate/contracts/Filesystem/Cloud.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Filesystem/Cloud.php rename to libs/vendor/illuminate/contracts/Filesystem/Cloud.php diff --git a/plugins/vendor/illuminate/contracts/Filesystem/Factory.php b/libs/vendor/illuminate/contracts/Filesystem/Factory.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Filesystem/Factory.php rename to libs/vendor/illuminate/contracts/Filesystem/Factory.php diff --git a/plugins/vendor/illuminate/contracts/Filesystem/FileNotFoundException.php b/libs/vendor/illuminate/contracts/Filesystem/FileNotFoundException.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Filesystem/FileNotFoundException.php rename to libs/vendor/illuminate/contracts/Filesystem/FileNotFoundException.php diff --git a/plugins/vendor/illuminate/contracts/Filesystem/Filesystem.php b/libs/vendor/illuminate/contracts/Filesystem/Filesystem.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Filesystem/Filesystem.php rename to libs/vendor/illuminate/contracts/Filesystem/Filesystem.php diff --git a/plugins/vendor/illuminate/contracts/Filesystem/LockTimeoutException.php b/libs/vendor/illuminate/contracts/Filesystem/LockTimeoutException.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Filesystem/LockTimeoutException.php rename to libs/vendor/illuminate/contracts/Filesystem/LockTimeoutException.php diff --git a/plugins/vendor/illuminate/contracts/Foundation/Application.php b/libs/vendor/illuminate/contracts/Foundation/Application.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Foundation/Application.php rename to libs/vendor/illuminate/contracts/Foundation/Application.php diff --git a/plugins/vendor/illuminate/contracts/Foundation/CachesConfiguration.php b/libs/vendor/illuminate/contracts/Foundation/CachesConfiguration.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Foundation/CachesConfiguration.php rename to libs/vendor/illuminate/contracts/Foundation/CachesConfiguration.php diff --git a/plugins/vendor/illuminate/contracts/Foundation/CachesRoutes.php b/libs/vendor/illuminate/contracts/Foundation/CachesRoutes.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Foundation/CachesRoutes.php rename to libs/vendor/illuminate/contracts/Foundation/CachesRoutes.php diff --git a/plugins/vendor/illuminate/contracts/Foundation/ExceptionRenderer.php b/libs/vendor/illuminate/contracts/Foundation/ExceptionRenderer.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Foundation/ExceptionRenderer.php rename to libs/vendor/illuminate/contracts/Foundation/ExceptionRenderer.php diff --git a/plugins/vendor/illuminate/contracts/Foundation/MaintenanceMode.php b/libs/vendor/illuminate/contracts/Foundation/MaintenanceMode.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Foundation/MaintenanceMode.php rename to libs/vendor/illuminate/contracts/Foundation/MaintenanceMode.php diff --git a/plugins/vendor/illuminate/contracts/Hashing/Hasher.php b/libs/vendor/illuminate/contracts/Hashing/Hasher.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Hashing/Hasher.php rename to libs/vendor/illuminate/contracts/Hashing/Hasher.php diff --git a/plugins/vendor/illuminate/contracts/Http/Kernel.php b/libs/vendor/illuminate/contracts/Http/Kernel.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Http/Kernel.php rename to libs/vendor/illuminate/contracts/Http/Kernel.php diff --git a/plugins/vendor/illuminate/contracts/JsonSchema/JsonSchema.php b/libs/vendor/illuminate/contracts/JsonSchema/JsonSchema.php similarity index 100% rename from plugins/vendor/illuminate/contracts/JsonSchema/JsonSchema.php rename to libs/vendor/illuminate/contracts/JsonSchema/JsonSchema.php diff --git a/plugins/vendor/illuminate/contracts/LICENSE.md b/libs/vendor/illuminate/contracts/LICENSE.md similarity index 100% rename from plugins/vendor/illuminate/contracts/LICENSE.md rename to libs/vendor/illuminate/contracts/LICENSE.md diff --git a/plugins/vendor/illuminate/contracts/Log/ContextLogProcessor.php b/libs/vendor/illuminate/contracts/Log/ContextLogProcessor.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Log/ContextLogProcessor.php rename to libs/vendor/illuminate/contracts/Log/ContextLogProcessor.php diff --git a/plugins/vendor/illuminate/contracts/Mail/Attachable.php b/libs/vendor/illuminate/contracts/Mail/Attachable.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Mail/Attachable.php rename to libs/vendor/illuminate/contracts/Mail/Attachable.php diff --git a/plugins/vendor/illuminate/contracts/Mail/Factory.php b/libs/vendor/illuminate/contracts/Mail/Factory.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Mail/Factory.php rename to libs/vendor/illuminate/contracts/Mail/Factory.php diff --git a/plugins/vendor/illuminate/contracts/Mail/MailQueue.php b/libs/vendor/illuminate/contracts/Mail/MailQueue.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Mail/MailQueue.php rename to libs/vendor/illuminate/contracts/Mail/MailQueue.php diff --git a/plugins/vendor/illuminate/contracts/Mail/Mailable.php b/libs/vendor/illuminate/contracts/Mail/Mailable.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Mail/Mailable.php rename to libs/vendor/illuminate/contracts/Mail/Mailable.php diff --git a/plugins/vendor/illuminate/contracts/Mail/Mailer.php b/libs/vendor/illuminate/contracts/Mail/Mailer.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Mail/Mailer.php rename to libs/vendor/illuminate/contracts/Mail/Mailer.php diff --git a/plugins/vendor/illuminate/contracts/Notifications/Dispatcher.php b/libs/vendor/illuminate/contracts/Notifications/Dispatcher.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Notifications/Dispatcher.php rename to libs/vendor/illuminate/contracts/Notifications/Dispatcher.php diff --git a/plugins/vendor/illuminate/contracts/Notifications/Factory.php b/libs/vendor/illuminate/contracts/Notifications/Factory.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Notifications/Factory.php rename to libs/vendor/illuminate/contracts/Notifications/Factory.php diff --git a/plugins/vendor/illuminate/contracts/Pagination/CursorPaginator.php b/libs/vendor/illuminate/contracts/Pagination/CursorPaginator.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Pagination/CursorPaginator.php rename to libs/vendor/illuminate/contracts/Pagination/CursorPaginator.php diff --git a/plugins/vendor/illuminate/contracts/Pagination/LengthAwarePaginator.php b/libs/vendor/illuminate/contracts/Pagination/LengthAwarePaginator.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Pagination/LengthAwarePaginator.php rename to libs/vendor/illuminate/contracts/Pagination/LengthAwarePaginator.php diff --git a/plugins/vendor/illuminate/contracts/Pagination/Paginator.php b/libs/vendor/illuminate/contracts/Pagination/Paginator.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Pagination/Paginator.php rename to libs/vendor/illuminate/contracts/Pagination/Paginator.php diff --git a/plugins/vendor/illuminate/contracts/Pipeline/Hub.php b/libs/vendor/illuminate/contracts/Pipeline/Hub.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Pipeline/Hub.php rename to libs/vendor/illuminate/contracts/Pipeline/Hub.php diff --git a/plugins/vendor/illuminate/contracts/Pipeline/Pipeline.php b/libs/vendor/illuminate/contracts/Pipeline/Pipeline.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Pipeline/Pipeline.php rename to libs/vendor/illuminate/contracts/Pipeline/Pipeline.php diff --git a/plugins/vendor/illuminate/contracts/Process/InvokedProcess.php b/libs/vendor/illuminate/contracts/Process/InvokedProcess.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Process/InvokedProcess.php rename to libs/vendor/illuminate/contracts/Process/InvokedProcess.php diff --git a/plugins/vendor/illuminate/contracts/Process/ProcessResult.php b/libs/vendor/illuminate/contracts/Process/ProcessResult.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Process/ProcessResult.php rename to libs/vendor/illuminate/contracts/Process/ProcessResult.php diff --git a/plugins/vendor/illuminate/contracts/Queue/ClearableQueue.php b/libs/vendor/illuminate/contracts/Queue/ClearableQueue.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Queue/ClearableQueue.php rename to libs/vendor/illuminate/contracts/Queue/ClearableQueue.php diff --git a/plugins/vendor/illuminate/contracts/Queue/EntityNotFoundException.php b/libs/vendor/illuminate/contracts/Queue/EntityNotFoundException.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Queue/EntityNotFoundException.php rename to libs/vendor/illuminate/contracts/Queue/EntityNotFoundException.php diff --git a/plugins/vendor/illuminate/contracts/Queue/EntityResolver.php b/libs/vendor/illuminate/contracts/Queue/EntityResolver.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Queue/EntityResolver.php rename to libs/vendor/illuminate/contracts/Queue/EntityResolver.php diff --git a/plugins/vendor/illuminate/contracts/Queue/Factory.php b/libs/vendor/illuminate/contracts/Queue/Factory.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Queue/Factory.php rename to libs/vendor/illuminate/contracts/Queue/Factory.php diff --git a/plugins/vendor/illuminate/contracts/Queue/Job.php b/libs/vendor/illuminate/contracts/Queue/Job.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Queue/Job.php rename to libs/vendor/illuminate/contracts/Queue/Job.php diff --git a/plugins/vendor/illuminate/contracts/Queue/Monitor.php b/libs/vendor/illuminate/contracts/Queue/Monitor.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Queue/Monitor.php rename to libs/vendor/illuminate/contracts/Queue/Monitor.php diff --git a/plugins/vendor/illuminate/contracts/Queue/Queue.php b/libs/vendor/illuminate/contracts/Queue/Queue.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Queue/Queue.php rename to libs/vendor/illuminate/contracts/Queue/Queue.php diff --git a/plugins/vendor/illuminate/contracts/Queue/QueueableCollection.php b/libs/vendor/illuminate/contracts/Queue/QueueableCollection.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Queue/QueueableCollection.php rename to libs/vendor/illuminate/contracts/Queue/QueueableCollection.php diff --git a/plugins/vendor/illuminate/contracts/Queue/QueueableEntity.php b/libs/vendor/illuminate/contracts/Queue/QueueableEntity.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Queue/QueueableEntity.php rename to libs/vendor/illuminate/contracts/Queue/QueueableEntity.php diff --git a/plugins/vendor/illuminate/contracts/Queue/ShouldBeEncrypted.php b/libs/vendor/illuminate/contracts/Queue/ShouldBeEncrypted.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Queue/ShouldBeEncrypted.php rename to libs/vendor/illuminate/contracts/Queue/ShouldBeEncrypted.php diff --git a/plugins/vendor/illuminate/contracts/Queue/ShouldBeUnique.php b/libs/vendor/illuminate/contracts/Queue/ShouldBeUnique.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Queue/ShouldBeUnique.php rename to libs/vendor/illuminate/contracts/Queue/ShouldBeUnique.php diff --git a/plugins/vendor/illuminate/contracts/Queue/ShouldBeUniqueUntilProcessing.php b/libs/vendor/illuminate/contracts/Queue/ShouldBeUniqueUntilProcessing.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Queue/ShouldBeUniqueUntilProcessing.php rename to libs/vendor/illuminate/contracts/Queue/ShouldBeUniqueUntilProcessing.php diff --git a/plugins/vendor/illuminate/contracts/Queue/ShouldQueue.php b/libs/vendor/illuminate/contracts/Queue/ShouldQueue.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Queue/ShouldQueue.php rename to libs/vendor/illuminate/contracts/Queue/ShouldQueue.php diff --git a/plugins/vendor/illuminate/contracts/Queue/ShouldQueueAfterCommit.php b/libs/vendor/illuminate/contracts/Queue/ShouldQueueAfterCommit.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Queue/ShouldQueueAfterCommit.php rename to libs/vendor/illuminate/contracts/Queue/ShouldQueueAfterCommit.php diff --git a/plugins/vendor/illuminate/contracts/Redis/Connection.php b/libs/vendor/illuminate/contracts/Redis/Connection.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Redis/Connection.php rename to libs/vendor/illuminate/contracts/Redis/Connection.php diff --git a/plugins/vendor/illuminate/contracts/Redis/Connector.php b/libs/vendor/illuminate/contracts/Redis/Connector.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Redis/Connector.php rename to libs/vendor/illuminate/contracts/Redis/Connector.php diff --git a/plugins/vendor/illuminate/contracts/Redis/Factory.php b/libs/vendor/illuminate/contracts/Redis/Factory.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Redis/Factory.php rename to libs/vendor/illuminate/contracts/Redis/Factory.php diff --git a/plugins/vendor/illuminate/contracts/Redis/LimiterTimeoutException.php b/libs/vendor/illuminate/contracts/Redis/LimiterTimeoutException.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Redis/LimiterTimeoutException.php rename to libs/vendor/illuminate/contracts/Redis/LimiterTimeoutException.php diff --git a/plugins/vendor/illuminate/contracts/Routing/BindingRegistrar.php b/libs/vendor/illuminate/contracts/Routing/BindingRegistrar.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Routing/BindingRegistrar.php rename to libs/vendor/illuminate/contracts/Routing/BindingRegistrar.php diff --git a/plugins/vendor/illuminate/contracts/Routing/Registrar.php b/libs/vendor/illuminate/contracts/Routing/Registrar.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Routing/Registrar.php rename to libs/vendor/illuminate/contracts/Routing/Registrar.php diff --git a/plugins/vendor/illuminate/contracts/Routing/ResponseFactory.php b/libs/vendor/illuminate/contracts/Routing/ResponseFactory.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Routing/ResponseFactory.php rename to libs/vendor/illuminate/contracts/Routing/ResponseFactory.php diff --git a/plugins/vendor/illuminate/contracts/Routing/UrlGenerator.php b/libs/vendor/illuminate/contracts/Routing/UrlGenerator.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Routing/UrlGenerator.php rename to libs/vendor/illuminate/contracts/Routing/UrlGenerator.php diff --git a/plugins/vendor/illuminate/contracts/Routing/UrlRoutable.php b/libs/vendor/illuminate/contracts/Routing/UrlRoutable.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Routing/UrlRoutable.php rename to libs/vendor/illuminate/contracts/Routing/UrlRoutable.php diff --git a/plugins/vendor/illuminate/contracts/Session/Middleware/AuthenticatesSessions.php b/libs/vendor/illuminate/contracts/Session/Middleware/AuthenticatesSessions.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Session/Middleware/AuthenticatesSessions.php rename to libs/vendor/illuminate/contracts/Session/Middleware/AuthenticatesSessions.php diff --git a/plugins/vendor/illuminate/contracts/Session/Session.php b/libs/vendor/illuminate/contracts/Session/Session.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Session/Session.php rename to libs/vendor/illuminate/contracts/Session/Session.php diff --git a/plugins/vendor/illuminate/contracts/Support/Arrayable.php b/libs/vendor/illuminate/contracts/Support/Arrayable.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Support/Arrayable.php rename to libs/vendor/illuminate/contracts/Support/Arrayable.php diff --git a/plugins/vendor/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php b/libs/vendor/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php rename to libs/vendor/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php diff --git a/plugins/vendor/illuminate/contracts/Support/DeferrableProvider.php b/libs/vendor/illuminate/contracts/Support/DeferrableProvider.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Support/DeferrableProvider.php rename to libs/vendor/illuminate/contracts/Support/DeferrableProvider.php diff --git a/plugins/vendor/illuminate/contracts/Support/DeferringDisplayableValue.php b/libs/vendor/illuminate/contracts/Support/DeferringDisplayableValue.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Support/DeferringDisplayableValue.php rename to libs/vendor/illuminate/contracts/Support/DeferringDisplayableValue.php diff --git a/plugins/vendor/illuminate/contracts/Support/HasOnceHash.php b/libs/vendor/illuminate/contracts/Support/HasOnceHash.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Support/HasOnceHash.php rename to libs/vendor/illuminate/contracts/Support/HasOnceHash.php diff --git a/plugins/vendor/illuminate/contracts/Support/Htmlable.php b/libs/vendor/illuminate/contracts/Support/Htmlable.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Support/Htmlable.php rename to libs/vendor/illuminate/contracts/Support/Htmlable.php diff --git a/plugins/vendor/illuminate/contracts/Support/Jsonable.php b/libs/vendor/illuminate/contracts/Support/Jsonable.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Support/Jsonable.php rename to libs/vendor/illuminate/contracts/Support/Jsonable.php diff --git a/plugins/vendor/illuminate/contracts/Support/MessageBag.php b/libs/vendor/illuminate/contracts/Support/MessageBag.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Support/MessageBag.php rename to libs/vendor/illuminate/contracts/Support/MessageBag.php diff --git a/plugins/vendor/illuminate/contracts/Support/MessageProvider.php b/libs/vendor/illuminate/contracts/Support/MessageProvider.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Support/MessageProvider.php rename to libs/vendor/illuminate/contracts/Support/MessageProvider.php diff --git a/plugins/vendor/illuminate/contracts/Support/Renderable.php b/libs/vendor/illuminate/contracts/Support/Renderable.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Support/Renderable.php rename to libs/vendor/illuminate/contracts/Support/Renderable.php diff --git a/plugins/vendor/illuminate/contracts/Support/Responsable.php b/libs/vendor/illuminate/contracts/Support/Responsable.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Support/Responsable.php rename to libs/vendor/illuminate/contracts/Support/Responsable.php diff --git a/plugins/vendor/illuminate/contracts/Support/ValidatedData.php b/libs/vendor/illuminate/contracts/Support/ValidatedData.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Support/ValidatedData.php rename to libs/vendor/illuminate/contracts/Support/ValidatedData.php diff --git a/plugins/vendor/illuminate/contracts/Translation/HasLocalePreference.php b/libs/vendor/illuminate/contracts/Translation/HasLocalePreference.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Translation/HasLocalePreference.php rename to libs/vendor/illuminate/contracts/Translation/HasLocalePreference.php diff --git a/plugins/vendor/illuminate/contracts/Translation/Loader.php b/libs/vendor/illuminate/contracts/Translation/Loader.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Translation/Loader.php rename to libs/vendor/illuminate/contracts/Translation/Loader.php diff --git a/plugins/vendor/illuminate/contracts/Translation/Translator.php b/libs/vendor/illuminate/contracts/Translation/Translator.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Translation/Translator.php rename to libs/vendor/illuminate/contracts/Translation/Translator.php diff --git a/plugins/vendor/illuminate/contracts/Validation/CompilableRules.php b/libs/vendor/illuminate/contracts/Validation/CompilableRules.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Validation/CompilableRules.php rename to libs/vendor/illuminate/contracts/Validation/CompilableRules.php diff --git a/plugins/vendor/illuminate/contracts/Validation/DataAwareRule.php b/libs/vendor/illuminate/contracts/Validation/DataAwareRule.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Validation/DataAwareRule.php rename to libs/vendor/illuminate/contracts/Validation/DataAwareRule.php diff --git a/plugins/vendor/illuminate/contracts/Validation/Factory.php b/libs/vendor/illuminate/contracts/Validation/Factory.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Validation/Factory.php rename to libs/vendor/illuminate/contracts/Validation/Factory.php diff --git a/plugins/vendor/illuminate/contracts/Validation/ImplicitRule.php b/libs/vendor/illuminate/contracts/Validation/ImplicitRule.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Validation/ImplicitRule.php rename to libs/vendor/illuminate/contracts/Validation/ImplicitRule.php diff --git a/plugins/vendor/illuminate/contracts/Validation/InvokableRule.php b/libs/vendor/illuminate/contracts/Validation/InvokableRule.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Validation/InvokableRule.php rename to libs/vendor/illuminate/contracts/Validation/InvokableRule.php diff --git a/plugins/vendor/illuminate/contracts/Validation/Rule.php b/libs/vendor/illuminate/contracts/Validation/Rule.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Validation/Rule.php rename to libs/vendor/illuminate/contracts/Validation/Rule.php diff --git a/plugins/vendor/illuminate/contracts/Validation/UncompromisedVerifier.php b/libs/vendor/illuminate/contracts/Validation/UncompromisedVerifier.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Validation/UncompromisedVerifier.php rename to libs/vendor/illuminate/contracts/Validation/UncompromisedVerifier.php diff --git a/plugins/vendor/illuminate/contracts/Validation/ValidatesWhenResolved.php b/libs/vendor/illuminate/contracts/Validation/ValidatesWhenResolved.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Validation/ValidatesWhenResolved.php rename to libs/vendor/illuminate/contracts/Validation/ValidatesWhenResolved.php diff --git a/plugins/vendor/illuminate/contracts/Validation/ValidationRule.php b/libs/vendor/illuminate/contracts/Validation/ValidationRule.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Validation/ValidationRule.php rename to libs/vendor/illuminate/contracts/Validation/ValidationRule.php diff --git a/plugins/vendor/illuminate/contracts/Validation/Validator.php b/libs/vendor/illuminate/contracts/Validation/Validator.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Validation/Validator.php rename to libs/vendor/illuminate/contracts/Validation/Validator.php diff --git a/plugins/vendor/illuminate/contracts/Validation/ValidatorAwareRule.php b/libs/vendor/illuminate/contracts/Validation/ValidatorAwareRule.php similarity index 100% rename from plugins/vendor/illuminate/contracts/Validation/ValidatorAwareRule.php rename to libs/vendor/illuminate/contracts/Validation/ValidatorAwareRule.php diff --git a/plugins/vendor/illuminate/contracts/View/Engine.php b/libs/vendor/illuminate/contracts/View/Engine.php similarity index 100% rename from plugins/vendor/illuminate/contracts/View/Engine.php rename to libs/vendor/illuminate/contracts/View/Engine.php diff --git a/plugins/vendor/illuminate/contracts/View/Factory.php b/libs/vendor/illuminate/contracts/View/Factory.php similarity index 100% rename from plugins/vendor/illuminate/contracts/View/Factory.php rename to libs/vendor/illuminate/contracts/View/Factory.php diff --git a/plugins/vendor/illuminate/contracts/View/View.php b/libs/vendor/illuminate/contracts/View/View.php similarity index 100% rename from plugins/vendor/illuminate/contracts/View/View.php rename to libs/vendor/illuminate/contracts/View/View.php diff --git a/plugins/vendor/illuminate/contracts/View/ViewCompilationException.php b/libs/vendor/illuminate/contracts/View/ViewCompilationException.php similarity index 100% rename from plugins/vendor/illuminate/contracts/View/ViewCompilationException.php rename to libs/vendor/illuminate/contracts/View/ViewCompilationException.php diff --git a/plugins/vendor/illuminate/contracts/composer.json b/libs/vendor/illuminate/contracts/composer.json similarity index 100% rename from plugins/vendor/illuminate/contracts/composer.json rename to libs/vendor/illuminate/contracts/composer.json diff --git a/plugins/vendor/illuminate/macroable/LICENSE.md b/libs/vendor/illuminate/macroable/LICENSE.md similarity index 100% rename from plugins/vendor/illuminate/macroable/LICENSE.md rename to libs/vendor/illuminate/macroable/LICENSE.md diff --git a/plugins/vendor/illuminate/macroable/Traits/Macroable.php b/libs/vendor/illuminate/macroable/Traits/Macroable.php similarity index 100% rename from plugins/vendor/illuminate/macroable/Traits/Macroable.php rename to libs/vendor/illuminate/macroable/Traits/Macroable.php diff --git a/plugins/vendor/illuminate/macroable/composer.json b/libs/vendor/illuminate/macroable/composer.json similarity index 100% rename from plugins/vendor/illuminate/macroable/composer.json rename to libs/vendor/illuminate/macroable/composer.json diff --git a/plugins/vendor/laravel/serializable-closure/LICENSE.md b/libs/vendor/laravel/serializable-closure/LICENSE.md similarity index 100% rename from plugins/vendor/laravel/serializable-closure/LICENSE.md rename to libs/vendor/laravel/serializable-closure/LICENSE.md diff --git a/plugins/vendor/laravel/serializable-closure/README.md b/libs/vendor/laravel/serializable-closure/README.md similarity index 100% rename from plugins/vendor/laravel/serializable-closure/README.md rename to libs/vendor/laravel/serializable-closure/README.md diff --git a/plugins/vendor/laravel/serializable-closure/composer.json b/libs/vendor/laravel/serializable-closure/composer.json similarity index 100% rename from plugins/vendor/laravel/serializable-closure/composer.json rename to libs/vendor/laravel/serializable-closure/composer.json diff --git a/plugins/vendor/laravel/serializable-closure/src/Contracts/Serializable.php b/libs/vendor/laravel/serializable-closure/src/Contracts/Serializable.php similarity index 100% rename from plugins/vendor/laravel/serializable-closure/src/Contracts/Serializable.php rename to libs/vendor/laravel/serializable-closure/src/Contracts/Serializable.php diff --git a/plugins/vendor/laravel/serializable-closure/src/Contracts/Signer.php b/libs/vendor/laravel/serializable-closure/src/Contracts/Signer.php similarity index 100% rename from plugins/vendor/laravel/serializable-closure/src/Contracts/Signer.php rename to libs/vendor/laravel/serializable-closure/src/Contracts/Signer.php diff --git a/plugins/vendor/laravel/serializable-closure/src/Exceptions/InvalidSignatureException.php b/libs/vendor/laravel/serializable-closure/src/Exceptions/InvalidSignatureException.php similarity index 100% rename from plugins/vendor/laravel/serializable-closure/src/Exceptions/InvalidSignatureException.php rename to libs/vendor/laravel/serializable-closure/src/Exceptions/InvalidSignatureException.php diff --git a/plugins/vendor/laravel/serializable-closure/src/Exceptions/MissingSecretKeyException.php b/libs/vendor/laravel/serializable-closure/src/Exceptions/MissingSecretKeyException.php similarity index 100% rename from plugins/vendor/laravel/serializable-closure/src/Exceptions/MissingSecretKeyException.php rename to libs/vendor/laravel/serializable-closure/src/Exceptions/MissingSecretKeyException.php diff --git a/plugins/vendor/laravel/serializable-closure/src/SerializableClosure.php b/libs/vendor/laravel/serializable-closure/src/SerializableClosure.php similarity index 100% rename from plugins/vendor/laravel/serializable-closure/src/SerializableClosure.php rename to libs/vendor/laravel/serializable-closure/src/SerializableClosure.php diff --git a/plugins/vendor/laravel/serializable-closure/src/Serializers/Native.php b/libs/vendor/laravel/serializable-closure/src/Serializers/Native.php similarity index 100% rename from plugins/vendor/laravel/serializable-closure/src/Serializers/Native.php rename to libs/vendor/laravel/serializable-closure/src/Serializers/Native.php diff --git a/plugins/vendor/laravel/serializable-closure/src/Serializers/Signed.php b/libs/vendor/laravel/serializable-closure/src/Serializers/Signed.php similarity index 100% rename from plugins/vendor/laravel/serializable-closure/src/Serializers/Signed.php rename to libs/vendor/laravel/serializable-closure/src/Serializers/Signed.php diff --git a/plugins/vendor/laravel/serializable-closure/src/Signers/Hmac.php b/libs/vendor/laravel/serializable-closure/src/Signers/Hmac.php similarity index 100% rename from plugins/vendor/laravel/serializable-closure/src/Signers/Hmac.php rename to libs/vendor/laravel/serializable-closure/src/Signers/Hmac.php diff --git a/plugins/vendor/laravel/serializable-closure/src/Support/ClosureScope.php b/libs/vendor/laravel/serializable-closure/src/Support/ClosureScope.php similarity index 100% rename from plugins/vendor/laravel/serializable-closure/src/Support/ClosureScope.php rename to libs/vendor/laravel/serializable-closure/src/Support/ClosureScope.php diff --git a/plugins/vendor/laravel/serializable-closure/src/Support/ClosureStream.php b/libs/vendor/laravel/serializable-closure/src/Support/ClosureStream.php similarity index 100% rename from plugins/vendor/laravel/serializable-closure/src/Support/ClosureStream.php rename to libs/vendor/laravel/serializable-closure/src/Support/ClosureStream.php diff --git a/plugins/vendor/laravel/serializable-closure/src/Support/ReflectionClosure.php b/libs/vendor/laravel/serializable-closure/src/Support/ReflectionClosure.php similarity index 100% rename from plugins/vendor/laravel/serializable-closure/src/Support/ReflectionClosure.php rename to libs/vendor/laravel/serializable-closure/src/Support/ReflectionClosure.php diff --git a/plugins/vendor/laravel/serializable-closure/src/Support/SelfReference.php b/libs/vendor/laravel/serializable-closure/src/Support/SelfReference.php similarity index 100% rename from plugins/vendor/laravel/serializable-closure/src/Support/SelfReference.php rename to libs/vendor/laravel/serializable-closure/src/Support/SelfReference.php diff --git a/plugins/vendor/laravel/serializable-closure/src/UnsignedSerializableClosure.php b/libs/vendor/laravel/serializable-closure/src/UnsignedSerializableClosure.php similarity index 100% rename from plugins/vendor/laravel/serializable-closure/src/UnsignedSerializableClosure.php rename to libs/vendor/laravel/serializable-closure/src/UnsignedSerializableClosure.php diff --git a/plugins/vendor/nesbot/carbon/.phpstorm.meta.php b/libs/vendor/nesbot/carbon/.phpstorm.meta.php similarity index 100% rename from plugins/vendor/nesbot/carbon/.phpstorm.meta.php rename to libs/vendor/nesbot/carbon/.phpstorm.meta.php diff --git a/plugins/vendor/nesbot/carbon/LICENSE b/libs/vendor/nesbot/carbon/LICENSE similarity index 100% rename from plugins/vendor/nesbot/carbon/LICENSE rename to libs/vendor/nesbot/carbon/LICENSE diff --git a/plugins/vendor/nesbot/carbon/SECURITY.md b/libs/vendor/nesbot/carbon/SECURITY.md similarity index 100% rename from plugins/vendor/nesbot/carbon/SECURITY.md rename to libs/vendor/nesbot/carbon/SECURITY.md diff --git a/plugins/vendor/nesbot/carbon/bin/carbon b/libs/vendor/nesbot/carbon/bin/carbon similarity index 100% rename from plugins/vendor/nesbot/carbon/bin/carbon rename to libs/vendor/nesbot/carbon/bin/carbon diff --git a/plugins/vendor/nesbot/carbon/bin/carbon.bat b/libs/vendor/nesbot/carbon/bin/carbon.bat similarity index 100% rename from plugins/vendor/nesbot/carbon/bin/carbon.bat rename to libs/vendor/nesbot/carbon/bin/carbon.bat diff --git a/plugins/vendor/nesbot/carbon/composer.json b/libs/vendor/nesbot/carbon/composer.json similarity index 100% rename from plugins/vendor/nesbot/carbon/composer.json rename to libs/vendor/nesbot/carbon/composer.json diff --git a/plugins/vendor/nesbot/carbon/extension.neon b/libs/vendor/nesbot/carbon/extension.neon similarity index 100% rename from plugins/vendor/nesbot/carbon/extension.neon rename to libs/vendor/nesbot/carbon/extension.neon diff --git a/plugins/vendor/nesbot/carbon/lazy/Carbon/MessageFormatter/MessageFormatterMapperStrongType.php b/libs/vendor/nesbot/carbon/lazy/Carbon/MessageFormatter/MessageFormatterMapperStrongType.php similarity index 100% rename from plugins/vendor/nesbot/carbon/lazy/Carbon/MessageFormatter/MessageFormatterMapperStrongType.php rename to libs/vendor/nesbot/carbon/lazy/Carbon/MessageFormatter/MessageFormatterMapperStrongType.php diff --git a/plugins/vendor/nesbot/carbon/lazy/Carbon/MessageFormatter/MessageFormatterMapperWeakType.php b/libs/vendor/nesbot/carbon/lazy/Carbon/MessageFormatter/MessageFormatterMapperWeakType.php similarity index 100% rename from plugins/vendor/nesbot/carbon/lazy/Carbon/MessageFormatter/MessageFormatterMapperWeakType.php rename to libs/vendor/nesbot/carbon/lazy/Carbon/MessageFormatter/MessageFormatterMapperWeakType.php diff --git a/plugins/vendor/nesbot/carbon/lazy/Carbon/ProtectedDatePeriod.php b/libs/vendor/nesbot/carbon/lazy/Carbon/ProtectedDatePeriod.php similarity index 100% rename from plugins/vendor/nesbot/carbon/lazy/Carbon/ProtectedDatePeriod.php rename to libs/vendor/nesbot/carbon/lazy/Carbon/ProtectedDatePeriod.php diff --git a/plugins/vendor/nesbot/carbon/lazy/Carbon/TranslatorStrongType.php b/libs/vendor/nesbot/carbon/lazy/Carbon/TranslatorStrongType.php similarity index 100% rename from plugins/vendor/nesbot/carbon/lazy/Carbon/TranslatorStrongType.php rename to libs/vendor/nesbot/carbon/lazy/Carbon/TranslatorStrongType.php diff --git a/plugins/vendor/nesbot/carbon/lazy/Carbon/TranslatorWeakType.php b/libs/vendor/nesbot/carbon/lazy/Carbon/TranslatorWeakType.php similarity index 100% rename from plugins/vendor/nesbot/carbon/lazy/Carbon/TranslatorWeakType.php rename to libs/vendor/nesbot/carbon/lazy/Carbon/TranslatorWeakType.php diff --git a/plugins/vendor/nesbot/carbon/lazy/Carbon/UnprotectedDatePeriod.php b/libs/vendor/nesbot/carbon/lazy/Carbon/UnprotectedDatePeriod.php similarity index 100% rename from plugins/vendor/nesbot/carbon/lazy/Carbon/UnprotectedDatePeriod.php rename to libs/vendor/nesbot/carbon/lazy/Carbon/UnprotectedDatePeriod.php diff --git a/plugins/vendor/nesbot/carbon/readme.md b/libs/vendor/nesbot/carbon/readme.md similarity index 100% rename from plugins/vendor/nesbot/carbon/readme.md rename to libs/vendor/nesbot/carbon/readme.md diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/AbstractTranslator.php b/libs/vendor/nesbot/carbon/src/Carbon/AbstractTranslator.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/AbstractTranslator.php rename to libs/vendor/nesbot/carbon/src/Carbon/AbstractTranslator.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Callback.php b/libs/vendor/nesbot/carbon/src/Carbon/Callback.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Callback.php rename to libs/vendor/nesbot/carbon/src/Carbon/Callback.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Carbon.php b/libs/vendor/nesbot/carbon/src/Carbon/Carbon.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Carbon.php rename to libs/vendor/nesbot/carbon/src/Carbon/Carbon.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/CarbonConverterInterface.php b/libs/vendor/nesbot/carbon/src/Carbon/CarbonConverterInterface.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/CarbonConverterInterface.php rename to libs/vendor/nesbot/carbon/src/Carbon/CarbonConverterInterface.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/CarbonImmutable.php b/libs/vendor/nesbot/carbon/src/Carbon/CarbonImmutable.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/CarbonImmutable.php rename to libs/vendor/nesbot/carbon/src/Carbon/CarbonImmutable.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/CarbonInterface.php b/libs/vendor/nesbot/carbon/src/Carbon/CarbonInterface.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/CarbonInterface.php rename to libs/vendor/nesbot/carbon/src/Carbon/CarbonInterface.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/CarbonInterval.php b/libs/vendor/nesbot/carbon/src/Carbon/CarbonInterval.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/CarbonInterval.php rename to libs/vendor/nesbot/carbon/src/Carbon/CarbonInterval.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/CarbonPeriod.php b/libs/vendor/nesbot/carbon/src/Carbon/CarbonPeriod.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/CarbonPeriod.php rename to libs/vendor/nesbot/carbon/src/Carbon/CarbonPeriod.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/CarbonPeriodImmutable.php b/libs/vendor/nesbot/carbon/src/Carbon/CarbonPeriodImmutable.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/CarbonPeriodImmutable.php rename to libs/vendor/nesbot/carbon/src/Carbon/CarbonPeriodImmutable.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/CarbonTimeZone.php b/libs/vendor/nesbot/carbon/src/Carbon/CarbonTimeZone.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/CarbonTimeZone.php rename to libs/vendor/nesbot/carbon/src/Carbon/CarbonTimeZone.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Cli/Invoker.php b/libs/vendor/nesbot/carbon/src/Carbon/Cli/Invoker.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Cli/Invoker.php rename to libs/vendor/nesbot/carbon/src/Carbon/Cli/Invoker.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Constants/DiffOptions.php b/libs/vendor/nesbot/carbon/src/Carbon/Constants/DiffOptions.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Constants/DiffOptions.php rename to libs/vendor/nesbot/carbon/src/Carbon/Constants/DiffOptions.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Constants/Format.php b/libs/vendor/nesbot/carbon/src/Carbon/Constants/Format.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Constants/Format.php rename to libs/vendor/nesbot/carbon/src/Carbon/Constants/Format.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Constants/TranslationOptions.php b/libs/vendor/nesbot/carbon/src/Carbon/Constants/TranslationOptions.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Constants/TranslationOptions.php rename to libs/vendor/nesbot/carbon/src/Carbon/Constants/TranslationOptions.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Constants/UnitValue.php b/libs/vendor/nesbot/carbon/src/Carbon/Constants/UnitValue.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Constants/UnitValue.php rename to libs/vendor/nesbot/carbon/src/Carbon/Constants/UnitValue.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/Exception.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/Exception.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/Exception.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/Exception.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitException.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitException.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitException.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitException.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/UnsupportedUnitException.php b/libs/vendor/nesbot/carbon/src/Carbon/Exceptions/UnsupportedUnitException.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Exceptions/UnsupportedUnitException.php rename to libs/vendor/nesbot/carbon/src/Carbon/Exceptions/UnsupportedUnitException.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Factory.php b/libs/vendor/nesbot/carbon/src/Carbon/Factory.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Factory.php rename to libs/vendor/nesbot/carbon/src/Carbon/Factory.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/FactoryImmutable.php b/libs/vendor/nesbot/carbon/src/Carbon/FactoryImmutable.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/FactoryImmutable.php rename to libs/vendor/nesbot/carbon/src/Carbon/FactoryImmutable.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/aa.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/aa.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/aa.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/aa.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/aa_DJ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/aa_DJ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/aa_DJ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/aa_DJ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/aa_ER.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/aa_ER.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/aa_ER.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/aa_ER.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/aa_ER@saaho.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/aa_ER@saaho.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/aa_ER@saaho.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/aa_ER@saaho.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/aa_ET.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/aa_ET.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/aa_ET.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/aa_ET.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/af.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/af.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/af.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/af.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/af_NA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/af_NA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/af_NA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/af_NA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/af_ZA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/af_ZA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/af_ZA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/af_ZA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/agq.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/agq.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/agq.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/agq.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/agr.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/agr.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/agr.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/agr.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/agr_PE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/agr_PE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/agr_PE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/agr_PE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ak.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ak.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ak.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ak.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ak_GH.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ak_GH.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ak_GH.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ak_GH.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/am.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/am.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/am.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/am.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/am_ET.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/am_ET.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/am_ET.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/am_ET.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/an.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/an.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/an.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/an.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/an_ES.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/an_ES.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/an_ES.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/an_ES.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/anp.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/anp.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/anp.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/anp.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/anp_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/anp_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/anp_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/anp_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_AE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_AE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_AE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_AE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_BH.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_BH.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_BH.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_BH.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_DJ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_DJ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_DJ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_DJ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_DZ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_DZ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_DZ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_DZ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_EG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_EG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_EG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_EG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_EH.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_EH.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_EH.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_EH.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_ER.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_ER.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_ER.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_ER.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_IL.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_IL.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_IL.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_IL.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_IQ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_IQ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_IQ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_IQ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_JO.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_JO.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_JO.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_JO.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_KM.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_KM.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_KM.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_KM.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_KW.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_KW.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_KW.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_KW.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_LB.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_LB.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_LB.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_LB.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_LY.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_LY.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_LY.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_LY.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_MA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_MA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_MA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_MA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_MR.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_MR.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_MR.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_MR.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_OM.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_OM.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_OM.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_OM.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_PS.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_PS.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_PS.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_PS.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_QA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_QA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_QA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_QA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_SA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_SA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_SA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_SA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_SD.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_SD.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_SD.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_SD.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_SO.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_SO.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_SO.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_SO.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_SS.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_SS.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_SS.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_SS.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_SY.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_SY.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_SY.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_SY.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_Shakl.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_Shakl.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_Shakl.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_Shakl.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_TD.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_TD.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_TD.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_TD.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_TN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_TN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_TN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_TN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_YE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_YE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ar_YE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ar_YE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/as.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/as.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/as.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/as.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/as_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/as_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/as_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/as_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/asa.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/asa.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/asa.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/asa.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ast.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ast.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ast.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ast.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ast_ES.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ast_ES.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ast_ES.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ast_ES.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ayc.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ayc.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ayc.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ayc.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ayc_PE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ayc_PE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ayc_PE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ayc_PE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/az.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/az.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/az.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/az.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/az_AZ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/az_AZ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/az_AZ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/az_AZ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/az_Arab.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/az_Arab.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/az_Arab.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/az_Arab.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/az_Cyrl.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/az_Cyrl.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/az_Cyrl.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/az_Cyrl.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/az_IR.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/az_IR.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/az_IR.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/az_IR.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/az_Latn.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/az_Latn.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/az_Latn.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/az_Latn.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/bas.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/bas.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/bas.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/bas.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/be.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/be.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/be.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/be.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/be_BY.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/be_BY.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/be_BY.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/be_BY.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/be_BY@latin.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/be_BY@latin.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/be_BY@latin.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/be_BY@latin.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/bem.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/bem.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/bem.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/bem.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/bem_ZM.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/bem_ZM.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/bem_ZM.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/bem_ZM.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ber.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ber.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ber.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ber.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ber_DZ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ber_DZ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ber_DZ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ber_DZ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ber_MA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ber_MA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ber_MA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ber_MA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/bez.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/bez.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/bez.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/bez.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/bg.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/bg.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/bg.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/bg.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/bg_BG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/bg_BG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/bg_BG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/bg_BG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/bhb.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/bhb.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/bhb.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/bhb.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/bhb_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/bhb_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/bhb_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/bhb_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/bho.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/bho.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/bho.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/bho.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/bho_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/bho_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/bho_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/bho_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/bi.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/bi.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/bi.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/bi.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/bi_VU.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/bi_VU.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/bi_VU.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/bi_VU.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/bm.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/bm.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/bm.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/bm.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/bn.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/bn.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/bn.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/bn.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/bn_BD.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/bn_BD.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/bn_BD.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/bn_BD.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/bn_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/bn_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/bn_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/bn_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/bo.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/bo.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/bo.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/bo.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/bo_CN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/bo_CN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/bo_CN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/bo_CN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/bo_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/bo_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/bo_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/bo_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/br.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/br.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/br.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/br.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/br_FR.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/br_FR.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/br_FR.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/br_FR.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/brx.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/brx.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/brx.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/brx.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/brx_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/brx_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/brx_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/brx_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/bs.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/bs.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/bs.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/bs.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/bs_BA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/bs_BA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/bs_BA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/bs_BA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/bs_Cyrl.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/bs_Cyrl.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/bs_Cyrl.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/bs_Cyrl.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/bs_Latn.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/bs_Latn.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/bs_Latn.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/bs_Latn.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/byn.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/byn.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/byn.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/byn.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/byn_ER.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/byn_ER.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/byn_ER.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/byn_ER.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ca.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ca.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ca.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ca.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ca_AD.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ca_AD.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ca_AD.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ca_AD.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ca_ES.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ca_ES.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ca_ES.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ca_ES.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ca_ES_Valencia.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ca_ES_Valencia.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ca_ES_Valencia.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ca_ES_Valencia.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ca_FR.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ca_FR.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ca_FR.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ca_FR.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ca_IT.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ca_IT.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ca_IT.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ca_IT.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ccp.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ccp.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ccp.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ccp.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ccp_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ccp_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ccp_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ccp_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ce.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ce.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ce.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ce.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ce_RU.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ce_RU.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ce_RU.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ce_RU.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/cgg.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/cgg.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/cgg.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/cgg.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/chr.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/chr.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/chr.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/chr.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/chr_US.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/chr_US.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/chr_US.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/chr_US.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ckb.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ckb.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ckb.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ckb.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/cmn.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/cmn.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/cmn.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/cmn.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/cmn_TW.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/cmn_TW.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/cmn_TW.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/cmn_TW.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/crh.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/crh.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/crh.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/crh.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/crh_UA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/crh_UA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/crh_UA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/crh_UA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/cs.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/cs.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/cs.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/cs.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/cs_CZ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/cs_CZ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/cs_CZ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/cs_CZ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/csb.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/csb.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/csb.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/csb.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/csb_PL.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/csb_PL.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/csb_PL.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/csb_PL.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/cu.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/cu.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/cu.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/cu.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/cv.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/cv.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/cv.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/cv.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/cv_RU.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/cv_RU.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/cv_RU.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/cv_RU.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/cy.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/cy.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/cy.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/cy.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/cy_GB.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/cy_GB.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/cy_GB.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/cy_GB.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/da.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/da.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/da.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/da.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/da_DK.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/da_DK.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/da_DK.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/da_DK.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/da_GL.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/da_GL.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/da_GL.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/da_GL.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/dav.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/dav.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/dav.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/dav.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/de.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/de.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/de.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/de.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/de_AT.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/de_AT.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/de_AT.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/de_AT.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/de_BE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/de_BE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/de_BE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/de_BE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/de_CH.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/de_CH.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/de_CH.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/de_CH.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/de_DE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/de_DE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/de_DE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/de_DE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/de_IT.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/de_IT.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/de_IT.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/de_IT.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/de_LI.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/de_LI.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/de_LI.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/de_LI.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/de_LU.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/de_LU.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/de_LU.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/de_LU.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/dje.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/dje.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/dje.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/dje.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/doi.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/doi.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/doi.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/doi.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/doi_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/doi_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/doi_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/doi_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/dsb.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/dsb.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/dsb.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/dsb.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/dsb_DE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/dsb_DE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/dsb_DE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/dsb_DE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/dua.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/dua.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/dua.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/dua.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/dv.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/dv.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/dv.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/dv.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/dv_MV.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/dv_MV.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/dv_MV.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/dv_MV.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/dyo.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/dyo.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/dyo.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/dyo.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/dz.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/dz.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/dz.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/dz.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/dz_BT.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/dz_BT.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/dz_BT.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/dz_BT.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ebu.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ebu.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ebu.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ebu.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ee.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ee.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ee.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ee.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ee_TG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ee_TG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ee_TG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ee_TG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/el.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/el.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/el.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/el.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/el_CY.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/el_CY.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/el_CY.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/el_CY.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/el_GR.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/el_GR.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/el_GR.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/el_GR.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_001.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_001.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_001.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_001.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_150.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_150.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_150.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_150.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_AG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_AG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_AG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_AG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_AI.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_AI.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_AI.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_AI.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_AS.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_AS.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_AS.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_AS.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_AT.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_AT.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_AT.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_AT.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_AU.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_AU.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_AU.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_AU.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_BB.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_BB.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_BB.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_BB.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_BE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_BE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_BE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_BE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_BI.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_BI.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_BI.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_BI.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_BM.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_BM.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_BM.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_BM.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_BS.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_BS.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_BS.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_BS.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_BW.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_BW.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_BW.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_BW.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_BZ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_BZ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_BZ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_BZ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_CA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_CA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_CA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_CA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_CC.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_CC.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_CC.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_CC.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_CH.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_CH.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_CH.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_CH.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_CK.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_CK.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_CK.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_CK.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_CM.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_CM.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_CM.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_CM.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_CX.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_CX.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_CX.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_CX.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_CY.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_CY.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_CY.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_CY.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_DE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_DE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_DE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_DE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_DG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_DG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_DG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_DG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_DK.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_DK.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_DK.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_DK.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_DM.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_DM.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_DM.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_DM.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_ER.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_ER.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_ER.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_ER.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_FI.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_FI.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_FI.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_FI.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_FJ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_FJ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_FJ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_FJ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_FK.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_FK.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_FK.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_FK.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_FM.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_FM.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_FM.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_FM.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_GB.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_GB.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_GB.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_GB.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_GD.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_GD.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_GD.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_GD.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_GG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_GG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_GG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_GG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_GH.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_GH.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_GH.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_GH.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_GI.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_GI.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_GI.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_GI.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_GM.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_GM.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_GM.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_GM.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_GU.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_GU.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_GU.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_GU.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_GY.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_GY.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_GY.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_GY.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_HK.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_HK.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_HK.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_HK.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_IE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_IE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_IE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_IE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_IL.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_IL.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_IL.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_IL.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_IM.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_IM.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_IM.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_IM.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_IO.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_IO.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_IO.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_IO.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_ISO.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_ISO.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_ISO.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_ISO.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_JE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_JE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_JE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_JE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_JM.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_JM.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_JM.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_JM.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_KE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_KE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_KE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_KE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_KI.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_KI.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_KI.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_KI.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_KN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_KN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_KN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_KN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_KY.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_KY.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_KY.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_KY.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_LC.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_LC.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_LC.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_LC.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_LR.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_LR.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_LR.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_LR.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_LS.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_LS.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_LS.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_LS.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_MG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_MG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_MG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_MG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_MH.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_MH.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_MH.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_MH.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_MO.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_MO.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_MO.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_MO.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_MP.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_MP.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_MP.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_MP.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_MS.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_MS.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_MS.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_MS.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_MT.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_MT.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_MT.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_MT.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_MU.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_MU.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_MU.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_MU.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_MW.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_MW.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_MW.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_MW.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_MY.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_MY.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_MY.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_MY.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_NA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_NA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_NA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_NA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_NF.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_NF.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_NF.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_NF.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_NG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_NG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_NG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_NG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_NL.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_NL.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_NL.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_NL.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_NR.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_NR.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_NR.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_NR.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_NU.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_NU.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_NU.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_NU.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_NZ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_NZ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_NZ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_NZ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_PG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_PG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_PG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_PG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_PH.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_PH.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_PH.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_PH.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_PK.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_PK.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_PK.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_PK.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_PN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_PN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_PN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_PN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_PR.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_PR.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_PR.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_PR.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_PW.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_PW.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_PW.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_PW.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_RW.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_RW.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_RW.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_RW.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_SB.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_SB.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_SB.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_SB.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_SC.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_SC.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_SC.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_SC.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_SD.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_SD.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_SD.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_SD.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_SE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_SE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_SE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_SE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_SG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_SG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_SG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_SG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_SH.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_SH.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_SH.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_SH.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_SI.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_SI.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_SI.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_SI.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_SL.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_SL.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_SL.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_SL.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_SS.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_SS.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_SS.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_SS.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_SX.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_SX.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_SX.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_SX.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_SZ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_SZ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_SZ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_SZ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_TC.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_TC.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_TC.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_TC.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_TK.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_TK.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_TK.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_TK.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_TO.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_TO.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_TO.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_TO.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_TT.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_TT.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_TT.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_TT.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_TV.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_TV.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_TV.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_TV.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_TZ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_TZ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_TZ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_TZ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_UG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_UG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_UG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_UG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_UM.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_UM.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_UM.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_UM.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_US.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_US.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_US.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_US.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_US_Posix.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_US_Posix.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_US_Posix.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_US_Posix.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_VC.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_VC.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_VC.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_VC.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_VG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_VG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_VG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_VG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_VI.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_VI.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_VI.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_VI.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_VU.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_VU.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_VU.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_VU.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_WS.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_WS.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_WS.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_WS.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_ZA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_ZA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_ZA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_ZA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_ZM.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_ZM.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_ZM.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_ZM.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_ZW.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/en_ZW.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/en_ZW.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/en_ZW.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/eo.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/eo.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/eo.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/eo.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/es.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/es.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/es.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/es.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_419.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/es_419.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_419.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/es_419.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_AR.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/es_AR.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_AR.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/es_AR.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_BO.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/es_BO.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_BO.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/es_BO.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_BR.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/es_BR.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_BR.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/es_BR.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_BZ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/es_BZ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_BZ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/es_BZ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_CL.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/es_CL.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_CL.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/es_CL.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_CO.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/es_CO.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_CO.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/es_CO.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_CR.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/es_CR.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_CR.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/es_CR.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_CU.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/es_CU.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_CU.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/es_CU.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_DO.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/es_DO.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_DO.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/es_DO.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_EA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/es_EA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_EA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/es_EA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_EC.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/es_EC.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_EC.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/es_EC.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_ES.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/es_ES.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_ES.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/es_ES.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_GQ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/es_GQ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_GQ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/es_GQ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_GT.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/es_GT.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_GT.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/es_GT.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_HN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/es_HN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_HN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/es_HN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_IC.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/es_IC.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_IC.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/es_IC.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_MX.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/es_MX.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_MX.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/es_MX.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_NI.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/es_NI.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_NI.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/es_NI.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_PA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/es_PA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_PA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/es_PA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_PE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/es_PE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_PE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/es_PE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_PH.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/es_PH.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_PH.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/es_PH.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_PR.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/es_PR.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_PR.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/es_PR.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_PY.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/es_PY.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_PY.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/es_PY.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_SV.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/es_SV.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_SV.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/es_SV.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_US.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/es_US.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_US.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/es_US.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_UY.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/es_UY.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_UY.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/es_UY.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_VE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/es_VE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/es_VE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/es_VE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/et.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/et.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/et.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/et.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/et_EE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/et_EE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/et_EE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/et_EE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/eu.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/eu.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/eu.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/eu.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/eu_ES.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/eu_ES.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/eu_ES.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/eu_ES.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ewo.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ewo.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ewo.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ewo.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fa.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fa.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fa.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fa.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fa_AF.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fa_AF.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fa_AF.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fa_AF.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fa_IR.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fa_IR.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fa_IR.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fa_IR.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ff.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ff.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ff.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ff.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ff_CM.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ff_CM.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ff_CM.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ff_CM.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ff_GN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ff_GN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ff_GN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ff_GN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ff_MR.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ff_MR.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ff_MR.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ff_MR.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ff_SN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ff_SN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ff_SN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ff_SN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fi.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fi.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fi.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fi.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fi_FI.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fi_FI.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fi_FI.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fi_FI.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fil.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fil.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fil.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fil.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fil_PH.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fil_PH.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fil_PH.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fil_PH.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fo.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fo.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fo.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fo.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fo_DK.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fo_DK.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fo_DK.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fo_DK.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fo_FO.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fo_FO.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fo_FO.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fo_FO.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_BE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_BE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_BE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_BE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_BF.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_BF.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_BF.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_BF.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_BI.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_BI.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_BI.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_BI.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_BJ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_BJ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_BJ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_BJ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_BL.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_BL.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_BL.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_BL.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_CA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_CA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_CA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_CA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_CD.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_CD.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_CD.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_CD.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_CF.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_CF.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_CF.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_CF.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_CG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_CG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_CG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_CG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_CH.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_CH.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_CH.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_CH.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_CI.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_CI.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_CI.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_CI.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_CM.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_CM.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_CM.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_CM.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_DJ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_DJ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_DJ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_DJ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_DZ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_DZ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_DZ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_DZ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_FR.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_FR.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_FR.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_FR.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_GA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_GA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_GA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_GA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_GF.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_GF.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_GF.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_GF.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_GN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_GN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_GN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_GN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_GP.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_GP.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_GP.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_GP.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_GQ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_GQ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_GQ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_GQ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_HT.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_HT.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_HT.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_HT.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_KM.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_KM.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_KM.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_KM.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_LU.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_LU.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_LU.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_LU.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_MA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_MA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_MA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_MA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_MC.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_MC.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_MC.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_MC.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_MF.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_MF.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_MF.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_MF.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_MG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_MG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_MG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_MG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_ML.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_ML.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_ML.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_ML.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_MQ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_MQ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_MQ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_MQ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_MR.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_MR.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_MR.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_MR.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_MU.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_MU.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_MU.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_MU.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_NC.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_NC.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_NC.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_NC.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_NE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_NE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_NE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_NE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_PF.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_PF.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_PF.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_PF.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_PM.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_PM.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_PM.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_PM.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_RE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_RE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_RE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_RE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_RW.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_RW.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_RW.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_RW.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_SC.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_SC.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_SC.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_SC.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_SN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_SN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_SN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_SN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_SY.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_SY.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_SY.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_SY.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_TD.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_TD.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_TD.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_TD.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_TG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_TG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_TG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_TG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_TN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_TN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_TN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_TN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_VU.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_VU.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_VU.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_VU.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_WF.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_WF.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_WF.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_WF.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_YT.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_YT.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fr_YT.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fr_YT.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fur.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fur.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fur.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fur.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fur_IT.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fur_IT.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fur_IT.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fur_IT.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fy.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fy.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fy.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fy.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fy_DE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fy_DE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fy_DE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fy_DE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/fy_NL.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/fy_NL.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/fy_NL.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/fy_NL.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ga.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ga.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ga.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ga.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ga_IE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ga_IE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ga_IE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ga_IE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/gd.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/gd.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/gd.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/gd.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/gd_GB.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/gd_GB.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/gd_GB.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/gd_GB.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/gez.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/gez.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/gez.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/gez.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/gez_ER.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/gez_ER.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/gez_ER.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/gez_ER.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/gez_ET.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/gez_ET.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/gez_ET.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/gez_ET.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/gl.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/gl.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/gl.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/gl.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/gl_ES.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/gl_ES.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/gl_ES.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/gl_ES.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/gom.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/gom.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/gom.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/gom.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/gom_Latn.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/gom_Latn.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/gom_Latn.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/gom_Latn.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/gsw.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/gsw.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/gsw.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/gsw.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/gsw_CH.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/gsw_CH.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/gsw_CH.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/gsw_CH.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/gsw_FR.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/gsw_FR.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/gsw_FR.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/gsw_FR.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/gsw_LI.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/gsw_LI.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/gsw_LI.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/gsw_LI.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/gu.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/gu.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/gu.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/gu.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/gu_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/gu_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/gu_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/gu_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/guz.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/guz.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/guz.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/guz.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/gv.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/gv.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/gv.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/gv.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/gv_GB.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/gv_GB.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/gv_GB.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/gv_GB.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ha.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ha.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ha.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ha.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ha_GH.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ha_GH.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ha_GH.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ha_GH.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ha_NE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ha_NE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ha_NE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ha_NE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ha_NG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ha_NG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ha_NG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ha_NG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/hak.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/hak.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/hak.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/hak.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/hak_TW.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/hak_TW.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/hak_TW.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/hak_TW.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/haw.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/haw.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/haw.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/haw.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/he.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/he.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/he.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/he.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/he_IL.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/he_IL.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/he_IL.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/he_IL.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/hi.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/hi.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/hi.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/hi.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/hi_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/hi_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/hi_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/hi_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/hif.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/hif.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/hif.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/hif.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/hif_FJ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/hif_FJ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/hif_FJ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/hif_FJ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/hne.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/hne.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/hne.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/hne.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/hne_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/hne_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/hne_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/hne_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/hr.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/hr.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/hr.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/hr.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/hr_BA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/hr_BA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/hr_BA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/hr_BA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/hr_HR.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/hr_HR.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/hr_HR.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/hr_HR.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/hsb.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/hsb.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/hsb.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/hsb.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/hsb_DE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/hsb_DE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/hsb_DE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/hsb_DE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ht.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ht.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ht.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ht.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ht_HT.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ht_HT.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ht_HT.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ht_HT.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/hu.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/hu.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/hu.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/hu.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/hu_HU.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/hu_HU.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/hu_HU.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/hu_HU.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/hy.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/hy.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/hy.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/hy.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/hy_AM.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/hy_AM.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/hy_AM.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/hy_AM.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/i18n.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/i18n.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/i18n.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/i18n.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ia.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ia.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ia.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ia.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ia_FR.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ia_FR.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ia_FR.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ia_FR.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/id.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/id.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/id.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/id.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/id_ID.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/id_ID.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/id_ID.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/id_ID.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ig.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ig.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ig.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ig.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ig_NG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ig_NG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ig_NG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ig_NG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ii.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ii.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ii.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ii.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ik.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ik.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ik.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ik.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ik_CA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ik_CA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ik_CA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ik_CA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/in.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/in.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/in.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/in.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/is.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/is.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/is.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/is.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/is_IS.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/is_IS.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/is_IS.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/is_IS.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/it.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/it.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/it.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/it.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/it_CH.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/it_CH.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/it_CH.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/it_CH.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/it_IT.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/it_IT.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/it_IT.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/it_IT.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/it_SM.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/it_SM.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/it_SM.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/it_SM.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/it_VA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/it_VA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/it_VA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/it_VA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/iu.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/iu.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/iu.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/iu.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/iu_CA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/iu_CA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/iu_CA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/iu_CA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/iw.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/iw.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/iw.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/iw.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ja.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ja.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ja.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ja.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ja_JP.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ja_JP.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ja_JP.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ja_JP.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/jgo.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/jgo.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/jgo.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/jgo.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/jmc.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/jmc.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/jmc.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/jmc.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/jv.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/jv.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/jv.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/jv.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ka.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ka.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ka.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ka.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ka_GE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ka_GE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ka_GE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ka_GE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/kab.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/kab.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/kab.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/kab.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/kab_DZ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/kab_DZ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/kab_DZ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/kab_DZ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/kam.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/kam.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/kam.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/kam.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/kde.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/kde.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/kde.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/kde.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/kea.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/kea.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/kea.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/kea.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/khq.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/khq.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/khq.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/khq.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ki.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ki.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ki.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ki.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/kk.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/kk.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/kk.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/kk.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/kk_KZ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/kk_KZ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/kk_KZ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/kk_KZ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/kkj.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/kkj.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/kkj.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/kkj.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/kl.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/kl.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/kl.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/kl.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/kl_GL.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/kl_GL.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/kl_GL.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/kl_GL.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/kln.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/kln.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/kln.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/kln.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/km.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/km.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/km.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/km.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/km_KH.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/km_KH.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/km_KH.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/km_KH.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/kn.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/kn.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/kn.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/kn.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/kn_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/kn_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/kn_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/kn_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ko.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ko.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ko.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ko.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ko_KP.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ko_KP.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ko_KP.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ko_KP.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ko_KR.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ko_KR.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ko_KR.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ko_KR.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/kok.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/kok.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/kok.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/kok.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/kok_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/kok_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/kok_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/kok_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ks.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ks.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ks.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ks.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ks_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ks_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ks_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ks_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ks_IN@devanagari.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ks_IN@devanagari.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ks_IN@devanagari.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ks_IN@devanagari.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ksb.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ksb.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ksb.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ksb.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ksf.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ksf.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ksf.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ksf.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ksh.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ksh.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ksh.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ksh.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ku.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ku.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ku.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ku.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ku_TR.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ku_TR.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ku_TR.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ku_TR.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/kw.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/kw.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/kw.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/kw.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/kw_GB.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/kw_GB.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/kw_GB.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/kw_GB.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ky.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ky.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ky.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ky.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ky_KG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ky_KG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ky_KG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ky_KG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/lag.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/lag.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/lag.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/lag.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/lb.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/lb.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/lb.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/lb.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/lb_LU.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/lb_LU.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/lb_LU.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/lb_LU.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/lg.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/lg.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/lg.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/lg.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/lg_UG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/lg_UG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/lg_UG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/lg_UG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/li.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/li.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/li.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/li.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/li_NL.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/li_NL.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/li_NL.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/li_NL.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/lij.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/lij.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/lij.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/lij.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/lij_IT.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/lij_IT.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/lij_IT.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/lij_IT.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/lkt.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/lkt.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/lkt.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/lkt.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ln.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ln.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ln.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ln.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ln_AO.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ln_AO.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ln_AO.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ln_AO.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ln_CD.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ln_CD.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ln_CD.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ln_CD.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ln_CF.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ln_CF.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ln_CF.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ln_CF.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ln_CG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ln_CG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ln_CG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ln_CG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/lo.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/lo.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/lo.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/lo.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/lo_LA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/lo_LA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/lo_LA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/lo_LA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/lrc.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/lrc.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/lrc.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/lrc.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/lrc_IQ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/lrc_IQ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/lrc_IQ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/lrc_IQ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/lt.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/lt.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/lt.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/lt.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/lt_LT.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/lt_LT.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/lt_LT.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/lt_LT.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/lu.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/lu.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/lu.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/lu.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/luo.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/luo.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/luo.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/luo.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/luy.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/luy.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/luy.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/luy.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/lv.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/lv.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/lv.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/lv.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/lv_LV.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/lv_LV.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/lv_LV.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/lv_LV.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/lzh.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/lzh.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/lzh.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/lzh.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/lzh_TW.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/lzh_TW.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/lzh_TW.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/lzh_TW.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mag.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mag.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mag.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mag.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mag_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mag_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mag_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mag_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mai.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mai.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mai.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mai.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mai_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mai_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mai_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mai_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mas.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mas.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mas.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mas.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mas_TZ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mas_TZ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mas_TZ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mas_TZ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mer.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mer.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mer.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mer.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mfe.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mfe.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mfe.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mfe.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mfe_MU.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mfe_MU.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mfe_MU.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mfe_MU.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mg.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mg.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mg.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mg.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mg_MG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mg_MG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mg_MG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mg_MG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mgh.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mgh.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mgh.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mgh.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mgo.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mgo.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mgo.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mgo.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mhr.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mhr.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mhr.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mhr.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mhr_RU.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mhr_RU.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mhr_RU.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mhr_RU.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mi.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mi.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mi.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mi.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mi_NZ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mi_NZ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mi_NZ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mi_NZ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/miq.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/miq.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/miq.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/miq.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/miq_NI.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/miq_NI.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/miq_NI.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/miq_NI.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mjw.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mjw.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mjw.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mjw.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mjw_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mjw_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mjw_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mjw_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mk.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mk.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mk.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mk.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mk_MK.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mk_MK.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mk_MK.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mk_MK.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ml.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ml.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ml.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ml.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ml_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ml_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ml_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ml_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mn.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mn.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mn.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mn.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mn_MN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mn_MN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mn_MN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mn_MN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mni.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mni.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mni.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mni.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mni_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mni_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mni_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mni_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mo.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mo.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mo.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mo.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mr.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mr.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mr.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mr.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mr_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mr_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mr_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mr_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ms.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ms.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ms.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ms.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ms_BN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ms_BN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ms_BN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ms_BN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ms_MY.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ms_MY.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ms_MY.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ms_MY.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ms_SG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ms_SG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ms_SG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ms_SG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mt.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mt.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mt.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mt.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mt_MT.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mt_MT.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mt_MT.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mt_MT.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mua.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mua.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mua.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mua.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/my.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/my.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/my.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/my.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/my_MM.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/my_MM.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/my_MM.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/my_MM.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/mzn.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/mzn.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/mzn.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/mzn.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nan.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nan.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nan.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nan.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nan_TW.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nan_TW.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nan_TW.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nan_TW.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nan_TW@latin.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nan_TW@latin.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nan_TW@latin.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nan_TW@latin.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/naq.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/naq.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/naq.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/naq.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nb.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nb.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nb.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nb.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nb_NO.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nb_NO.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nb_NO.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nb_NO.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nb_SJ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nb_SJ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nb_SJ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nb_SJ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nd.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nd.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nd.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nd.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nds.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nds.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nds.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nds.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nds_DE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nds_DE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nds_DE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nds_DE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nds_NL.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nds_NL.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nds_NL.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nds_NL.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ne.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ne.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ne.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ne.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ne_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ne_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ne_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ne_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ne_NP.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ne_NP.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ne_NP.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ne_NP.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nhn.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nhn.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nhn.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nhn.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nhn_MX.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nhn_MX.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nhn_MX.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nhn_MX.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/niu.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/niu.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/niu.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/niu.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/niu_NU.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/niu_NU.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/niu_NU.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/niu_NU.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nl.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nl.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nl.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nl.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nl_AW.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nl_AW.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nl_AW.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nl_AW.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nl_BE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nl_BE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nl_BE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nl_BE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nl_BQ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nl_BQ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nl_BQ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nl_BQ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nl_CW.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nl_CW.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nl_CW.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nl_CW.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nl_NL.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nl_NL.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nl_NL.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nl_NL.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nl_SR.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nl_SR.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nl_SR.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nl_SR.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nl_SX.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nl_SX.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nl_SX.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nl_SX.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nmg.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nmg.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nmg.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nmg.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nn.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nn.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nn.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nn.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nn_NO.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nn_NO.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nn_NO.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nn_NO.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nnh.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nnh.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nnh.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nnh.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/no.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/no.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/no.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/no.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nr.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nr.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nr.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nr.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nr_ZA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nr_ZA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nr_ZA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nr_ZA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nso.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nso.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nso.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nso.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nso_ZA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nso_ZA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nso_ZA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nso_ZA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nus.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nus.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nus.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nus.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/nyn.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/nyn.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/nyn.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/nyn.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/oc.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/oc.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/oc.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/oc.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/oc_FR.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/oc_FR.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/oc_FR.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/oc_FR.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/om.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/om.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/om.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/om.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/om_ET.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/om_ET.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/om_ET.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/om_ET.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/om_KE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/om_KE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/om_KE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/om_KE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/or.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/or.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/or.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/or.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/or_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/or_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/or_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/or_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/os.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/os.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/os.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/os.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/os_RU.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/os_RU.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/os_RU.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/os_RU.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/pa.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/pa.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/pa.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/pa.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/pa_Arab.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/pa_Arab.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/pa_Arab.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/pa_Arab.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/pa_Guru.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/pa_Guru.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/pa_Guru.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/pa_Guru.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/pa_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/pa_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/pa_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/pa_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/pa_PK.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/pa_PK.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/pa_PK.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/pa_PK.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/pap.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/pap.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/pap.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/pap.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/pap_AW.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/pap_AW.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/pap_AW.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/pap_AW.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/pap_CW.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/pap_CW.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/pap_CW.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/pap_CW.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/pl.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/pl.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/pl.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/pl.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/pl_PL.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/pl_PL.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/pl_PL.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/pl_PL.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/prg.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/prg.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/prg.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/prg.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ps.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ps.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ps.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ps.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ps_AF.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ps_AF.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ps_AF.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ps_AF.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/pt.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/pt.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/pt.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/pt.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/pt_AO.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/pt_AO.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/pt_AO.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/pt_AO.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/pt_BR.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/pt_BR.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/pt_BR.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/pt_BR.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/pt_CH.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/pt_CH.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/pt_CH.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/pt_CH.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/pt_CV.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/pt_CV.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/pt_CV.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/pt_CV.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/pt_GQ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/pt_GQ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/pt_GQ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/pt_GQ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/pt_GW.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/pt_GW.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/pt_GW.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/pt_GW.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/pt_LU.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/pt_LU.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/pt_LU.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/pt_LU.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/pt_MO.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/pt_MO.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/pt_MO.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/pt_MO.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/pt_MZ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/pt_MZ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/pt_MZ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/pt_MZ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/pt_PT.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/pt_PT.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/pt_PT.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/pt_PT.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/pt_ST.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/pt_ST.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/pt_ST.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/pt_ST.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/pt_TL.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/pt_TL.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/pt_TL.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/pt_TL.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/qu.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/qu.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/qu.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/qu.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/qu_BO.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/qu_BO.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/qu_BO.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/qu_BO.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/qu_EC.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/qu_EC.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/qu_EC.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/qu_EC.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/quz.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/quz.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/quz.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/quz.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/quz_PE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/quz_PE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/quz_PE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/quz_PE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/raj.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/raj.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/raj.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/raj.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/raj_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/raj_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/raj_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/raj_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/rm.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/rm.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/rm.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/rm.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/rn.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/rn.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/rn.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/rn.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ro.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ro.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ro.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ro.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ro_MD.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ro_MD.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ro_MD.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ro_MD.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ro_RO.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ro_RO.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ro_RO.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ro_RO.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/rof.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/rof.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/rof.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/rof.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ru.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ru.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ru.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ru.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ru_BY.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ru_BY.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ru_BY.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ru_BY.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ru_KG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ru_KG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ru_KG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ru_KG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ru_KZ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ru_KZ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ru_KZ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ru_KZ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ru_MD.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ru_MD.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ru_MD.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ru_MD.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ru_RU.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ru_RU.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ru_RU.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ru_RU.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ru_UA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ru_UA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ru_UA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ru_UA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/rw.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/rw.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/rw.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/rw.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/rw_RW.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/rw_RW.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/rw_RW.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/rw_RW.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/rwk.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/rwk.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/rwk.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/rwk.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sa.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sa.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sa.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sa.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sa_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sa_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sa_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sa_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sah.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sah.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sah.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sah.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sah_RU.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sah_RU.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sah_RU.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sah_RU.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/saq.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/saq.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/saq.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/saq.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sat.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sat.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sat.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sat.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sat_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sat_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sat_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sat_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sbp.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sbp.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sbp.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sbp.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sc.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sc.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sc.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sc.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sc_IT.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sc_IT.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sc_IT.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sc_IT.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sd.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sd.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sd.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sd.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sd_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sd_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sd_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sd_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sd_IN@devanagari.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sd_IN@devanagari.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sd_IN@devanagari.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sd_IN@devanagari.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/se.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/se.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/se.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/se.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/se_FI.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/se_FI.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/se_FI.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/se_FI.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/se_NO.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/se_NO.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/se_NO.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/se_NO.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/se_SE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/se_SE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/se_SE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/se_SE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/seh.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/seh.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/seh.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/seh.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ses.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ses.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ses.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ses.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sg.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sg.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sg.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sg.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sgs.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sgs.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sgs.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sgs.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sgs_LT.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sgs_LT.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sgs_LT.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sgs_LT.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sh.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sh.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sh.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sh.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/shi.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/shi.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/shi.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/shi.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/shi_Latn.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/shi_Latn.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/shi_Latn.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/shi_Latn.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/shi_Tfng.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/shi_Tfng.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/shi_Tfng.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/shi_Tfng.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/shn.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/shn.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/shn.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/shn.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/shn_MM.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/shn_MM.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/shn_MM.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/shn_MM.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/shs.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/shs.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/shs.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/shs.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/shs_CA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/shs_CA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/shs_CA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/shs_CA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/si.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/si.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/si.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/si.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/si_LK.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/si_LK.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/si_LK.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/si_LK.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sid.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sid.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sid.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sid.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sid_ET.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sid_ET.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sid_ET.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sid_ET.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sk.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sk.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sk.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sk.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sk_SK.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sk_SK.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sk_SK.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sk_SK.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sl.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sl.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sl.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sl.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sl_SI.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sl_SI.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sl_SI.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sl_SI.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sm.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sm.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sm.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sm.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sm_WS.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sm_WS.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sm_WS.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sm_WS.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/smn.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/smn.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/smn.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/smn.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sn.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sn.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sn.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sn.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/so.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/so.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/so.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/so.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/so_DJ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/so_DJ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/so_DJ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/so_DJ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/so_ET.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/so_ET.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/so_ET.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/so_ET.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/so_KE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/so_KE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/so_KE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/so_KE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/so_SO.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/so_SO.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/so_SO.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/so_SO.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sq.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sq.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sq.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sq.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sq_AL.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sq_AL.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sq_AL.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sq_AL.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sq_MK.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sq_MK.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sq_MK.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sq_MK.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sq_XK.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sq_XK.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sq_XK.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sq_XK.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sr.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sr.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sr.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sr.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_BA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_BA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_BA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_BA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_ME.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_ME.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_ME.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_ME.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_XK.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_XK.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_XK.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sr_Cyrl_XK.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_BA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_BA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_BA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_BA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_ME.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_ME.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_ME.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_ME.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_XK.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_XK.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_XK.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sr_Latn_XK.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sr_ME.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sr_ME.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sr_ME.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sr_ME.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sr_RS.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sr_RS.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sr_RS.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sr_RS.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sr_RS@latin.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sr_RS@latin.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sr_RS@latin.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sr_RS@latin.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ss.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ss.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ss.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ss.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ss_ZA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ss_ZA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ss_ZA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ss_ZA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/st.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/st.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/st.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/st.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/st_ZA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/st_ZA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/st_ZA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/st_ZA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sv.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sv.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sv.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sv.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sv_AX.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sv_AX.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sv_AX.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sv_AX.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sv_FI.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sv_FI.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sv_FI.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sv_FI.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sv_SE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sv_SE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sv_SE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sv_SE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sw.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sw.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sw.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sw.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sw_CD.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sw_CD.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sw_CD.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sw_CD.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sw_KE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sw_KE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sw_KE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sw_KE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sw_TZ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sw_TZ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sw_TZ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sw_TZ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/sw_UG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/sw_UG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/sw_UG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/sw_UG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/szl.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/szl.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/szl.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/szl.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/szl_PL.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/szl_PL.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/szl_PL.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/szl_PL.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ta.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ta.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ta.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ta.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ta_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ta_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ta_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ta_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ta_LK.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ta_LK.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ta_LK.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ta_LK.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ta_MY.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ta_MY.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ta_MY.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ta_MY.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ta_SG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ta_SG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ta_SG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ta_SG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/tcy.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/tcy.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/tcy.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/tcy.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/tcy_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/tcy_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/tcy_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/tcy_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/te.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/te.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/te.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/te.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/te_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/te_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/te_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/te_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/teo.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/teo.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/teo.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/teo.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/teo_KE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/teo_KE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/teo_KE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/teo_KE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/tet.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/tet.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/tet.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/tet.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/tg.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/tg.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/tg.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/tg.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/tg_TJ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/tg_TJ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/tg_TJ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/tg_TJ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/th.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/th.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/th.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/th.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/th_TH.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/th_TH.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/th_TH.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/th_TH.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/the.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/the.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/the.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/the.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/the_NP.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/the_NP.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/the_NP.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/the_NP.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ti.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ti.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ti.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ti.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ti_ER.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ti_ER.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ti_ER.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ti_ER.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ti_ET.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ti_ET.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ti_ET.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ti_ET.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/tig.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/tig.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/tig.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/tig.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/tig_ER.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/tig_ER.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/tig_ER.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/tig_ER.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/tk.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/tk.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/tk.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/tk.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/tk_TM.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/tk_TM.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/tk_TM.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/tk_TM.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/tl.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/tl.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/tl.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/tl.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/tl_PH.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/tl_PH.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/tl_PH.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/tl_PH.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/tlh.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/tlh.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/tlh.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/tlh.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/tn.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/tn.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/tn.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/tn.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/tn_ZA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/tn_ZA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/tn_ZA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/tn_ZA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/to.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/to.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/to.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/to.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/to_TO.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/to_TO.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/to_TO.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/to_TO.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/tpi.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/tpi.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/tpi.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/tpi.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/tpi_PG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/tpi_PG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/tpi_PG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/tpi_PG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/tr.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/tr.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/tr.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/tr.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/tr_CY.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/tr_CY.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/tr_CY.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/tr_CY.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/tr_TR.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/tr_TR.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/tr_TR.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/tr_TR.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ts.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ts.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ts.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ts.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ts_ZA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ts_ZA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ts_ZA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ts_ZA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/tt.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/tt.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/tt.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/tt.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/tt_RU.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/tt_RU.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/tt_RU.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/tt_RU.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/tt_RU@iqtelif.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/tt_RU@iqtelif.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/tt_RU@iqtelif.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/tt_RU@iqtelif.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/twq.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/twq.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/twq.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/twq.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/tzl.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/tzl.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/tzl.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/tzl.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/tzm.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/tzm.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/tzm.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/tzm.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/tzm_Latn.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/tzm_Latn.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/tzm_Latn.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/tzm_Latn.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ug.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ug.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ug.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ug.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ug_CN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ug_CN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ug_CN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ug_CN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/uk.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/uk.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/uk.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/uk.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/uk_UA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/uk_UA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/uk_UA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/uk_UA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/unm.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/unm.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/unm.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/unm.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/unm_US.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/unm_US.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/unm_US.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/unm_US.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ur.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ur.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ur.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ur.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ur_IN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ur_IN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ur_IN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ur_IN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ur_PK.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ur_PK.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ur_PK.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ur_PK.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/uz.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/uz.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/uz.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/uz.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/uz_Arab.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/uz_Arab.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/uz_Arab.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/uz_Arab.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/uz_Cyrl.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/uz_Cyrl.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/uz_Cyrl.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/uz_Cyrl.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/uz_Latn.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/uz_Latn.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/uz_Latn.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/uz_Latn.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ@cyrillic.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ@cyrillic.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ@cyrillic.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/uz_UZ@cyrillic.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/vai.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/vai.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/vai.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/vai.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/vai_Latn.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/vai_Latn.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/vai_Latn.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/vai_Latn.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/vai_Vaii.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/vai_Vaii.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/vai_Vaii.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/vai_Vaii.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ve.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ve.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ve.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ve.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/ve_ZA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/ve_ZA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/ve_ZA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/ve_ZA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/vi.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/vi.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/vi.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/vi.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/vi_VN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/vi_VN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/vi_VN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/vi_VN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/vo.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/vo.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/vo.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/vo.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/vun.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/vun.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/vun.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/vun.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/wa.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/wa.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/wa.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/wa.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/wa_BE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/wa_BE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/wa_BE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/wa_BE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/wae.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/wae.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/wae.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/wae.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/wae_CH.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/wae_CH.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/wae_CH.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/wae_CH.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/wal.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/wal.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/wal.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/wal.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/wal_ET.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/wal_ET.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/wal_ET.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/wal_ET.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/wo.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/wo.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/wo.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/wo.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/wo_SN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/wo_SN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/wo_SN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/wo_SN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/xh.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/xh.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/xh.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/xh.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/xh_ZA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/xh_ZA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/xh_ZA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/xh_ZA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/xog.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/xog.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/xog.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/xog.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/yav.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/yav.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/yav.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/yav.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/yi.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/yi.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/yi.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/yi.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/yi_US.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/yi_US.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/yi_US.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/yi_US.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/yo.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/yo.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/yo.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/yo.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/yo_BJ.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/yo_BJ.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/yo_BJ.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/yo_BJ.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/yo_NG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/yo_NG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/yo_NG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/yo_NG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/yue.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/yue.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/yue.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/yue.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/yue_HK.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/yue_HK.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/yue_HK.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/yue_HK.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/yue_Hans.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/yue_Hans.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/yue_Hans.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/yue_Hans.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/yue_Hant.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/yue_Hant.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/yue_Hant.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/yue_Hant.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/yuw.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/yuw.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/yuw.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/yuw.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/yuw_PG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/yuw_PG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/yuw_PG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/yuw_PG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/zgh.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/zgh.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/zgh.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/zgh.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/zh.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/zh.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh_CN.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/zh_CN.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh_CN.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/zh_CN.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh_HK.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/zh_HK.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh_HK.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/zh_HK.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_HK.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_HK.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_HK.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_HK.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_MO.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_MO.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_MO.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_MO.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_SG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_SG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_SG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hans_SG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_HK.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_HK.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_HK.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_HK.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_MO.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_MO.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_MO.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_MO.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_TW.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_TW.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_TW.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/zh_Hant_TW.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh_MO.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/zh_MO.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh_MO.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/zh_MO.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh_SG.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/zh_SG.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh_SG.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/zh_SG.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh_TW.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/zh_TW.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh_TW.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/zh_TW.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh_YUE.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/zh_YUE.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/zh_YUE.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/zh_YUE.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/zu.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/zu.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/zu.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/zu.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Lang/zu_ZA.php b/libs/vendor/nesbot/carbon/src/Carbon/Lang/zu_ZA.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Lang/zu_ZA.php rename to libs/vendor/nesbot/carbon/src/Carbon/Lang/zu_ZA.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Language.php b/libs/vendor/nesbot/carbon/src/Carbon/Language.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Language.php rename to libs/vendor/nesbot/carbon/src/Carbon/Language.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php b/libs/vendor/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php rename to libs/vendor/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/List/languages.php b/libs/vendor/nesbot/carbon/src/Carbon/List/languages.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/List/languages.php rename to libs/vendor/nesbot/carbon/src/Carbon/List/languages.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/List/regions.php b/libs/vendor/nesbot/carbon/src/Carbon/List/regions.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/List/regions.php rename to libs/vendor/nesbot/carbon/src/Carbon/List/regions.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/MessageFormatter/MessageFormatterMapper.php b/libs/vendor/nesbot/carbon/src/Carbon/MessageFormatter/MessageFormatterMapper.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/MessageFormatter/MessageFormatterMapper.php rename to libs/vendor/nesbot/carbon/src/Carbon/MessageFormatter/MessageFormatterMapper.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Month.php b/libs/vendor/nesbot/carbon/src/Carbon/Month.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Month.php rename to libs/vendor/nesbot/carbon/src/Carbon/Month.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/OverflowMode.php b/libs/vendor/nesbot/carbon/src/Carbon/OverflowMode.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/OverflowMode.php rename to libs/vendor/nesbot/carbon/src/Carbon/OverflowMode.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/PHPStan/MacroExtension.php b/libs/vendor/nesbot/carbon/src/Carbon/PHPStan/MacroExtension.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/PHPStan/MacroExtension.php rename to libs/vendor/nesbot/carbon/src/Carbon/PHPStan/MacroExtension.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/PHPStan/MacroMethodReflection.php b/libs/vendor/nesbot/carbon/src/Carbon/PHPStan/MacroMethodReflection.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/PHPStan/MacroMethodReflection.php rename to libs/vendor/nesbot/carbon/src/Carbon/PHPStan/MacroMethodReflection.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Boundaries.php b/libs/vendor/nesbot/carbon/src/Carbon/Traits/Boundaries.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Traits/Boundaries.php rename to libs/vendor/nesbot/carbon/src/Carbon/Traits/Boundaries.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Cast.php b/libs/vendor/nesbot/carbon/src/Carbon/Traits/Cast.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Traits/Cast.php rename to libs/vendor/nesbot/carbon/src/Carbon/Traits/Cast.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Comparison.php b/libs/vendor/nesbot/carbon/src/Carbon/Traits/Comparison.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Traits/Comparison.php rename to libs/vendor/nesbot/carbon/src/Carbon/Traits/Comparison.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Converter.php b/libs/vendor/nesbot/carbon/src/Carbon/Traits/Converter.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Traits/Converter.php rename to libs/vendor/nesbot/carbon/src/Carbon/Traits/Converter.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Creator.php b/libs/vendor/nesbot/carbon/src/Carbon/Traits/Creator.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Traits/Creator.php rename to libs/vendor/nesbot/carbon/src/Carbon/Traits/Creator.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Date.php b/libs/vendor/nesbot/carbon/src/Carbon/Traits/Date.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Traits/Date.php rename to libs/vendor/nesbot/carbon/src/Carbon/Traits/Date.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/DeprecatedPeriodProperties.php b/libs/vendor/nesbot/carbon/src/Carbon/Traits/DeprecatedPeriodProperties.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Traits/DeprecatedPeriodProperties.php rename to libs/vendor/nesbot/carbon/src/Carbon/Traits/DeprecatedPeriodProperties.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Difference.php b/libs/vendor/nesbot/carbon/src/Carbon/Traits/Difference.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Traits/Difference.php rename to libs/vendor/nesbot/carbon/src/Carbon/Traits/Difference.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php b/libs/vendor/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php rename to libs/vendor/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/IntervalStep.php b/libs/vendor/nesbot/carbon/src/Carbon/Traits/IntervalStep.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Traits/IntervalStep.php rename to libs/vendor/nesbot/carbon/src/Carbon/Traits/IntervalStep.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/LocalFactory.php b/libs/vendor/nesbot/carbon/src/Carbon/Traits/LocalFactory.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Traits/LocalFactory.php rename to libs/vendor/nesbot/carbon/src/Carbon/Traits/LocalFactory.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Localization.php b/libs/vendor/nesbot/carbon/src/Carbon/Traits/Localization.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Traits/Localization.php rename to libs/vendor/nesbot/carbon/src/Carbon/Traits/Localization.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Macro.php b/libs/vendor/nesbot/carbon/src/Carbon/Traits/Macro.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Traits/Macro.php rename to libs/vendor/nesbot/carbon/src/Carbon/Traits/Macro.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/MagicParameter.php b/libs/vendor/nesbot/carbon/src/Carbon/Traits/MagicParameter.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Traits/MagicParameter.php rename to libs/vendor/nesbot/carbon/src/Carbon/Traits/MagicParameter.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Mixin.php b/libs/vendor/nesbot/carbon/src/Carbon/Traits/Mixin.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Traits/Mixin.php rename to libs/vendor/nesbot/carbon/src/Carbon/Traits/Mixin.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Modifiers.php b/libs/vendor/nesbot/carbon/src/Carbon/Traits/Modifiers.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Traits/Modifiers.php rename to libs/vendor/nesbot/carbon/src/Carbon/Traits/Modifiers.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Mutability.php b/libs/vendor/nesbot/carbon/src/Carbon/Traits/Mutability.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Traits/Mutability.php rename to libs/vendor/nesbot/carbon/src/Carbon/Traits/Mutability.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php b/libs/vendor/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php rename to libs/vendor/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Options.php b/libs/vendor/nesbot/carbon/src/Carbon/Traits/Options.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Traits/Options.php rename to libs/vendor/nesbot/carbon/src/Carbon/Traits/Options.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Rounding.php b/libs/vendor/nesbot/carbon/src/Carbon/Traits/Rounding.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Traits/Rounding.php rename to libs/vendor/nesbot/carbon/src/Carbon/Traits/Rounding.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Serialization.php b/libs/vendor/nesbot/carbon/src/Carbon/Traits/Serialization.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Traits/Serialization.php rename to libs/vendor/nesbot/carbon/src/Carbon/Traits/Serialization.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/StaticLocalization.php b/libs/vendor/nesbot/carbon/src/Carbon/Traits/StaticLocalization.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Traits/StaticLocalization.php rename to libs/vendor/nesbot/carbon/src/Carbon/Traits/StaticLocalization.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/StaticOptions.php b/libs/vendor/nesbot/carbon/src/Carbon/Traits/StaticOptions.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Traits/StaticOptions.php rename to libs/vendor/nesbot/carbon/src/Carbon/Traits/StaticOptions.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Test.php b/libs/vendor/nesbot/carbon/src/Carbon/Traits/Test.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Traits/Test.php rename to libs/vendor/nesbot/carbon/src/Carbon/Traits/Test.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Timestamp.php b/libs/vendor/nesbot/carbon/src/Carbon/Traits/Timestamp.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Traits/Timestamp.php rename to libs/vendor/nesbot/carbon/src/Carbon/Traits/Timestamp.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/ToStringFormat.php b/libs/vendor/nesbot/carbon/src/Carbon/Traits/ToStringFormat.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Traits/ToStringFormat.php rename to libs/vendor/nesbot/carbon/src/Carbon/Traits/ToStringFormat.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Units.php b/libs/vendor/nesbot/carbon/src/Carbon/Traits/Units.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Traits/Units.php rename to libs/vendor/nesbot/carbon/src/Carbon/Traits/Units.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Traits/Week.php b/libs/vendor/nesbot/carbon/src/Carbon/Traits/Week.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Traits/Week.php rename to libs/vendor/nesbot/carbon/src/Carbon/Traits/Week.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Translator.php b/libs/vendor/nesbot/carbon/src/Carbon/Translator.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Translator.php rename to libs/vendor/nesbot/carbon/src/Carbon/Translator.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/TranslatorImmutable.php b/libs/vendor/nesbot/carbon/src/Carbon/TranslatorImmutable.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/TranslatorImmutable.php rename to libs/vendor/nesbot/carbon/src/Carbon/TranslatorImmutable.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/TranslatorStrongTypeInterface.php b/libs/vendor/nesbot/carbon/src/Carbon/TranslatorStrongTypeInterface.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/TranslatorStrongTypeInterface.php rename to libs/vendor/nesbot/carbon/src/Carbon/TranslatorStrongTypeInterface.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/Unit.php b/libs/vendor/nesbot/carbon/src/Carbon/Unit.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/Unit.php rename to libs/vendor/nesbot/carbon/src/Carbon/Unit.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/WeekDay.php b/libs/vendor/nesbot/carbon/src/Carbon/WeekDay.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/WeekDay.php rename to libs/vendor/nesbot/carbon/src/Carbon/WeekDay.php diff --git a/plugins/vendor/nesbot/carbon/src/Carbon/WrapperClock.php b/libs/vendor/nesbot/carbon/src/Carbon/WrapperClock.php similarity index 100% rename from plugins/vendor/nesbot/carbon/src/Carbon/WrapperClock.php rename to libs/vendor/nesbot/carbon/src/Carbon/WrapperClock.php diff --git a/plugins/vendor/php-di/invoker/LICENSE b/libs/vendor/php-di/invoker/LICENSE similarity index 100% rename from plugins/vendor/php-di/invoker/LICENSE rename to libs/vendor/php-di/invoker/LICENSE diff --git a/plugins/vendor/php-di/invoker/README.md b/libs/vendor/php-di/invoker/README.md similarity index 100% rename from plugins/vendor/php-di/invoker/README.md rename to libs/vendor/php-di/invoker/README.md diff --git a/plugins/vendor/php-di/invoker/composer.json b/libs/vendor/php-di/invoker/composer.json similarity index 100% rename from plugins/vendor/php-di/invoker/composer.json rename to libs/vendor/php-di/invoker/composer.json diff --git a/plugins/vendor/php-di/invoker/src/CallableResolver.php b/libs/vendor/php-di/invoker/src/CallableResolver.php similarity index 100% rename from plugins/vendor/php-di/invoker/src/CallableResolver.php rename to libs/vendor/php-di/invoker/src/CallableResolver.php diff --git a/plugins/vendor/php-di/invoker/src/Exception/InvocationException.php b/libs/vendor/php-di/invoker/src/Exception/InvocationException.php similarity index 100% rename from plugins/vendor/php-di/invoker/src/Exception/InvocationException.php rename to libs/vendor/php-di/invoker/src/Exception/InvocationException.php diff --git a/plugins/vendor/php-di/invoker/src/Exception/NotCallableException.php b/libs/vendor/php-di/invoker/src/Exception/NotCallableException.php similarity index 100% rename from plugins/vendor/php-di/invoker/src/Exception/NotCallableException.php rename to libs/vendor/php-di/invoker/src/Exception/NotCallableException.php diff --git a/plugins/vendor/php-di/invoker/src/Exception/NotEnoughParametersException.php b/libs/vendor/php-di/invoker/src/Exception/NotEnoughParametersException.php similarity index 100% rename from plugins/vendor/php-di/invoker/src/Exception/NotEnoughParametersException.php rename to libs/vendor/php-di/invoker/src/Exception/NotEnoughParametersException.php diff --git a/plugins/vendor/php-di/invoker/src/Invoker.php b/libs/vendor/php-di/invoker/src/Invoker.php similarity index 100% rename from plugins/vendor/php-di/invoker/src/Invoker.php rename to libs/vendor/php-di/invoker/src/Invoker.php diff --git a/plugins/vendor/php-di/invoker/src/InvokerInterface.php b/libs/vendor/php-di/invoker/src/InvokerInterface.php similarity index 100% rename from plugins/vendor/php-di/invoker/src/InvokerInterface.php rename to libs/vendor/php-di/invoker/src/InvokerInterface.php diff --git a/plugins/vendor/php-di/invoker/src/ParameterResolver/AssociativeArrayResolver.php b/libs/vendor/php-di/invoker/src/ParameterResolver/AssociativeArrayResolver.php similarity index 100% rename from plugins/vendor/php-di/invoker/src/ParameterResolver/AssociativeArrayResolver.php rename to libs/vendor/php-di/invoker/src/ParameterResolver/AssociativeArrayResolver.php diff --git a/plugins/vendor/php-di/invoker/src/ParameterResolver/Container/ParameterNameContainerResolver.php b/libs/vendor/php-di/invoker/src/ParameterResolver/Container/ParameterNameContainerResolver.php similarity index 100% rename from plugins/vendor/php-di/invoker/src/ParameterResolver/Container/ParameterNameContainerResolver.php rename to libs/vendor/php-di/invoker/src/ParameterResolver/Container/ParameterNameContainerResolver.php diff --git a/plugins/vendor/php-di/invoker/src/ParameterResolver/Container/TypeHintContainerResolver.php b/libs/vendor/php-di/invoker/src/ParameterResolver/Container/TypeHintContainerResolver.php similarity index 100% rename from plugins/vendor/php-di/invoker/src/ParameterResolver/Container/TypeHintContainerResolver.php rename to libs/vendor/php-di/invoker/src/ParameterResolver/Container/TypeHintContainerResolver.php diff --git a/plugins/vendor/php-di/invoker/src/ParameterResolver/DefaultValueResolver.php b/libs/vendor/php-di/invoker/src/ParameterResolver/DefaultValueResolver.php similarity index 100% rename from plugins/vendor/php-di/invoker/src/ParameterResolver/DefaultValueResolver.php rename to libs/vendor/php-di/invoker/src/ParameterResolver/DefaultValueResolver.php diff --git a/plugins/vendor/php-di/invoker/src/ParameterResolver/NumericArrayResolver.php b/libs/vendor/php-di/invoker/src/ParameterResolver/NumericArrayResolver.php similarity index 100% rename from plugins/vendor/php-di/invoker/src/ParameterResolver/NumericArrayResolver.php rename to libs/vendor/php-di/invoker/src/ParameterResolver/NumericArrayResolver.php diff --git a/plugins/vendor/php-di/invoker/src/ParameterResolver/ParameterResolver.php b/libs/vendor/php-di/invoker/src/ParameterResolver/ParameterResolver.php similarity index 100% rename from plugins/vendor/php-di/invoker/src/ParameterResolver/ParameterResolver.php rename to libs/vendor/php-di/invoker/src/ParameterResolver/ParameterResolver.php diff --git a/plugins/vendor/php-di/invoker/src/ParameterResolver/ResolverChain.php b/libs/vendor/php-di/invoker/src/ParameterResolver/ResolverChain.php similarity index 100% rename from plugins/vendor/php-di/invoker/src/ParameterResolver/ResolverChain.php rename to libs/vendor/php-di/invoker/src/ParameterResolver/ResolverChain.php diff --git a/plugins/vendor/php-di/invoker/src/ParameterResolver/TypeHintResolver.php b/libs/vendor/php-di/invoker/src/ParameterResolver/TypeHintResolver.php similarity index 100% rename from plugins/vendor/php-di/invoker/src/ParameterResolver/TypeHintResolver.php rename to libs/vendor/php-di/invoker/src/ParameterResolver/TypeHintResolver.php diff --git a/plugins/vendor/php-di/invoker/src/Reflection/CallableReflection.php b/libs/vendor/php-di/invoker/src/Reflection/CallableReflection.php similarity index 100% rename from plugins/vendor/php-di/invoker/src/Reflection/CallableReflection.php rename to libs/vendor/php-di/invoker/src/Reflection/CallableReflection.php diff --git a/plugins/vendor/php-di/php-di/LICENSE b/libs/vendor/php-di/php-di/LICENSE similarity index 100% rename from plugins/vendor/php-di/php-di/LICENSE rename to libs/vendor/php-di/php-di/LICENSE diff --git a/plugins/vendor/php-di/php-di/README.md b/libs/vendor/php-di/php-di/README.md similarity index 100% rename from plugins/vendor/php-di/php-di/README.md rename to libs/vendor/php-di/php-di/README.md diff --git a/plugins/vendor/php-di/php-di/change-log.md b/libs/vendor/php-di/php-di/change-log.md similarity index 100% rename from plugins/vendor/php-di/php-di/change-log.md rename to libs/vendor/php-di/php-di/change-log.md diff --git a/plugins/vendor/php-di/php-di/composer.json b/libs/vendor/php-di/php-di/composer.json similarity index 100% rename from plugins/vendor/php-di/php-di/composer.json rename to libs/vendor/php-di/php-di/composer.json diff --git a/plugins/vendor/php-di/php-di/src/Attribute/Inject.php b/libs/vendor/php-di/php-di/src/Attribute/Inject.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Attribute/Inject.php rename to libs/vendor/php-di/php-di/src/Attribute/Inject.php diff --git a/plugins/vendor/php-di/php-di/src/Attribute/Injectable.php b/libs/vendor/php-di/php-di/src/Attribute/Injectable.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Attribute/Injectable.php rename to libs/vendor/php-di/php-di/src/Attribute/Injectable.php diff --git a/plugins/vendor/php-di/php-di/src/CompiledContainer.php b/libs/vendor/php-di/php-di/src/CompiledContainer.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/CompiledContainer.php rename to libs/vendor/php-di/php-di/src/CompiledContainer.php diff --git a/plugins/vendor/php-di/php-di/src/Compiler/Compiler.php b/libs/vendor/php-di/php-di/src/Compiler/Compiler.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Compiler/Compiler.php rename to libs/vendor/php-di/php-di/src/Compiler/Compiler.php diff --git a/plugins/vendor/php-di/php-di/src/Compiler/ObjectCreationCompiler.php b/libs/vendor/php-di/php-di/src/Compiler/ObjectCreationCompiler.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Compiler/ObjectCreationCompiler.php rename to libs/vendor/php-di/php-di/src/Compiler/ObjectCreationCompiler.php diff --git a/plugins/vendor/php-di/php-di/src/Compiler/RequestedEntryHolder.php b/libs/vendor/php-di/php-di/src/Compiler/RequestedEntryHolder.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Compiler/RequestedEntryHolder.php rename to libs/vendor/php-di/php-di/src/Compiler/RequestedEntryHolder.php diff --git a/plugins/vendor/php-di/php-di/src/Compiler/Template.php b/libs/vendor/php-di/php-di/src/Compiler/Template.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Compiler/Template.php rename to libs/vendor/php-di/php-di/src/Compiler/Template.php diff --git a/plugins/vendor/php-di/php-di/src/Container.php b/libs/vendor/php-di/php-di/src/Container.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Container.php rename to libs/vendor/php-di/php-di/src/Container.php diff --git a/plugins/vendor/php-di/php-di/src/ContainerBuilder.php b/libs/vendor/php-di/php-di/src/ContainerBuilder.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/ContainerBuilder.php rename to libs/vendor/php-di/php-di/src/ContainerBuilder.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/ArrayDefinition.php b/libs/vendor/php-di/php-di/src/Definition/ArrayDefinition.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/ArrayDefinition.php rename to libs/vendor/php-di/php-di/src/Definition/ArrayDefinition.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/ArrayDefinitionExtension.php b/libs/vendor/php-di/php-di/src/Definition/ArrayDefinitionExtension.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/ArrayDefinitionExtension.php rename to libs/vendor/php-di/php-di/src/Definition/ArrayDefinitionExtension.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/AutowireDefinition.php b/libs/vendor/php-di/php-di/src/Definition/AutowireDefinition.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/AutowireDefinition.php rename to libs/vendor/php-di/php-di/src/Definition/AutowireDefinition.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/DecoratorDefinition.php b/libs/vendor/php-di/php-di/src/Definition/DecoratorDefinition.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/DecoratorDefinition.php rename to libs/vendor/php-di/php-di/src/Definition/DecoratorDefinition.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/Definition.php b/libs/vendor/php-di/php-di/src/Definition/Definition.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/Definition.php rename to libs/vendor/php-di/php-di/src/Definition/Definition.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/Dumper/ObjectDefinitionDumper.php b/libs/vendor/php-di/php-di/src/Definition/Dumper/ObjectDefinitionDumper.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/Dumper/ObjectDefinitionDumper.php rename to libs/vendor/php-di/php-di/src/Definition/Dumper/ObjectDefinitionDumper.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/EnvironmentVariableDefinition.php b/libs/vendor/php-di/php-di/src/Definition/EnvironmentVariableDefinition.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/EnvironmentVariableDefinition.php rename to libs/vendor/php-di/php-di/src/Definition/EnvironmentVariableDefinition.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/Exception/InvalidAttribute.php b/libs/vendor/php-di/php-di/src/Definition/Exception/InvalidAttribute.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/Exception/InvalidAttribute.php rename to libs/vendor/php-di/php-di/src/Definition/Exception/InvalidAttribute.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/Exception/InvalidDefinition.php b/libs/vendor/php-di/php-di/src/Definition/Exception/InvalidDefinition.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/Exception/InvalidDefinition.php rename to libs/vendor/php-di/php-di/src/Definition/Exception/InvalidDefinition.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/ExtendsPreviousDefinition.php b/libs/vendor/php-di/php-di/src/Definition/ExtendsPreviousDefinition.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/ExtendsPreviousDefinition.php rename to libs/vendor/php-di/php-di/src/Definition/ExtendsPreviousDefinition.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/FactoryDefinition.php b/libs/vendor/php-di/php-di/src/Definition/FactoryDefinition.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/FactoryDefinition.php rename to libs/vendor/php-di/php-di/src/Definition/FactoryDefinition.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/Helper/AutowireDefinitionHelper.php b/libs/vendor/php-di/php-di/src/Definition/Helper/AutowireDefinitionHelper.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/Helper/AutowireDefinitionHelper.php rename to libs/vendor/php-di/php-di/src/Definition/Helper/AutowireDefinitionHelper.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/Helper/CreateDefinitionHelper.php b/libs/vendor/php-di/php-di/src/Definition/Helper/CreateDefinitionHelper.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/Helper/CreateDefinitionHelper.php rename to libs/vendor/php-di/php-di/src/Definition/Helper/CreateDefinitionHelper.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/Helper/DefinitionHelper.php b/libs/vendor/php-di/php-di/src/Definition/Helper/DefinitionHelper.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/Helper/DefinitionHelper.php rename to libs/vendor/php-di/php-di/src/Definition/Helper/DefinitionHelper.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/Helper/FactoryDefinitionHelper.php b/libs/vendor/php-di/php-di/src/Definition/Helper/FactoryDefinitionHelper.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/Helper/FactoryDefinitionHelper.php rename to libs/vendor/php-di/php-di/src/Definition/Helper/FactoryDefinitionHelper.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/InstanceDefinition.php b/libs/vendor/php-di/php-di/src/Definition/InstanceDefinition.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/InstanceDefinition.php rename to libs/vendor/php-di/php-di/src/Definition/InstanceDefinition.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/ObjectDefinition.php b/libs/vendor/php-di/php-di/src/Definition/ObjectDefinition.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/ObjectDefinition.php rename to libs/vendor/php-di/php-di/src/Definition/ObjectDefinition.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/ObjectDefinition/MethodInjection.php b/libs/vendor/php-di/php-di/src/Definition/ObjectDefinition/MethodInjection.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/ObjectDefinition/MethodInjection.php rename to libs/vendor/php-di/php-di/src/Definition/ObjectDefinition/MethodInjection.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/ObjectDefinition/PropertyInjection.php b/libs/vendor/php-di/php-di/src/Definition/ObjectDefinition/PropertyInjection.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/ObjectDefinition/PropertyInjection.php rename to libs/vendor/php-di/php-di/src/Definition/ObjectDefinition/PropertyInjection.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/Reference.php b/libs/vendor/php-di/php-di/src/Definition/Reference.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/Reference.php rename to libs/vendor/php-di/php-di/src/Definition/Reference.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/Resolver/ArrayResolver.php b/libs/vendor/php-di/php-di/src/Definition/Resolver/ArrayResolver.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/Resolver/ArrayResolver.php rename to libs/vendor/php-di/php-di/src/Definition/Resolver/ArrayResolver.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/Resolver/DecoratorResolver.php b/libs/vendor/php-di/php-di/src/Definition/Resolver/DecoratorResolver.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/Resolver/DecoratorResolver.php rename to libs/vendor/php-di/php-di/src/Definition/Resolver/DecoratorResolver.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/Resolver/DefinitionResolver.php b/libs/vendor/php-di/php-di/src/Definition/Resolver/DefinitionResolver.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/Resolver/DefinitionResolver.php rename to libs/vendor/php-di/php-di/src/Definition/Resolver/DefinitionResolver.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/Resolver/EnvironmentVariableResolver.php b/libs/vendor/php-di/php-di/src/Definition/Resolver/EnvironmentVariableResolver.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/Resolver/EnvironmentVariableResolver.php rename to libs/vendor/php-di/php-di/src/Definition/Resolver/EnvironmentVariableResolver.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/Resolver/FactoryResolver.php b/libs/vendor/php-di/php-di/src/Definition/Resolver/FactoryResolver.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/Resolver/FactoryResolver.php rename to libs/vendor/php-di/php-di/src/Definition/Resolver/FactoryResolver.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/Resolver/InstanceInjector.php b/libs/vendor/php-di/php-di/src/Definition/Resolver/InstanceInjector.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/Resolver/InstanceInjector.php rename to libs/vendor/php-di/php-di/src/Definition/Resolver/InstanceInjector.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/Resolver/ObjectCreator.php b/libs/vendor/php-di/php-di/src/Definition/Resolver/ObjectCreator.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/Resolver/ObjectCreator.php rename to libs/vendor/php-di/php-di/src/Definition/Resolver/ObjectCreator.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/Resolver/ParameterResolver.php b/libs/vendor/php-di/php-di/src/Definition/Resolver/ParameterResolver.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/Resolver/ParameterResolver.php rename to libs/vendor/php-di/php-di/src/Definition/Resolver/ParameterResolver.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/Resolver/ResolverDispatcher.php b/libs/vendor/php-di/php-di/src/Definition/Resolver/ResolverDispatcher.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/Resolver/ResolverDispatcher.php rename to libs/vendor/php-di/php-di/src/Definition/Resolver/ResolverDispatcher.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/SelfResolvingDefinition.php b/libs/vendor/php-di/php-di/src/Definition/SelfResolvingDefinition.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/SelfResolvingDefinition.php rename to libs/vendor/php-di/php-di/src/Definition/SelfResolvingDefinition.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/Source/AttributeBasedAutowiring.php b/libs/vendor/php-di/php-di/src/Definition/Source/AttributeBasedAutowiring.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/Source/AttributeBasedAutowiring.php rename to libs/vendor/php-di/php-di/src/Definition/Source/AttributeBasedAutowiring.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/Source/Autowiring.php b/libs/vendor/php-di/php-di/src/Definition/Source/Autowiring.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/Source/Autowiring.php rename to libs/vendor/php-di/php-di/src/Definition/Source/Autowiring.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/Source/DefinitionArray.php b/libs/vendor/php-di/php-di/src/Definition/Source/DefinitionArray.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/Source/DefinitionArray.php rename to libs/vendor/php-di/php-di/src/Definition/Source/DefinitionArray.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/Source/DefinitionFile.php b/libs/vendor/php-di/php-di/src/Definition/Source/DefinitionFile.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/Source/DefinitionFile.php rename to libs/vendor/php-di/php-di/src/Definition/Source/DefinitionFile.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/Source/DefinitionNormalizer.php b/libs/vendor/php-di/php-di/src/Definition/Source/DefinitionNormalizer.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/Source/DefinitionNormalizer.php rename to libs/vendor/php-di/php-di/src/Definition/Source/DefinitionNormalizer.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/Source/DefinitionSource.php b/libs/vendor/php-di/php-di/src/Definition/Source/DefinitionSource.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/Source/DefinitionSource.php rename to libs/vendor/php-di/php-di/src/Definition/Source/DefinitionSource.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/Source/MutableDefinitionSource.php b/libs/vendor/php-di/php-di/src/Definition/Source/MutableDefinitionSource.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/Source/MutableDefinitionSource.php rename to libs/vendor/php-di/php-di/src/Definition/Source/MutableDefinitionSource.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/Source/NoAutowiring.php b/libs/vendor/php-di/php-di/src/Definition/Source/NoAutowiring.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/Source/NoAutowiring.php rename to libs/vendor/php-di/php-di/src/Definition/Source/NoAutowiring.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/Source/ReflectionBasedAutowiring.php b/libs/vendor/php-di/php-di/src/Definition/Source/ReflectionBasedAutowiring.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/Source/ReflectionBasedAutowiring.php rename to libs/vendor/php-di/php-di/src/Definition/Source/ReflectionBasedAutowiring.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/Source/SourceCache.php b/libs/vendor/php-di/php-di/src/Definition/Source/SourceCache.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/Source/SourceCache.php rename to libs/vendor/php-di/php-di/src/Definition/Source/SourceCache.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/Source/SourceChain.php b/libs/vendor/php-di/php-di/src/Definition/Source/SourceChain.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/Source/SourceChain.php rename to libs/vendor/php-di/php-di/src/Definition/Source/SourceChain.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/StringDefinition.php b/libs/vendor/php-di/php-di/src/Definition/StringDefinition.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/StringDefinition.php rename to libs/vendor/php-di/php-di/src/Definition/StringDefinition.php diff --git a/plugins/vendor/php-di/php-di/src/Definition/ValueDefinition.php b/libs/vendor/php-di/php-di/src/Definition/ValueDefinition.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Definition/ValueDefinition.php rename to libs/vendor/php-di/php-di/src/Definition/ValueDefinition.php diff --git a/plugins/vendor/php-di/php-di/src/DependencyException.php b/libs/vendor/php-di/php-di/src/DependencyException.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/DependencyException.php rename to libs/vendor/php-di/php-di/src/DependencyException.php diff --git a/plugins/vendor/php-di/php-di/src/Factory/RequestedEntry.php b/libs/vendor/php-di/php-di/src/Factory/RequestedEntry.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Factory/RequestedEntry.php rename to libs/vendor/php-di/php-di/src/Factory/RequestedEntry.php diff --git a/plugins/vendor/php-di/php-di/src/FactoryInterface.php b/libs/vendor/php-di/php-di/src/FactoryInterface.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/FactoryInterface.php rename to libs/vendor/php-di/php-di/src/FactoryInterface.php diff --git a/plugins/vendor/php-di/php-di/src/Invoker/DefinitionParameterResolver.php b/libs/vendor/php-di/php-di/src/Invoker/DefinitionParameterResolver.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Invoker/DefinitionParameterResolver.php rename to libs/vendor/php-di/php-di/src/Invoker/DefinitionParameterResolver.php diff --git a/plugins/vendor/php-di/php-di/src/Invoker/FactoryParameterResolver.php b/libs/vendor/php-di/php-di/src/Invoker/FactoryParameterResolver.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Invoker/FactoryParameterResolver.php rename to libs/vendor/php-di/php-di/src/Invoker/FactoryParameterResolver.php diff --git a/plugins/vendor/php-di/php-di/src/NotFoundException.php b/libs/vendor/php-di/php-di/src/NotFoundException.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/NotFoundException.php rename to libs/vendor/php-di/php-di/src/NotFoundException.php diff --git a/plugins/vendor/php-di/php-di/src/Proxy/NativeProxyFactory.php b/libs/vendor/php-di/php-di/src/Proxy/NativeProxyFactory.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Proxy/NativeProxyFactory.php rename to libs/vendor/php-di/php-di/src/Proxy/NativeProxyFactory.php diff --git a/plugins/vendor/php-di/php-di/src/Proxy/ProxyFactory.php b/libs/vendor/php-di/php-di/src/Proxy/ProxyFactory.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Proxy/ProxyFactory.php rename to libs/vendor/php-di/php-di/src/Proxy/ProxyFactory.php diff --git a/plugins/vendor/php-di/php-di/src/Proxy/ProxyFactoryInterface.php b/libs/vendor/php-di/php-di/src/Proxy/ProxyFactoryInterface.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/Proxy/ProxyFactoryInterface.php rename to libs/vendor/php-di/php-di/src/Proxy/ProxyFactoryInterface.php diff --git a/plugins/vendor/php-di/php-di/src/functions.php b/libs/vendor/php-di/php-di/src/functions.php similarity index 100% rename from plugins/vendor/php-di/php-di/src/functions.php rename to libs/vendor/php-di/php-di/src/functions.php diff --git a/plugins/vendor/php-di/php-di/support.md b/libs/vendor/php-di/php-di/support.md similarity index 100% rename from plugins/vendor/php-di/php-di/support.md rename to libs/vendor/php-di/php-di/support.md diff --git a/plugins/vendor/psr/clock/CHANGELOG.md b/libs/vendor/psr/clock/CHANGELOG.md similarity index 100% rename from plugins/vendor/psr/clock/CHANGELOG.md rename to libs/vendor/psr/clock/CHANGELOG.md diff --git a/plugins/vendor/psr/clock/LICENSE b/libs/vendor/psr/clock/LICENSE similarity index 100% rename from plugins/vendor/psr/clock/LICENSE rename to libs/vendor/psr/clock/LICENSE diff --git a/plugins/vendor/psr/clock/README.md b/libs/vendor/psr/clock/README.md similarity index 100% rename from plugins/vendor/psr/clock/README.md rename to libs/vendor/psr/clock/README.md diff --git a/plugins/vendor/psr/clock/composer.json b/libs/vendor/psr/clock/composer.json similarity index 100% rename from plugins/vendor/psr/clock/composer.json rename to libs/vendor/psr/clock/composer.json diff --git a/plugins/vendor/psr/clock/src/ClockInterface.php b/libs/vendor/psr/clock/src/ClockInterface.php similarity index 100% rename from plugins/vendor/psr/clock/src/ClockInterface.php rename to libs/vendor/psr/clock/src/ClockInterface.php diff --git a/plugins/vendor/psr/container/.gitignore b/libs/vendor/psr/container/.gitignore similarity index 100% rename from plugins/vendor/psr/container/.gitignore rename to libs/vendor/psr/container/.gitignore diff --git a/plugins/vendor/psr/container/LICENSE b/libs/vendor/psr/container/LICENSE similarity index 100% rename from plugins/vendor/psr/container/LICENSE rename to libs/vendor/psr/container/LICENSE diff --git a/plugins/vendor/psr/container/README.md b/libs/vendor/psr/container/README.md similarity index 100% rename from plugins/vendor/psr/container/README.md rename to libs/vendor/psr/container/README.md diff --git a/plugins/vendor/psr/container/composer.json b/libs/vendor/psr/container/composer.json similarity index 100% rename from plugins/vendor/psr/container/composer.json rename to libs/vendor/psr/container/composer.json diff --git a/plugins/vendor/psr/container/src/ContainerExceptionInterface.php b/libs/vendor/psr/container/src/ContainerExceptionInterface.php similarity index 100% rename from plugins/vendor/psr/container/src/ContainerExceptionInterface.php rename to libs/vendor/psr/container/src/ContainerExceptionInterface.php diff --git a/plugins/vendor/psr/container/src/ContainerInterface.php b/libs/vendor/psr/container/src/ContainerInterface.php similarity index 100% rename from plugins/vendor/psr/container/src/ContainerInterface.php rename to libs/vendor/psr/container/src/ContainerInterface.php diff --git a/plugins/vendor/psr/container/src/NotFoundExceptionInterface.php b/libs/vendor/psr/container/src/NotFoundExceptionInterface.php similarity index 100% rename from plugins/vendor/psr/container/src/NotFoundExceptionInterface.php rename to libs/vendor/psr/container/src/NotFoundExceptionInterface.php diff --git a/plugins/vendor/psr/http-factory/LICENSE b/libs/vendor/psr/http-factory/LICENSE similarity index 100% rename from plugins/vendor/psr/http-factory/LICENSE rename to libs/vendor/psr/http-factory/LICENSE diff --git a/plugins/vendor/psr/http-factory/README.md b/libs/vendor/psr/http-factory/README.md similarity index 100% rename from plugins/vendor/psr/http-factory/README.md rename to libs/vendor/psr/http-factory/README.md diff --git a/plugins/vendor/psr/http-factory/composer.json b/libs/vendor/psr/http-factory/composer.json similarity index 100% rename from plugins/vendor/psr/http-factory/composer.json rename to libs/vendor/psr/http-factory/composer.json diff --git a/plugins/vendor/psr/http-factory/src/RequestFactoryInterface.php b/libs/vendor/psr/http-factory/src/RequestFactoryInterface.php similarity index 100% rename from plugins/vendor/psr/http-factory/src/RequestFactoryInterface.php rename to libs/vendor/psr/http-factory/src/RequestFactoryInterface.php diff --git a/plugins/vendor/psr/http-factory/src/ResponseFactoryInterface.php b/libs/vendor/psr/http-factory/src/ResponseFactoryInterface.php similarity index 100% rename from plugins/vendor/psr/http-factory/src/ResponseFactoryInterface.php rename to libs/vendor/psr/http-factory/src/ResponseFactoryInterface.php diff --git a/plugins/vendor/psr/http-factory/src/ServerRequestFactoryInterface.php b/libs/vendor/psr/http-factory/src/ServerRequestFactoryInterface.php similarity index 100% rename from plugins/vendor/psr/http-factory/src/ServerRequestFactoryInterface.php rename to libs/vendor/psr/http-factory/src/ServerRequestFactoryInterface.php diff --git a/plugins/vendor/psr/http-factory/src/StreamFactoryInterface.php b/libs/vendor/psr/http-factory/src/StreamFactoryInterface.php similarity index 100% rename from plugins/vendor/psr/http-factory/src/StreamFactoryInterface.php rename to libs/vendor/psr/http-factory/src/StreamFactoryInterface.php diff --git a/plugins/vendor/psr/http-factory/src/UploadedFileFactoryInterface.php b/libs/vendor/psr/http-factory/src/UploadedFileFactoryInterface.php similarity index 100% rename from plugins/vendor/psr/http-factory/src/UploadedFileFactoryInterface.php rename to libs/vendor/psr/http-factory/src/UploadedFileFactoryInterface.php diff --git a/plugins/vendor/psr/http-factory/src/UriFactoryInterface.php b/libs/vendor/psr/http-factory/src/UriFactoryInterface.php similarity index 100% rename from plugins/vendor/psr/http-factory/src/UriFactoryInterface.php rename to libs/vendor/psr/http-factory/src/UriFactoryInterface.php diff --git a/plugins/vendor/psr/http-message/CHANGELOG.md b/libs/vendor/psr/http-message/CHANGELOG.md similarity index 100% rename from plugins/vendor/psr/http-message/CHANGELOG.md rename to libs/vendor/psr/http-message/CHANGELOG.md diff --git a/plugins/vendor/psr/http-message/LICENSE b/libs/vendor/psr/http-message/LICENSE similarity index 100% rename from plugins/vendor/psr/http-message/LICENSE rename to libs/vendor/psr/http-message/LICENSE diff --git a/plugins/vendor/psr/http-message/README.md b/libs/vendor/psr/http-message/README.md similarity index 100% rename from plugins/vendor/psr/http-message/README.md rename to libs/vendor/psr/http-message/README.md diff --git a/plugins/vendor/psr/http-message/composer.json b/libs/vendor/psr/http-message/composer.json similarity index 100% rename from plugins/vendor/psr/http-message/composer.json rename to libs/vendor/psr/http-message/composer.json diff --git a/plugins/vendor/psr/http-message/docs/PSR7-Interfaces.md b/libs/vendor/psr/http-message/docs/PSR7-Interfaces.md similarity index 100% rename from plugins/vendor/psr/http-message/docs/PSR7-Interfaces.md rename to libs/vendor/psr/http-message/docs/PSR7-Interfaces.md diff --git a/plugins/vendor/psr/http-message/docs/PSR7-Usage.md b/libs/vendor/psr/http-message/docs/PSR7-Usage.md similarity index 100% rename from plugins/vendor/psr/http-message/docs/PSR7-Usage.md rename to libs/vendor/psr/http-message/docs/PSR7-Usage.md diff --git a/plugins/vendor/psr/http-message/src/MessageInterface.php b/libs/vendor/psr/http-message/src/MessageInterface.php similarity index 100% rename from plugins/vendor/psr/http-message/src/MessageInterface.php rename to libs/vendor/psr/http-message/src/MessageInterface.php diff --git a/plugins/vendor/psr/http-message/src/RequestInterface.php b/libs/vendor/psr/http-message/src/RequestInterface.php similarity index 100% rename from plugins/vendor/psr/http-message/src/RequestInterface.php rename to libs/vendor/psr/http-message/src/RequestInterface.php diff --git a/plugins/vendor/psr/http-message/src/ResponseInterface.php b/libs/vendor/psr/http-message/src/ResponseInterface.php similarity index 100% rename from plugins/vendor/psr/http-message/src/ResponseInterface.php rename to libs/vendor/psr/http-message/src/ResponseInterface.php diff --git a/plugins/vendor/psr/http-message/src/ServerRequestInterface.php b/libs/vendor/psr/http-message/src/ServerRequestInterface.php similarity index 100% rename from plugins/vendor/psr/http-message/src/ServerRequestInterface.php rename to libs/vendor/psr/http-message/src/ServerRequestInterface.php diff --git a/plugins/vendor/psr/http-message/src/StreamInterface.php b/libs/vendor/psr/http-message/src/StreamInterface.php similarity index 100% rename from plugins/vendor/psr/http-message/src/StreamInterface.php rename to libs/vendor/psr/http-message/src/StreamInterface.php diff --git a/plugins/vendor/psr/http-message/src/UploadedFileInterface.php b/libs/vendor/psr/http-message/src/UploadedFileInterface.php similarity index 100% rename from plugins/vendor/psr/http-message/src/UploadedFileInterface.php rename to libs/vendor/psr/http-message/src/UploadedFileInterface.php diff --git a/plugins/vendor/psr/http-message/src/UriInterface.php b/libs/vendor/psr/http-message/src/UriInterface.php similarity index 100% rename from plugins/vendor/psr/http-message/src/UriInterface.php rename to libs/vendor/psr/http-message/src/UriInterface.php diff --git a/plugins/vendor/psr/log/LICENSE b/libs/vendor/psr/log/LICENSE similarity index 100% rename from plugins/vendor/psr/log/LICENSE rename to libs/vendor/psr/log/LICENSE diff --git a/plugins/vendor/psr/log/README.md b/libs/vendor/psr/log/README.md similarity index 100% rename from plugins/vendor/psr/log/README.md rename to libs/vendor/psr/log/README.md diff --git a/plugins/vendor/psr/log/composer.json b/libs/vendor/psr/log/composer.json similarity index 100% rename from plugins/vendor/psr/log/composer.json rename to libs/vendor/psr/log/composer.json diff --git a/plugins/vendor/psr/log/src/AbstractLogger.php b/libs/vendor/psr/log/src/AbstractLogger.php similarity index 100% rename from plugins/vendor/psr/log/src/AbstractLogger.php rename to libs/vendor/psr/log/src/AbstractLogger.php diff --git a/plugins/vendor/psr/log/src/InvalidArgumentException.php b/libs/vendor/psr/log/src/InvalidArgumentException.php similarity index 100% rename from plugins/vendor/psr/log/src/InvalidArgumentException.php rename to libs/vendor/psr/log/src/InvalidArgumentException.php diff --git a/plugins/vendor/psr/log/src/LogLevel.php b/libs/vendor/psr/log/src/LogLevel.php similarity index 100% rename from plugins/vendor/psr/log/src/LogLevel.php rename to libs/vendor/psr/log/src/LogLevel.php diff --git a/plugins/vendor/psr/log/src/LoggerAwareInterface.php b/libs/vendor/psr/log/src/LoggerAwareInterface.php similarity index 100% rename from plugins/vendor/psr/log/src/LoggerAwareInterface.php rename to libs/vendor/psr/log/src/LoggerAwareInterface.php diff --git a/plugins/vendor/psr/log/src/LoggerAwareTrait.php b/libs/vendor/psr/log/src/LoggerAwareTrait.php similarity index 100% rename from plugins/vendor/psr/log/src/LoggerAwareTrait.php rename to libs/vendor/psr/log/src/LoggerAwareTrait.php diff --git a/plugins/vendor/psr/log/src/LoggerInterface.php b/libs/vendor/psr/log/src/LoggerInterface.php similarity index 100% rename from plugins/vendor/psr/log/src/LoggerInterface.php rename to libs/vendor/psr/log/src/LoggerInterface.php diff --git a/plugins/vendor/psr/log/src/LoggerTrait.php b/libs/vendor/psr/log/src/LoggerTrait.php similarity index 100% rename from plugins/vendor/psr/log/src/LoggerTrait.php rename to libs/vendor/psr/log/src/LoggerTrait.php diff --git a/plugins/vendor/psr/log/src/NullLogger.php b/libs/vendor/psr/log/src/NullLogger.php similarity index 100% rename from plugins/vendor/psr/log/src/NullLogger.php rename to libs/vendor/psr/log/src/NullLogger.php diff --git a/plugins/vendor/psr/simple-cache/.editorconfig b/libs/vendor/psr/simple-cache/.editorconfig similarity index 100% rename from plugins/vendor/psr/simple-cache/.editorconfig rename to libs/vendor/psr/simple-cache/.editorconfig diff --git a/plugins/vendor/psr/simple-cache/LICENSE.md b/libs/vendor/psr/simple-cache/LICENSE.md similarity index 100% rename from plugins/vendor/psr/simple-cache/LICENSE.md rename to libs/vendor/psr/simple-cache/LICENSE.md diff --git a/plugins/vendor/psr/simple-cache/README.md b/libs/vendor/psr/simple-cache/README.md similarity index 100% rename from plugins/vendor/psr/simple-cache/README.md rename to libs/vendor/psr/simple-cache/README.md diff --git a/plugins/vendor/psr/simple-cache/composer.json b/libs/vendor/psr/simple-cache/composer.json similarity index 100% rename from plugins/vendor/psr/simple-cache/composer.json rename to libs/vendor/psr/simple-cache/composer.json diff --git a/plugins/vendor/psr/simple-cache/src/CacheException.php b/libs/vendor/psr/simple-cache/src/CacheException.php similarity index 100% rename from plugins/vendor/psr/simple-cache/src/CacheException.php rename to libs/vendor/psr/simple-cache/src/CacheException.php diff --git a/plugins/vendor/psr/simple-cache/src/CacheInterface.php b/libs/vendor/psr/simple-cache/src/CacheInterface.php similarity index 100% rename from plugins/vendor/psr/simple-cache/src/CacheInterface.php rename to libs/vendor/psr/simple-cache/src/CacheInterface.php diff --git a/plugins/vendor/psr/simple-cache/src/InvalidArgumentException.php b/libs/vendor/psr/simple-cache/src/InvalidArgumentException.php similarity index 100% rename from plugins/vendor/psr/simple-cache/src/InvalidArgumentException.php rename to libs/vendor/psr/simple-cache/src/InvalidArgumentException.php diff --git a/plugins/vendor/ralouphie/getallheaders/LICENSE b/libs/vendor/ralouphie/getallheaders/LICENSE similarity index 100% rename from plugins/vendor/ralouphie/getallheaders/LICENSE rename to libs/vendor/ralouphie/getallheaders/LICENSE diff --git a/plugins/vendor/ralouphie/getallheaders/README.md b/libs/vendor/ralouphie/getallheaders/README.md similarity index 100% rename from plugins/vendor/ralouphie/getallheaders/README.md rename to libs/vendor/ralouphie/getallheaders/README.md diff --git a/plugins/vendor/ralouphie/getallheaders/composer.json b/libs/vendor/ralouphie/getallheaders/composer.json similarity index 100% rename from plugins/vendor/ralouphie/getallheaders/composer.json rename to libs/vendor/ralouphie/getallheaders/composer.json diff --git a/plugins/vendor/ralouphie/getallheaders/src/getallheaders.php b/libs/vendor/ralouphie/getallheaders/src/getallheaders.php similarity index 100% rename from plugins/vendor/ralouphie/getallheaders/src/getallheaders.php rename to libs/vendor/ralouphie/getallheaders/src/getallheaders.php diff --git a/plugins/vendor/symfony/clock/CHANGELOG.md b/libs/vendor/symfony/clock/CHANGELOG.md similarity index 100% rename from plugins/vendor/symfony/clock/CHANGELOG.md rename to libs/vendor/symfony/clock/CHANGELOG.md diff --git a/plugins/vendor/symfony/clock/Clock.php b/libs/vendor/symfony/clock/Clock.php similarity index 100% rename from plugins/vendor/symfony/clock/Clock.php rename to libs/vendor/symfony/clock/Clock.php diff --git a/plugins/vendor/symfony/clock/ClockAwareTrait.php b/libs/vendor/symfony/clock/ClockAwareTrait.php similarity index 100% rename from plugins/vendor/symfony/clock/ClockAwareTrait.php rename to libs/vendor/symfony/clock/ClockAwareTrait.php diff --git a/plugins/vendor/symfony/clock/ClockInterface.php b/libs/vendor/symfony/clock/ClockInterface.php similarity index 100% rename from plugins/vendor/symfony/clock/ClockInterface.php rename to libs/vendor/symfony/clock/ClockInterface.php diff --git a/plugins/vendor/symfony/clock/DatePoint.php b/libs/vendor/symfony/clock/DatePoint.php similarity index 100% rename from plugins/vendor/symfony/clock/DatePoint.php rename to libs/vendor/symfony/clock/DatePoint.php diff --git a/plugins/vendor/symfony/clock/LICENSE b/libs/vendor/symfony/clock/LICENSE similarity index 100% rename from plugins/vendor/symfony/clock/LICENSE rename to libs/vendor/symfony/clock/LICENSE diff --git a/plugins/vendor/symfony/clock/MockClock.php b/libs/vendor/symfony/clock/MockClock.php similarity index 100% rename from plugins/vendor/symfony/clock/MockClock.php rename to libs/vendor/symfony/clock/MockClock.php diff --git a/plugins/vendor/symfony/clock/MonotonicClock.php b/libs/vendor/symfony/clock/MonotonicClock.php similarity index 100% rename from plugins/vendor/symfony/clock/MonotonicClock.php rename to libs/vendor/symfony/clock/MonotonicClock.php diff --git a/plugins/vendor/symfony/clock/NativeClock.php b/libs/vendor/symfony/clock/NativeClock.php similarity index 100% rename from plugins/vendor/symfony/clock/NativeClock.php rename to libs/vendor/symfony/clock/NativeClock.php diff --git a/plugins/vendor/symfony/clock/README.md b/libs/vendor/symfony/clock/README.md similarity index 100% rename from plugins/vendor/symfony/clock/README.md rename to libs/vendor/symfony/clock/README.md diff --git a/plugins/vendor/symfony/clock/Resources/now.php b/libs/vendor/symfony/clock/Resources/now.php similarity index 100% rename from plugins/vendor/symfony/clock/Resources/now.php rename to libs/vendor/symfony/clock/Resources/now.php diff --git a/plugins/vendor/symfony/clock/Test/ClockSensitiveTrait.php b/libs/vendor/symfony/clock/Test/ClockSensitiveTrait.php similarity index 100% rename from plugins/vendor/symfony/clock/Test/ClockSensitiveTrait.php rename to libs/vendor/symfony/clock/Test/ClockSensitiveTrait.php diff --git a/plugins/vendor/symfony/clock/composer.json b/libs/vendor/symfony/clock/composer.json similarity index 100% rename from plugins/vendor/symfony/clock/composer.json rename to libs/vendor/symfony/clock/composer.json diff --git a/plugins/vendor/symfony/deprecation-contracts/CHANGELOG.md b/libs/vendor/symfony/deprecation-contracts/CHANGELOG.md similarity index 100% rename from plugins/vendor/symfony/deprecation-contracts/CHANGELOG.md rename to libs/vendor/symfony/deprecation-contracts/CHANGELOG.md diff --git a/plugins/vendor/symfony/deprecation-contracts/LICENSE b/libs/vendor/symfony/deprecation-contracts/LICENSE similarity index 100% rename from plugins/vendor/symfony/deprecation-contracts/LICENSE rename to libs/vendor/symfony/deprecation-contracts/LICENSE diff --git a/plugins/vendor/symfony/deprecation-contracts/README.md b/libs/vendor/symfony/deprecation-contracts/README.md similarity index 100% rename from plugins/vendor/symfony/deprecation-contracts/README.md rename to libs/vendor/symfony/deprecation-contracts/README.md diff --git a/plugins/vendor/symfony/deprecation-contracts/composer.json b/libs/vendor/symfony/deprecation-contracts/composer.json similarity index 100% rename from plugins/vendor/symfony/deprecation-contracts/composer.json rename to libs/vendor/symfony/deprecation-contracts/composer.json diff --git a/plugins/vendor/symfony/deprecation-contracts/function.php b/libs/vendor/symfony/deprecation-contracts/function.php similarity index 100% rename from plugins/vendor/symfony/deprecation-contracts/function.php rename to libs/vendor/symfony/deprecation-contracts/function.php diff --git a/plugins/vendor/symfony/mime/Address.php b/libs/vendor/symfony/mime/Address.php similarity index 100% rename from plugins/vendor/symfony/mime/Address.php rename to libs/vendor/symfony/mime/Address.php diff --git a/plugins/vendor/symfony/mime/BodyRendererInterface.php b/libs/vendor/symfony/mime/BodyRendererInterface.php similarity index 100% rename from plugins/vendor/symfony/mime/BodyRendererInterface.php rename to libs/vendor/symfony/mime/BodyRendererInterface.php diff --git a/plugins/vendor/symfony/mime/CHANGELOG.md b/libs/vendor/symfony/mime/CHANGELOG.md similarity index 100% rename from plugins/vendor/symfony/mime/CHANGELOG.md rename to libs/vendor/symfony/mime/CHANGELOG.md diff --git a/plugins/vendor/symfony/mime/CharacterStream.php b/libs/vendor/symfony/mime/CharacterStream.php similarity index 100% rename from plugins/vendor/symfony/mime/CharacterStream.php rename to libs/vendor/symfony/mime/CharacterStream.php diff --git a/plugins/vendor/symfony/mime/Crypto/DkimOptions.php b/libs/vendor/symfony/mime/Crypto/DkimOptions.php similarity index 100% rename from plugins/vendor/symfony/mime/Crypto/DkimOptions.php rename to libs/vendor/symfony/mime/Crypto/DkimOptions.php diff --git a/plugins/vendor/symfony/mime/Crypto/DkimSigner.php b/libs/vendor/symfony/mime/Crypto/DkimSigner.php similarity index 100% rename from plugins/vendor/symfony/mime/Crypto/DkimSigner.php rename to libs/vendor/symfony/mime/Crypto/DkimSigner.php diff --git a/plugins/vendor/symfony/mime/Crypto/SMime.php b/libs/vendor/symfony/mime/Crypto/SMime.php similarity index 100% rename from plugins/vendor/symfony/mime/Crypto/SMime.php rename to libs/vendor/symfony/mime/Crypto/SMime.php diff --git a/plugins/vendor/symfony/mime/Crypto/SMimeEncrypter.php b/libs/vendor/symfony/mime/Crypto/SMimeEncrypter.php similarity index 100% rename from plugins/vendor/symfony/mime/Crypto/SMimeEncrypter.php rename to libs/vendor/symfony/mime/Crypto/SMimeEncrypter.php diff --git a/plugins/vendor/symfony/mime/Crypto/SMimeSigner.php b/libs/vendor/symfony/mime/Crypto/SMimeSigner.php similarity index 100% rename from plugins/vendor/symfony/mime/Crypto/SMimeSigner.php rename to libs/vendor/symfony/mime/Crypto/SMimeSigner.php diff --git a/plugins/vendor/symfony/mime/DependencyInjection/AddMimeTypeGuesserPass.php b/libs/vendor/symfony/mime/DependencyInjection/AddMimeTypeGuesserPass.php similarity index 100% rename from plugins/vendor/symfony/mime/DependencyInjection/AddMimeTypeGuesserPass.php rename to libs/vendor/symfony/mime/DependencyInjection/AddMimeTypeGuesserPass.php diff --git a/plugins/vendor/symfony/mime/DraftEmail.php b/libs/vendor/symfony/mime/DraftEmail.php similarity index 100% rename from plugins/vendor/symfony/mime/DraftEmail.php rename to libs/vendor/symfony/mime/DraftEmail.php diff --git a/plugins/vendor/symfony/mime/Email.php b/libs/vendor/symfony/mime/Email.php similarity index 100% rename from plugins/vendor/symfony/mime/Email.php rename to libs/vendor/symfony/mime/Email.php diff --git a/plugins/vendor/symfony/mime/Encoder/AddressEncoderInterface.php b/libs/vendor/symfony/mime/Encoder/AddressEncoderInterface.php similarity index 100% rename from plugins/vendor/symfony/mime/Encoder/AddressEncoderInterface.php rename to libs/vendor/symfony/mime/Encoder/AddressEncoderInterface.php diff --git a/plugins/vendor/symfony/mime/Encoder/Base64ContentEncoder.php b/libs/vendor/symfony/mime/Encoder/Base64ContentEncoder.php similarity index 100% rename from plugins/vendor/symfony/mime/Encoder/Base64ContentEncoder.php rename to libs/vendor/symfony/mime/Encoder/Base64ContentEncoder.php diff --git a/plugins/vendor/symfony/mime/Encoder/Base64Encoder.php b/libs/vendor/symfony/mime/Encoder/Base64Encoder.php similarity index 100% rename from plugins/vendor/symfony/mime/Encoder/Base64Encoder.php rename to libs/vendor/symfony/mime/Encoder/Base64Encoder.php diff --git a/plugins/vendor/symfony/mime/Encoder/Base64MimeHeaderEncoder.php b/libs/vendor/symfony/mime/Encoder/Base64MimeHeaderEncoder.php similarity index 100% rename from plugins/vendor/symfony/mime/Encoder/Base64MimeHeaderEncoder.php rename to libs/vendor/symfony/mime/Encoder/Base64MimeHeaderEncoder.php diff --git a/plugins/vendor/symfony/mime/Encoder/ContentEncoderInterface.php b/libs/vendor/symfony/mime/Encoder/ContentEncoderInterface.php similarity index 100% rename from plugins/vendor/symfony/mime/Encoder/ContentEncoderInterface.php rename to libs/vendor/symfony/mime/Encoder/ContentEncoderInterface.php diff --git a/plugins/vendor/symfony/mime/Encoder/EightBitContentEncoder.php b/libs/vendor/symfony/mime/Encoder/EightBitContentEncoder.php similarity index 100% rename from plugins/vendor/symfony/mime/Encoder/EightBitContentEncoder.php rename to libs/vendor/symfony/mime/Encoder/EightBitContentEncoder.php diff --git a/plugins/vendor/symfony/mime/Encoder/EncoderInterface.php b/libs/vendor/symfony/mime/Encoder/EncoderInterface.php similarity index 100% rename from plugins/vendor/symfony/mime/Encoder/EncoderInterface.php rename to libs/vendor/symfony/mime/Encoder/EncoderInterface.php diff --git a/plugins/vendor/symfony/mime/Encoder/IdnAddressEncoder.php b/libs/vendor/symfony/mime/Encoder/IdnAddressEncoder.php similarity index 100% rename from plugins/vendor/symfony/mime/Encoder/IdnAddressEncoder.php rename to libs/vendor/symfony/mime/Encoder/IdnAddressEncoder.php diff --git a/plugins/vendor/symfony/mime/Encoder/MimeHeaderEncoderInterface.php b/libs/vendor/symfony/mime/Encoder/MimeHeaderEncoderInterface.php similarity index 100% rename from plugins/vendor/symfony/mime/Encoder/MimeHeaderEncoderInterface.php rename to libs/vendor/symfony/mime/Encoder/MimeHeaderEncoderInterface.php diff --git a/plugins/vendor/symfony/mime/Encoder/QpContentEncoder.php b/libs/vendor/symfony/mime/Encoder/QpContentEncoder.php similarity index 100% rename from plugins/vendor/symfony/mime/Encoder/QpContentEncoder.php rename to libs/vendor/symfony/mime/Encoder/QpContentEncoder.php diff --git a/plugins/vendor/symfony/mime/Encoder/QpEncoder.php b/libs/vendor/symfony/mime/Encoder/QpEncoder.php similarity index 100% rename from plugins/vendor/symfony/mime/Encoder/QpEncoder.php rename to libs/vendor/symfony/mime/Encoder/QpEncoder.php diff --git a/plugins/vendor/symfony/mime/Encoder/QpMimeHeaderEncoder.php b/libs/vendor/symfony/mime/Encoder/QpMimeHeaderEncoder.php similarity index 100% rename from plugins/vendor/symfony/mime/Encoder/QpMimeHeaderEncoder.php rename to libs/vendor/symfony/mime/Encoder/QpMimeHeaderEncoder.php diff --git a/plugins/vendor/symfony/mime/Encoder/Rfc2231Encoder.php b/libs/vendor/symfony/mime/Encoder/Rfc2231Encoder.php similarity index 100% rename from plugins/vendor/symfony/mime/Encoder/Rfc2231Encoder.php rename to libs/vendor/symfony/mime/Encoder/Rfc2231Encoder.php diff --git a/plugins/vendor/symfony/mime/Exception/AddressEncoderException.php b/libs/vendor/symfony/mime/Exception/AddressEncoderException.php similarity index 100% rename from plugins/vendor/symfony/mime/Exception/AddressEncoderException.php rename to libs/vendor/symfony/mime/Exception/AddressEncoderException.php diff --git a/plugins/vendor/symfony/mime/Exception/ExceptionInterface.php b/libs/vendor/symfony/mime/Exception/ExceptionInterface.php similarity index 100% rename from plugins/vendor/symfony/mime/Exception/ExceptionInterface.php rename to libs/vendor/symfony/mime/Exception/ExceptionInterface.php diff --git a/plugins/vendor/symfony/mime/Exception/InvalidArgumentException.php b/libs/vendor/symfony/mime/Exception/InvalidArgumentException.php similarity index 100% rename from plugins/vendor/symfony/mime/Exception/InvalidArgumentException.php rename to libs/vendor/symfony/mime/Exception/InvalidArgumentException.php diff --git a/plugins/vendor/symfony/mime/Exception/LogicException.php b/libs/vendor/symfony/mime/Exception/LogicException.php similarity index 100% rename from plugins/vendor/symfony/mime/Exception/LogicException.php rename to libs/vendor/symfony/mime/Exception/LogicException.php diff --git a/plugins/vendor/symfony/mime/Exception/RfcComplianceException.php b/libs/vendor/symfony/mime/Exception/RfcComplianceException.php similarity index 100% rename from plugins/vendor/symfony/mime/Exception/RfcComplianceException.php rename to libs/vendor/symfony/mime/Exception/RfcComplianceException.php diff --git a/plugins/vendor/symfony/mime/Exception/RuntimeException.php b/libs/vendor/symfony/mime/Exception/RuntimeException.php similarity index 100% rename from plugins/vendor/symfony/mime/Exception/RuntimeException.php rename to libs/vendor/symfony/mime/Exception/RuntimeException.php diff --git a/plugins/vendor/symfony/mime/FileBinaryMimeTypeGuesser.php b/libs/vendor/symfony/mime/FileBinaryMimeTypeGuesser.php similarity index 100% rename from plugins/vendor/symfony/mime/FileBinaryMimeTypeGuesser.php rename to libs/vendor/symfony/mime/FileBinaryMimeTypeGuesser.php diff --git a/plugins/vendor/symfony/mime/FileinfoMimeTypeGuesser.php b/libs/vendor/symfony/mime/FileinfoMimeTypeGuesser.php similarity index 100% rename from plugins/vendor/symfony/mime/FileinfoMimeTypeGuesser.php rename to libs/vendor/symfony/mime/FileinfoMimeTypeGuesser.php diff --git a/plugins/vendor/symfony/mime/Header/AbstractHeader.php b/libs/vendor/symfony/mime/Header/AbstractHeader.php similarity index 100% rename from plugins/vendor/symfony/mime/Header/AbstractHeader.php rename to libs/vendor/symfony/mime/Header/AbstractHeader.php diff --git a/plugins/vendor/symfony/mime/Header/DateHeader.php b/libs/vendor/symfony/mime/Header/DateHeader.php similarity index 100% rename from plugins/vendor/symfony/mime/Header/DateHeader.php rename to libs/vendor/symfony/mime/Header/DateHeader.php diff --git a/plugins/vendor/symfony/mime/Header/HeaderInterface.php b/libs/vendor/symfony/mime/Header/HeaderInterface.php similarity index 100% rename from plugins/vendor/symfony/mime/Header/HeaderInterface.php rename to libs/vendor/symfony/mime/Header/HeaderInterface.php diff --git a/plugins/vendor/symfony/mime/Header/Headers.php b/libs/vendor/symfony/mime/Header/Headers.php similarity index 100% rename from plugins/vendor/symfony/mime/Header/Headers.php rename to libs/vendor/symfony/mime/Header/Headers.php diff --git a/plugins/vendor/symfony/mime/Header/IdentificationHeader.php b/libs/vendor/symfony/mime/Header/IdentificationHeader.php similarity index 100% rename from plugins/vendor/symfony/mime/Header/IdentificationHeader.php rename to libs/vendor/symfony/mime/Header/IdentificationHeader.php diff --git a/plugins/vendor/symfony/mime/Header/MailboxHeader.php b/libs/vendor/symfony/mime/Header/MailboxHeader.php similarity index 100% rename from plugins/vendor/symfony/mime/Header/MailboxHeader.php rename to libs/vendor/symfony/mime/Header/MailboxHeader.php diff --git a/plugins/vendor/symfony/mime/Header/MailboxListHeader.php b/libs/vendor/symfony/mime/Header/MailboxListHeader.php similarity index 100% rename from plugins/vendor/symfony/mime/Header/MailboxListHeader.php rename to libs/vendor/symfony/mime/Header/MailboxListHeader.php diff --git a/plugins/vendor/symfony/mime/Header/ParameterizedHeader.php b/libs/vendor/symfony/mime/Header/ParameterizedHeader.php similarity index 100% rename from plugins/vendor/symfony/mime/Header/ParameterizedHeader.php rename to libs/vendor/symfony/mime/Header/ParameterizedHeader.php diff --git a/plugins/vendor/symfony/mime/Header/PathHeader.php b/libs/vendor/symfony/mime/Header/PathHeader.php similarity index 100% rename from plugins/vendor/symfony/mime/Header/PathHeader.php rename to libs/vendor/symfony/mime/Header/PathHeader.php diff --git a/plugins/vendor/symfony/mime/Header/UnstructuredHeader.php b/libs/vendor/symfony/mime/Header/UnstructuredHeader.php similarity index 100% rename from plugins/vendor/symfony/mime/Header/UnstructuredHeader.php rename to libs/vendor/symfony/mime/Header/UnstructuredHeader.php diff --git a/plugins/vendor/symfony/mime/HtmlToTextConverter/DefaultHtmlToTextConverter.php b/libs/vendor/symfony/mime/HtmlToTextConverter/DefaultHtmlToTextConverter.php similarity index 100% rename from plugins/vendor/symfony/mime/HtmlToTextConverter/DefaultHtmlToTextConverter.php rename to libs/vendor/symfony/mime/HtmlToTextConverter/DefaultHtmlToTextConverter.php diff --git a/plugins/vendor/symfony/mime/HtmlToTextConverter/HtmlToTextConverterInterface.php b/libs/vendor/symfony/mime/HtmlToTextConverter/HtmlToTextConverterInterface.php similarity index 100% rename from plugins/vendor/symfony/mime/HtmlToTextConverter/HtmlToTextConverterInterface.php rename to libs/vendor/symfony/mime/HtmlToTextConverter/HtmlToTextConverterInterface.php diff --git a/plugins/vendor/symfony/mime/HtmlToTextConverter/LeagueHtmlToMarkdownConverter.php b/libs/vendor/symfony/mime/HtmlToTextConverter/LeagueHtmlToMarkdownConverter.php similarity index 100% rename from plugins/vendor/symfony/mime/HtmlToTextConverter/LeagueHtmlToMarkdownConverter.php rename to libs/vendor/symfony/mime/HtmlToTextConverter/LeagueHtmlToMarkdownConverter.php diff --git a/plugins/vendor/symfony/mime/LICENSE b/libs/vendor/symfony/mime/LICENSE similarity index 100% rename from plugins/vendor/symfony/mime/LICENSE rename to libs/vendor/symfony/mime/LICENSE diff --git a/plugins/vendor/symfony/mime/Message.php b/libs/vendor/symfony/mime/Message.php similarity index 100% rename from plugins/vendor/symfony/mime/Message.php rename to libs/vendor/symfony/mime/Message.php diff --git a/plugins/vendor/symfony/mime/MessageConverter.php b/libs/vendor/symfony/mime/MessageConverter.php similarity index 100% rename from plugins/vendor/symfony/mime/MessageConverter.php rename to libs/vendor/symfony/mime/MessageConverter.php diff --git a/plugins/vendor/symfony/mime/MimeTypeGuesserInterface.php b/libs/vendor/symfony/mime/MimeTypeGuesserInterface.php similarity index 100% rename from plugins/vendor/symfony/mime/MimeTypeGuesserInterface.php rename to libs/vendor/symfony/mime/MimeTypeGuesserInterface.php diff --git a/plugins/vendor/symfony/mime/MimeTypes.php b/libs/vendor/symfony/mime/MimeTypes.php similarity index 100% rename from plugins/vendor/symfony/mime/MimeTypes.php rename to libs/vendor/symfony/mime/MimeTypes.php diff --git a/plugins/vendor/symfony/mime/MimeTypesInterface.php b/libs/vendor/symfony/mime/MimeTypesInterface.php similarity index 100% rename from plugins/vendor/symfony/mime/MimeTypesInterface.php rename to libs/vendor/symfony/mime/MimeTypesInterface.php diff --git a/plugins/vendor/symfony/mime/Part/AbstractMultipartPart.php b/libs/vendor/symfony/mime/Part/AbstractMultipartPart.php similarity index 100% rename from plugins/vendor/symfony/mime/Part/AbstractMultipartPart.php rename to libs/vendor/symfony/mime/Part/AbstractMultipartPart.php diff --git a/plugins/vendor/symfony/mime/Part/AbstractPart.php b/libs/vendor/symfony/mime/Part/AbstractPart.php similarity index 100% rename from plugins/vendor/symfony/mime/Part/AbstractPart.php rename to libs/vendor/symfony/mime/Part/AbstractPart.php diff --git a/plugins/vendor/symfony/mime/Part/DataPart.php b/libs/vendor/symfony/mime/Part/DataPart.php similarity index 100% rename from plugins/vendor/symfony/mime/Part/DataPart.php rename to libs/vendor/symfony/mime/Part/DataPart.php diff --git a/plugins/vendor/symfony/mime/Part/File.php b/libs/vendor/symfony/mime/Part/File.php similarity index 100% rename from plugins/vendor/symfony/mime/Part/File.php rename to libs/vendor/symfony/mime/Part/File.php diff --git a/plugins/vendor/symfony/mime/Part/MessagePart.php b/libs/vendor/symfony/mime/Part/MessagePart.php similarity index 100% rename from plugins/vendor/symfony/mime/Part/MessagePart.php rename to libs/vendor/symfony/mime/Part/MessagePart.php diff --git a/plugins/vendor/symfony/mime/Part/Multipart/AlternativePart.php b/libs/vendor/symfony/mime/Part/Multipart/AlternativePart.php similarity index 100% rename from plugins/vendor/symfony/mime/Part/Multipart/AlternativePart.php rename to libs/vendor/symfony/mime/Part/Multipart/AlternativePart.php diff --git a/plugins/vendor/symfony/mime/Part/Multipart/DigestPart.php b/libs/vendor/symfony/mime/Part/Multipart/DigestPart.php similarity index 100% rename from plugins/vendor/symfony/mime/Part/Multipart/DigestPart.php rename to libs/vendor/symfony/mime/Part/Multipart/DigestPart.php diff --git a/plugins/vendor/symfony/mime/Part/Multipart/FormDataPart.php b/libs/vendor/symfony/mime/Part/Multipart/FormDataPart.php similarity index 100% rename from plugins/vendor/symfony/mime/Part/Multipart/FormDataPart.php rename to libs/vendor/symfony/mime/Part/Multipart/FormDataPart.php diff --git a/plugins/vendor/symfony/mime/Part/Multipart/MixedPart.php b/libs/vendor/symfony/mime/Part/Multipart/MixedPart.php similarity index 100% rename from plugins/vendor/symfony/mime/Part/Multipart/MixedPart.php rename to libs/vendor/symfony/mime/Part/Multipart/MixedPart.php diff --git a/plugins/vendor/symfony/mime/Part/Multipart/RelatedPart.php b/libs/vendor/symfony/mime/Part/Multipart/RelatedPart.php similarity index 100% rename from plugins/vendor/symfony/mime/Part/Multipart/RelatedPart.php rename to libs/vendor/symfony/mime/Part/Multipart/RelatedPart.php diff --git a/plugins/vendor/symfony/mime/Part/SMimePart.php b/libs/vendor/symfony/mime/Part/SMimePart.php similarity index 100% rename from plugins/vendor/symfony/mime/Part/SMimePart.php rename to libs/vendor/symfony/mime/Part/SMimePart.php diff --git a/plugins/vendor/symfony/mime/Part/TextPart.php b/libs/vendor/symfony/mime/Part/TextPart.php similarity index 100% rename from plugins/vendor/symfony/mime/Part/TextPart.php rename to libs/vendor/symfony/mime/Part/TextPart.php diff --git a/plugins/vendor/symfony/mime/README.md b/libs/vendor/symfony/mime/README.md similarity index 100% rename from plugins/vendor/symfony/mime/README.md rename to libs/vendor/symfony/mime/README.md diff --git a/plugins/vendor/symfony/mime/RawMessage.php b/libs/vendor/symfony/mime/RawMessage.php similarity index 100% rename from plugins/vendor/symfony/mime/RawMessage.php rename to libs/vendor/symfony/mime/RawMessage.php diff --git a/plugins/vendor/symfony/mime/Test/Constraint/EmailAddressContains.php b/libs/vendor/symfony/mime/Test/Constraint/EmailAddressContains.php similarity index 100% rename from plugins/vendor/symfony/mime/Test/Constraint/EmailAddressContains.php rename to libs/vendor/symfony/mime/Test/Constraint/EmailAddressContains.php diff --git a/plugins/vendor/symfony/mime/Test/Constraint/EmailAttachmentCount.php b/libs/vendor/symfony/mime/Test/Constraint/EmailAttachmentCount.php similarity index 100% rename from plugins/vendor/symfony/mime/Test/Constraint/EmailAttachmentCount.php rename to libs/vendor/symfony/mime/Test/Constraint/EmailAttachmentCount.php diff --git a/plugins/vendor/symfony/mime/Test/Constraint/EmailHasHeader.php b/libs/vendor/symfony/mime/Test/Constraint/EmailHasHeader.php similarity index 100% rename from plugins/vendor/symfony/mime/Test/Constraint/EmailHasHeader.php rename to libs/vendor/symfony/mime/Test/Constraint/EmailHasHeader.php diff --git a/plugins/vendor/symfony/mime/Test/Constraint/EmailHeaderSame.php b/libs/vendor/symfony/mime/Test/Constraint/EmailHeaderSame.php similarity index 100% rename from plugins/vendor/symfony/mime/Test/Constraint/EmailHeaderSame.php rename to libs/vendor/symfony/mime/Test/Constraint/EmailHeaderSame.php diff --git a/plugins/vendor/symfony/mime/Test/Constraint/EmailHtmlBodyContains.php b/libs/vendor/symfony/mime/Test/Constraint/EmailHtmlBodyContains.php similarity index 100% rename from plugins/vendor/symfony/mime/Test/Constraint/EmailHtmlBodyContains.php rename to libs/vendor/symfony/mime/Test/Constraint/EmailHtmlBodyContains.php diff --git a/plugins/vendor/symfony/mime/Test/Constraint/EmailSubjectContains.php b/libs/vendor/symfony/mime/Test/Constraint/EmailSubjectContains.php similarity index 100% rename from plugins/vendor/symfony/mime/Test/Constraint/EmailSubjectContains.php rename to libs/vendor/symfony/mime/Test/Constraint/EmailSubjectContains.php diff --git a/plugins/vendor/symfony/mime/Test/Constraint/EmailTextBodyContains.php b/libs/vendor/symfony/mime/Test/Constraint/EmailTextBodyContains.php similarity index 100% rename from plugins/vendor/symfony/mime/Test/Constraint/EmailTextBodyContains.php rename to libs/vendor/symfony/mime/Test/Constraint/EmailTextBodyContains.php diff --git a/plugins/vendor/symfony/mime/composer.json b/libs/vendor/symfony/mime/composer.json similarity index 100% rename from plugins/vendor/symfony/mime/composer.json rename to libs/vendor/symfony/mime/composer.json diff --git a/plugins/vendor/symfony/polyfill-iconv/Iconv.php b/libs/vendor/symfony/polyfill-iconv/Iconv.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Iconv.php rename to libs/vendor/symfony/polyfill-iconv/Iconv.php diff --git a/plugins/vendor/symfony/polyfill-iconv/LICENSE b/libs/vendor/symfony/polyfill-iconv/LICENSE similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/LICENSE rename to libs/vendor/symfony/polyfill-iconv/LICENSE diff --git a/plugins/vendor/symfony/polyfill-iconv/README.md b/libs/vendor/symfony/polyfill-iconv/README.md similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/README.md rename to libs/vendor/symfony/polyfill-iconv/README.md diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.big5.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.big5.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.big5.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.big5.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp037.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp037.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp037.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp037.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp1006.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp1006.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp1006.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp1006.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp1026.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp1026.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp1026.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp1026.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp424.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp424.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp424.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp424.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp437.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp437.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp437.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp437.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp500.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp500.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp500.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp500.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp737.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp737.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp737.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp737.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp775.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp775.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp775.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp775.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp850.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp850.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp850.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp850.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp852.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp852.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp852.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp852.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp855.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp855.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp855.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp855.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp856.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp856.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp856.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp856.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp857.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp857.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp857.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp857.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp860.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp860.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp860.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp860.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp861.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp861.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp861.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp861.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp862.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp862.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp862.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp862.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp863.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp863.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp863.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp863.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp864.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp864.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp864.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp864.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp865.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp865.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp865.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp865.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp866.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp866.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp866.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp866.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp869.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp869.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp869.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp869.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp874.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp874.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp874.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp874.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp875.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp875.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp875.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp875.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp932.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp932.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp932.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp932.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp936.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp936.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp936.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp936.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp949.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp949.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp949.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp949.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp950.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp950.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.cp950.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.cp950.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-1.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-1.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-1.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-1.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-10.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-10.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-10.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-10.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-11.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-11.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-11.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-11.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-13.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-13.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-13.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-13.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-14.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-14.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-14.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-14.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-15.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-15.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-15.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-15.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-16.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-16.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-16.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-16.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-2.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-2.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-2.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-2.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-3.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-3.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-3.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-3.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-4.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-4.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-4.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-4.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-5.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-5.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-5.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-5.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-6.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-6.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-6.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-6.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-7.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-7.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-7.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-7.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-8.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-8.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-8.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-8.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-9.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-9.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-9.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.iso-8859-9.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.koi8-r.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.koi8-r.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.koi8-r.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.koi8-r.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.koi8-u.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.koi8-u.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.koi8-u.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.koi8-u.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.us-ascii.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.us-ascii.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.us-ascii.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.us-ascii.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1250.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1250.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1250.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1250.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1251.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1251.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1251.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1251.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1252.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1252.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1252.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1252.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1253.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1253.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1253.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1253.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1254.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1254.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1254.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1254.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1255.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1255.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1255.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1255.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1256.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1256.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1256.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1256.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1257.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1257.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1257.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1257.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1258.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1258.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1258.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/from.windows-1258.php diff --git a/plugins/vendor/symfony/polyfill-iconv/Resources/charset/translit.php b/libs/vendor/symfony/polyfill-iconv/Resources/charset/translit.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/Resources/charset/translit.php rename to libs/vendor/symfony/polyfill-iconv/Resources/charset/translit.php diff --git a/plugins/vendor/symfony/polyfill-iconv/bootstrap.php b/libs/vendor/symfony/polyfill-iconv/bootstrap.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/bootstrap.php rename to libs/vendor/symfony/polyfill-iconv/bootstrap.php diff --git a/plugins/vendor/symfony/polyfill-iconv/bootstrap80.php b/libs/vendor/symfony/polyfill-iconv/bootstrap80.php similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/bootstrap80.php rename to libs/vendor/symfony/polyfill-iconv/bootstrap80.php diff --git a/plugins/vendor/symfony/polyfill-iconv/composer.json b/libs/vendor/symfony/polyfill-iconv/composer.json similarity index 100% rename from plugins/vendor/symfony/polyfill-iconv/composer.json rename to libs/vendor/symfony/polyfill-iconv/composer.json diff --git a/plugins/vendor/symfony/polyfill-intl-idn/Idn.php b/libs/vendor/symfony/polyfill-intl-idn/Idn.php similarity index 100% rename from plugins/vendor/symfony/polyfill-intl-idn/Idn.php rename to libs/vendor/symfony/polyfill-intl-idn/Idn.php diff --git a/plugins/vendor/symfony/polyfill-intl-idn/Info.php b/libs/vendor/symfony/polyfill-intl-idn/Info.php similarity index 100% rename from plugins/vendor/symfony/polyfill-intl-idn/Info.php rename to libs/vendor/symfony/polyfill-intl-idn/Info.php diff --git a/plugins/vendor/symfony/polyfill-intl-idn/LICENSE b/libs/vendor/symfony/polyfill-intl-idn/LICENSE similarity index 100% rename from plugins/vendor/symfony/polyfill-intl-idn/LICENSE rename to libs/vendor/symfony/polyfill-intl-idn/LICENSE diff --git a/plugins/vendor/symfony/polyfill-intl-idn/README.md b/libs/vendor/symfony/polyfill-intl-idn/README.md similarity index 100% rename from plugins/vendor/symfony/polyfill-intl-idn/README.md rename to libs/vendor/symfony/polyfill-intl-idn/README.md diff --git a/plugins/vendor/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php b/libs/vendor/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php similarity index 100% rename from plugins/vendor/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php rename to libs/vendor/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php diff --git a/plugins/vendor/symfony/polyfill-intl-idn/Resources/unidata/Regex.php b/libs/vendor/symfony/polyfill-intl-idn/Resources/unidata/Regex.php similarity index 100% rename from plugins/vendor/symfony/polyfill-intl-idn/Resources/unidata/Regex.php rename to libs/vendor/symfony/polyfill-intl-idn/Resources/unidata/Regex.php diff --git a/plugins/vendor/symfony/polyfill-intl-idn/Resources/unidata/deviation.php b/libs/vendor/symfony/polyfill-intl-idn/Resources/unidata/deviation.php similarity index 100% rename from plugins/vendor/symfony/polyfill-intl-idn/Resources/unidata/deviation.php rename to libs/vendor/symfony/polyfill-intl-idn/Resources/unidata/deviation.php diff --git a/plugins/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed.php b/libs/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed.php similarity index 100% rename from plugins/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed.php rename to libs/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed.php diff --git a/plugins/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_mapped.php b/libs/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_mapped.php similarity index 100% rename from plugins/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_mapped.php rename to libs/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_mapped.php diff --git a/plugins/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_valid.php b/libs/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_valid.php similarity index 100% rename from plugins/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_valid.php rename to libs/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_valid.php diff --git a/plugins/vendor/symfony/polyfill-intl-idn/Resources/unidata/ignored.php b/libs/vendor/symfony/polyfill-intl-idn/Resources/unidata/ignored.php similarity index 100% rename from plugins/vendor/symfony/polyfill-intl-idn/Resources/unidata/ignored.php rename to libs/vendor/symfony/polyfill-intl-idn/Resources/unidata/ignored.php diff --git a/plugins/vendor/symfony/polyfill-intl-idn/Resources/unidata/mapped.php b/libs/vendor/symfony/polyfill-intl-idn/Resources/unidata/mapped.php similarity index 100% rename from plugins/vendor/symfony/polyfill-intl-idn/Resources/unidata/mapped.php rename to libs/vendor/symfony/polyfill-intl-idn/Resources/unidata/mapped.php diff --git a/plugins/vendor/symfony/polyfill-intl-idn/Resources/unidata/virama.php b/libs/vendor/symfony/polyfill-intl-idn/Resources/unidata/virama.php similarity index 100% rename from plugins/vendor/symfony/polyfill-intl-idn/Resources/unidata/virama.php rename to libs/vendor/symfony/polyfill-intl-idn/Resources/unidata/virama.php diff --git a/plugins/vendor/symfony/polyfill-intl-idn/bootstrap.php b/libs/vendor/symfony/polyfill-intl-idn/bootstrap.php similarity index 100% rename from plugins/vendor/symfony/polyfill-intl-idn/bootstrap.php rename to libs/vendor/symfony/polyfill-intl-idn/bootstrap.php diff --git a/plugins/vendor/symfony/polyfill-intl-idn/bootstrap80.php b/libs/vendor/symfony/polyfill-intl-idn/bootstrap80.php similarity index 100% rename from plugins/vendor/symfony/polyfill-intl-idn/bootstrap80.php rename to libs/vendor/symfony/polyfill-intl-idn/bootstrap80.php diff --git a/plugins/vendor/symfony/polyfill-intl-idn/composer.json b/libs/vendor/symfony/polyfill-intl-idn/composer.json similarity index 100% rename from plugins/vendor/symfony/polyfill-intl-idn/composer.json rename to libs/vendor/symfony/polyfill-intl-idn/composer.json diff --git a/plugins/vendor/symfony/polyfill-intl-normalizer/LICENSE b/libs/vendor/symfony/polyfill-intl-normalizer/LICENSE similarity index 100% rename from plugins/vendor/symfony/polyfill-intl-normalizer/LICENSE rename to libs/vendor/symfony/polyfill-intl-normalizer/LICENSE diff --git a/plugins/vendor/symfony/polyfill-intl-normalizer/Normalizer.php b/libs/vendor/symfony/polyfill-intl-normalizer/Normalizer.php similarity index 100% rename from plugins/vendor/symfony/polyfill-intl-normalizer/Normalizer.php rename to libs/vendor/symfony/polyfill-intl-normalizer/Normalizer.php diff --git a/plugins/vendor/symfony/polyfill-intl-normalizer/README.md b/libs/vendor/symfony/polyfill-intl-normalizer/README.md similarity index 100% rename from plugins/vendor/symfony/polyfill-intl-normalizer/README.md rename to libs/vendor/symfony/polyfill-intl-normalizer/README.md diff --git a/plugins/vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php b/libs/vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php similarity index 100% rename from plugins/vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php rename to libs/vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php diff --git a/plugins/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalComposition.php b/libs/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalComposition.php similarity index 100% rename from plugins/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalComposition.php rename to libs/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalComposition.php diff --git a/plugins/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php b/libs/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php similarity index 100% rename from plugins/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php rename to libs/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php diff --git a/plugins/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php b/libs/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php similarity index 100% rename from plugins/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php rename to libs/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php diff --git a/plugins/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php b/libs/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php similarity index 100% rename from plugins/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php rename to libs/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php diff --git a/plugins/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/rawCanonicalDecomposition.php b/libs/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/rawCanonicalDecomposition.php similarity index 100% rename from plugins/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/rawCanonicalDecomposition.php rename to libs/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/rawCanonicalDecomposition.php diff --git a/plugins/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/rawCompatibilityDecomposition.php b/libs/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/rawCompatibilityDecomposition.php similarity index 100% rename from plugins/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/rawCompatibilityDecomposition.php rename to libs/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/rawCompatibilityDecomposition.php diff --git a/plugins/vendor/symfony/polyfill-intl-normalizer/bootstrap.php b/libs/vendor/symfony/polyfill-intl-normalizer/bootstrap.php similarity index 100% rename from plugins/vendor/symfony/polyfill-intl-normalizer/bootstrap.php rename to libs/vendor/symfony/polyfill-intl-normalizer/bootstrap.php diff --git a/plugins/vendor/symfony/polyfill-intl-normalizer/bootstrap80.php b/libs/vendor/symfony/polyfill-intl-normalizer/bootstrap80.php similarity index 100% rename from plugins/vendor/symfony/polyfill-intl-normalizer/bootstrap80.php rename to libs/vendor/symfony/polyfill-intl-normalizer/bootstrap80.php diff --git a/plugins/vendor/symfony/polyfill-intl-normalizer/composer.json b/libs/vendor/symfony/polyfill-intl-normalizer/composer.json similarity index 100% rename from plugins/vendor/symfony/polyfill-intl-normalizer/composer.json rename to libs/vendor/symfony/polyfill-intl-normalizer/composer.json diff --git a/plugins/vendor/symfony/polyfill-mbstring/LICENSE b/libs/vendor/symfony/polyfill-mbstring/LICENSE similarity index 100% rename from plugins/vendor/symfony/polyfill-mbstring/LICENSE rename to libs/vendor/symfony/polyfill-mbstring/LICENSE diff --git a/plugins/vendor/symfony/polyfill-mbstring/Mbstring.php b/libs/vendor/symfony/polyfill-mbstring/Mbstring.php similarity index 100% rename from plugins/vendor/symfony/polyfill-mbstring/Mbstring.php rename to libs/vendor/symfony/polyfill-mbstring/Mbstring.php diff --git a/plugins/vendor/symfony/polyfill-mbstring/README.md b/libs/vendor/symfony/polyfill-mbstring/README.md similarity index 100% rename from plugins/vendor/symfony/polyfill-mbstring/README.md rename to libs/vendor/symfony/polyfill-mbstring/README.md diff --git a/plugins/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php b/libs/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php similarity index 100% rename from plugins/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php rename to libs/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php diff --git a/plugins/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php b/libs/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php similarity index 100% rename from plugins/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php rename to libs/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php diff --git a/plugins/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php b/libs/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php similarity index 100% rename from plugins/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php rename to libs/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php diff --git a/plugins/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php b/libs/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php similarity index 100% rename from plugins/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php rename to libs/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php diff --git a/plugins/vendor/symfony/polyfill-mbstring/bootstrap.php b/libs/vendor/symfony/polyfill-mbstring/bootstrap.php similarity index 100% rename from plugins/vendor/symfony/polyfill-mbstring/bootstrap.php rename to libs/vendor/symfony/polyfill-mbstring/bootstrap.php diff --git a/plugins/vendor/symfony/polyfill-mbstring/bootstrap72.php b/libs/vendor/symfony/polyfill-mbstring/bootstrap72.php similarity index 100% rename from plugins/vendor/symfony/polyfill-mbstring/bootstrap72.php rename to libs/vendor/symfony/polyfill-mbstring/bootstrap72.php diff --git a/plugins/vendor/symfony/polyfill-mbstring/bootstrap80.php b/libs/vendor/symfony/polyfill-mbstring/bootstrap80.php similarity index 100% rename from plugins/vendor/symfony/polyfill-mbstring/bootstrap80.php rename to libs/vendor/symfony/polyfill-mbstring/bootstrap80.php diff --git a/plugins/vendor/symfony/polyfill-mbstring/composer.json b/libs/vendor/symfony/polyfill-mbstring/composer.json similarity index 100% rename from plugins/vendor/symfony/polyfill-mbstring/composer.json rename to libs/vendor/symfony/polyfill-mbstring/composer.json diff --git a/plugins/vendor/symfony/polyfill-php80/LICENSE b/libs/vendor/symfony/polyfill-php80/LICENSE similarity index 100% rename from plugins/vendor/symfony/polyfill-php80/LICENSE rename to libs/vendor/symfony/polyfill-php80/LICENSE diff --git a/plugins/vendor/symfony/polyfill-php80/Php80.php b/libs/vendor/symfony/polyfill-php80/Php80.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php80/Php80.php rename to libs/vendor/symfony/polyfill-php80/Php80.php diff --git a/plugins/vendor/symfony/polyfill-php80/PhpToken.php b/libs/vendor/symfony/polyfill-php80/PhpToken.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php80/PhpToken.php rename to libs/vendor/symfony/polyfill-php80/PhpToken.php diff --git a/plugins/vendor/symfony/polyfill-php80/README.md b/libs/vendor/symfony/polyfill-php80/README.md similarity index 100% rename from plugins/vendor/symfony/polyfill-php80/README.md rename to libs/vendor/symfony/polyfill-php80/README.md diff --git a/plugins/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php b/libs/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php rename to libs/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php diff --git a/plugins/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php b/libs/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php rename to libs/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php diff --git a/plugins/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php b/libs/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php rename to libs/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php diff --git a/plugins/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php b/libs/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php rename to libs/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php diff --git a/plugins/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php b/libs/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php rename to libs/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php diff --git a/plugins/vendor/symfony/polyfill-php80/bootstrap.php b/libs/vendor/symfony/polyfill-php80/bootstrap.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php80/bootstrap.php rename to libs/vendor/symfony/polyfill-php80/bootstrap.php diff --git a/plugins/vendor/symfony/polyfill-php80/composer.json b/libs/vendor/symfony/polyfill-php80/composer.json similarity index 100% rename from plugins/vendor/symfony/polyfill-php80/composer.json rename to libs/vendor/symfony/polyfill-php80/composer.json diff --git a/plugins/vendor/symfony/polyfill-php83/LICENSE b/libs/vendor/symfony/polyfill-php83/LICENSE similarity index 100% rename from plugins/vendor/symfony/polyfill-php83/LICENSE rename to libs/vendor/symfony/polyfill-php83/LICENSE diff --git a/plugins/vendor/symfony/polyfill-php83/Php83.php b/libs/vendor/symfony/polyfill-php83/Php83.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php83/Php83.php rename to libs/vendor/symfony/polyfill-php83/Php83.php diff --git a/plugins/vendor/symfony/polyfill-php83/README.md b/libs/vendor/symfony/polyfill-php83/README.md similarity index 100% rename from plugins/vendor/symfony/polyfill-php83/README.md rename to libs/vendor/symfony/polyfill-php83/README.md diff --git a/plugins/vendor/symfony/polyfill-php83/Resources/stubs/DateError.php b/libs/vendor/symfony/polyfill-php83/Resources/stubs/DateError.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php83/Resources/stubs/DateError.php rename to libs/vendor/symfony/polyfill-php83/Resources/stubs/DateError.php diff --git a/plugins/vendor/symfony/polyfill-php83/Resources/stubs/DateException.php b/libs/vendor/symfony/polyfill-php83/Resources/stubs/DateException.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php83/Resources/stubs/DateException.php rename to libs/vendor/symfony/polyfill-php83/Resources/stubs/DateException.php diff --git a/plugins/vendor/symfony/polyfill-php83/Resources/stubs/DateInvalidOperationException.php b/libs/vendor/symfony/polyfill-php83/Resources/stubs/DateInvalidOperationException.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php83/Resources/stubs/DateInvalidOperationException.php rename to libs/vendor/symfony/polyfill-php83/Resources/stubs/DateInvalidOperationException.php diff --git a/plugins/vendor/symfony/polyfill-php83/Resources/stubs/DateInvalidTimeZoneException.php b/libs/vendor/symfony/polyfill-php83/Resources/stubs/DateInvalidTimeZoneException.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php83/Resources/stubs/DateInvalidTimeZoneException.php rename to libs/vendor/symfony/polyfill-php83/Resources/stubs/DateInvalidTimeZoneException.php diff --git a/plugins/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedIntervalStringException.php b/libs/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedIntervalStringException.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedIntervalStringException.php rename to libs/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedIntervalStringException.php diff --git a/plugins/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedPeriodStringException.php b/libs/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedPeriodStringException.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedPeriodStringException.php rename to libs/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedPeriodStringException.php diff --git a/plugins/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedStringException.php b/libs/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedStringException.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedStringException.php rename to libs/vendor/symfony/polyfill-php83/Resources/stubs/DateMalformedStringException.php diff --git a/plugins/vendor/symfony/polyfill-php83/Resources/stubs/DateObjectError.php b/libs/vendor/symfony/polyfill-php83/Resources/stubs/DateObjectError.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php83/Resources/stubs/DateObjectError.php rename to libs/vendor/symfony/polyfill-php83/Resources/stubs/DateObjectError.php diff --git a/plugins/vendor/symfony/polyfill-php83/Resources/stubs/DateRangeError.php b/libs/vendor/symfony/polyfill-php83/Resources/stubs/DateRangeError.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php83/Resources/stubs/DateRangeError.php rename to libs/vendor/symfony/polyfill-php83/Resources/stubs/DateRangeError.php diff --git a/plugins/vendor/symfony/polyfill-php83/Resources/stubs/Override.php b/libs/vendor/symfony/polyfill-php83/Resources/stubs/Override.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php83/Resources/stubs/Override.php rename to libs/vendor/symfony/polyfill-php83/Resources/stubs/Override.php diff --git a/plugins/vendor/symfony/polyfill-php83/Resources/stubs/SQLite3Exception.php b/libs/vendor/symfony/polyfill-php83/Resources/stubs/SQLite3Exception.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php83/Resources/stubs/SQLite3Exception.php rename to libs/vendor/symfony/polyfill-php83/Resources/stubs/SQLite3Exception.php diff --git a/plugins/vendor/symfony/polyfill-php83/bootstrap.php b/libs/vendor/symfony/polyfill-php83/bootstrap.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php83/bootstrap.php rename to libs/vendor/symfony/polyfill-php83/bootstrap.php diff --git a/plugins/vendor/symfony/polyfill-php83/bootstrap72.php b/libs/vendor/symfony/polyfill-php83/bootstrap72.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php83/bootstrap72.php rename to libs/vendor/symfony/polyfill-php83/bootstrap72.php diff --git a/plugins/vendor/symfony/polyfill-php83/bootstrap81.php b/libs/vendor/symfony/polyfill-php83/bootstrap81.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php83/bootstrap81.php rename to libs/vendor/symfony/polyfill-php83/bootstrap81.php diff --git a/plugins/vendor/symfony/polyfill-php83/composer.json b/libs/vendor/symfony/polyfill-php83/composer.json similarity index 100% rename from plugins/vendor/symfony/polyfill-php83/composer.json rename to libs/vendor/symfony/polyfill-php83/composer.json diff --git a/plugins/vendor/symfony/polyfill-php84/LICENSE b/libs/vendor/symfony/polyfill-php84/LICENSE similarity index 100% rename from plugins/vendor/symfony/polyfill-php84/LICENSE rename to libs/vendor/symfony/polyfill-php84/LICENSE diff --git a/plugins/vendor/symfony/polyfill-php84/Php84.php b/libs/vendor/symfony/polyfill-php84/Php84.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php84/Php84.php rename to libs/vendor/symfony/polyfill-php84/Php84.php diff --git a/plugins/vendor/symfony/polyfill-php84/README.md b/libs/vendor/symfony/polyfill-php84/README.md similarity index 100% rename from plugins/vendor/symfony/polyfill-php84/README.md rename to libs/vendor/symfony/polyfill-php84/README.md diff --git a/plugins/vendor/symfony/polyfill-php84/Resources/Deprecated.php b/libs/vendor/symfony/polyfill-php84/Resources/Deprecated.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php84/Resources/Deprecated.php rename to libs/vendor/symfony/polyfill-php84/Resources/Deprecated.php diff --git a/plugins/vendor/symfony/polyfill-php84/Resources/RoundingMode.php b/libs/vendor/symfony/polyfill-php84/Resources/RoundingMode.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php84/Resources/RoundingMode.php rename to libs/vendor/symfony/polyfill-php84/Resources/RoundingMode.php diff --git a/plugins/vendor/symfony/polyfill-php84/Resources/stubs/Deprecated.php b/libs/vendor/symfony/polyfill-php84/Resources/stubs/Deprecated.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php84/Resources/stubs/Deprecated.php rename to libs/vendor/symfony/polyfill-php84/Resources/stubs/Deprecated.php diff --git a/plugins/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Dblib.php b/libs/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Dblib.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Dblib.php rename to libs/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Dblib.php diff --git a/plugins/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Firebird.php b/libs/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Firebird.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Firebird.php rename to libs/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Firebird.php diff --git a/plugins/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Mysql.php b/libs/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Mysql.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Mysql.php rename to libs/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Mysql.php diff --git a/plugins/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Odbc.php b/libs/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Odbc.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Odbc.php rename to libs/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Odbc.php diff --git a/plugins/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Pgsql.php b/libs/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Pgsql.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Pgsql.php rename to libs/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Pgsql.php diff --git a/plugins/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Sqlite.php b/libs/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Sqlite.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Sqlite.php rename to libs/vendor/symfony/polyfill-php84/Resources/stubs/Pdo/Sqlite.php diff --git a/plugins/vendor/symfony/polyfill-php84/Resources/stubs/ReflectionConstant.php b/libs/vendor/symfony/polyfill-php84/Resources/stubs/ReflectionConstant.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php84/Resources/stubs/ReflectionConstant.php rename to libs/vendor/symfony/polyfill-php84/Resources/stubs/ReflectionConstant.php diff --git a/plugins/vendor/symfony/polyfill-php84/Resources/stubs/RoundingMode.php b/libs/vendor/symfony/polyfill-php84/Resources/stubs/RoundingMode.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php84/Resources/stubs/RoundingMode.php rename to libs/vendor/symfony/polyfill-php84/Resources/stubs/RoundingMode.php diff --git a/plugins/vendor/symfony/polyfill-php84/bootstrap.php b/libs/vendor/symfony/polyfill-php84/bootstrap.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php84/bootstrap.php rename to libs/vendor/symfony/polyfill-php84/bootstrap.php diff --git a/plugins/vendor/symfony/polyfill-php84/bootstrap72.php b/libs/vendor/symfony/polyfill-php84/bootstrap72.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php84/bootstrap72.php rename to libs/vendor/symfony/polyfill-php84/bootstrap72.php diff --git a/plugins/vendor/symfony/polyfill-php84/bootstrap82.php b/libs/vendor/symfony/polyfill-php84/bootstrap82.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php84/bootstrap82.php rename to libs/vendor/symfony/polyfill-php84/bootstrap82.php diff --git a/plugins/vendor/symfony/polyfill-php84/composer.json b/libs/vendor/symfony/polyfill-php84/composer.json similarity index 100% rename from plugins/vendor/symfony/polyfill-php84/composer.json rename to libs/vendor/symfony/polyfill-php84/composer.json diff --git a/plugins/vendor/symfony/polyfill-php85/LICENSE b/libs/vendor/symfony/polyfill-php85/LICENSE similarity index 100% rename from plugins/vendor/symfony/polyfill-php85/LICENSE rename to libs/vendor/symfony/polyfill-php85/LICENSE diff --git a/plugins/vendor/symfony/polyfill-php85/Php85.php b/libs/vendor/symfony/polyfill-php85/Php85.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php85/Php85.php rename to libs/vendor/symfony/polyfill-php85/Php85.php diff --git a/plugins/vendor/symfony/polyfill-php85/README.md b/libs/vendor/symfony/polyfill-php85/README.md similarity index 100% rename from plugins/vendor/symfony/polyfill-php85/README.md rename to libs/vendor/symfony/polyfill-php85/README.md diff --git a/plugins/vendor/symfony/polyfill-php85/Resources/stubs/DelayedTargetValidation.php b/libs/vendor/symfony/polyfill-php85/Resources/stubs/DelayedTargetValidation.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php85/Resources/stubs/DelayedTargetValidation.php rename to libs/vendor/symfony/polyfill-php85/Resources/stubs/DelayedTargetValidation.php diff --git a/plugins/vendor/symfony/polyfill-php85/Resources/stubs/Filter/FilterException.php b/libs/vendor/symfony/polyfill-php85/Resources/stubs/Filter/FilterException.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php85/Resources/stubs/Filter/FilterException.php rename to libs/vendor/symfony/polyfill-php85/Resources/stubs/Filter/FilterException.php diff --git a/plugins/vendor/symfony/polyfill-php85/Resources/stubs/Filter/FilterFailedException.php b/libs/vendor/symfony/polyfill-php85/Resources/stubs/Filter/FilterFailedException.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php85/Resources/stubs/Filter/FilterFailedException.php rename to libs/vendor/symfony/polyfill-php85/Resources/stubs/Filter/FilterFailedException.php diff --git a/plugins/vendor/symfony/polyfill-php85/Resources/stubs/NoDiscard.php b/libs/vendor/symfony/polyfill-php85/Resources/stubs/NoDiscard.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php85/Resources/stubs/NoDiscard.php rename to libs/vendor/symfony/polyfill-php85/Resources/stubs/NoDiscard.php diff --git a/plugins/vendor/symfony/polyfill-php85/bootstrap.php b/libs/vendor/symfony/polyfill-php85/bootstrap.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php85/bootstrap.php rename to libs/vendor/symfony/polyfill-php85/bootstrap.php diff --git a/plugins/vendor/symfony/polyfill-php85/bootstrap80.php b/libs/vendor/symfony/polyfill-php85/bootstrap80.php similarity index 100% rename from plugins/vendor/symfony/polyfill-php85/bootstrap80.php rename to libs/vendor/symfony/polyfill-php85/bootstrap80.php diff --git a/plugins/vendor/symfony/polyfill-php85/composer.json b/libs/vendor/symfony/polyfill-php85/composer.json similarity index 100% rename from plugins/vendor/symfony/polyfill-php85/composer.json rename to libs/vendor/symfony/polyfill-php85/composer.json diff --git a/plugins/vendor/symfony/translation-contracts/CHANGELOG.md b/libs/vendor/symfony/translation-contracts/CHANGELOG.md similarity index 100% rename from plugins/vendor/symfony/translation-contracts/CHANGELOG.md rename to libs/vendor/symfony/translation-contracts/CHANGELOG.md diff --git a/plugins/vendor/symfony/translation-contracts/LICENSE b/libs/vendor/symfony/translation-contracts/LICENSE similarity index 100% rename from plugins/vendor/symfony/translation-contracts/LICENSE rename to libs/vendor/symfony/translation-contracts/LICENSE diff --git a/plugins/vendor/symfony/translation-contracts/LocaleAwareInterface.php b/libs/vendor/symfony/translation-contracts/LocaleAwareInterface.php similarity index 100% rename from plugins/vendor/symfony/translation-contracts/LocaleAwareInterface.php rename to libs/vendor/symfony/translation-contracts/LocaleAwareInterface.php diff --git a/plugins/vendor/symfony/translation-contracts/README.md b/libs/vendor/symfony/translation-contracts/README.md similarity index 100% rename from plugins/vendor/symfony/translation-contracts/README.md rename to libs/vendor/symfony/translation-contracts/README.md diff --git a/plugins/vendor/symfony/translation-contracts/Test/TranslatorTest.php b/libs/vendor/symfony/translation-contracts/Test/TranslatorTest.php similarity index 100% rename from plugins/vendor/symfony/translation-contracts/Test/TranslatorTest.php rename to libs/vendor/symfony/translation-contracts/Test/TranslatorTest.php diff --git a/plugins/vendor/symfony/translation-contracts/TranslatableInterface.php b/libs/vendor/symfony/translation-contracts/TranslatableInterface.php similarity index 100% rename from plugins/vendor/symfony/translation-contracts/TranslatableInterface.php rename to libs/vendor/symfony/translation-contracts/TranslatableInterface.php diff --git a/plugins/vendor/symfony/translation-contracts/TranslatorInterface.php b/libs/vendor/symfony/translation-contracts/TranslatorInterface.php similarity index 100% rename from plugins/vendor/symfony/translation-contracts/TranslatorInterface.php rename to libs/vendor/symfony/translation-contracts/TranslatorInterface.php diff --git a/plugins/vendor/symfony/translation-contracts/TranslatorTrait.php b/libs/vendor/symfony/translation-contracts/TranslatorTrait.php similarity index 100% rename from plugins/vendor/symfony/translation-contracts/TranslatorTrait.php rename to libs/vendor/symfony/translation-contracts/TranslatorTrait.php diff --git a/plugins/vendor/symfony/translation-contracts/composer.json b/libs/vendor/symfony/translation-contracts/composer.json similarity index 100% rename from plugins/vendor/symfony/translation-contracts/composer.json rename to libs/vendor/symfony/translation-contracts/composer.json diff --git a/plugins/vendor/symfony/translation/CHANGELOG.md b/libs/vendor/symfony/translation/CHANGELOG.md similarity index 100% rename from plugins/vendor/symfony/translation/CHANGELOG.md rename to libs/vendor/symfony/translation/CHANGELOG.md diff --git a/plugins/vendor/symfony/translation/Catalogue/AbstractOperation.php b/libs/vendor/symfony/translation/Catalogue/AbstractOperation.php similarity index 100% rename from plugins/vendor/symfony/translation/Catalogue/AbstractOperation.php rename to libs/vendor/symfony/translation/Catalogue/AbstractOperation.php diff --git a/plugins/vendor/symfony/translation/Catalogue/MergeOperation.php b/libs/vendor/symfony/translation/Catalogue/MergeOperation.php similarity index 100% rename from plugins/vendor/symfony/translation/Catalogue/MergeOperation.php rename to libs/vendor/symfony/translation/Catalogue/MergeOperation.php diff --git a/plugins/vendor/symfony/translation/Catalogue/OperationInterface.php b/libs/vendor/symfony/translation/Catalogue/OperationInterface.php similarity index 100% rename from plugins/vendor/symfony/translation/Catalogue/OperationInterface.php rename to libs/vendor/symfony/translation/Catalogue/OperationInterface.php diff --git a/plugins/vendor/symfony/translation/Catalogue/TargetOperation.php b/libs/vendor/symfony/translation/Catalogue/TargetOperation.php similarity index 100% rename from plugins/vendor/symfony/translation/Catalogue/TargetOperation.php rename to libs/vendor/symfony/translation/Catalogue/TargetOperation.php diff --git a/plugins/vendor/symfony/translation/CatalogueMetadataAwareInterface.php b/libs/vendor/symfony/translation/CatalogueMetadataAwareInterface.php similarity index 100% rename from plugins/vendor/symfony/translation/CatalogueMetadataAwareInterface.php rename to libs/vendor/symfony/translation/CatalogueMetadataAwareInterface.php diff --git a/plugins/vendor/symfony/translation/Command/TranslationLintCommand.php b/libs/vendor/symfony/translation/Command/TranslationLintCommand.php similarity index 100% rename from plugins/vendor/symfony/translation/Command/TranslationLintCommand.php rename to libs/vendor/symfony/translation/Command/TranslationLintCommand.php diff --git a/plugins/vendor/symfony/translation/Command/TranslationPullCommand.php b/libs/vendor/symfony/translation/Command/TranslationPullCommand.php similarity index 100% rename from plugins/vendor/symfony/translation/Command/TranslationPullCommand.php rename to libs/vendor/symfony/translation/Command/TranslationPullCommand.php diff --git a/plugins/vendor/symfony/translation/Command/TranslationPushCommand.php b/libs/vendor/symfony/translation/Command/TranslationPushCommand.php similarity index 100% rename from plugins/vendor/symfony/translation/Command/TranslationPushCommand.php rename to libs/vendor/symfony/translation/Command/TranslationPushCommand.php diff --git a/plugins/vendor/symfony/translation/Command/TranslationTrait.php b/libs/vendor/symfony/translation/Command/TranslationTrait.php similarity index 100% rename from plugins/vendor/symfony/translation/Command/TranslationTrait.php rename to libs/vendor/symfony/translation/Command/TranslationTrait.php diff --git a/plugins/vendor/symfony/translation/Command/XliffLintCommand.php b/libs/vendor/symfony/translation/Command/XliffLintCommand.php similarity index 100% rename from plugins/vendor/symfony/translation/Command/XliffLintCommand.php rename to libs/vendor/symfony/translation/Command/XliffLintCommand.php diff --git a/plugins/vendor/symfony/translation/DataCollector/TranslationDataCollector.php b/libs/vendor/symfony/translation/DataCollector/TranslationDataCollector.php similarity index 100% rename from plugins/vendor/symfony/translation/DataCollector/TranslationDataCollector.php rename to libs/vendor/symfony/translation/DataCollector/TranslationDataCollector.php diff --git a/plugins/vendor/symfony/translation/DataCollectorTranslator.php b/libs/vendor/symfony/translation/DataCollectorTranslator.php similarity index 100% rename from plugins/vendor/symfony/translation/DataCollectorTranslator.php rename to libs/vendor/symfony/translation/DataCollectorTranslator.php diff --git a/plugins/vendor/symfony/translation/DependencyInjection/DataCollectorTranslatorPass.php b/libs/vendor/symfony/translation/DependencyInjection/DataCollectorTranslatorPass.php similarity index 100% rename from plugins/vendor/symfony/translation/DependencyInjection/DataCollectorTranslatorPass.php rename to libs/vendor/symfony/translation/DependencyInjection/DataCollectorTranslatorPass.php diff --git a/plugins/vendor/symfony/translation/DependencyInjection/LoggingTranslatorPass.php b/libs/vendor/symfony/translation/DependencyInjection/LoggingTranslatorPass.php similarity index 100% rename from plugins/vendor/symfony/translation/DependencyInjection/LoggingTranslatorPass.php rename to libs/vendor/symfony/translation/DependencyInjection/LoggingTranslatorPass.php diff --git a/plugins/vendor/symfony/translation/DependencyInjection/TranslationDumperPass.php b/libs/vendor/symfony/translation/DependencyInjection/TranslationDumperPass.php similarity index 100% rename from plugins/vendor/symfony/translation/DependencyInjection/TranslationDumperPass.php rename to libs/vendor/symfony/translation/DependencyInjection/TranslationDumperPass.php diff --git a/plugins/vendor/symfony/translation/DependencyInjection/TranslationExtractorPass.php b/libs/vendor/symfony/translation/DependencyInjection/TranslationExtractorPass.php similarity index 100% rename from plugins/vendor/symfony/translation/DependencyInjection/TranslationExtractorPass.php rename to libs/vendor/symfony/translation/DependencyInjection/TranslationExtractorPass.php diff --git a/plugins/vendor/symfony/translation/DependencyInjection/TranslatorPass.php b/libs/vendor/symfony/translation/DependencyInjection/TranslatorPass.php similarity index 100% rename from plugins/vendor/symfony/translation/DependencyInjection/TranslatorPass.php rename to libs/vendor/symfony/translation/DependencyInjection/TranslatorPass.php diff --git a/plugins/vendor/symfony/translation/DependencyInjection/TranslatorPathsPass.php b/libs/vendor/symfony/translation/DependencyInjection/TranslatorPathsPass.php similarity index 100% rename from plugins/vendor/symfony/translation/DependencyInjection/TranslatorPathsPass.php rename to libs/vendor/symfony/translation/DependencyInjection/TranslatorPathsPass.php diff --git a/plugins/vendor/symfony/translation/Dumper/CsvFileDumper.php b/libs/vendor/symfony/translation/Dumper/CsvFileDumper.php similarity index 100% rename from plugins/vendor/symfony/translation/Dumper/CsvFileDumper.php rename to libs/vendor/symfony/translation/Dumper/CsvFileDumper.php diff --git a/plugins/vendor/symfony/translation/Dumper/DumperInterface.php b/libs/vendor/symfony/translation/Dumper/DumperInterface.php similarity index 100% rename from plugins/vendor/symfony/translation/Dumper/DumperInterface.php rename to libs/vendor/symfony/translation/Dumper/DumperInterface.php diff --git a/plugins/vendor/symfony/translation/Dumper/FileDumper.php b/libs/vendor/symfony/translation/Dumper/FileDumper.php similarity index 100% rename from plugins/vendor/symfony/translation/Dumper/FileDumper.php rename to libs/vendor/symfony/translation/Dumper/FileDumper.php diff --git a/plugins/vendor/symfony/translation/Dumper/IcuResFileDumper.php b/libs/vendor/symfony/translation/Dumper/IcuResFileDumper.php similarity index 100% rename from plugins/vendor/symfony/translation/Dumper/IcuResFileDumper.php rename to libs/vendor/symfony/translation/Dumper/IcuResFileDumper.php diff --git a/plugins/vendor/symfony/translation/Dumper/IniFileDumper.php b/libs/vendor/symfony/translation/Dumper/IniFileDumper.php similarity index 100% rename from plugins/vendor/symfony/translation/Dumper/IniFileDumper.php rename to libs/vendor/symfony/translation/Dumper/IniFileDumper.php diff --git a/plugins/vendor/symfony/translation/Dumper/JsonFileDumper.php b/libs/vendor/symfony/translation/Dumper/JsonFileDumper.php similarity index 100% rename from plugins/vendor/symfony/translation/Dumper/JsonFileDumper.php rename to libs/vendor/symfony/translation/Dumper/JsonFileDumper.php diff --git a/plugins/vendor/symfony/translation/Dumper/MoFileDumper.php b/libs/vendor/symfony/translation/Dumper/MoFileDumper.php similarity index 100% rename from plugins/vendor/symfony/translation/Dumper/MoFileDumper.php rename to libs/vendor/symfony/translation/Dumper/MoFileDumper.php diff --git a/plugins/vendor/symfony/translation/Dumper/PhpFileDumper.php b/libs/vendor/symfony/translation/Dumper/PhpFileDumper.php similarity index 100% rename from plugins/vendor/symfony/translation/Dumper/PhpFileDumper.php rename to libs/vendor/symfony/translation/Dumper/PhpFileDumper.php diff --git a/plugins/vendor/symfony/translation/Dumper/PoFileDumper.php b/libs/vendor/symfony/translation/Dumper/PoFileDumper.php similarity index 100% rename from plugins/vendor/symfony/translation/Dumper/PoFileDumper.php rename to libs/vendor/symfony/translation/Dumper/PoFileDumper.php diff --git a/plugins/vendor/symfony/translation/Dumper/QtFileDumper.php b/libs/vendor/symfony/translation/Dumper/QtFileDumper.php similarity index 100% rename from plugins/vendor/symfony/translation/Dumper/QtFileDumper.php rename to libs/vendor/symfony/translation/Dumper/QtFileDumper.php diff --git a/plugins/vendor/symfony/translation/Dumper/XliffFileDumper.php b/libs/vendor/symfony/translation/Dumper/XliffFileDumper.php similarity index 100% rename from plugins/vendor/symfony/translation/Dumper/XliffFileDumper.php rename to libs/vendor/symfony/translation/Dumper/XliffFileDumper.php diff --git a/plugins/vendor/symfony/translation/Dumper/YamlFileDumper.php b/libs/vendor/symfony/translation/Dumper/YamlFileDumper.php similarity index 100% rename from plugins/vendor/symfony/translation/Dumper/YamlFileDumper.php rename to libs/vendor/symfony/translation/Dumper/YamlFileDumper.php diff --git a/plugins/vendor/symfony/translation/Exception/ExceptionInterface.php b/libs/vendor/symfony/translation/Exception/ExceptionInterface.php similarity index 100% rename from plugins/vendor/symfony/translation/Exception/ExceptionInterface.php rename to libs/vendor/symfony/translation/Exception/ExceptionInterface.php diff --git a/plugins/vendor/symfony/translation/Exception/IncompleteDsnException.php b/libs/vendor/symfony/translation/Exception/IncompleteDsnException.php similarity index 100% rename from plugins/vendor/symfony/translation/Exception/IncompleteDsnException.php rename to libs/vendor/symfony/translation/Exception/IncompleteDsnException.php diff --git a/plugins/vendor/symfony/translation/Exception/InvalidArgumentException.php b/libs/vendor/symfony/translation/Exception/InvalidArgumentException.php similarity index 100% rename from plugins/vendor/symfony/translation/Exception/InvalidArgumentException.php rename to libs/vendor/symfony/translation/Exception/InvalidArgumentException.php diff --git a/plugins/vendor/symfony/translation/Exception/InvalidResourceException.php b/libs/vendor/symfony/translation/Exception/InvalidResourceException.php similarity index 100% rename from plugins/vendor/symfony/translation/Exception/InvalidResourceException.php rename to libs/vendor/symfony/translation/Exception/InvalidResourceException.php diff --git a/plugins/vendor/symfony/translation/Exception/LogicException.php b/libs/vendor/symfony/translation/Exception/LogicException.php similarity index 100% rename from plugins/vendor/symfony/translation/Exception/LogicException.php rename to libs/vendor/symfony/translation/Exception/LogicException.php diff --git a/plugins/vendor/symfony/translation/Exception/MissingRequiredOptionException.php b/libs/vendor/symfony/translation/Exception/MissingRequiredOptionException.php similarity index 100% rename from plugins/vendor/symfony/translation/Exception/MissingRequiredOptionException.php rename to libs/vendor/symfony/translation/Exception/MissingRequiredOptionException.php diff --git a/plugins/vendor/symfony/translation/Exception/NotFoundResourceException.php b/libs/vendor/symfony/translation/Exception/NotFoundResourceException.php similarity index 100% rename from plugins/vendor/symfony/translation/Exception/NotFoundResourceException.php rename to libs/vendor/symfony/translation/Exception/NotFoundResourceException.php diff --git a/plugins/vendor/symfony/translation/Exception/ProviderException.php b/libs/vendor/symfony/translation/Exception/ProviderException.php similarity index 100% rename from plugins/vendor/symfony/translation/Exception/ProviderException.php rename to libs/vendor/symfony/translation/Exception/ProviderException.php diff --git a/plugins/vendor/symfony/translation/Exception/ProviderExceptionInterface.php b/libs/vendor/symfony/translation/Exception/ProviderExceptionInterface.php similarity index 100% rename from plugins/vendor/symfony/translation/Exception/ProviderExceptionInterface.php rename to libs/vendor/symfony/translation/Exception/ProviderExceptionInterface.php diff --git a/plugins/vendor/symfony/translation/Exception/RuntimeException.php b/libs/vendor/symfony/translation/Exception/RuntimeException.php similarity index 100% rename from plugins/vendor/symfony/translation/Exception/RuntimeException.php rename to libs/vendor/symfony/translation/Exception/RuntimeException.php diff --git a/plugins/vendor/symfony/translation/Exception/UnsupportedSchemeException.php b/libs/vendor/symfony/translation/Exception/UnsupportedSchemeException.php similarity index 100% rename from plugins/vendor/symfony/translation/Exception/UnsupportedSchemeException.php rename to libs/vendor/symfony/translation/Exception/UnsupportedSchemeException.php diff --git a/plugins/vendor/symfony/translation/Extractor/AbstractFileExtractor.php b/libs/vendor/symfony/translation/Extractor/AbstractFileExtractor.php similarity index 100% rename from plugins/vendor/symfony/translation/Extractor/AbstractFileExtractor.php rename to libs/vendor/symfony/translation/Extractor/AbstractFileExtractor.php diff --git a/plugins/vendor/symfony/translation/Extractor/ChainExtractor.php b/libs/vendor/symfony/translation/Extractor/ChainExtractor.php similarity index 100% rename from plugins/vendor/symfony/translation/Extractor/ChainExtractor.php rename to libs/vendor/symfony/translation/Extractor/ChainExtractor.php diff --git a/plugins/vendor/symfony/translation/Extractor/ExtractorInterface.php b/libs/vendor/symfony/translation/Extractor/ExtractorInterface.php similarity index 100% rename from plugins/vendor/symfony/translation/Extractor/ExtractorInterface.php rename to libs/vendor/symfony/translation/Extractor/ExtractorInterface.php diff --git a/plugins/vendor/symfony/translation/Extractor/PhpAstExtractor.php b/libs/vendor/symfony/translation/Extractor/PhpAstExtractor.php similarity index 100% rename from plugins/vendor/symfony/translation/Extractor/PhpAstExtractor.php rename to libs/vendor/symfony/translation/Extractor/PhpAstExtractor.php diff --git a/plugins/vendor/symfony/translation/Extractor/Visitor/AbstractVisitor.php b/libs/vendor/symfony/translation/Extractor/Visitor/AbstractVisitor.php similarity index 100% rename from plugins/vendor/symfony/translation/Extractor/Visitor/AbstractVisitor.php rename to libs/vendor/symfony/translation/Extractor/Visitor/AbstractVisitor.php diff --git a/plugins/vendor/symfony/translation/Extractor/Visitor/ConstraintVisitor.php b/libs/vendor/symfony/translation/Extractor/Visitor/ConstraintVisitor.php similarity index 100% rename from plugins/vendor/symfony/translation/Extractor/Visitor/ConstraintVisitor.php rename to libs/vendor/symfony/translation/Extractor/Visitor/ConstraintVisitor.php diff --git a/plugins/vendor/symfony/translation/Extractor/Visitor/TransMethodVisitor.php b/libs/vendor/symfony/translation/Extractor/Visitor/TransMethodVisitor.php similarity index 100% rename from plugins/vendor/symfony/translation/Extractor/Visitor/TransMethodVisitor.php rename to libs/vendor/symfony/translation/Extractor/Visitor/TransMethodVisitor.php diff --git a/plugins/vendor/symfony/translation/Extractor/Visitor/TranslatableMessageVisitor.php b/libs/vendor/symfony/translation/Extractor/Visitor/TranslatableMessageVisitor.php similarity index 100% rename from plugins/vendor/symfony/translation/Extractor/Visitor/TranslatableMessageVisitor.php rename to libs/vendor/symfony/translation/Extractor/Visitor/TranslatableMessageVisitor.php diff --git a/plugins/vendor/symfony/translation/Formatter/IntlFormatter.php b/libs/vendor/symfony/translation/Formatter/IntlFormatter.php similarity index 100% rename from plugins/vendor/symfony/translation/Formatter/IntlFormatter.php rename to libs/vendor/symfony/translation/Formatter/IntlFormatter.php diff --git a/plugins/vendor/symfony/translation/Formatter/IntlFormatterInterface.php b/libs/vendor/symfony/translation/Formatter/IntlFormatterInterface.php similarity index 100% rename from plugins/vendor/symfony/translation/Formatter/IntlFormatterInterface.php rename to libs/vendor/symfony/translation/Formatter/IntlFormatterInterface.php diff --git a/plugins/vendor/symfony/translation/Formatter/MessageFormatter.php b/libs/vendor/symfony/translation/Formatter/MessageFormatter.php similarity index 100% rename from plugins/vendor/symfony/translation/Formatter/MessageFormatter.php rename to libs/vendor/symfony/translation/Formatter/MessageFormatter.php diff --git a/plugins/vendor/symfony/translation/Formatter/MessageFormatterInterface.php b/libs/vendor/symfony/translation/Formatter/MessageFormatterInterface.php similarity index 100% rename from plugins/vendor/symfony/translation/Formatter/MessageFormatterInterface.php rename to libs/vendor/symfony/translation/Formatter/MessageFormatterInterface.php diff --git a/plugins/vendor/symfony/translation/IdentityTranslator.php b/libs/vendor/symfony/translation/IdentityTranslator.php similarity index 100% rename from plugins/vendor/symfony/translation/IdentityTranslator.php rename to libs/vendor/symfony/translation/IdentityTranslator.php diff --git a/plugins/vendor/symfony/translation/LICENSE b/libs/vendor/symfony/translation/LICENSE similarity index 100% rename from plugins/vendor/symfony/translation/LICENSE rename to libs/vendor/symfony/translation/LICENSE diff --git a/plugins/vendor/symfony/translation/Loader/ArrayLoader.php b/libs/vendor/symfony/translation/Loader/ArrayLoader.php similarity index 100% rename from plugins/vendor/symfony/translation/Loader/ArrayLoader.php rename to libs/vendor/symfony/translation/Loader/ArrayLoader.php diff --git a/plugins/vendor/symfony/translation/Loader/CsvFileLoader.php b/libs/vendor/symfony/translation/Loader/CsvFileLoader.php similarity index 100% rename from plugins/vendor/symfony/translation/Loader/CsvFileLoader.php rename to libs/vendor/symfony/translation/Loader/CsvFileLoader.php diff --git a/plugins/vendor/symfony/translation/Loader/FileLoader.php b/libs/vendor/symfony/translation/Loader/FileLoader.php similarity index 100% rename from plugins/vendor/symfony/translation/Loader/FileLoader.php rename to libs/vendor/symfony/translation/Loader/FileLoader.php diff --git a/plugins/vendor/symfony/translation/Loader/IcuDatFileLoader.php b/libs/vendor/symfony/translation/Loader/IcuDatFileLoader.php similarity index 100% rename from plugins/vendor/symfony/translation/Loader/IcuDatFileLoader.php rename to libs/vendor/symfony/translation/Loader/IcuDatFileLoader.php diff --git a/plugins/vendor/symfony/translation/Loader/IcuResFileLoader.php b/libs/vendor/symfony/translation/Loader/IcuResFileLoader.php similarity index 100% rename from plugins/vendor/symfony/translation/Loader/IcuResFileLoader.php rename to libs/vendor/symfony/translation/Loader/IcuResFileLoader.php diff --git a/plugins/vendor/symfony/translation/Loader/IniFileLoader.php b/libs/vendor/symfony/translation/Loader/IniFileLoader.php similarity index 100% rename from plugins/vendor/symfony/translation/Loader/IniFileLoader.php rename to libs/vendor/symfony/translation/Loader/IniFileLoader.php diff --git a/plugins/vendor/symfony/translation/Loader/JsonFileLoader.php b/libs/vendor/symfony/translation/Loader/JsonFileLoader.php similarity index 100% rename from plugins/vendor/symfony/translation/Loader/JsonFileLoader.php rename to libs/vendor/symfony/translation/Loader/JsonFileLoader.php diff --git a/plugins/vendor/symfony/translation/Loader/LoaderInterface.php b/libs/vendor/symfony/translation/Loader/LoaderInterface.php similarity index 100% rename from plugins/vendor/symfony/translation/Loader/LoaderInterface.php rename to libs/vendor/symfony/translation/Loader/LoaderInterface.php diff --git a/plugins/vendor/symfony/translation/Loader/MoFileLoader.php b/libs/vendor/symfony/translation/Loader/MoFileLoader.php similarity index 100% rename from plugins/vendor/symfony/translation/Loader/MoFileLoader.php rename to libs/vendor/symfony/translation/Loader/MoFileLoader.php diff --git a/plugins/vendor/symfony/translation/Loader/PhpFileLoader.php b/libs/vendor/symfony/translation/Loader/PhpFileLoader.php similarity index 100% rename from plugins/vendor/symfony/translation/Loader/PhpFileLoader.php rename to libs/vendor/symfony/translation/Loader/PhpFileLoader.php diff --git a/plugins/vendor/symfony/translation/Loader/PoFileLoader.php b/libs/vendor/symfony/translation/Loader/PoFileLoader.php similarity index 100% rename from plugins/vendor/symfony/translation/Loader/PoFileLoader.php rename to libs/vendor/symfony/translation/Loader/PoFileLoader.php diff --git a/plugins/vendor/symfony/translation/Loader/QtFileLoader.php b/libs/vendor/symfony/translation/Loader/QtFileLoader.php similarity index 100% rename from plugins/vendor/symfony/translation/Loader/QtFileLoader.php rename to libs/vendor/symfony/translation/Loader/QtFileLoader.php diff --git a/plugins/vendor/symfony/translation/Loader/XliffFileLoader.php b/libs/vendor/symfony/translation/Loader/XliffFileLoader.php similarity index 100% rename from plugins/vendor/symfony/translation/Loader/XliffFileLoader.php rename to libs/vendor/symfony/translation/Loader/XliffFileLoader.php diff --git a/plugins/vendor/symfony/translation/Loader/YamlFileLoader.php b/libs/vendor/symfony/translation/Loader/YamlFileLoader.php similarity index 100% rename from plugins/vendor/symfony/translation/Loader/YamlFileLoader.php rename to libs/vendor/symfony/translation/Loader/YamlFileLoader.php diff --git a/plugins/vendor/symfony/translation/LocaleSwitcher.php b/libs/vendor/symfony/translation/LocaleSwitcher.php similarity index 100% rename from plugins/vendor/symfony/translation/LocaleSwitcher.php rename to libs/vendor/symfony/translation/LocaleSwitcher.php diff --git a/plugins/vendor/symfony/translation/LoggingTranslator.php b/libs/vendor/symfony/translation/LoggingTranslator.php similarity index 100% rename from plugins/vendor/symfony/translation/LoggingTranslator.php rename to libs/vendor/symfony/translation/LoggingTranslator.php diff --git a/plugins/vendor/symfony/translation/MessageCatalogue.php b/libs/vendor/symfony/translation/MessageCatalogue.php similarity index 100% rename from plugins/vendor/symfony/translation/MessageCatalogue.php rename to libs/vendor/symfony/translation/MessageCatalogue.php diff --git a/plugins/vendor/symfony/translation/MessageCatalogueInterface.php b/libs/vendor/symfony/translation/MessageCatalogueInterface.php similarity index 100% rename from plugins/vendor/symfony/translation/MessageCatalogueInterface.php rename to libs/vendor/symfony/translation/MessageCatalogueInterface.php diff --git a/plugins/vendor/symfony/translation/MetadataAwareInterface.php b/libs/vendor/symfony/translation/MetadataAwareInterface.php similarity index 100% rename from plugins/vendor/symfony/translation/MetadataAwareInterface.php rename to libs/vendor/symfony/translation/MetadataAwareInterface.php diff --git a/plugins/vendor/symfony/translation/Provider/AbstractProviderFactory.php b/libs/vendor/symfony/translation/Provider/AbstractProviderFactory.php similarity index 100% rename from plugins/vendor/symfony/translation/Provider/AbstractProviderFactory.php rename to libs/vendor/symfony/translation/Provider/AbstractProviderFactory.php diff --git a/plugins/vendor/symfony/translation/Provider/Dsn.php b/libs/vendor/symfony/translation/Provider/Dsn.php similarity index 100% rename from plugins/vendor/symfony/translation/Provider/Dsn.php rename to libs/vendor/symfony/translation/Provider/Dsn.php diff --git a/plugins/vendor/symfony/translation/Provider/FilteringProvider.php b/libs/vendor/symfony/translation/Provider/FilteringProvider.php similarity index 100% rename from plugins/vendor/symfony/translation/Provider/FilteringProvider.php rename to libs/vendor/symfony/translation/Provider/FilteringProvider.php diff --git a/plugins/vendor/symfony/translation/Provider/NullProvider.php b/libs/vendor/symfony/translation/Provider/NullProvider.php similarity index 100% rename from plugins/vendor/symfony/translation/Provider/NullProvider.php rename to libs/vendor/symfony/translation/Provider/NullProvider.php diff --git a/plugins/vendor/symfony/translation/Provider/NullProviderFactory.php b/libs/vendor/symfony/translation/Provider/NullProviderFactory.php similarity index 100% rename from plugins/vendor/symfony/translation/Provider/NullProviderFactory.php rename to libs/vendor/symfony/translation/Provider/NullProviderFactory.php diff --git a/plugins/vendor/symfony/translation/Provider/ProviderFactoryInterface.php b/libs/vendor/symfony/translation/Provider/ProviderFactoryInterface.php similarity index 100% rename from plugins/vendor/symfony/translation/Provider/ProviderFactoryInterface.php rename to libs/vendor/symfony/translation/Provider/ProviderFactoryInterface.php diff --git a/plugins/vendor/symfony/translation/Provider/ProviderInterface.php b/libs/vendor/symfony/translation/Provider/ProviderInterface.php similarity index 100% rename from plugins/vendor/symfony/translation/Provider/ProviderInterface.php rename to libs/vendor/symfony/translation/Provider/ProviderInterface.php diff --git a/plugins/vendor/symfony/translation/Provider/TranslationProviderCollection.php b/libs/vendor/symfony/translation/Provider/TranslationProviderCollection.php similarity index 100% rename from plugins/vendor/symfony/translation/Provider/TranslationProviderCollection.php rename to libs/vendor/symfony/translation/Provider/TranslationProviderCollection.php diff --git a/plugins/vendor/symfony/translation/Provider/TranslationProviderCollectionFactory.php b/libs/vendor/symfony/translation/Provider/TranslationProviderCollectionFactory.php similarity index 100% rename from plugins/vendor/symfony/translation/Provider/TranslationProviderCollectionFactory.php rename to libs/vendor/symfony/translation/Provider/TranslationProviderCollectionFactory.php diff --git a/plugins/vendor/symfony/translation/PseudoLocalizationTranslator.php b/libs/vendor/symfony/translation/PseudoLocalizationTranslator.php similarity index 100% rename from plugins/vendor/symfony/translation/PseudoLocalizationTranslator.php rename to libs/vendor/symfony/translation/PseudoLocalizationTranslator.php diff --git a/plugins/vendor/symfony/translation/README.md b/libs/vendor/symfony/translation/README.md similarity index 100% rename from plugins/vendor/symfony/translation/README.md rename to libs/vendor/symfony/translation/README.md diff --git a/plugins/vendor/symfony/translation/Reader/TranslationReader.php b/libs/vendor/symfony/translation/Reader/TranslationReader.php similarity index 100% rename from plugins/vendor/symfony/translation/Reader/TranslationReader.php rename to libs/vendor/symfony/translation/Reader/TranslationReader.php diff --git a/plugins/vendor/symfony/translation/Reader/TranslationReaderInterface.php b/libs/vendor/symfony/translation/Reader/TranslationReaderInterface.php similarity index 100% rename from plugins/vendor/symfony/translation/Reader/TranslationReaderInterface.php rename to libs/vendor/symfony/translation/Reader/TranslationReaderInterface.php diff --git a/plugins/vendor/symfony/translation/Resources/bin/translation-status.php b/libs/vendor/symfony/translation/Resources/bin/translation-status.php similarity index 100% rename from plugins/vendor/symfony/translation/Resources/bin/translation-status.php rename to libs/vendor/symfony/translation/Resources/bin/translation-status.php diff --git a/plugins/vendor/symfony/translation/Resources/data/parents.json b/libs/vendor/symfony/translation/Resources/data/parents.json similarity index 100% rename from plugins/vendor/symfony/translation/Resources/data/parents.json rename to libs/vendor/symfony/translation/Resources/data/parents.json diff --git a/plugins/vendor/symfony/translation/Resources/functions.php b/libs/vendor/symfony/translation/Resources/functions.php similarity index 100% rename from plugins/vendor/symfony/translation/Resources/functions.php rename to libs/vendor/symfony/translation/Resources/functions.php diff --git a/plugins/vendor/symfony/translation/Resources/schemas/xliff-core-1.2-transitional.xsd b/libs/vendor/symfony/translation/Resources/schemas/xliff-core-1.2-transitional.xsd similarity index 100% rename from plugins/vendor/symfony/translation/Resources/schemas/xliff-core-1.2-transitional.xsd rename to libs/vendor/symfony/translation/Resources/schemas/xliff-core-1.2-transitional.xsd diff --git a/plugins/vendor/symfony/translation/Resources/schemas/xliff-core-2.0.xsd b/libs/vendor/symfony/translation/Resources/schemas/xliff-core-2.0.xsd similarity index 100% rename from plugins/vendor/symfony/translation/Resources/schemas/xliff-core-2.0.xsd rename to libs/vendor/symfony/translation/Resources/schemas/xliff-core-2.0.xsd diff --git a/plugins/vendor/symfony/translation/Resources/schemas/xml.xsd b/libs/vendor/symfony/translation/Resources/schemas/xml.xsd similarity index 100% rename from plugins/vendor/symfony/translation/Resources/schemas/xml.xsd rename to libs/vendor/symfony/translation/Resources/schemas/xml.xsd diff --git a/plugins/vendor/symfony/translation/StaticMessage.php b/libs/vendor/symfony/translation/StaticMessage.php similarity index 100% rename from plugins/vendor/symfony/translation/StaticMessage.php rename to libs/vendor/symfony/translation/StaticMessage.php diff --git a/plugins/vendor/symfony/translation/Test/AbstractProviderFactoryTestCase.php b/libs/vendor/symfony/translation/Test/AbstractProviderFactoryTestCase.php similarity index 100% rename from plugins/vendor/symfony/translation/Test/AbstractProviderFactoryTestCase.php rename to libs/vendor/symfony/translation/Test/AbstractProviderFactoryTestCase.php diff --git a/plugins/vendor/symfony/translation/Test/IncompleteDsnTestTrait.php b/libs/vendor/symfony/translation/Test/IncompleteDsnTestTrait.php similarity index 100% rename from plugins/vendor/symfony/translation/Test/IncompleteDsnTestTrait.php rename to libs/vendor/symfony/translation/Test/IncompleteDsnTestTrait.php diff --git a/plugins/vendor/symfony/translation/Test/ProviderFactoryTestCase.php b/libs/vendor/symfony/translation/Test/ProviderFactoryTestCase.php similarity index 100% rename from plugins/vendor/symfony/translation/Test/ProviderFactoryTestCase.php rename to libs/vendor/symfony/translation/Test/ProviderFactoryTestCase.php diff --git a/plugins/vendor/symfony/translation/Test/ProviderTestCase.php b/libs/vendor/symfony/translation/Test/ProviderTestCase.php similarity index 100% rename from plugins/vendor/symfony/translation/Test/ProviderTestCase.php rename to libs/vendor/symfony/translation/Test/ProviderTestCase.php diff --git a/plugins/vendor/symfony/translation/TranslatableMessage.php b/libs/vendor/symfony/translation/TranslatableMessage.php similarity index 100% rename from plugins/vendor/symfony/translation/TranslatableMessage.php rename to libs/vendor/symfony/translation/TranslatableMessage.php diff --git a/plugins/vendor/symfony/translation/Translator.php b/libs/vendor/symfony/translation/Translator.php similarity index 100% rename from plugins/vendor/symfony/translation/Translator.php rename to libs/vendor/symfony/translation/Translator.php diff --git a/plugins/vendor/symfony/translation/TranslatorBag.php b/libs/vendor/symfony/translation/TranslatorBag.php similarity index 100% rename from plugins/vendor/symfony/translation/TranslatorBag.php rename to libs/vendor/symfony/translation/TranslatorBag.php diff --git a/plugins/vendor/symfony/translation/TranslatorBagInterface.php b/libs/vendor/symfony/translation/TranslatorBagInterface.php similarity index 100% rename from plugins/vendor/symfony/translation/TranslatorBagInterface.php rename to libs/vendor/symfony/translation/TranslatorBagInterface.php diff --git a/plugins/vendor/symfony/translation/Util/ArrayConverter.php b/libs/vendor/symfony/translation/Util/ArrayConverter.php similarity index 100% rename from plugins/vendor/symfony/translation/Util/ArrayConverter.php rename to libs/vendor/symfony/translation/Util/ArrayConverter.php diff --git a/plugins/vendor/symfony/translation/Util/XliffUtils.php b/libs/vendor/symfony/translation/Util/XliffUtils.php similarity index 100% rename from plugins/vendor/symfony/translation/Util/XliffUtils.php rename to libs/vendor/symfony/translation/Util/XliffUtils.php diff --git a/plugins/vendor/symfony/translation/Writer/TranslationWriter.php b/libs/vendor/symfony/translation/Writer/TranslationWriter.php similarity index 100% rename from plugins/vendor/symfony/translation/Writer/TranslationWriter.php rename to libs/vendor/symfony/translation/Writer/TranslationWriter.php diff --git a/plugins/vendor/symfony/translation/Writer/TranslationWriterInterface.php b/libs/vendor/symfony/translation/Writer/TranslationWriterInterface.php similarity index 100% rename from plugins/vendor/symfony/translation/Writer/TranslationWriterInterface.php rename to libs/vendor/symfony/translation/Writer/TranslationWriterInterface.php diff --git a/plugins/vendor/symfony/translation/composer.json b/libs/vendor/symfony/translation/composer.json similarity index 100% rename from plugins/vendor/symfony/translation/composer.json rename to libs/vendor/symfony/translation/composer.json diff --git a/plugins/vendor/zbateson/mail-mime-parser/.github/FUNDING.yml b/libs/vendor/zbateson/mail-mime-parser/.github/FUNDING.yml similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/.github/FUNDING.yml rename to libs/vendor/zbateson/mail-mime-parser/.github/FUNDING.yml diff --git a/plugins/vendor/zbateson/mail-mime-parser/.github/workflows/tests.yml b/libs/vendor/zbateson/mail-mime-parser/.github/workflows/tests.yml similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/.github/workflows/tests.yml rename to libs/vendor/zbateson/mail-mime-parser/.github/workflows/tests.yml diff --git a/plugins/vendor/zbateson/mail-mime-parser/.php-cs-fixer.dist.php b/libs/vendor/zbateson/mail-mime-parser/.php-cs-fixer.dist.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/.php-cs-fixer.dist.php rename to libs/vendor/zbateson/mail-mime-parser/.php-cs-fixer.dist.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/LICENSE b/libs/vendor/zbateson/mail-mime-parser/LICENSE similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/LICENSE rename to libs/vendor/zbateson/mail-mime-parser/LICENSE diff --git a/plugins/vendor/zbateson/mail-mime-parser/PHPStanConstants.php b/libs/vendor/zbateson/mail-mime-parser/PHPStanConstants.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/PHPStanConstants.php rename to libs/vendor/zbateson/mail-mime-parser/PHPStanConstants.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/README.md b/libs/vendor/zbateson/mail-mime-parser/README.md similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/README.md rename to libs/vendor/zbateson/mail-mime-parser/README.md diff --git a/plugins/vendor/zbateson/mail-mime-parser/composer.json b/libs/vendor/zbateson/mail-mime-parser/composer.json similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/composer.json rename to libs/vendor/zbateson/mail-mime-parser/composer.json diff --git a/plugins/vendor/zbateson/mail-mime-parser/phpstan.neon b/libs/vendor/zbateson/mail-mime-parser/phpstan.neon similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/phpstan.neon rename to libs/vendor/zbateson/mail-mime-parser/phpstan.neon diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Error.php b/libs/vendor/zbateson/mail-mime-parser/src/Error.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Error.php rename to libs/vendor/zbateson/mail-mime-parser/src/Error.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/ErrorBag.php b/libs/vendor/zbateson/mail-mime-parser/src/ErrorBag.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/ErrorBag.php rename to libs/vendor/zbateson/mail-mime-parser/src/ErrorBag.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/AbstractHeader.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/AbstractHeader.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/AbstractHeader.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/AbstractHeader.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/AddressHeader.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/AddressHeader.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/AddressHeader.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/AddressHeader.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AbstractConsumerService.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AbstractConsumerService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AbstractConsumerService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AbstractConsumerService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AbstractGenericConsumerService.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AbstractGenericConsumerService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AbstractGenericConsumerService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AbstractGenericConsumerService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AddressBaseConsumerService.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AddressBaseConsumerService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AddressBaseConsumerService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AddressBaseConsumerService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AddressConsumerService.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AddressConsumerService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AddressConsumerService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AddressConsumerService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AddressEmailConsumerService.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AddressEmailConsumerService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AddressEmailConsumerService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AddressEmailConsumerService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AddressGroupConsumerService.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AddressGroupConsumerService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AddressGroupConsumerService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/AddressGroupConsumerService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/CommentConsumerService.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/CommentConsumerService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/CommentConsumerService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/CommentConsumerService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/DateConsumerService.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/DateConsumerService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/DateConsumerService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/DateConsumerService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/GenericConsumerMimeLiteralPartService.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/GenericConsumerMimeLiteralPartService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/GenericConsumerMimeLiteralPartService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/GenericConsumerMimeLiteralPartService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/GenericConsumerService.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/GenericConsumerService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/GenericConsumerService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/GenericConsumerService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/IConsumerService.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/IConsumerService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/IConsumerService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/IConsumerService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/IdBaseConsumerService.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/IdBaseConsumerService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/IdBaseConsumerService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/IdBaseConsumerService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/IdConsumerService.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/IdConsumerService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/IdConsumerService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/IdConsumerService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/ParameterConsumerService.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/ParameterConsumerService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/ParameterConsumerService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/ParameterConsumerService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/ParameterNameValueConsumerService.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/ParameterNameValueConsumerService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/ParameterNameValueConsumerService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/ParameterNameValueConsumerService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/ParameterValueConsumerService.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/ParameterValueConsumerService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/ParameterValueConsumerService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/ParameterValueConsumerService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/QuotedStringConsumerService.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/QuotedStringConsumerService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/QuotedStringConsumerService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/QuotedStringConsumerService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/QuotedStringMimeLiteralPartConsumerService.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/QuotedStringMimeLiteralPartConsumerService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/QuotedStringMimeLiteralPartConsumerService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/QuotedStringMimeLiteralPartConsumerService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/QuotedStringMimeLiteralPartTokenSplitPatternTrait.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/QuotedStringMimeLiteralPartTokenSplitPatternTrait.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/QuotedStringMimeLiteralPartTokenSplitPatternTrait.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/QuotedStringMimeLiteralPartTokenSplitPatternTrait.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/Received/DomainConsumerService.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/Received/DomainConsumerService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/Received/DomainConsumerService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/Received/DomainConsumerService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/Received/GenericReceivedConsumerService.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/Received/GenericReceivedConsumerService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/Received/GenericReceivedConsumerService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/Received/GenericReceivedConsumerService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/Received/ReceivedDateConsumerService.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/Received/ReceivedDateConsumerService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/Received/ReceivedDateConsumerService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/Received/ReceivedDateConsumerService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/ReceivedConsumerService.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/ReceivedConsumerService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/ReceivedConsumerService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/ReceivedConsumerService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/SubjectConsumerService.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/SubjectConsumerService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Consumer/SubjectConsumerService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Consumer/SubjectConsumerService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/DateHeader.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/DateHeader.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/DateHeader.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/DateHeader.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/GenericHeader.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/GenericHeader.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/GenericHeader.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/GenericHeader.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/HeaderConsts.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/HeaderConsts.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/HeaderConsts.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/HeaderConsts.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/HeaderFactory.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/HeaderFactory.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/HeaderFactory.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/HeaderFactory.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/IHeader.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/IHeader.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/IHeader.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/IHeader.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/IHeaderPart.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/IHeaderPart.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/IHeaderPart.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/IHeaderPart.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/IdHeader.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/IdHeader.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/IdHeader.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/IdHeader.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/MimeEncodedHeader.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/MimeEncodedHeader.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/MimeEncodedHeader.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/MimeEncodedHeader.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/ParameterHeader.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/ParameterHeader.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/ParameterHeader.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/ParameterHeader.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/AddressGroupPart.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Part/AddressGroupPart.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/AddressGroupPart.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Part/AddressGroupPart.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/AddressPart.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Part/AddressPart.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/AddressPart.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Part/AddressPart.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/CommentPart.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Part/CommentPart.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/CommentPart.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Part/CommentPart.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/ContainerPart.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Part/ContainerPart.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/ContainerPart.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Part/ContainerPart.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/DatePart.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Part/DatePart.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/DatePart.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Part/DatePart.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/HeaderPart.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Part/HeaderPart.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/HeaderPart.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Part/HeaderPart.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/HeaderPartFactory.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Part/HeaderPartFactory.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/HeaderPartFactory.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Part/HeaderPartFactory.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/MimeToken.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Part/MimeToken.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/MimeToken.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Part/MimeToken.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/MimeTokenPartFactory.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Part/MimeTokenPartFactory.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/MimeTokenPartFactory.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Part/MimeTokenPartFactory.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/NameValuePart.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Part/NameValuePart.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/NameValuePart.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Part/NameValuePart.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/ParameterPart.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Part/ParameterPart.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/ParameterPart.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Part/ParameterPart.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/QuotedLiteralPart.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Part/QuotedLiteralPart.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/QuotedLiteralPart.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Part/QuotedLiteralPart.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/ReceivedDomainPart.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Part/ReceivedDomainPart.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/ReceivedDomainPart.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Part/ReceivedDomainPart.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/ReceivedPart.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Part/ReceivedPart.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/ReceivedPart.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Part/ReceivedPart.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/SplitParameterPart.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Part/SplitParameterPart.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/SplitParameterPart.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Part/SplitParameterPart.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/SubjectToken.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Part/SubjectToken.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/SubjectToken.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Part/SubjectToken.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/Token.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/Part/Token.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/Part/Token.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/Part/Token.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/ReceivedHeader.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/ReceivedHeader.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/ReceivedHeader.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/ReceivedHeader.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Header/SubjectHeader.php b/libs/vendor/zbateson/mail-mime-parser/src/Header/SubjectHeader.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Header/SubjectHeader.php rename to libs/vendor/zbateson/mail-mime-parser/src/Header/SubjectHeader.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/IErrorBag.php b/libs/vendor/zbateson/mail-mime-parser/src/IErrorBag.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/IErrorBag.php rename to libs/vendor/zbateson/mail-mime-parser/src/IErrorBag.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/IMessage.php b/libs/vendor/zbateson/mail-mime-parser/src/IMessage.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/IMessage.php rename to libs/vendor/zbateson/mail-mime-parser/src/IMessage.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/MailMimeParser.php b/libs/vendor/zbateson/mail-mime-parser/src/MailMimeParser.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/MailMimeParser.php rename to libs/vendor/zbateson/mail-mime-parser/src/MailMimeParser.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Message.php b/libs/vendor/zbateson/mail-mime-parser/src/Message.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Message.php rename to libs/vendor/zbateson/mail-mime-parser/src/Message.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Message/Factory/IMessagePartFactory.php b/libs/vendor/zbateson/mail-mime-parser/src/Message/Factory/IMessagePartFactory.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Message/Factory/IMessagePartFactory.php rename to libs/vendor/zbateson/mail-mime-parser/src/Message/Factory/IMessagePartFactory.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Message/Factory/IMimePartFactory.php b/libs/vendor/zbateson/mail-mime-parser/src/Message/Factory/IMimePartFactory.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Message/Factory/IMimePartFactory.php rename to libs/vendor/zbateson/mail-mime-parser/src/Message/Factory/IMimePartFactory.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Message/Factory/IUUEncodedPartFactory.php b/libs/vendor/zbateson/mail-mime-parser/src/Message/Factory/IUUEncodedPartFactory.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Message/Factory/IUUEncodedPartFactory.php rename to libs/vendor/zbateson/mail-mime-parser/src/Message/Factory/IUUEncodedPartFactory.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Message/Factory/PartChildrenContainerFactory.php b/libs/vendor/zbateson/mail-mime-parser/src/Message/Factory/PartChildrenContainerFactory.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Message/Factory/PartChildrenContainerFactory.php rename to libs/vendor/zbateson/mail-mime-parser/src/Message/Factory/PartChildrenContainerFactory.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Message/Factory/PartHeaderContainerFactory.php b/libs/vendor/zbateson/mail-mime-parser/src/Message/Factory/PartHeaderContainerFactory.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Message/Factory/PartHeaderContainerFactory.php rename to libs/vendor/zbateson/mail-mime-parser/src/Message/Factory/PartHeaderContainerFactory.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Message/Factory/PartStreamContainerFactory.php b/libs/vendor/zbateson/mail-mime-parser/src/Message/Factory/PartStreamContainerFactory.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Message/Factory/PartStreamContainerFactory.php rename to libs/vendor/zbateson/mail-mime-parser/src/Message/Factory/PartStreamContainerFactory.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Message/Helper/AbstractHelper.php b/libs/vendor/zbateson/mail-mime-parser/src/Message/Helper/AbstractHelper.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Message/Helper/AbstractHelper.php rename to libs/vendor/zbateson/mail-mime-parser/src/Message/Helper/AbstractHelper.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Message/Helper/GenericHelper.php b/libs/vendor/zbateson/mail-mime-parser/src/Message/Helper/GenericHelper.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Message/Helper/GenericHelper.php rename to libs/vendor/zbateson/mail-mime-parser/src/Message/Helper/GenericHelper.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Message/Helper/MultipartHelper.php b/libs/vendor/zbateson/mail-mime-parser/src/Message/Helper/MultipartHelper.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Message/Helper/MultipartHelper.php rename to libs/vendor/zbateson/mail-mime-parser/src/Message/Helper/MultipartHelper.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Message/Helper/PrivacyHelper.php b/libs/vendor/zbateson/mail-mime-parser/src/Message/Helper/PrivacyHelper.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Message/Helper/PrivacyHelper.php rename to libs/vendor/zbateson/mail-mime-parser/src/Message/Helper/PrivacyHelper.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Message/IMessagePart.php b/libs/vendor/zbateson/mail-mime-parser/src/Message/IMessagePart.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Message/IMessagePart.php rename to libs/vendor/zbateson/mail-mime-parser/src/Message/IMessagePart.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Message/IMimePart.php b/libs/vendor/zbateson/mail-mime-parser/src/Message/IMimePart.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Message/IMimePart.php rename to libs/vendor/zbateson/mail-mime-parser/src/Message/IMimePart.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Message/IMultiPart.php b/libs/vendor/zbateson/mail-mime-parser/src/Message/IMultiPart.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Message/IMultiPart.php rename to libs/vendor/zbateson/mail-mime-parser/src/Message/IMultiPart.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Message/IUUEncodedPart.php b/libs/vendor/zbateson/mail-mime-parser/src/Message/IUUEncodedPart.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Message/IUUEncodedPart.php rename to libs/vendor/zbateson/mail-mime-parser/src/Message/IUUEncodedPart.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Message/MessagePart.php b/libs/vendor/zbateson/mail-mime-parser/src/Message/MessagePart.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Message/MessagePart.php rename to libs/vendor/zbateson/mail-mime-parser/src/Message/MessagePart.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Message/MimePart.php b/libs/vendor/zbateson/mail-mime-parser/src/Message/MimePart.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Message/MimePart.php rename to libs/vendor/zbateson/mail-mime-parser/src/Message/MimePart.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Message/MultiPart.php b/libs/vendor/zbateson/mail-mime-parser/src/Message/MultiPart.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Message/MultiPart.php rename to libs/vendor/zbateson/mail-mime-parser/src/Message/MultiPart.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Message/NonMimePart.php b/libs/vendor/zbateson/mail-mime-parser/src/Message/NonMimePart.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Message/NonMimePart.php rename to libs/vendor/zbateson/mail-mime-parser/src/Message/NonMimePart.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Message/PartChildrenContainer.php b/libs/vendor/zbateson/mail-mime-parser/src/Message/PartChildrenContainer.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Message/PartChildrenContainer.php rename to libs/vendor/zbateson/mail-mime-parser/src/Message/PartChildrenContainer.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Message/PartFilter.php b/libs/vendor/zbateson/mail-mime-parser/src/Message/PartFilter.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Message/PartFilter.php rename to libs/vendor/zbateson/mail-mime-parser/src/Message/PartFilter.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Message/PartHeaderContainer.php b/libs/vendor/zbateson/mail-mime-parser/src/Message/PartHeaderContainer.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Message/PartHeaderContainer.php rename to libs/vendor/zbateson/mail-mime-parser/src/Message/PartHeaderContainer.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Message/PartStreamContainer.php b/libs/vendor/zbateson/mail-mime-parser/src/Message/PartStreamContainer.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Message/PartStreamContainer.php rename to libs/vendor/zbateson/mail-mime-parser/src/Message/PartStreamContainer.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Message/UUEncodedPart.php b/libs/vendor/zbateson/mail-mime-parser/src/Message/UUEncodedPart.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Message/UUEncodedPart.php rename to libs/vendor/zbateson/mail-mime-parser/src/Message/UUEncodedPart.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/AbstractParserService.php b/libs/vendor/zbateson/mail-mime-parser/src/Parser/AbstractParserService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Parser/AbstractParserService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Parser/AbstractParserService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/CompatibleParserNotFoundException.php b/libs/vendor/zbateson/mail-mime-parser/src/Parser/CompatibleParserNotFoundException.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Parser/CompatibleParserNotFoundException.php rename to libs/vendor/zbateson/mail-mime-parser/src/Parser/CompatibleParserNotFoundException.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/HeaderParserService.php b/libs/vendor/zbateson/mail-mime-parser/src/Parser/HeaderParserService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Parser/HeaderParserService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Parser/HeaderParserService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/IParserService.php b/libs/vendor/zbateson/mail-mime-parser/src/Parser/IParserService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Parser/IParserService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Parser/IParserService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/MessageParserService.php b/libs/vendor/zbateson/mail-mime-parser/src/Parser/MessageParserService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Parser/MessageParserService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Parser/MessageParserService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/MimeParserService.php b/libs/vendor/zbateson/mail-mime-parser/src/Parser/MimeParserService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Parser/MimeParserService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Parser/MimeParserService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/NonMimeParserService.php b/libs/vendor/zbateson/mail-mime-parser/src/Parser/NonMimeParserService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Parser/NonMimeParserService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Parser/NonMimeParserService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/ParserManagerService.php b/libs/vendor/zbateson/mail-mime-parser/src/Parser/ParserManagerService.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Parser/ParserManagerService.php rename to libs/vendor/zbateson/mail-mime-parser/src/Parser/ParserManagerService.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/Part/ParserPartChildrenContainer.php b/libs/vendor/zbateson/mail-mime-parser/src/Parser/Part/ParserPartChildrenContainer.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Parser/Part/ParserPartChildrenContainer.php rename to libs/vendor/zbateson/mail-mime-parser/src/Parser/Part/ParserPartChildrenContainer.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/Part/ParserPartChildrenContainerFactory.php b/libs/vendor/zbateson/mail-mime-parser/src/Parser/Part/ParserPartChildrenContainerFactory.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Parser/Part/ParserPartChildrenContainerFactory.php rename to libs/vendor/zbateson/mail-mime-parser/src/Parser/Part/ParserPartChildrenContainerFactory.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/Part/ParserPartStreamContainer.php b/libs/vendor/zbateson/mail-mime-parser/src/Parser/Part/ParserPartStreamContainer.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Parser/Part/ParserPartStreamContainer.php rename to libs/vendor/zbateson/mail-mime-parser/src/Parser/Part/ParserPartStreamContainer.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/Part/ParserPartStreamContainerFactory.php b/libs/vendor/zbateson/mail-mime-parser/src/Parser/Part/ParserPartStreamContainerFactory.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Parser/Part/ParserPartStreamContainerFactory.php rename to libs/vendor/zbateson/mail-mime-parser/src/Parser/Part/ParserPartStreamContainerFactory.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/Part/UUEncodedPartHeaderContainer.php b/libs/vendor/zbateson/mail-mime-parser/src/Parser/Part/UUEncodedPartHeaderContainer.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Parser/Part/UUEncodedPartHeaderContainer.php rename to libs/vendor/zbateson/mail-mime-parser/src/Parser/Part/UUEncodedPartHeaderContainer.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/Part/UUEncodedPartHeaderContainerFactory.php b/libs/vendor/zbateson/mail-mime-parser/src/Parser/Part/UUEncodedPartHeaderContainerFactory.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Parser/Part/UUEncodedPartHeaderContainerFactory.php rename to libs/vendor/zbateson/mail-mime-parser/src/Parser/Part/UUEncodedPartHeaderContainerFactory.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/PartBuilder.php b/libs/vendor/zbateson/mail-mime-parser/src/Parser/PartBuilder.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Parser/PartBuilder.php rename to libs/vendor/zbateson/mail-mime-parser/src/Parser/PartBuilder.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/PartBuilderFactory.php b/libs/vendor/zbateson/mail-mime-parser/src/Parser/PartBuilderFactory.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Parser/PartBuilderFactory.php rename to libs/vendor/zbateson/mail-mime-parser/src/Parser/PartBuilderFactory.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMessageProxy.php b/libs/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMessageProxy.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMessageProxy.php rename to libs/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMessageProxy.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMessageProxyFactory.php b/libs/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMessageProxyFactory.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMessageProxyFactory.php rename to libs/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMessageProxyFactory.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMimePartProxy.php b/libs/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMimePartProxy.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMimePartProxy.php rename to libs/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMimePartProxy.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMimePartProxyFactory.php b/libs/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMimePartProxyFactory.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMimePartProxyFactory.php rename to libs/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMimePartProxyFactory.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserNonMimeMessageProxy.php b/libs/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserNonMimeMessageProxy.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserNonMimeMessageProxy.php rename to libs/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserNonMimeMessageProxy.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserNonMimeMessageProxyFactory.php b/libs/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserNonMimeMessageProxyFactory.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserNonMimeMessageProxyFactory.php rename to libs/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserNonMimeMessageProxyFactory.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserPartProxy.php b/libs/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserPartProxy.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserPartProxy.php rename to libs/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserPartProxy.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserPartProxyFactory.php b/libs/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserPartProxyFactory.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserPartProxyFactory.php rename to libs/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserPartProxyFactory.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserUUEncodedPartProxy.php b/libs/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserUUEncodedPartProxy.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserUUEncodedPartProxy.php rename to libs/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserUUEncodedPartProxy.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserUUEncodedPartProxyFactory.php b/libs/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserUUEncodedPartProxyFactory.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserUUEncodedPartProxyFactory.php rename to libs/vendor/zbateson/mail-mime-parser/src/Parser/Proxy/ParserUUEncodedPartProxyFactory.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Stream/HeaderStream.php b/libs/vendor/zbateson/mail-mime-parser/src/Stream/HeaderStream.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Stream/HeaderStream.php rename to libs/vendor/zbateson/mail-mime-parser/src/Stream/HeaderStream.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Stream/MessagePartStream.php b/libs/vendor/zbateson/mail-mime-parser/src/Stream/MessagePartStream.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Stream/MessagePartStream.php rename to libs/vendor/zbateson/mail-mime-parser/src/Stream/MessagePartStream.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Stream/MessagePartStreamDecorator.php b/libs/vendor/zbateson/mail-mime-parser/src/Stream/MessagePartStreamDecorator.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Stream/MessagePartStreamDecorator.php rename to libs/vendor/zbateson/mail-mime-parser/src/Stream/MessagePartStreamDecorator.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Stream/MessagePartStreamReadException.php b/libs/vendor/zbateson/mail-mime-parser/src/Stream/MessagePartStreamReadException.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Stream/MessagePartStreamReadException.php rename to libs/vendor/zbateson/mail-mime-parser/src/Stream/MessagePartStreamReadException.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/Stream/StreamFactory.php b/libs/vendor/zbateson/mail-mime-parser/src/Stream/StreamFactory.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/Stream/StreamFactory.php rename to libs/vendor/zbateson/mail-mime-parser/src/Stream/StreamFactory.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/src/di_config.php b/libs/vendor/zbateson/mail-mime-parser/src/di_config.php similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/src/di_config.php rename to libs/vendor/zbateson/mail-mime-parser/src/di_config.php diff --git a/plugins/vendor/zbateson/mail-mime-parser/version.txt b/libs/vendor/zbateson/mail-mime-parser/version.txt similarity index 100% rename from plugins/vendor/zbateson/mail-mime-parser/version.txt rename to libs/vendor/zbateson/mail-mime-parser/version.txt diff --git a/plugins/vendor/zbateson/mb-wrapper/LICENSE b/libs/vendor/zbateson/mb-wrapper/LICENSE similarity index 100% rename from plugins/vendor/zbateson/mb-wrapper/LICENSE rename to libs/vendor/zbateson/mb-wrapper/LICENSE diff --git a/plugins/vendor/zbateson/mb-wrapper/README.md b/libs/vendor/zbateson/mb-wrapper/README.md similarity index 100% rename from plugins/vendor/zbateson/mb-wrapper/README.md rename to libs/vendor/zbateson/mb-wrapper/README.md diff --git a/plugins/vendor/zbateson/mb-wrapper/composer.json b/libs/vendor/zbateson/mb-wrapper/composer.json similarity index 100% rename from plugins/vendor/zbateson/mb-wrapper/composer.json rename to libs/vendor/zbateson/mb-wrapper/composer.json diff --git a/plugins/vendor/zbateson/mb-wrapper/src/MbWrapper.php b/libs/vendor/zbateson/mb-wrapper/src/MbWrapper.php similarity index 100% rename from plugins/vendor/zbateson/mb-wrapper/src/MbWrapper.php rename to libs/vendor/zbateson/mb-wrapper/src/MbWrapper.php diff --git a/plugins/vendor/zbateson/mb-wrapper/src/UnsupportedCharsetException.php b/libs/vendor/zbateson/mb-wrapper/src/UnsupportedCharsetException.php similarity index 100% rename from plugins/vendor/zbateson/mb-wrapper/src/UnsupportedCharsetException.php rename to libs/vendor/zbateson/mb-wrapper/src/UnsupportedCharsetException.php diff --git a/plugins/vendor/zbateson/stream-decorators/.github/FUNDING.yml b/libs/vendor/zbateson/stream-decorators/.github/FUNDING.yml similarity index 100% rename from plugins/vendor/zbateson/stream-decorators/.github/FUNDING.yml rename to libs/vendor/zbateson/stream-decorators/.github/FUNDING.yml diff --git a/plugins/vendor/zbateson/stream-decorators/.github/workflows/tests.yml b/libs/vendor/zbateson/stream-decorators/.github/workflows/tests.yml similarity index 100% rename from plugins/vendor/zbateson/stream-decorators/.github/workflows/tests.yml rename to libs/vendor/zbateson/stream-decorators/.github/workflows/tests.yml diff --git a/plugins/vendor/zbateson/stream-decorators/.php-cs-fixer.dist.php b/libs/vendor/zbateson/stream-decorators/.php-cs-fixer.dist.php similarity index 100% rename from plugins/vendor/zbateson/stream-decorators/.php-cs-fixer.dist.php rename to libs/vendor/zbateson/stream-decorators/.php-cs-fixer.dist.php diff --git a/plugins/vendor/zbateson/stream-decorators/LICENSE b/libs/vendor/zbateson/stream-decorators/LICENSE similarity index 100% rename from plugins/vendor/zbateson/stream-decorators/LICENSE rename to libs/vendor/zbateson/stream-decorators/LICENSE diff --git a/plugins/vendor/zbateson/stream-decorators/PhpCsFixer.php b/libs/vendor/zbateson/stream-decorators/PhpCsFixer.php similarity index 100% rename from plugins/vendor/zbateson/stream-decorators/PhpCsFixer.php rename to libs/vendor/zbateson/stream-decorators/PhpCsFixer.php diff --git a/plugins/vendor/zbateson/stream-decorators/README.md b/libs/vendor/zbateson/stream-decorators/README.md similarity index 100% rename from plugins/vendor/zbateson/stream-decorators/README.md rename to libs/vendor/zbateson/stream-decorators/README.md diff --git a/plugins/vendor/zbateson/stream-decorators/composer.json b/libs/vendor/zbateson/stream-decorators/composer.json similarity index 100% rename from plugins/vendor/zbateson/stream-decorators/composer.json rename to libs/vendor/zbateson/stream-decorators/composer.json diff --git a/plugins/vendor/zbateson/stream-decorators/phpstan.neon b/libs/vendor/zbateson/stream-decorators/phpstan.neon similarity index 100% rename from plugins/vendor/zbateson/stream-decorators/phpstan.neon rename to libs/vendor/zbateson/stream-decorators/phpstan.neon diff --git a/plugins/vendor/zbateson/stream-decorators/src/Base64Stream.php b/libs/vendor/zbateson/stream-decorators/src/Base64Stream.php similarity index 100% rename from plugins/vendor/zbateson/stream-decorators/src/Base64Stream.php rename to libs/vendor/zbateson/stream-decorators/src/Base64Stream.php diff --git a/plugins/vendor/zbateson/stream-decorators/src/CharsetStream.php b/libs/vendor/zbateson/stream-decorators/src/CharsetStream.php similarity index 100% rename from plugins/vendor/zbateson/stream-decorators/src/CharsetStream.php rename to libs/vendor/zbateson/stream-decorators/src/CharsetStream.php diff --git a/plugins/vendor/zbateson/stream-decorators/src/ChunkSplitStream.php b/libs/vendor/zbateson/stream-decorators/src/ChunkSplitStream.php similarity index 100% rename from plugins/vendor/zbateson/stream-decorators/src/ChunkSplitStream.php rename to libs/vendor/zbateson/stream-decorators/src/ChunkSplitStream.php diff --git a/plugins/vendor/zbateson/stream-decorators/src/DecoratedCachingStream.php b/libs/vendor/zbateson/stream-decorators/src/DecoratedCachingStream.php similarity index 100% rename from plugins/vendor/zbateson/stream-decorators/src/DecoratedCachingStream.php rename to libs/vendor/zbateson/stream-decorators/src/DecoratedCachingStream.php diff --git a/plugins/vendor/zbateson/stream-decorators/src/NonClosingStream.php b/libs/vendor/zbateson/stream-decorators/src/NonClosingStream.php similarity index 100% rename from plugins/vendor/zbateson/stream-decorators/src/NonClosingStream.php rename to libs/vendor/zbateson/stream-decorators/src/NonClosingStream.php diff --git a/plugins/vendor/zbateson/stream-decorators/src/PregReplaceFilterStream.php b/libs/vendor/zbateson/stream-decorators/src/PregReplaceFilterStream.php similarity index 100% rename from plugins/vendor/zbateson/stream-decorators/src/PregReplaceFilterStream.php rename to libs/vendor/zbateson/stream-decorators/src/PregReplaceFilterStream.php diff --git a/plugins/vendor/zbateson/stream-decorators/src/QuotedPrintableStream.php b/libs/vendor/zbateson/stream-decorators/src/QuotedPrintableStream.php similarity index 100% rename from plugins/vendor/zbateson/stream-decorators/src/QuotedPrintableStream.php rename to libs/vendor/zbateson/stream-decorators/src/QuotedPrintableStream.php diff --git a/plugins/vendor/zbateson/stream-decorators/src/SeekingLimitStream.php b/libs/vendor/zbateson/stream-decorators/src/SeekingLimitStream.php similarity index 100% rename from plugins/vendor/zbateson/stream-decorators/src/SeekingLimitStream.php rename to libs/vendor/zbateson/stream-decorators/src/SeekingLimitStream.php diff --git a/plugins/vendor/zbateson/stream-decorators/src/TellZeroStream.php b/libs/vendor/zbateson/stream-decorators/src/TellZeroStream.php similarity index 100% rename from plugins/vendor/zbateson/stream-decorators/src/TellZeroStream.php rename to libs/vendor/zbateson/stream-decorators/src/TellZeroStream.php diff --git a/plugins/vendor/zbateson/stream-decorators/src/UUStream.php b/libs/vendor/zbateson/stream-decorators/src/UUStream.php similarity index 100% rename from plugins/vendor/zbateson/stream-decorators/src/UUStream.php rename to libs/vendor/zbateson/stream-decorators/src/UUStream.php diff --git a/plugins/zapcal/README.md b/libs/zapcal/README.md similarity index 100% rename from plugins/zapcal/README.md rename to libs/zapcal/README.md diff --git a/plugins/zapcal/includes/date.php b/libs/zapcal/includes/date.php similarity index 100% rename from plugins/zapcal/includes/date.php rename to libs/zapcal/includes/date.php diff --git a/plugins/zapcal/includes/framework.php b/libs/zapcal/includes/framework.php similarity index 100% rename from plugins/zapcal/includes/framework.php rename to libs/zapcal/includes/framework.php diff --git a/plugins/zapcal/includes/ical.php b/libs/zapcal/includes/ical.php similarity index 100% rename from plugins/zapcal/includes/ical.php rename to libs/zapcal/includes/ical.php diff --git a/plugins/zapcal/includes/index.html b/libs/zapcal/includes/index.html similarity index 100% rename from plugins/zapcal/includes/index.html rename to libs/zapcal/includes/index.html diff --git a/plugins/zapcal/includes/recurringdate.php b/libs/zapcal/includes/recurringdate.php similarity index 100% rename from plugins/zapcal/includes/recurringdate.php rename to libs/zapcal/includes/recurringdate.php diff --git a/plugins/zapcal/includes/timezone.php b/libs/zapcal/includes/timezone.php similarity index 100% rename from plugins/zapcal/includes/timezone.php rename to libs/zapcal/includes/timezone.php diff --git a/plugins/zapcal/zapcallib.php b/libs/zapcal/zapcallib.php similarity index 100% rename from plugins/zapcal/zapcallib.php rename to libs/zapcal/zapcallib.php diff --git a/login.php b/login.php index b759018a9..65b3fe4ff 100644 --- a/login.php +++ b/login.php @@ -11,7 +11,7 @@ if (!file_exists('config.php')) { require_once "config.php"; require_once "functions.php"; -require_once "plugins/totp/totp.php"; +require_once "libs/totp/totp.php"; if (session_status() === PHP_SESSION_NONE) { ini_set("session.cookie_httponly", true); @@ -628,13 +628,13 @@ $show_login_form = (!$show_role_choice && !$show_mfa_form); - + - + @@ -746,9 +746,9 @@ if (!$config_whitelabel_enabled) { } ?> - - - + + + diff --git a/setup/index.php b/setup/index.php index 8cebdf1b8..1e6f07fb3 100644 --- a/setup/index.php +++ b/setup/index.php @@ -728,12 +728,12 @@ if (isset($_POST['add_telemetry'])) { ITFlow Setup - + - + - - + + @@ -1622,14 +1622,14 @@ if (isset($_POST['add_telemetry'])) { - + - + - - + + - + From 0f0aa89f75765cb577bce37606758455e3f881fd Mon Sep 17 00:00:00 2001 From: johnnyq Date: Fri, 10 Jul 2026 18:37:16 -0400 Subject: [PATCH 014/241] Bump ImapEngine from 1.25.0 to 1.25.1 --- libs/composer.lock | 12 +- libs/vendor/composer/autoload_classmap.php | 906 ----------------- libs/vendor/composer/autoload_files.php | 6 +- libs/vendor/composer/autoload_psr4.php | 4 +- libs/vendor/composer/autoload_static.php | 920 +----------------- libs/vendor/composer/installed.json | 14 +- libs/vendor/composer/installed.php | 10 +- .../imapengine/src/Attachment.php | 4 + 8 files changed, 34 insertions(+), 1842 deletions(-) diff --git a/libs/composer.lock b/libs/composer.lock index 14c52d41d..f3aa52afe 100644 --- a/libs/composer.lock +++ b/libs/composer.lock @@ -77,16 +77,16 @@ }, { "name": "directorytree/imapengine", - "version": "v1.25.0", + "version": "v1.25.1", "source": { "type": "git", "url": "https://github.com/DirectoryTree/ImapEngine.git", - "reference": "ac8a4d028334c2d3a4bc8fd975317a75cd968a47" + "reference": "7dd94f76a800a4ca1fd06b132b71484f55b60767" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/DirectoryTree/ImapEngine/zipball/ac8a4d028334c2d3a4bc8fd975317a75cd968a47", - "reference": "ac8a4d028334c2d3a4bc8fd975317a75cd968a47", + "url": "https://api.github.com/repos/DirectoryTree/ImapEngine/zipball/7dd94f76a800a4ca1fd06b132b71484f55b60767", + "reference": "7dd94f76a800a4ca1fd06b132b71484f55b60767", "shasum": "" }, "require": { @@ -127,7 +127,7 @@ ], "support": { "issues": "https://github.com/DirectoryTree/ImapEngine/issues", - "source": "https://github.com/DirectoryTree/ImapEngine/tree/v1.25.0" + "source": "https://github.com/DirectoryTree/ImapEngine/tree/v1.25.1" }, "funding": [ { @@ -135,7 +135,7 @@ "type": "github" } ], - "time": "2026-06-19T17:03:06+00:00" + "time": "2026-07-06T16:08:31+00:00" }, { "name": "doctrine/lexer", diff --git a/libs/vendor/composer/autoload_classmap.php b/libs/vendor/composer/autoload_classmap.php index b9426f741..a1e055758 100644 --- a/libs/vendor/composer/autoload_classmap.php +++ b/libs/vendor/composer/autoload_classmap.php @@ -7,162 +7,7 @@ $baseDir = dirname($vendorDir); return array( 'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', - 'Carbon\\AbstractTranslator' => $vendorDir . '/nesbot/carbon/src/Carbon/AbstractTranslator.php', - 'Carbon\\Callback' => $vendorDir . '/nesbot/carbon/src/Carbon/Callback.php', - 'Carbon\\Carbon' => $vendorDir . '/nesbot/carbon/src/Carbon/Carbon.php', - 'Carbon\\CarbonConverterInterface' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonConverterInterface.php', - 'Carbon\\CarbonImmutable' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonImmutable.php', - 'Carbon\\CarbonInterface' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonInterface.php', - 'Carbon\\CarbonInterval' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonInterval.php', - 'Carbon\\CarbonPeriod' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonPeriod.php', - 'Carbon\\CarbonPeriodImmutable' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonPeriodImmutable.php', - 'Carbon\\CarbonTimeZone' => $vendorDir . '/nesbot/carbon/src/Carbon/CarbonTimeZone.php', - 'Carbon\\Cli\\Invoker' => $vendorDir . '/nesbot/carbon/src/Carbon/Cli/Invoker.php', - 'Carbon\\Constants\\DiffOptions' => $vendorDir . '/nesbot/carbon/src/Carbon/Constants/DiffOptions.php', - 'Carbon\\Constants\\Format' => $vendorDir . '/nesbot/carbon/src/Carbon/Constants/Format.php', - 'Carbon\\Constants\\TranslationOptions' => $vendorDir . '/nesbot/carbon/src/Carbon/Constants/TranslationOptions.php', - 'Carbon\\Constants\\UnitValue' => $vendorDir . '/nesbot/carbon/src/Carbon/Constants/UnitValue.php', - 'Carbon\\Doctrine\\CarbonDoctrineType' => $vendorDir . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonDoctrineType.php', - 'Carbon\\Doctrine\\CarbonImmutableType' => $vendorDir . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonImmutableType.php', - 'Carbon\\Doctrine\\CarbonType' => $vendorDir . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonType.php', - 'Carbon\\Doctrine\\CarbonTypeConverter' => $vendorDir . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonTypeConverter.php', - 'Carbon\\Doctrine\\DateTimeDefaultPrecision' => $vendorDir . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeDefaultPrecision.php', - 'Carbon\\Doctrine\\DateTimeImmutableType' => $vendorDir . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeImmutableType.php', - 'Carbon\\Doctrine\\DateTimeType' => $vendorDir . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeType.php', - 'Carbon\\Exceptions\\BadComparisonUnitException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php', - 'Carbon\\Exceptions\\BadFluentConstructorException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php', - 'Carbon\\Exceptions\\BadFluentSetterException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php', - 'Carbon\\Exceptions\\BadMethodCallException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php', - 'Carbon\\Exceptions\\EndLessPeriodException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php', - 'Carbon\\Exceptions\\Exception' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/Exception.php', - 'Carbon\\Exceptions\\ImmutableException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php', - 'Carbon\\Exceptions\\InvalidArgumentException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php', - 'Carbon\\Exceptions\\InvalidCastException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php', - 'Carbon\\Exceptions\\InvalidDateException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php', - 'Carbon\\Exceptions\\InvalidFormatException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php', - 'Carbon\\Exceptions\\InvalidIntervalException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php', - 'Carbon\\Exceptions\\InvalidPeriodDateException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php', - 'Carbon\\Exceptions\\InvalidPeriodParameterException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php', - 'Carbon\\Exceptions\\InvalidTimeZoneException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php', - 'Carbon\\Exceptions\\InvalidTypeException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php', - 'Carbon\\Exceptions\\NotACarbonClassException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php', - 'Carbon\\Exceptions\\NotAPeriodException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php', - 'Carbon\\Exceptions\\NotLocaleAwareException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php', - 'Carbon\\Exceptions\\OutOfRangeException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php', - 'Carbon\\Exceptions\\ParseErrorException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php', - 'Carbon\\Exceptions\\RuntimeException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php', - 'Carbon\\Exceptions\\UnitException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnitException.php', - 'Carbon\\Exceptions\\UnitNotConfiguredException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php', - 'Carbon\\Exceptions\\UnknownGetterException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php', - 'Carbon\\Exceptions\\UnknownMethodException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php', - 'Carbon\\Exceptions\\UnknownSetterException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php', - 'Carbon\\Exceptions\\UnknownUnitException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php', - 'Carbon\\Exceptions\\UnreachableException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php', - 'Carbon\\Exceptions\\UnsupportedUnitException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/UnsupportedUnitException.php', - 'Carbon\\Factory' => $vendorDir . '/nesbot/carbon/src/Carbon/Factory.php', - 'Carbon\\FactoryImmutable' => $vendorDir . '/nesbot/carbon/src/Carbon/FactoryImmutable.php', - 'Carbon\\Language' => $vendorDir . '/nesbot/carbon/src/Carbon/Language.php', - 'Carbon\\Laravel\\ServiceProvider' => $vendorDir . '/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php', - 'Carbon\\MessageFormatter\\MessageFormatterMapper' => $vendorDir . '/nesbot/carbon/src/Carbon/MessageFormatter/MessageFormatterMapper.php', - 'Carbon\\Month' => $vendorDir . '/nesbot/carbon/src/Carbon/Month.php', - 'Carbon\\OverflowMode' => $vendorDir . '/nesbot/carbon/src/Carbon/OverflowMode.php', - 'Carbon\\PHPStan\\MacroExtension' => $vendorDir . '/nesbot/carbon/src/Carbon/PHPStan/MacroExtension.php', - 'Carbon\\PHPStan\\MacroMethodReflection' => $vendorDir . '/nesbot/carbon/src/Carbon/PHPStan/MacroMethodReflection.php', - 'Carbon\\Traits\\Boundaries' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Boundaries.php', - 'Carbon\\Traits\\Cast' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Cast.php', - 'Carbon\\Traits\\Comparison' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Comparison.php', - 'Carbon\\Traits\\Converter' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Converter.php', - 'Carbon\\Traits\\Creator' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Creator.php', - 'Carbon\\Traits\\Date' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Date.php', - 'Carbon\\Traits\\DeprecatedPeriodProperties' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/DeprecatedPeriodProperties.php', - 'Carbon\\Traits\\Difference' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Difference.php', - 'Carbon\\Traits\\IntervalRounding' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php', - 'Carbon\\Traits\\IntervalStep' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/IntervalStep.php', - 'Carbon\\Traits\\LocalFactory' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/LocalFactory.php', - 'Carbon\\Traits\\Localization' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Localization.php', - 'Carbon\\Traits\\Macro' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Macro.php', - 'Carbon\\Traits\\MagicParameter' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/MagicParameter.php', - 'Carbon\\Traits\\Mixin' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Mixin.php', - 'Carbon\\Traits\\Modifiers' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Modifiers.php', - 'Carbon\\Traits\\Mutability' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Mutability.php', - 'Carbon\\Traits\\ObjectInitialisation' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php', - 'Carbon\\Traits\\Options' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Options.php', - 'Carbon\\Traits\\Rounding' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Rounding.php', - 'Carbon\\Traits\\Serialization' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Serialization.php', - 'Carbon\\Traits\\StaticLocalization' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/StaticLocalization.php', - 'Carbon\\Traits\\StaticOptions' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/StaticOptions.php', - 'Carbon\\Traits\\Test' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Test.php', - 'Carbon\\Traits\\Timestamp' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Timestamp.php', - 'Carbon\\Traits\\ToStringFormat' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/ToStringFormat.php', - 'Carbon\\Traits\\Units' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Units.php', - 'Carbon\\Traits\\Week' => $vendorDir . '/nesbot/carbon/src/Carbon/Traits/Week.php', - 'Carbon\\Translator' => $vendorDir . '/nesbot/carbon/src/Carbon/Translator.php', - 'Carbon\\TranslatorImmutable' => $vendorDir . '/nesbot/carbon/src/Carbon/TranslatorImmutable.php', - 'Carbon\\TranslatorStrongTypeInterface' => $vendorDir . '/nesbot/carbon/src/Carbon/TranslatorStrongTypeInterface.php', - 'Carbon\\Unit' => $vendorDir . '/nesbot/carbon/src/Carbon/Unit.php', - 'Carbon\\WeekDay' => $vendorDir . '/nesbot/carbon/src/Carbon/WeekDay.php', - 'Carbon\\WrapperClock' => $vendorDir . '/nesbot/carbon/src/Carbon/WrapperClock.php', 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', - 'DI\\Attribute\\Inject' => $vendorDir . '/php-di/php-di/src/Attribute/Inject.php', - 'DI\\Attribute\\Injectable' => $vendorDir . '/php-di/php-di/src/Attribute/Injectable.php', - 'DI\\CompiledContainer' => $vendorDir . '/php-di/php-di/src/CompiledContainer.php', - 'DI\\Compiler\\Compiler' => $vendorDir . '/php-di/php-di/src/Compiler/Compiler.php', - 'DI\\Compiler\\ObjectCreationCompiler' => $vendorDir . '/php-di/php-di/src/Compiler/ObjectCreationCompiler.php', - 'DI\\Compiler\\RequestedEntryHolder' => $vendorDir . '/php-di/php-di/src/Compiler/RequestedEntryHolder.php', - 'DI\\Container' => $vendorDir . '/php-di/php-di/src/Container.php', - 'DI\\ContainerBuilder' => $vendorDir . '/php-di/php-di/src/ContainerBuilder.php', - 'DI\\Definition\\ArrayDefinition' => $vendorDir . '/php-di/php-di/src/Definition/ArrayDefinition.php', - 'DI\\Definition\\ArrayDefinitionExtension' => $vendorDir . '/php-di/php-di/src/Definition/ArrayDefinitionExtension.php', - 'DI\\Definition\\AutowireDefinition' => $vendorDir . '/php-di/php-di/src/Definition/AutowireDefinition.php', - 'DI\\Definition\\DecoratorDefinition' => $vendorDir . '/php-di/php-di/src/Definition/DecoratorDefinition.php', - 'DI\\Definition\\Definition' => $vendorDir . '/php-di/php-di/src/Definition/Definition.php', - 'DI\\Definition\\Dumper\\ObjectDefinitionDumper' => $vendorDir . '/php-di/php-di/src/Definition/Dumper/ObjectDefinitionDumper.php', - 'DI\\Definition\\EnvironmentVariableDefinition' => $vendorDir . '/php-di/php-di/src/Definition/EnvironmentVariableDefinition.php', - 'DI\\Definition\\Exception\\InvalidAttribute' => $vendorDir . '/php-di/php-di/src/Definition/Exception/InvalidAttribute.php', - 'DI\\Definition\\Exception\\InvalidDefinition' => $vendorDir . '/php-di/php-di/src/Definition/Exception/InvalidDefinition.php', - 'DI\\Definition\\ExtendsPreviousDefinition' => $vendorDir . '/php-di/php-di/src/Definition/ExtendsPreviousDefinition.php', - 'DI\\Definition\\FactoryDefinition' => $vendorDir . '/php-di/php-di/src/Definition/FactoryDefinition.php', - 'DI\\Definition\\Helper\\AutowireDefinitionHelper' => $vendorDir . '/php-di/php-di/src/Definition/Helper/AutowireDefinitionHelper.php', - 'DI\\Definition\\Helper\\CreateDefinitionHelper' => $vendorDir . '/php-di/php-di/src/Definition/Helper/CreateDefinitionHelper.php', - 'DI\\Definition\\Helper\\DefinitionHelper' => $vendorDir . '/php-di/php-di/src/Definition/Helper/DefinitionHelper.php', - 'DI\\Definition\\Helper\\FactoryDefinitionHelper' => $vendorDir . '/php-di/php-di/src/Definition/Helper/FactoryDefinitionHelper.php', - 'DI\\Definition\\InstanceDefinition' => $vendorDir . '/php-di/php-di/src/Definition/InstanceDefinition.php', - 'DI\\Definition\\ObjectDefinition' => $vendorDir . '/php-di/php-di/src/Definition/ObjectDefinition.php', - 'DI\\Definition\\ObjectDefinition\\MethodInjection' => $vendorDir . '/php-di/php-di/src/Definition/ObjectDefinition/MethodInjection.php', - 'DI\\Definition\\ObjectDefinition\\PropertyInjection' => $vendorDir . '/php-di/php-di/src/Definition/ObjectDefinition/PropertyInjection.php', - 'DI\\Definition\\Reference' => $vendorDir . '/php-di/php-di/src/Definition/Reference.php', - 'DI\\Definition\\Resolver\\ArrayResolver' => $vendorDir . '/php-di/php-di/src/Definition/Resolver/ArrayResolver.php', - 'DI\\Definition\\Resolver\\DecoratorResolver' => $vendorDir . '/php-di/php-di/src/Definition/Resolver/DecoratorResolver.php', - 'DI\\Definition\\Resolver\\DefinitionResolver' => $vendorDir . '/php-di/php-di/src/Definition/Resolver/DefinitionResolver.php', - 'DI\\Definition\\Resolver\\EnvironmentVariableResolver' => $vendorDir . '/php-di/php-di/src/Definition/Resolver/EnvironmentVariableResolver.php', - 'DI\\Definition\\Resolver\\FactoryResolver' => $vendorDir . '/php-di/php-di/src/Definition/Resolver/FactoryResolver.php', - 'DI\\Definition\\Resolver\\InstanceInjector' => $vendorDir . '/php-di/php-di/src/Definition/Resolver/InstanceInjector.php', - 'DI\\Definition\\Resolver\\ObjectCreator' => $vendorDir . '/php-di/php-di/src/Definition/Resolver/ObjectCreator.php', - 'DI\\Definition\\Resolver\\ParameterResolver' => $vendorDir . '/php-di/php-di/src/Definition/Resolver/ParameterResolver.php', - 'DI\\Definition\\Resolver\\ResolverDispatcher' => $vendorDir . '/php-di/php-di/src/Definition/Resolver/ResolverDispatcher.php', - 'DI\\Definition\\SelfResolvingDefinition' => $vendorDir . '/php-di/php-di/src/Definition/SelfResolvingDefinition.php', - 'DI\\Definition\\Source\\AttributeBasedAutowiring' => $vendorDir . '/php-di/php-di/src/Definition/Source/AttributeBasedAutowiring.php', - 'DI\\Definition\\Source\\Autowiring' => $vendorDir . '/php-di/php-di/src/Definition/Source/Autowiring.php', - 'DI\\Definition\\Source\\DefinitionArray' => $vendorDir . '/php-di/php-di/src/Definition/Source/DefinitionArray.php', - 'DI\\Definition\\Source\\DefinitionFile' => $vendorDir . '/php-di/php-di/src/Definition/Source/DefinitionFile.php', - 'DI\\Definition\\Source\\DefinitionNormalizer' => $vendorDir . '/php-di/php-di/src/Definition/Source/DefinitionNormalizer.php', - 'DI\\Definition\\Source\\DefinitionSource' => $vendorDir . '/php-di/php-di/src/Definition/Source/DefinitionSource.php', - 'DI\\Definition\\Source\\MutableDefinitionSource' => $vendorDir . '/php-di/php-di/src/Definition/Source/MutableDefinitionSource.php', - 'DI\\Definition\\Source\\NoAutowiring' => $vendorDir . '/php-di/php-di/src/Definition/Source/NoAutowiring.php', - 'DI\\Definition\\Source\\ReflectionBasedAutowiring' => $vendorDir . '/php-di/php-di/src/Definition/Source/ReflectionBasedAutowiring.php', - 'DI\\Definition\\Source\\SourceCache' => $vendorDir . '/php-di/php-di/src/Definition/Source/SourceCache.php', - 'DI\\Definition\\Source\\SourceChain' => $vendorDir . '/php-di/php-di/src/Definition/Source/SourceChain.php', - 'DI\\Definition\\StringDefinition' => $vendorDir . '/php-di/php-di/src/Definition/StringDefinition.php', - 'DI\\Definition\\ValueDefinition' => $vendorDir . '/php-di/php-di/src/Definition/ValueDefinition.php', - 'DI\\DependencyException' => $vendorDir . '/php-di/php-di/src/DependencyException.php', - 'DI\\FactoryInterface' => $vendorDir . '/php-di/php-di/src/FactoryInterface.php', - 'DI\\Factory\\RequestedEntry' => $vendorDir . '/php-di/php-di/src/Factory/RequestedEntry.php', - 'DI\\Invoker\\DefinitionParameterResolver' => $vendorDir . '/php-di/php-di/src/Invoker/DefinitionParameterResolver.php', - 'DI\\Invoker\\FactoryParameterResolver' => $vendorDir . '/php-di/php-di/src/Invoker/FactoryParameterResolver.php', - 'DI\\NotFoundException' => $vendorDir . '/php-di/php-di/src/NotFoundException.php', - 'DI\\Proxy\\NativeProxyFactory' => $vendorDir . '/php-di/php-di/src/Proxy/NativeProxyFactory.php', - 'DI\\Proxy\\ProxyFactory' => $vendorDir . '/php-di/php-di/src/Proxy/ProxyFactory.php', - 'DI\\Proxy\\ProxyFactoryInterface' => $vendorDir . '/php-di/php-di/src/Proxy/ProxyFactoryInterface.php', 'DateError' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateError.php', 'DateException' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateException.php', 'DateInvalidOperationException' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateInvalidOperationException.php', @@ -174,413 +19,8 @@ return array( 'DateRangeError' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/DateRangeError.php', 'DelayedTargetValidation' => $vendorDir . '/symfony/polyfill-php85/Resources/stubs/DelayedTargetValidation.php', 'Deprecated' => $vendorDir . '/symfony/polyfill-php84/Resources/stubs/Deprecated.php', - 'DirectoryTree\\ImapEngine\\Address' => $vendorDir . '/directorytree/imapengine/src/Address.php', - 'DirectoryTree\\ImapEngine\\Attachment' => $vendorDir . '/directorytree/imapengine/src/Attachment.php', - 'DirectoryTree\\ImapEngine\\BodyStructureCollection' => $vendorDir . '/directorytree/imapengine/src/BodyStructureCollection.php', - 'DirectoryTree\\ImapEngine\\BodyStructurePart' => $vendorDir . '/directorytree/imapengine/src/BodyStructurePart.php', - 'DirectoryTree\\ImapEngine\\Collections\\FolderCollection' => $vendorDir . '/directorytree/imapengine/src/Collections/FolderCollection.php', - 'DirectoryTree\\ImapEngine\\Collections\\MessageCollection' => $vendorDir . '/directorytree/imapengine/src/Collections/MessageCollection.php', - 'DirectoryTree\\ImapEngine\\Collections\\PaginatedCollection' => $vendorDir . '/directorytree/imapengine/src/Collections/PaginatedCollection.php', - 'DirectoryTree\\ImapEngine\\Collections\\ResponseCollection' => $vendorDir . '/directorytree/imapengine/src/Collections/ResponseCollection.php', - 'DirectoryTree\\ImapEngine\\ComparesFolders' => $vendorDir . '/directorytree/imapengine/src/ComparesFolders.php', - 'DirectoryTree\\ImapEngine\\Connection\\ConnectionInterface' => $vendorDir . '/directorytree/imapengine/src/Connection/ConnectionInterface.php', - 'DirectoryTree\\ImapEngine\\Connection\\ImapCommand' => $vendorDir . '/directorytree/imapengine/src/Connection/ImapCommand.php', - 'DirectoryTree\\ImapEngine\\Connection\\ImapConnection' => $vendorDir . '/directorytree/imapengine/src/Connection/ImapConnection.php', - 'DirectoryTree\\ImapEngine\\Connection\\ImapParser' => $vendorDir . '/directorytree/imapengine/src/Connection/ImapParser.php', - 'DirectoryTree\\ImapEngine\\Connection\\ImapQueryBuilder' => $vendorDir . '/directorytree/imapengine/src/Connection/ImapQueryBuilder.php', - 'DirectoryTree\\ImapEngine\\Connection\\ImapTokenizer' => $vendorDir . '/directorytree/imapengine/src/Connection/ImapTokenizer.php', - 'DirectoryTree\\ImapEngine\\Connection\\Loggers\\EchoLogger' => $vendorDir . '/directorytree/imapengine/src/Connection/Loggers/EchoLogger.php', - 'DirectoryTree\\ImapEngine\\Connection\\Loggers\\FileLogger' => $vendorDir . '/directorytree/imapengine/src/Connection/Loggers/FileLogger.php', - 'DirectoryTree\\ImapEngine\\Connection\\Loggers\\Logger' => $vendorDir . '/directorytree/imapengine/src/Connection/Loggers/Logger.php', - 'DirectoryTree\\ImapEngine\\Connection\\Loggers\\LoggerInterface' => $vendorDir . '/directorytree/imapengine/src/Connection/Loggers/LoggerInterface.php', - 'DirectoryTree\\ImapEngine\\Connection\\Loggers\\RayLogger' => $vendorDir . '/directorytree/imapengine/src/Connection/Loggers/RayLogger.php', - 'DirectoryTree\\ImapEngine\\Connection\\RawQueryValue' => $vendorDir . '/directorytree/imapengine/src/Connection/RawQueryValue.php', - 'DirectoryTree\\ImapEngine\\Connection\\Responses\\ContinuationResponse' => $vendorDir . '/directorytree/imapengine/src/Connection/Responses/ContinuationResponse.php', - 'DirectoryTree\\ImapEngine\\Connection\\Responses\\Data\\Data' => $vendorDir . '/directorytree/imapengine/src/Connection/Responses/Data/Data.php', - 'DirectoryTree\\ImapEngine\\Connection\\Responses\\Data\\ListData' => $vendorDir . '/directorytree/imapengine/src/Connection/Responses/Data/ListData.php', - 'DirectoryTree\\ImapEngine\\Connection\\Responses\\Data\\ResponseCodeData' => $vendorDir . '/directorytree/imapengine/src/Connection/Responses/Data/ResponseCodeData.php', - 'DirectoryTree\\ImapEngine\\Connection\\Responses\\HasTokens' => $vendorDir . '/directorytree/imapengine/src/Connection/Responses/HasTokens.php', - 'DirectoryTree\\ImapEngine\\Connection\\Responses\\MessageResponseParser' => $vendorDir . '/directorytree/imapengine/src/Connection/Responses/MessageResponseParser.php', - 'DirectoryTree\\ImapEngine\\Connection\\Responses\\Response' => $vendorDir . '/directorytree/imapengine/src/Connection/Responses/Response.php', - 'DirectoryTree\\ImapEngine\\Connection\\Responses\\TaggedResponse' => $vendorDir . '/directorytree/imapengine/src/Connection/Responses/TaggedResponse.php', - 'DirectoryTree\\ImapEngine\\Connection\\Responses\\UntaggedResponse' => $vendorDir . '/directorytree/imapengine/src/Connection/Responses/UntaggedResponse.php', - 'DirectoryTree\\ImapEngine\\Connection\\Result' => $vendorDir . '/directorytree/imapengine/src/Connection/Result.php', - 'DirectoryTree\\ImapEngine\\Connection\\Streams\\FakeStream' => $vendorDir . '/directorytree/imapengine/src/Connection/Streams/FakeStream.php', - 'DirectoryTree\\ImapEngine\\Connection\\Streams\\ImapStream' => $vendorDir . '/directorytree/imapengine/src/Connection/Streams/ImapStream.php', - 'DirectoryTree\\ImapEngine\\Connection\\Streams\\StreamInterface' => $vendorDir . '/directorytree/imapengine/src/Connection/Streams/StreamInterface.php', - 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\Atom' => $vendorDir . '/directorytree/imapengine/src/Connection/Tokens/Atom.php', - 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\Crlf' => $vendorDir . '/directorytree/imapengine/src/Connection/Tokens/Crlf.php', - 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\EmailAddress' => $vendorDir . '/directorytree/imapengine/src/Connection/Tokens/EmailAddress.php', - 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\ListClose' => $vendorDir . '/directorytree/imapengine/src/Connection/Tokens/ListClose.php', - 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\ListOpen' => $vendorDir . '/directorytree/imapengine/src/Connection/Tokens/ListOpen.php', - 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\Literal' => $vendorDir . '/directorytree/imapengine/src/Connection/Tokens/Literal.php', - 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\Nil' => $vendorDir . '/directorytree/imapengine/src/Connection/Tokens/Nil.php', - 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\Number' => $vendorDir . '/directorytree/imapengine/src/Connection/Tokens/Number.php', - 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\QuotedString' => $vendorDir . '/directorytree/imapengine/src/Connection/Tokens/QuotedString.php', - 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\ResponseCodeClose' => $vendorDir . '/directorytree/imapengine/src/Connection/Tokens/ResponseCodeClose.php', - 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\ResponseCodeOpen' => $vendorDir . '/directorytree/imapengine/src/Connection/Tokens/ResponseCodeOpen.php', - 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\Token' => $vendorDir . '/directorytree/imapengine/src/Connection/Tokens/Token.php', - 'DirectoryTree\\ImapEngine\\ContentDisposition' => $vendorDir . '/directorytree/imapengine/src/ContentDisposition.php', - 'DirectoryTree\\ImapEngine\\DraftMessage' => $vendorDir . '/directorytree/imapengine/src/DraftMessage.php', - 'DirectoryTree\\ImapEngine\\Enums\\ContentDispositionType' => $vendorDir . '/directorytree/imapengine/src/Enums/ContentDispositionType.php', - 'DirectoryTree\\ImapEngine\\Enums\\ImapFetchIdentifier' => $vendorDir . '/directorytree/imapengine/src/Enums/ImapFetchIdentifier.php', - 'DirectoryTree\\ImapEngine\\Enums\\ImapFlag' => $vendorDir . '/directorytree/imapengine/src/Enums/ImapFlag.php', - 'DirectoryTree\\ImapEngine\\Enums\\ImapSearchKey' => $vendorDir . '/directorytree/imapengine/src/Enums/ImapSearchKey.php', - 'DirectoryTree\\ImapEngine\\Enums\\ImapSortKey' => $vendorDir . '/directorytree/imapengine/src/Enums/ImapSortKey.php', - 'DirectoryTree\\ImapEngine\\Exceptions\\Exception' => $vendorDir . '/directorytree/imapengine/src/Exceptions/Exception.php', - 'DirectoryTree\\ImapEngine\\Exceptions\\ImapCapabilityException' => $vendorDir . '/directorytree/imapengine/src/Exceptions/ImapCapabilityException.php', - 'DirectoryTree\\ImapEngine\\Exceptions\\ImapCommandException' => $vendorDir . '/directorytree/imapengine/src/Exceptions/ImapCommandException.php', - 'DirectoryTree\\ImapEngine\\Exceptions\\ImapConnectionClosedException' => $vendorDir . '/directorytree/imapengine/src/Exceptions/ImapConnectionClosedException.php', - 'DirectoryTree\\ImapEngine\\Exceptions\\ImapConnectionException' => $vendorDir . '/directorytree/imapengine/src/Exceptions/ImapConnectionException.php', - 'DirectoryTree\\ImapEngine\\Exceptions\\ImapConnectionFailedException' => $vendorDir . '/directorytree/imapengine/src/Exceptions/ImapConnectionFailedException.php', - 'DirectoryTree\\ImapEngine\\Exceptions\\ImapConnectionTimedOutException' => $vendorDir . '/directorytree/imapengine/src/Exceptions/ImapConnectionTimedOutException.php', - 'DirectoryTree\\ImapEngine\\Exceptions\\ImapParserException' => $vendorDir . '/directorytree/imapengine/src/Exceptions/ImapParserException.php', - 'DirectoryTree\\ImapEngine\\Exceptions\\ImapResponseException' => $vendorDir . '/directorytree/imapengine/src/Exceptions/ImapResponseException.php', - 'DirectoryTree\\ImapEngine\\Exceptions\\ImapStreamException' => $vendorDir . '/directorytree/imapengine/src/Exceptions/ImapStreamException.php', - 'DirectoryTree\\ImapEngine\\Exceptions\\RuntimeException' => $vendorDir . '/directorytree/imapengine/src/Exceptions/RuntimeException.php', - 'DirectoryTree\\ImapEngine\\FileMessage' => $vendorDir . '/directorytree/imapengine/src/FileMessage.php', - 'DirectoryTree\\ImapEngine\\FlaggableInterface' => $vendorDir . '/directorytree/imapengine/src/FlaggableInterface.php', - 'DirectoryTree\\ImapEngine\\Folder' => $vendorDir . '/directorytree/imapengine/src/Folder.php', - 'DirectoryTree\\ImapEngine\\FolderInterface' => $vendorDir . '/directorytree/imapengine/src/FolderInterface.php', - 'DirectoryTree\\ImapEngine\\FolderRepository' => $vendorDir . '/directorytree/imapengine/src/FolderRepository.php', - 'DirectoryTree\\ImapEngine\\FolderRepositoryInterface' => $vendorDir . '/directorytree/imapengine/src/FolderRepositoryInterface.php', - 'DirectoryTree\\ImapEngine\\HasFlags' => $vendorDir . '/directorytree/imapengine/src/HasFlags.php', - 'DirectoryTree\\ImapEngine\\HasMessageAccessors' => $vendorDir . '/directorytree/imapengine/src/HasMessageAccessors.php', - 'DirectoryTree\\ImapEngine\\HasParsedMessage' => $vendorDir . '/directorytree/imapengine/src/HasParsedMessage.php', - 'DirectoryTree\\ImapEngine\\Idle' => $vendorDir . '/directorytree/imapengine/src/Idle.php', - 'DirectoryTree\\ImapEngine\\Mailbox' => $vendorDir . '/directorytree/imapengine/src/Mailbox.php', - 'DirectoryTree\\ImapEngine\\MailboxInterface' => $vendorDir . '/directorytree/imapengine/src/MailboxInterface.php', - 'DirectoryTree\\ImapEngine\\Mbox' => $vendorDir . '/directorytree/imapengine/src/Mbox.php', - 'DirectoryTree\\ImapEngine\\Message' => $vendorDir . '/directorytree/imapengine/src/Message.php', - 'DirectoryTree\\ImapEngine\\MessageInterface' => $vendorDir . '/directorytree/imapengine/src/MessageInterface.php', - 'DirectoryTree\\ImapEngine\\MessageParser' => $vendorDir . '/directorytree/imapengine/src/MessageParser.php', - 'DirectoryTree\\ImapEngine\\MessageQuery' => $vendorDir . '/directorytree/imapengine/src/MessageQuery.php', - 'DirectoryTree\\ImapEngine\\MessageQueryInterface' => $vendorDir . '/directorytree/imapengine/src/MessageQueryInterface.php', - 'DirectoryTree\\ImapEngine\\Pagination\\LengthAwarePaginator' => $vendorDir . '/directorytree/imapengine/src/Pagination/LengthAwarePaginator.php', - 'DirectoryTree\\ImapEngine\\Poll' => $vendorDir . '/directorytree/imapengine/src/Poll.php', - 'DirectoryTree\\ImapEngine\\QueriesMessages' => $vendorDir . '/directorytree/imapengine/src/QueriesMessages.php', - 'DirectoryTree\\ImapEngine\\Support\\BodyPartDecoder' => $vendorDir . '/directorytree/imapengine/src/Support/BodyPartDecoder.php', - 'DirectoryTree\\ImapEngine\\Support\\ForwardsCalls' => $vendorDir . '/directorytree/imapengine/src/Support/ForwardsCalls.php', - 'DirectoryTree\\ImapEngine\\Support\\LazyBodyPartStream' => $vendorDir . '/directorytree/imapengine/src/Support/LazyBodyPartStream.php', - 'DirectoryTree\\ImapEngine\\Support\\MimeMessage' => $vendorDir . '/directorytree/imapengine/src/Support/MimeMessage.php', - 'DirectoryTree\\ImapEngine\\Support\\Str' => $vendorDir . '/directorytree/imapengine/src/Support/Str.php', - 'DirectoryTree\\ImapEngine\\Testing\\FakeFolder' => $vendorDir . '/directorytree/imapengine/src/Testing/FakeFolder.php', - 'DirectoryTree\\ImapEngine\\Testing\\FakeFolderRepository' => $vendorDir . '/directorytree/imapengine/src/Testing/FakeFolderRepository.php', - 'DirectoryTree\\ImapEngine\\Testing\\FakeMailbox' => $vendorDir . '/directorytree/imapengine/src/Testing/FakeMailbox.php', - 'DirectoryTree\\ImapEngine\\Testing\\FakeMessage' => $vendorDir . '/directorytree/imapengine/src/Testing/FakeMessage.php', - 'DirectoryTree\\ImapEngine\\Testing\\FakeMessageQuery' => $vendorDir . '/directorytree/imapengine/src/Testing/FakeMessageQuery.php', - 'Doctrine\\Common\\Lexer\\AbstractLexer' => $vendorDir . '/doctrine/lexer/src/AbstractLexer.php', - 'Doctrine\\Common\\Lexer\\Token' => $vendorDir . '/doctrine/lexer/src/Token.php', - 'Egulias\\EmailValidator\\EmailLexer' => $vendorDir . '/egulias/email-validator/src/EmailLexer.php', - 'Egulias\\EmailValidator\\EmailParser' => $vendorDir . '/egulias/email-validator/src/EmailParser.php', - 'Egulias\\EmailValidator\\EmailValidator' => $vendorDir . '/egulias/email-validator/src/EmailValidator.php', - 'Egulias\\EmailValidator\\MessageIDParser' => $vendorDir . '/egulias/email-validator/src/MessageIDParser.php', - 'Egulias\\EmailValidator\\Parser' => $vendorDir . '/egulias/email-validator/src/Parser.php', - 'Egulias\\EmailValidator\\Parser\\Comment' => $vendorDir . '/egulias/email-validator/src/Parser/Comment.php', - 'Egulias\\EmailValidator\\Parser\\CommentStrategy\\CommentStrategy' => $vendorDir . '/egulias/email-validator/src/Parser/CommentStrategy/CommentStrategy.php', - 'Egulias\\EmailValidator\\Parser\\CommentStrategy\\DomainComment' => $vendorDir . '/egulias/email-validator/src/Parser/CommentStrategy/DomainComment.php', - 'Egulias\\EmailValidator\\Parser\\CommentStrategy\\LocalComment' => $vendorDir . '/egulias/email-validator/src/Parser/CommentStrategy/LocalComment.php', - 'Egulias\\EmailValidator\\Parser\\DomainLiteral' => $vendorDir . '/egulias/email-validator/src/Parser/DomainLiteral.php', - 'Egulias\\EmailValidator\\Parser\\DomainPart' => $vendorDir . '/egulias/email-validator/src/Parser/DomainPart.php', - 'Egulias\\EmailValidator\\Parser\\DoubleQuote' => $vendorDir . '/egulias/email-validator/src/Parser/DoubleQuote.php', - 'Egulias\\EmailValidator\\Parser\\FoldingWhiteSpace' => $vendorDir . '/egulias/email-validator/src/Parser/FoldingWhiteSpace.php', - 'Egulias\\EmailValidator\\Parser\\IDLeftPart' => $vendorDir . '/egulias/email-validator/src/Parser/IDLeftPart.php', - 'Egulias\\EmailValidator\\Parser\\IDRightPart' => $vendorDir . '/egulias/email-validator/src/Parser/IDRightPart.php', - 'Egulias\\EmailValidator\\Parser\\LocalPart' => $vendorDir . '/egulias/email-validator/src/Parser/LocalPart.php', - 'Egulias\\EmailValidator\\Parser\\PartParser' => $vendorDir . '/egulias/email-validator/src/Parser/PartParser.php', - 'Egulias\\EmailValidator\\Result\\InvalidEmail' => $vendorDir . '/egulias/email-validator/src/Result/InvalidEmail.php', - 'Egulias\\EmailValidator\\Result\\MultipleErrors' => $vendorDir . '/egulias/email-validator/src/Result/MultipleErrors.php', - 'Egulias\\EmailValidator\\Result\\Reason\\AtextAfterCFWS' => $vendorDir . '/egulias/email-validator/src/Result/Reason/AtextAfterCFWS.php', - 'Egulias\\EmailValidator\\Result\\Reason\\CRLFAtTheEnd' => $vendorDir . '/egulias/email-validator/src/Result/Reason/CRLFAtTheEnd.php', - 'Egulias\\EmailValidator\\Result\\Reason\\CRLFX2' => $vendorDir . '/egulias/email-validator/src/Result/Reason/CRLFX2.php', - 'Egulias\\EmailValidator\\Result\\Reason\\CRNoLF' => $vendorDir . '/egulias/email-validator/src/Result/Reason/CRNoLF.php', - 'Egulias\\EmailValidator\\Result\\Reason\\CharNotAllowed' => $vendorDir . '/egulias/email-validator/src/Result/Reason/CharNotAllowed.php', - 'Egulias\\EmailValidator\\Result\\Reason\\CommaInDomain' => $vendorDir . '/egulias/email-validator/src/Result/Reason/CommaInDomain.php', - 'Egulias\\EmailValidator\\Result\\Reason\\CommentsInIDRight' => $vendorDir . '/egulias/email-validator/src/Result/Reason/CommentsInIDRight.php', - 'Egulias\\EmailValidator\\Result\\Reason\\ConsecutiveAt' => $vendorDir . '/egulias/email-validator/src/Result/Reason/ConsecutiveAt.php', - 'Egulias\\EmailValidator\\Result\\Reason\\ConsecutiveDot' => $vendorDir . '/egulias/email-validator/src/Result/Reason/ConsecutiveDot.php', - 'Egulias\\EmailValidator\\Result\\Reason\\DetailedReason' => $vendorDir . '/egulias/email-validator/src/Result/Reason/DetailedReason.php', - 'Egulias\\EmailValidator\\Result\\Reason\\DomainAcceptsNoMail' => $vendorDir . '/egulias/email-validator/src/Result/Reason/DomainAcceptsNoMail.php', - 'Egulias\\EmailValidator\\Result\\Reason\\DomainHyphened' => $vendorDir . '/egulias/email-validator/src/Result/Reason/DomainHyphened.php', - 'Egulias\\EmailValidator\\Result\\Reason\\DomainTooLong' => $vendorDir . '/egulias/email-validator/src/Result/Reason/DomainTooLong.php', - 'Egulias\\EmailValidator\\Result\\Reason\\DotAtEnd' => $vendorDir . '/egulias/email-validator/src/Result/Reason/DotAtEnd.php', - 'Egulias\\EmailValidator\\Result\\Reason\\DotAtStart' => $vendorDir . '/egulias/email-validator/src/Result/Reason/DotAtStart.php', - 'Egulias\\EmailValidator\\Result\\Reason\\EmptyReason' => $vendorDir . '/egulias/email-validator/src/Result/Reason/EmptyReason.php', - 'Egulias\\EmailValidator\\Result\\Reason\\ExceptionFound' => $vendorDir . '/egulias/email-validator/src/Result/Reason/ExceptionFound.php', - 'Egulias\\EmailValidator\\Result\\Reason\\ExpectingATEXT' => $vendorDir . '/egulias/email-validator/src/Result/Reason/ExpectingATEXT.php', - 'Egulias\\EmailValidator\\Result\\Reason\\ExpectingCTEXT' => $vendorDir . '/egulias/email-validator/src/Result/Reason/ExpectingCTEXT.php', - 'Egulias\\EmailValidator\\Result\\Reason\\ExpectingDTEXT' => $vendorDir . '/egulias/email-validator/src/Result/Reason/ExpectingDTEXT.php', - 'Egulias\\EmailValidator\\Result\\Reason\\ExpectingDomainLiteralClose' => $vendorDir . '/egulias/email-validator/src/Result/Reason/ExpectingDomainLiteralClose.php', - 'Egulias\\EmailValidator\\Result\\Reason\\LabelTooLong' => $vendorDir . '/egulias/email-validator/src/Result/Reason/LabelTooLong.php', - 'Egulias\\EmailValidator\\Result\\Reason\\LocalOrReservedDomain' => $vendorDir . '/egulias/email-validator/src/Result/Reason/LocalOrReservedDomain.php', - 'Egulias\\EmailValidator\\Result\\Reason\\NoDNSRecord' => $vendorDir . '/egulias/email-validator/src/Result/Reason/NoDNSRecord.php', - 'Egulias\\EmailValidator\\Result\\Reason\\NoDomainPart' => $vendorDir . '/egulias/email-validator/src/Result/Reason/NoDomainPart.php', - 'Egulias\\EmailValidator\\Result\\Reason\\NoLocalPart' => $vendorDir . '/egulias/email-validator/src/Result/Reason/NoLocalPart.php', - 'Egulias\\EmailValidator\\Result\\Reason\\RFCWarnings' => $vendorDir . '/egulias/email-validator/src/Result/Reason/RFCWarnings.php', - 'Egulias\\EmailValidator\\Result\\Reason\\Reason' => $vendorDir . '/egulias/email-validator/src/Result/Reason/Reason.php', - 'Egulias\\EmailValidator\\Result\\Reason\\SpoofEmail' => $vendorDir . '/egulias/email-validator/src/Result/Reason/SpoofEmail.php', - 'Egulias\\EmailValidator\\Result\\Reason\\UnOpenedComment' => $vendorDir . '/egulias/email-validator/src/Result/Reason/UnOpenedComment.php', - 'Egulias\\EmailValidator\\Result\\Reason\\UnableToGetDNSRecord' => $vendorDir . '/egulias/email-validator/src/Result/Reason/UnableToGetDNSRecord.php', - 'Egulias\\EmailValidator\\Result\\Reason\\UnclosedComment' => $vendorDir . '/egulias/email-validator/src/Result/Reason/UnclosedComment.php', - 'Egulias\\EmailValidator\\Result\\Reason\\UnclosedQuotedString' => $vendorDir . '/egulias/email-validator/src/Result/Reason/UnclosedQuotedString.php', - 'Egulias\\EmailValidator\\Result\\Reason\\UnusualElements' => $vendorDir . '/egulias/email-validator/src/Result/Reason/UnusualElements.php', - 'Egulias\\EmailValidator\\Result\\Result' => $vendorDir . '/egulias/email-validator/src/Result/Result.php', - 'Egulias\\EmailValidator\\Result\\SpoofEmail' => $vendorDir . '/egulias/email-validator/src/Result/SpoofEmail.php', - 'Egulias\\EmailValidator\\Result\\ValidEmail' => $vendorDir . '/egulias/email-validator/src/Result/ValidEmail.php', - 'Egulias\\EmailValidator\\Validation\\DNSCheckValidation' => $vendorDir . '/egulias/email-validator/src/Validation/DNSCheckValidation.php', - 'Egulias\\EmailValidator\\Validation\\DNSGetRecordWrapper' => $vendorDir . '/egulias/email-validator/src/Validation/DNSGetRecordWrapper.php', - 'Egulias\\EmailValidator\\Validation\\DNSRecords' => $vendorDir . '/egulias/email-validator/src/Validation/DNSRecords.php', - 'Egulias\\EmailValidator\\Validation\\EmailValidation' => $vendorDir . '/egulias/email-validator/src/Validation/EmailValidation.php', - 'Egulias\\EmailValidator\\Validation\\Exception\\EmptyValidationList' => $vendorDir . '/egulias/email-validator/src/Validation/Exception/EmptyValidationList.php', - 'Egulias\\EmailValidator\\Validation\\Extra\\SpoofCheckValidation' => $vendorDir . '/egulias/email-validator/src/Validation/Extra/SpoofCheckValidation.php', - 'Egulias\\EmailValidator\\Validation\\MessageIDValidation' => $vendorDir . '/egulias/email-validator/src/Validation/MessageIDValidation.php', - 'Egulias\\EmailValidator\\Validation\\MultipleValidationWithAnd' => $vendorDir . '/egulias/email-validator/src/Validation/MultipleValidationWithAnd.php', - 'Egulias\\EmailValidator\\Validation\\NoRFCWarningsValidation' => $vendorDir . '/egulias/email-validator/src/Validation/NoRFCWarningsValidation.php', - 'Egulias\\EmailValidator\\Validation\\RFCValidation' => $vendorDir . '/egulias/email-validator/src/Validation/RFCValidation.php', - 'Egulias\\EmailValidator\\Warning\\AddressLiteral' => $vendorDir . '/egulias/email-validator/src/Warning/AddressLiteral.php', - 'Egulias\\EmailValidator\\Warning\\CFWSNearAt' => $vendorDir . '/egulias/email-validator/src/Warning/CFWSNearAt.php', - 'Egulias\\EmailValidator\\Warning\\CFWSWithFWS' => $vendorDir . '/egulias/email-validator/src/Warning/CFWSWithFWS.php', - 'Egulias\\EmailValidator\\Warning\\Comment' => $vendorDir . '/egulias/email-validator/src/Warning/Comment.php', - 'Egulias\\EmailValidator\\Warning\\DeprecatedComment' => $vendorDir . '/egulias/email-validator/src/Warning/DeprecatedComment.php', - 'Egulias\\EmailValidator\\Warning\\DomainLiteral' => $vendorDir . '/egulias/email-validator/src/Warning/DomainLiteral.php', - 'Egulias\\EmailValidator\\Warning\\EmailTooLong' => $vendorDir . '/egulias/email-validator/src/Warning/EmailTooLong.php', - 'Egulias\\EmailValidator\\Warning\\IPV6BadChar' => $vendorDir . '/egulias/email-validator/src/Warning/IPV6BadChar.php', - 'Egulias\\EmailValidator\\Warning\\IPV6ColonEnd' => $vendorDir . '/egulias/email-validator/src/Warning/IPV6ColonEnd.php', - 'Egulias\\EmailValidator\\Warning\\IPV6ColonStart' => $vendorDir . '/egulias/email-validator/src/Warning/IPV6ColonStart.php', - 'Egulias\\EmailValidator\\Warning\\IPV6Deprecated' => $vendorDir . '/egulias/email-validator/src/Warning/IPV6Deprecated.php', - 'Egulias\\EmailValidator\\Warning\\IPV6DoubleColon' => $vendorDir . '/egulias/email-validator/src/Warning/IPV6DoubleColon.php', - 'Egulias\\EmailValidator\\Warning\\IPV6GroupCount' => $vendorDir . '/egulias/email-validator/src/Warning/IPV6GroupCount.php', - 'Egulias\\EmailValidator\\Warning\\IPV6MaxGroups' => $vendorDir . '/egulias/email-validator/src/Warning/IPV6MaxGroups.php', - 'Egulias\\EmailValidator\\Warning\\LocalTooLong' => $vendorDir . '/egulias/email-validator/src/Warning/LocalTooLong.php', - 'Egulias\\EmailValidator\\Warning\\NoDNSMXRecord' => $vendorDir . '/egulias/email-validator/src/Warning/NoDNSMXRecord.php', - 'Egulias\\EmailValidator\\Warning\\ObsoleteDTEXT' => $vendorDir . '/egulias/email-validator/src/Warning/ObsoleteDTEXT.php', - 'Egulias\\EmailValidator\\Warning\\QuotedPart' => $vendorDir . '/egulias/email-validator/src/Warning/QuotedPart.php', - 'Egulias\\EmailValidator\\Warning\\QuotedString' => $vendorDir . '/egulias/email-validator/src/Warning/QuotedString.php', - 'Egulias\\EmailValidator\\Warning\\TLD' => $vendorDir . '/egulias/email-validator/src/Warning/TLD.php', - 'Egulias\\EmailValidator\\Warning\\Warning' => $vendorDir . '/egulias/email-validator/src/Warning/Warning.php', 'Filter\\FilterException' => $vendorDir . '/symfony/polyfill-php85/Resources/stubs/Filter/FilterException.php', 'Filter\\FilterFailedException' => $vendorDir . '/symfony/polyfill-php85/Resources/stubs/Filter/FilterFailedException.php', - 'GuzzleHttp\\Psr7\\AppendStream' => $vendorDir . '/guzzlehttp/psr7/src/AppendStream.php', - 'GuzzleHttp\\Psr7\\BufferStream' => $vendorDir . '/guzzlehttp/psr7/src/BufferStream.php', - 'GuzzleHttp\\Psr7\\CachingStream' => $vendorDir . '/guzzlehttp/psr7/src/CachingStream.php', - 'GuzzleHttp\\Psr7\\DroppingStream' => $vendorDir . '/guzzlehttp/psr7/src/DroppingStream.php', - 'GuzzleHttp\\Psr7\\Exception\\MalformedUriException' => $vendorDir . '/guzzlehttp/psr7/src/Exception/MalformedUriException.php', - 'GuzzleHttp\\Psr7\\FnStream' => $vendorDir . '/guzzlehttp/psr7/src/FnStream.php', - 'GuzzleHttp\\Psr7\\Header' => $vendorDir . '/guzzlehttp/psr7/src/Header.php', - 'GuzzleHttp\\Psr7\\HttpFactory' => $vendorDir . '/guzzlehttp/psr7/src/HttpFactory.php', - 'GuzzleHttp\\Psr7\\InflateStream' => $vendorDir . '/guzzlehttp/psr7/src/InflateStream.php', - 'GuzzleHttp\\Psr7\\LazyOpenStream' => $vendorDir . '/guzzlehttp/psr7/src/LazyOpenStream.php', - 'GuzzleHttp\\Psr7\\LimitStream' => $vendorDir . '/guzzlehttp/psr7/src/LimitStream.php', - 'GuzzleHttp\\Psr7\\Message' => $vendorDir . '/guzzlehttp/psr7/src/Message.php', - 'GuzzleHttp\\Psr7\\MessageTrait' => $vendorDir . '/guzzlehttp/psr7/src/MessageTrait.php', - 'GuzzleHttp\\Psr7\\MimeType' => $vendorDir . '/guzzlehttp/psr7/src/MimeType.php', - 'GuzzleHttp\\Psr7\\MultipartStream' => $vendorDir . '/guzzlehttp/psr7/src/MultipartStream.php', - 'GuzzleHttp\\Psr7\\NoSeekStream' => $vendorDir . '/guzzlehttp/psr7/src/NoSeekStream.php', - 'GuzzleHttp\\Psr7\\PumpStream' => $vendorDir . '/guzzlehttp/psr7/src/PumpStream.php', - 'GuzzleHttp\\Psr7\\Query' => $vendorDir . '/guzzlehttp/psr7/src/Query.php', - 'GuzzleHttp\\Psr7\\Request' => $vendorDir . '/guzzlehttp/psr7/src/Request.php', - 'GuzzleHttp\\Psr7\\Response' => $vendorDir . '/guzzlehttp/psr7/src/Response.php', - 'GuzzleHttp\\Psr7\\Rfc3986' => $vendorDir . '/guzzlehttp/psr7/src/Rfc3986.php', - 'GuzzleHttp\\Psr7\\Rfc7230' => $vendorDir . '/guzzlehttp/psr7/src/Rfc7230.php', - 'GuzzleHttp\\Psr7\\ServerRequest' => $vendorDir . '/guzzlehttp/psr7/src/ServerRequest.php', - 'GuzzleHttp\\Psr7\\Stream' => $vendorDir . '/guzzlehttp/psr7/src/Stream.php', - 'GuzzleHttp\\Psr7\\StreamDecoratorTrait' => $vendorDir . '/guzzlehttp/psr7/src/StreamDecoratorTrait.php', - 'GuzzleHttp\\Psr7\\StreamWrapper' => $vendorDir . '/guzzlehttp/psr7/src/StreamWrapper.php', - 'GuzzleHttp\\Psr7\\UploadedFile' => $vendorDir . '/guzzlehttp/psr7/src/UploadedFile.php', - 'GuzzleHttp\\Psr7\\Uri' => $vendorDir . '/guzzlehttp/psr7/src/Uri.php', - 'GuzzleHttp\\Psr7\\UriComparator' => $vendorDir . '/guzzlehttp/psr7/src/UriComparator.php', - 'GuzzleHttp\\Psr7\\UriNormalizer' => $vendorDir . '/guzzlehttp/psr7/src/UriNormalizer.php', - 'GuzzleHttp\\Psr7\\UriResolver' => $vendorDir . '/guzzlehttp/psr7/src/UriResolver.php', - 'GuzzleHttp\\Psr7\\Utils' => $vendorDir . '/guzzlehttp/psr7/src/Utils.php', - 'Illuminate\\Contracts\\Auth\\Access\\Authorizable' => $vendorDir . '/illuminate/contracts/Auth/Access/Authorizable.php', - 'Illuminate\\Contracts\\Auth\\Access\\Gate' => $vendorDir . '/illuminate/contracts/Auth/Access/Gate.php', - 'Illuminate\\Contracts\\Auth\\Authenticatable' => $vendorDir . '/illuminate/contracts/Auth/Authenticatable.php', - 'Illuminate\\Contracts\\Auth\\CanResetPassword' => $vendorDir . '/illuminate/contracts/Auth/CanResetPassword.php', - 'Illuminate\\Contracts\\Auth\\Factory' => $vendorDir . '/illuminate/contracts/Auth/Factory.php', - 'Illuminate\\Contracts\\Auth\\Guard' => $vendorDir . '/illuminate/contracts/Auth/Guard.php', - 'Illuminate\\Contracts\\Auth\\Middleware\\AuthenticatesRequests' => $vendorDir . '/illuminate/contracts/Auth/Middleware/AuthenticatesRequests.php', - 'Illuminate\\Contracts\\Auth\\MustVerifyEmail' => $vendorDir . '/illuminate/contracts/Auth/MustVerifyEmail.php', - 'Illuminate\\Contracts\\Auth\\PasswordBroker' => $vendorDir . '/illuminate/contracts/Auth/PasswordBroker.php', - 'Illuminate\\Contracts\\Auth\\PasswordBrokerFactory' => $vendorDir . '/illuminate/contracts/Auth/PasswordBrokerFactory.php', - 'Illuminate\\Contracts\\Auth\\StatefulGuard' => $vendorDir . '/illuminate/contracts/Auth/StatefulGuard.php', - 'Illuminate\\Contracts\\Auth\\SupportsBasicAuth' => $vendorDir . '/illuminate/contracts/Auth/SupportsBasicAuth.php', - 'Illuminate\\Contracts\\Auth\\UserProvider' => $vendorDir . '/illuminate/contracts/Auth/UserProvider.php', - 'Illuminate\\Contracts\\Broadcasting\\Broadcaster' => $vendorDir . '/illuminate/contracts/Broadcasting/Broadcaster.php', - 'Illuminate\\Contracts\\Broadcasting\\Factory' => $vendorDir . '/illuminate/contracts/Broadcasting/Factory.php', - 'Illuminate\\Contracts\\Broadcasting\\HasBroadcastChannel' => $vendorDir . '/illuminate/contracts/Broadcasting/HasBroadcastChannel.php', - 'Illuminate\\Contracts\\Broadcasting\\ShouldBeUnique' => $vendorDir . '/illuminate/contracts/Broadcasting/ShouldBeUnique.php', - 'Illuminate\\Contracts\\Broadcasting\\ShouldBroadcast' => $vendorDir . '/illuminate/contracts/Broadcasting/ShouldBroadcast.php', - 'Illuminate\\Contracts\\Broadcasting\\ShouldBroadcastNow' => $vendorDir . '/illuminate/contracts/Broadcasting/ShouldBroadcastNow.php', - 'Illuminate\\Contracts\\Broadcasting\\ShouldRescue' => $vendorDir . '/illuminate/contracts/Broadcasting/ShouldRescue.php', - 'Illuminate\\Contracts\\Bus\\Dispatcher' => $vendorDir . '/illuminate/contracts/Bus/Dispatcher.php', - 'Illuminate\\Contracts\\Bus\\QueueingDispatcher' => $vendorDir . '/illuminate/contracts/Bus/QueueingDispatcher.php', - 'Illuminate\\Contracts\\Cache\\Factory' => $vendorDir . '/illuminate/contracts/Cache/Factory.php', - 'Illuminate\\Contracts\\Cache\\Lock' => $vendorDir . '/illuminate/contracts/Cache/Lock.php', - 'Illuminate\\Contracts\\Cache\\LockProvider' => $vendorDir . '/illuminate/contracts/Cache/LockProvider.php', - 'Illuminate\\Contracts\\Cache\\LockTimeoutException' => $vendorDir . '/illuminate/contracts/Cache/LockTimeoutException.php', - 'Illuminate\\Contracts\\Cache\\Repository' => $vendorDir . '/illuminate/contracts/Cache/Repository.php', - 'Illuminate\\Contracts\\Cache\\Store' => $vendorDir . '/illuminate/contracts/Cache/Store.php', - 'Illuminate\\Contracts\\Concurrency\\Driver' => $vendorDir . '/illuminate/contracts/Concurrency/Driver.php', - 'Illuminate\\Contracts\\Config\\Repository' => $vendorDir . '/illuminate/contracts/Config/Repository.php', - 'Illuminate\\Contracts\\Console\\Application' => $vendorDir . '/illuminate/contracts/Console/Application.php', - 'Illuminate\\Contracts\\Console\\Isolatable' => $vendorDir . '/illuminate/contracts/Console/Isolatable.php', - 'Illuminate\\Contracts\\Console\\Kernel' => $vendorDir . '/illuminate/contracts/Console/Kernel.php', - 'Illuminate\\Contracts\\Console\\PromptsForMissingInput' => $vendorDir . '/illuminate/contracts/Console/PromptsForMissingInput.php', - 'Illuminate\\Contracts\\Container\\BindingResolutionException' => $vendorDir . '/illuminate/contracts/Container/BindingResolutionException.php', - 'Illuminate\\Contracts\\Container\\CircularDependencyException' => $vendorDir . '/illuminate/contracts/Container/CircularDependencyException.php', - 'Illuminate\\Contracts\\Container\\Container' => $vendorDir . '/illuminate/contracts/Container/Container.php', - 'Illuminate\\Contracts\\Container\\ContextualAttribute' => $vendorDir . '/illuminate/contracts/Container/ContextualAttribute.php', - 'Illuminate\\Contracts\\Container\\ContextualBindingBuilder' => $vendorDir . '/illuminate/contracts/Container/ContextualBindingBuilder.php', - 'Illuminate\\Contracts\\Container\\SelfBuilding' => $vendorDir . '/illuminate/contracts/Container/SelfBuilding.php', - 'Illuminate\\Contracts\\Cookie\\Factory' => $vendorDir . '/illuminate/contracts/Cookie/Factory.php', - 'Illuminate\\Contracts\\Cookie\\QueueingFactory' => $vendorDir . '/illuminate/contracts/Cookie/QueueingFactory.php', - 'Illuminate\\Contracts\\Database\\ConcurrencyErrorDetector' => $vendorDir . '/illuminate/contracts/Database/ConcurrencyErrorDetector.php', - 'Illuminate\\Contracts\\Database\\Eloquent\\Builder' => $vendorDir . '/illuminate/contracts/Database/Eloquent/Builder.php', - 'Illuminate\\Contracts\\Database\\Eloquent\\Castable' => $vendorDir . '/illuminate/contracts/Database/Eloquent/Castable.php', - 'Illuminate\\Contracts\\Database\\Eloquent\\CastsAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/CastsAttributes.php', - 'Illuminate\\Contracts\\Database\\Eloquent\\CastsInboundAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php', - 'Illuminate\\Contracts\\Database\\Eloquent\\ComparesCastableAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/ComparesCastableAttributes.php', - 'Illuminate\\Contracts\\Database\\Eloquent\\DeviatesCastableAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/DeviatesCastableAttributes.php', - 'Illuminate\\Contracts\\Database\\Eloquent\\SerializesCastableAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/SerializesCastableAttributes.php', - 'Illuminate\\Contracts\\Database\\Eloquent\\SupportsPartialRelations' => $vendorDir . '/illuminate/contracts/Database/Eloquent/SupportsPartialRelations.php', - 'Illuminate\\Contracts\\Database\\Events\\MigrationEvent' => $vendorDir . '/illuminate/contracts/Database/Events/MigrationEvent.php', - 'Illuminate\\Contracts\\Database\\LostConnectionDetector' => $vendorDir . '/illuminate/contracts/Database/LostConnectionDetector.php', - 'Illuminate\\Contracts\\Database\\ModelIdentifier' => $vendorDir . '/illuminate/contracts/Database/ModelIdentifier.php', - 'Illuminate\\Contracts\\Database\\Query\\Builder' => $vendorDir . '/illuminate/contracts/Database/Query/Builder.php', - 'Illuminate\\Contracts\\Database\\Query\\ConditionExpression' => $vendorDir . '/illuminate/contracts/Database/Query/ConditionExpression.php', - 'Illuminate\\Contracts\\Database\\Query\\Expression' => $vendorDir . '/illuminate/contracts/Database/Query/Expression.php', - 'Illuminate\\Contracts\\Debug\\ExceptionHandler' => $vendorDir . '/illuminate/contracts/Debug/ExceptionHandler.php', - 'Illuminate\\Contracts\\Debug\\ShouldntReport' => $vendorDir . '/illuminate/contracts/Debug/ShouldntReport.php', - 'Illuminate\\Contracts\\Encryption\\DecryptException' => $vendorDir . '/illuminate/contracts/Encryption/DecryptException.php', - 'Illuminate\\Contracts\\Encryption\\EncryptException' => $vendorDir . '/illuminate/contracts/Encryption/EncryptException.php', - 'Illuminate\\Contracts\\Encryption\\Encrypter' => $vendorDir . '/illuminate/contracts/Encryption/Encrypter.php', - 'Illuminate\\Contracts\\Encryption\\StringEncrypter' => $vendorDir . '/illuminate/contracts/Encryption/StringEncrypter.php', - 'Illuminate\\Contracts\\Events\\Dispatcher' => $vendorDir . '/illuminate/contracts/Events/Dispatcher.php', - 'Illuminate\\Contracts\\Events\\ShouldDispatchAfterCommit' => $vendorDir . '/illuminate/contracts/Events/ShouldDispatchAfterCommit.php', - 'Illuminate\\Contracts\\Events\\ShouldHandleEventsAfterCommit' => $vendorDir . '/illuminate/contracts/Events/ShouldHandleEventsAfterCommit.php', - 'Illuminate\\Contracts\\Filesystem\\Cloud' => $vendorDir . '/illuminate/contracts/Filesystem/Cloud.php', - 'Illuminate\\Contracts\\Filesystem\\Factory' => $vendorDir . '/illuminate/contracts/Filesystem/Factory.php', - 'Illuminate\\Contracts\\Filesystem\\FileNotFoundException' => $vendorDir . '/illuminate/contracts/Filesystem/FileNotFoundException.php', - 'Illuminate\\Contracts\\Filesystem\\Filesystem' => $vendorDir . '/illuminate/contracts/Filesystem/Filesystem.php', - 'Illuminate\\Contracts\\Filesystem\\LockTimeoutException' => $vendorDir . '/illuminate/contracts/Filesystem/LockTimeoutException.php', - 'Illuminate\\Contracts\\Foundation\\Application' => $vendorDir . '/illuminate/contracts/Foundation/Application.php', - 'Illuminate\\Contracts\\Foundation\\CachesConfiguration' => $vendorDir . '/illuminate/contracts/Foundation/CachesConfiguration.php', - 'Illuminate\\Contracts\\Foundation\\CachesRoutes' => $vendorDir . '/illuminate/contracts/Foundation/CachesRoutes.php', - 'Illuminate\\Contracts\\Foundation\\ExceptionRenderer' => $vendorDir . '/illuminate/contracts/Foundation/ExceptionRenderer.php', - 'Illuminate\\Contracts\\Foundation\\MaintenanceMode' => $vendorDir . '/illuminate/contracts/Foundation/MaintenanceMode.php', - 'Illuminate\\Contracts\\Hashing\\Hasher' => $vendorDir . '/illuminate/contracts/Hashing/Hasher.php', - 'Illuminate\\Contracts\\Http\\Kernel' => $vendorDir . '/illuminate/contracts/Http/Kernel.php', - 'Illuminate\\Contracts\\JsonSchema\\JsonSchema' => $vendorDir . '/illuminate/contracts/JsonSchema/JsonSchema.php', - 'Illuminate\\Contracts\\Log\\ContextLogProcessor' => $vendorDir . '/illuminate/contracts/Log/ContextLogProcessor.php', - 'Illuminate\\Contracts\\Mail\\Attachable' => $vendorDir . '/illuminate/contracts/Mail/Attachable.php', - 'Illuminate\\Contracts\\Mail\\Factory' => $vendorDir . '/illuminate/contracts/Mail/Factory.php', - 'Illuminate\\Contracts\\Mail\\MailQueue' => $vendorDir . '/illuminate/contracts/Mail/MailQueue.php', - 'Illuminate\\Contracts\\Mail\\Mailable' => $vendorDir . '/illuminate/contracts/Mail/Mailable.php', - 'Illuminate\\Contracts\\Mail\\Mailer' => $vendorDir . '/illuminate/contracts/Mail/Mailer.php', - 'Illuminate\\Contracts\\Notifications\\Dispatcher' => $vendorDir . '/illuminate/contracts/Notifications/Dispatcher.php', - 'Illuminate\\Contracts\\Notifications\\Factory' => $vendorDir . '/illuminate/contracts/Notifications/Factory.php', - 'Illuminate\\Contracts\\Pagination\\CursorPaginator' => $vendorDir . '/illuminate/contracts/Pagination/CursorPaginator.php', - 'Illuminate\\Contracts\\Pagination\\LengthAwarePaginator' => $vendorDir . '/illuminate/contracts/Pagination/LengthAwarePaginator.php', - 'Illuminate\\Contracts\\Pagination\\Paginator' => $vendorDir . '/illuminate/contracts/Pagination/Paginator.php', - 'Illuminate\\Contracts\\Pipeline\\Hub' => $vendorDir . '/illuminate/contracts/Pipeline/Hub.php', - 'Illuminate\\Contracts\\Pipeline\\Pipeline' => $vendorDir . '/illuminate/contracts/Pipeline/Pipeline.php', - 'Illuminate\\Contracts\\Process\\InvokedProcess' => $vendorDir . '/illuminate/contracts/Process/InvokedProcess.php', - 'Illuminate\\Contracts\\Process\\ProcessResult' => $vendorDir . '/illuminate/contracts/Process/ProcessResult.php', - 'Illuminate\\Contracts\\Queue\\ClearableQueue' => $vendorDir . '/illuminate/contracts/Queue/ClearableQueue.php', - 'Illuminate\\Contracts\\Queue\\EntityNotFoundException' => $vendorDir . '/illuminate/contracts/Queue/EntityNotFoundException.php', - 'Illuminate\\Contracts\\Queue\\EntityResolver' => $vendorDir . '/illuminate/contracts/Queue/EntityResolver.php', - 'Illuminate\\Contracts\\Queue\\Factory' => $vendorDir . '/illuminate/contracts/Queue/Factory.php', - 'Illuminate\\Contracts\\Queue\\Job' => $vendorDir . '/illuminate/contracts/Queue/Job.php', - 'Illuminate\\Contracts\\Queue\\Monitor' => $vendorDir . '/illuminate/contracts/Queue/Monitor.php', - 'Illuminate\\Contracts\\Queue\\Queue' => $vendorDir . '/illuminate/contracts/Queue/Queue.php', - 'Illuminate\\Contracts\\Queue\\QueueableCollection' => $vendorDir . '/illuminate/contracts/Queue/QueueableCollection.php', - 'Illuminate\\Contracts\\Queue\\QueueableEntity' => $vendorDir . '/illuminate/contracts/Queue/QueueableEntity.php', - 'Illuminate\\Contracts\\Queue\\ShouldBeEncrypted' => $vendorDir . '/illuminate/contracts/Queue/ShouldBeEncrypted.php', - 'Illuminate\\Contracts\\Queue\\ShouldBeUnique' => $vendorDir . '/illuminate/contracts/Queue/ShouldBeUnique.php', - 'Illuminate\\Contracts\\Queue\\ShouldBeUniqueUntilProcessing' => $vendorDir . '/illuminate/contracts/Queue/ShouldBeUniqueUntilProcessing.php', - 'Illuminate\\Contracts\\Queue\\ShouldQueue' => $vendorDir . '/illuminate/contracts/Queue/ShouldQueue.php', - 'Illuminate\\Contracts\\Queue\\ShouldQueueAfterCommit' => $vendorDir . '/illuminate/contracts/Queue/ShouldQueueAfterCommit.php', - 'Illuminate\\Contracts\\Redis\\Connection' => $vendorDir . '/illuminate/contracts/Redis/Connection.php', - 'Illuminate\\Contracts\\Redis\\Connector' => $vendorDir . '/illuminate/contracts/Redis/Connector.php', - 'Illuminate\\Contracts\\Redis\\Factory' => $vendorDir . '/illuminate/contracts/Redis/Factory.php', - 'Illuminate\\Contracts\\Redis\\LimiterTimeoutException' => $vendorDir . '/illuminate/contracts/Redis/LimiterTimeoutException.php', - 'Illuminate\\Contracts\\Routing\\BindingRegistrar' => $vendorDir . '/illuminate/contracts/Routing/BindingRegistrar.php', - 'Illuminate\\Contracts\\Routing\\Registrar' => $vendorDir . '/illuminate/contracts/Routing/Registrar.php', - 'Illuminate\\Contracts\\Routing\\ResponseFactory' => $vendorDir . '/illuminate/contracts/Routing/ResponseFactory.php', - 'Illuminate\\Contracts\\Routing\\UrlGenerator' => $vendorDir . '/illuminate/contracts/Routing/UrlGenerator.php', - 'Illuminate\\Contracts\\Routing\\UrlRoutable' => $vendorDir . '/illuminate/contracts/Routing/UrlRoutable.php', - 'Illuminate\\Contracts\\Session\\Middleware\\AuthenticatesSessions' => $vendorDir . '/illuminate/contracts/Session/Middleware/AuthenticatesSessions.php', - 'Illuminate\\Contracts\\Session\\Session' => $vendorDir . '/illuminate/contracts/Session/Session.php', - 'Illuminate\\Contracts\\Support\\Arrayable' => $vendorDir . '/illuminate/contracts/Support/Arrayable.php', - 'Illuminate\\Contracts\\Support\\CanBeEscapedWhenCastToString' => $vendorDir . '/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php', - 'Illuminate\\Contracts\\Support\\DeferrableProvider' => $vendorDir . '/illuminate/contracts/Support/DeferrableProvider.php', - 'Illuminate\\Contracts\\Support\\DeferringDisplayableValue' => $vendorDir . '/illuminate/contracts/Support/DeferringDisplayableValue.php', - 'Illuminate\\Contracts\\Support\\HasOnceHash' => $vendorDir . '/illuminate/contracts/Support/HasOnceHash.php', - 'Illuminate\\Contracts\\Support\\Htmlable' => $vendorDir . '/illuminate/contracts/Support/Htmlable.php', - 'Illuminate\\Contracts\\Support\\Jsonable' => $vendorDir . '/illuminate/contracts/Support/Jsonable.php', - 'Illuminate\\Contracts\\Support\\MessageBag' => $vendorDir . '/illuminate/contracts/Support/MessageBag.php', - 'Illuminate\\Contracts\\Support\\MessageProvider' => $vendorDir . '/illuminate/contracts/Support/MessageProvider.php', - 'Illuminate\\Contracts\\Support\\Renderable' => $vendorDir . '/illuminate/contracts/Support/Renderable.php', - 'Illuminate\\Contracts\\Support\\Responsable' => $vendorDir . '/illuminate/contracts/Support/Responsable.php', - 'Illuminate\\Contracts\\Support\\ValidatedData' => $vendorDir . '/illuminate/contracts/Support/ValidatedData.php', - 'Illuminate\\Contracts\\Translation\\HasLocalePreference' => $vendorDir . '/illuminate/contracts/Translation/HasLocalePreference.php', - 'Illuminate\\Contracts\\Translation\\Loader' => $vendorDir . '/illuminate/contracts/Translation/Loader.php', - 'Illuminate\\Contracts\\Translation\\Translator' => $vendorDir . '/illuminate/contracts/Translation/Translator.php', - 'Illuminate\\Contracts\\Validation\\CompilableRules' => $vendorDir . '/illuminate/contracts/Validation/CompilableRules.php', - 'Illuminate\\Contracts\\Validation\\DataAwareRule' => $vendorDir . '/illuminate/contracts/Validation/DataAwareRule.php', - 'Illuminate\\Contracts\\Validation\\Factory' => $vendorDir . '/illuminate/contracts/Validation/Factory.php', - 'Illuminate\\Contracts\\Validation\\ImplicitRule' => $vendorDir . '/illuminate/contracts/Validation/ImplicitRule.php', - 'Illuminate\\Contracts\\Validation\\InvokableRule' => $vendorDir . '/illuminate/contracts/Validation/InvokableRule.php', - 'Illuminate\\Contracts\\Validation\\Rule' => $vendorDir . '/illuminate/contracts/Validation/Rule.php', - 'Illuminate\\Contracts\\Validation\\UncompromisedVerifier' => $vendorDir . '/illuminate/contracts/Validation/UncompromisedVerifier.php', - 'Illuminate\\Contracts\\Validation\\ValidatesWhenResolved' => $vendorDir . '/illuminate/contracts/Validation/ValidatesWhenResolved.php', - 'Illuminate\\Contracts\\Validation\\ValidationRule' => $vendorDir . '/illuminate/contracts/Validation/ValidationRule.php', - 'Illuminate\\Contracts\\Validation\\Validator' => $vendorDir . '/illuminate/contracts/Validation/Validator.php', - 'Illuminate\\Contracts\\Validation\\ValidatorAwareRule' => $vendorDir . '/illuminate/contracts/Validation/ValidatorAwareRule.php', - 'Illuminate\\Contracts\\View\\Engine' => $vendorDir . '/illuminate/contracts/View/Engine.php', - 'Illuminate\\Contracts\\View\\Factory' => $vendorDir . '/illuminate/contracts/View/Factory.php', - 'Illuminate\\Contracts\\View\\View' => $vendorDir . '/illuminate/contracts/View/View.php', - 'Illuminate\\Contracts\\View\\ViewCompilationException' => $vendorDir . '/illuminate/contracts/View/ViewCompilationException.php', - 'Illuminate\\Support\\Arr' => $vendorDir . '/illuminate/collections/Arr.php', - 'Illuminate\\Support\\Collection' => $vendorDir . '/illuminate/collections/Collection.php', - 'Illuminate\\Support\\Enumerable' => $vendorDir . '/illuminate/collections/Enumerable.php', - 'Illuminate\\Support\\HigherOrderCollectionProxy' => $vendorDir . '/illuminate/collections/HigherOrderCollectionProxy.php', - 'Illuminate\\Support\\HigherOrderWhenProxy' => $vendorDir . '/illuminate/conditionable/HigherOrderWhenProxy.php', - 'Illuminate\\Support\\ItemNotFoundException' => $vendorDir . '/illuminate/collections/ItemNotFoundException.php', - 'Illuminate\\Support\\LazyCollection' => $vendorDir . '/illuminate/collections/LazyCollection.php', - 'Illuminate\\Support\\MultipleItemsFoundException' => $vendorDir . '/illuminate/collections/MultipleItemsFoundException.php', - 'Illuminate\\Support\\Traits\\Conditionable' => $vendorDir . '/illuminate/conditionable/Traits/Conditionable.php', - 'Illuminate\\Support\\Traits\\EnumeratesValues' => $vendorDir . '/illuminate/collections/Traits/EnumeratesValues.php', - 'Illuminate\\Support\\Traits\\Macroable' => $vendorDir . '/illuminate/macroable/Traits/Macroable.php', - 'Illuminate\\Support\\Traits\\TransformsToResourceCollection' => $vendorDir . '/illuminate/collections/Traits/TransformsToResourceCollection.php', - 'Invoker\\CallableResolver' => $vendorDir . '/php-di/invoker/src/CallableResolver.php', - 'Invoker\\Exception\\InvocationException' => $vendorDir . '/php-di/invoker/src/Exception/InvocationException.php', - 'Invoker\\Exception\\NotCallableException' => $vendorDir . '/php-di/invoker/src/Exception/NotCallableException.php', - 'Invoker\\Exception\\NotEnoughParametersException' => $vendorDir . '/php-di/invoker/src/Exception/NotEnoughParametersException.php', - 'Invoker\\Invoker' => $vendorDir . '/php-di/invoker/src/Invoker.php', - 'Invoker\\InvokerInterface' => $vendorDir . '/php-di/invoker/src/InvokerInterface.php', - 'Invoker\\ParameterResolver\\AssociativeArrayResolver' => $vendorDir . '/php-di/invoker/src/ParameterResolver/AssociativeArrayResolver.php', - 'Invoker\\ParameterResolver\\Container\\ParameterNameContainerResolver' => $vendorDir . '/php-di/invoker/src/ParameterResolver/Container/ParameterNameContainerResolver.php', - 'Invoker\\ParameterResolver\\Container\\TypeHintContainerResolver' => $vendorDir . '/php-di/invoker/src/ParameterResolver/Container/TypeHintContainerResolver.php', - 'Invoker\\ParameterResolver\\DefaultValueResolver' => $vendorDir . '/php-di/invoker/src/ParameterResolver/DefaultValueResolver.php', - 'Invoker\\ParameterResolver\\NumericArrayResolver' => $vendorDir . '/php-di/invoker/src/ParameterResolver/NumericArrayResolver.php', - 'Invoker\\ParameterResolver\\ParameterResolver' => $vendorDir . '/php-di/invoker/src/ParameterResolver/ParameterResolver.php', - 'Invoker\\ParameterResolver\\ResolverChain' => $vendorDir . '/php-di/invoker/src/ParameterResolver/ResolverChain.php', - 'Invoker\\ParameterResolver\\TypeHintResolver' => $vendorDir . '/php-di/invoker/src/ParameterResolver/TypeHintResolver.php', - 'Invoker\\Reflection\\CallableReflection' => $vendorDir . '/php-di/invoker/src/Reflection/CallableReflection.php', - 'Laravel\\SerializableClosure\\Contracts\\Serializable' => $vendorDir . '/laravel/serializable-closure/src/Contracts/Serializable.php', - 'Laravel\\SerializableClosure\\Contracts\\Signer' => $vendorDir . '/laravel/serializable-closure/src/Contracts/Signer.php', - 'Laravel\\SerializableClosure\\Exceptions\\InvalidSignatureException' => $vendorDir . '/laravel/serializable-closure/src/Exceptions/InvalidSignatureException.php', - 'Laravel\\SerializableClosure\\Exceptions\\MissingSecretKeyException' => $vendorDir . '/laravel/serializable-closure/src/Exceptions/MissingSecretKeyException.php', - 'Laravel\\SerializableClosure\\SerializableClosure' => $vendorDir . '/laravel/serializable-closure/src/SerializableClosure.php', - 'Laravel\\SerializableClosure\\Serializers\\Native' => $vendorDir . '/laravel/serializable-closure/src/Serializers/Native.php', - 'Laravel\\SerializableClosure\\Serializers\\Signed' => $vendorDir . '/laravel/serializable-closure/src/Serializers/Signed.php', - 'Laravel\\SerializableClosure\\Signers\\Hmac' => $vendorDir . '/laravel/serializable-closure/src/Signers/Hmac.php', - 'Laravel\\SerializableClosure\\Support\\ClosureScope' => $vendorDir . '/laravel/serializable-closure/src/Support/ClosureScope.php', - 'Laravel\\SerializableClosure\\Support\\ClosureStream' => $vendorDir . '/laravel/serializable-closure/src/Support/ClosureStream.php', - 'Laravel\\SerializableClosure\\Support\\ReflectionClosure' => $vendorDir . '/laravel/serializable-closure/src/Support/ReflectionClosure.php', - 'Laravel\\SerializableClosure\\Support\\SelfReference' => $vendorDir . '/laravel/serializable-closure/src/Support/SelfReference.php', - 'Laravel\\SerializableClosure\\UnsignedSerializableClosure' => $vendorDir . '/laravel/serializable-closure/src/UnsignedSerializableClosure.php', 'NoDiscard' => $vendorDir . '/symfony/polyfill-php85/Resources/stubs/NoDiscard.php', 'Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', 'Override' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/Override.php', @@ -591,356 +31,10 @@ return array( 'Pdo\\Pgsql' => $vendorDir . '/symfony/polyfill-php84/Resources/stubs/Pdo/Pgsql.php', 'Pdo\\Sqlite' => $vendorDir . '/symfony/polyfill-php84/Resources/stubs/Pdo/Sqlite.php', 'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', - 'Psr\\Clock\\ClockInterface' => $vendorDir . '/psr/clock/src/ClockInterface.php', - 'Psr\\Container\\ContainerExceptionInterface' => $vendorDir . '/psr/container/src/ContainerExceptionInterface.php', - 'Psr\\Container\\ContainerInterface' => $vendorDir . '/psr/container/src/ContainerInterface.php', - 'Psr\\Container\\NotFoundExceptionInterface' => $vendorDir . '/psr/container/src/NotFoundExceptionInterface.php', - 'Psr\\Http\\Message\\MessageInterface' => $vendorDir . '/psr/http-message/src/MessageInterface.php', - 'Psr\\Http\\Message\\RequestFactoryInterface' => $vendorDir . '/psr/http-factory/src/RequestFactoryInterface.php', - 'Psr\\Http\\Message\\RequestInterface' => $vendorDir . '/psr/http-message/src/RequestInterface.php', - 'Psr\\Http\\Message\\ResponseFactoryInterface' => $vendorDir . '/psr/http-factory/src/ResponseFactoryInterface.php', - 'Psr\\Http\\Message\\ResponseInterface' => $vendorDir . '/psr/http-message/src/ResponseInterface.php', - 'Psr\\Http\\Message\\ServerRequestFactoryInterface' => $vendorDir . '/psr/http-factory/src/ServerRequestFactoryInterface.php', - 'Psr\\Http\\Message\\ServerRequestInterface' => $vendorDir . '/psr/http-message/src/ServerRequestInterface.php', - 'Psr\\Http\\Message\\StreamFactoryInterface' => $vendorDir . '/psr/http-factory/src/StreamFactoryInterface.php', - 'Psr\\Http\\Message\\StreamInterface' => $vendorDir . '/psr/http-message/src/StreamInterface.php', - 'Psr\\Http\\Message\\UploadedFileFactoryInterface' => $vendorDir . '/psr/http-factory/src/UploadedFileFactoryInterface.php', - 'Psr\\Http\\Message\\UploadedFileInterface' => $vendorDir . '/psr/http-message/src/UploadedFileInterface.php', - 'Psr\\Http\\Message\\UriFactoryInterface' => $vendorDir . '/psr/http-factory/src/UriFactoryInterface.php', - 'Psr\\Http\\Message\\UriInterface' => $vendorDir . '/psr/http-message/src/UriInterface.php', - 'Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/src/AbstractLogger.php', - 'Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/src/InvalidArgumentException.php', - 'Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/src/LogLevel.php', - 'Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/src/LoggerAwareInterface.php', - 'Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/src/LoggerAwareTrait.php', - 'Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/src/LoggerInterface.php', - 'Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/src/LoggerTrait.php', - 'Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/src/NullLogger.php', - 'Psr\\SimpleCache\\CacheException' => $vendorDir . '/psr/simple-cache/src/CacheException.php', - 'Psr\\SimpleCache\\CacheInterface' => $vendorDir . '/psr/simple-cache/src/CacheInterface.php', - 'Psr\\SimpleCache\\InvalidArgumentException' => $vendorDir . '/psr/simple-cache/src/InvalidArgumentException.php', 'ReflectionConstant' => $vendorDir . '/symfony/polyfill-php84/Resources/stubs/ReflectionConstant.php', 'RoundingMode' => $vendorDir . '/symfony/polyfill-php84/Resources/stubs/RoundingMode.php', 'SQLite3Exception' => $vendorDir . '/symfony/polyfill-php83/Resources/stubs/SQLite3Exception.php', 'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', - 'Symfony\\Component\\Clock\\Clock' => $vendorDir . '/symfony/clock/Clock.php', - 'Symfony\\Component\\Clock\\ClockAwareTrait' => $vendorDir . '/symfony/clock/ClockAwareTrait.php', - 'Symfony\\Component\\Clock\\ClockInterface' => $vendorDir . '/symfony/clock/ClockInterface.php', - 'Symfony\\Component\\Clock\\DatePoint' => $vendorDir . '/symfony/clock/DatePoint.php', - 'Symfony\\Component\\Clock\\MockClock' => $vendorDir . '/symfony/clock/MockClock.php', - 'Symfony\\Component\\Clock\\MonotonicClock' => $vendorDir . '/symfony/clock/MonotonicClock.php', - 'Symfony\\Component\\Clock\\NativeClock' => $vendorDir . '/symfony/clock/NativeClock.php', - 'Symfony\\Component\\Clock\\Test\\ClockSensitiveTrait' => $vendorDir . '/symfony/clock/Test/ClockSensitiveTrait.php', - 'Symfony\\Component\\Mime\\Address' => $vendorDir . '/symfony/mime/Address.php', - 'Symfony\\Component\\Mime\\BodyRendererInterface' => $vendorDir . '/symfony/mime/BodyRendererInterface.php', - 'Symfony\\Component\\Mime\\CharacterStream' => $vendorDir . '/symfony/mime/CharacterStream.php', - 'Symfony\\Component\\Mime\\Crypto\\DkimOptions' => $vendorDir . '/symfony/mime/Crypto/DkimOptions.php', - 'Symfony\\Component\\Mime\\Crypto\\DkimSigner' => $vendorDir . '/symfony/mime/Crypto/DkimSigner.php', - 'Symfony\\Component\\Mime\\Crypto\\SMime' => $vendorDir . '/symfony/mime/Crypto/SMime.php', - 'Symfony\\Component\\Mime\\Crypto\\SMimeEncrypter' => $vendorDir . '/symfony/mime/Crypto/SMimeEncrypter.php', - 'Symfony\\Component\\Mime\\Crypto\\SMimeSigner' => $vendorDir . '/symfony/mime/Crypto/SMimeSigner.php', - 'Symfony\\Component\\Mime\\DependencyInjection\\AddMimeTypeGuesserPass' => $vendorDir . '/symfony/mime/DependencyInjection/AddMimeTypeGuesserPass.php', - 'Symfony\\Component\\Mime\\DraftEmail' => $vendorDir . '/symfony/mime/DraftEmail.php', - 'Symfony\\Component\\Mime\\Email' => $vendorDir . '/symfony/mime/Email.php', - 'Symfony\\Component\\Mime\\Encoder\\AddressEncoderInterface' => $vendorDir . '/symfony/mime/Encoder/AddressEncoderInterface.php', - 'Symfony\\Component\\Mime\\Encoder\\Base64ContentEncoder' => $vendorDir . '/symfony/mime/Encoder/Base64ContentEncoder.php', - 'Symfony\\Component\\Mime\\Encoder\\Base64Encoder' => $vendorDir . '/symfony/mime/Encoder/Base64Encoder.php', - 'Symfony\\Component\\Mime\\Encoder\\Base64MimeHeaderEncoder' => $vendorDir . '/symfony/mime/Encoder/Base64MimeHeaderEncoder.php', - 'Symfony\\Component\\Mime\\Encoder\\ContentEncoderInterface' => $vendorDir . '/symfony/mime/Encoder/ContentEncoderInterface.php', - 'Symfony\\Component\\Mime\\Encoder\\EightBitContentEncoder' => $vendorDir . '/symfony/mime/Encoder/EightBitContentEncoder.php', - 'Symfony\\Component\\Mime\\Encoder\\EncoderInterface' => $vendorDir . '/symfony/mime/Encoder/EncoderInterface.php', - 'Symfony\\Component\\Mime\\Encoder\\IdnAddressEncoder' => $vendorDir . '/symfony/mime/Encoder/IdnAddressEncoder.php', - 'Symfony\\Component\\Mime\\Encoder\\MimeHeaderEncoderInterface' => $vendorDir . '/symfony/mime/Encoder/MimeHeaderEncoderInterface.php', - 'Symfony\\Component\\Mime\\Encoder\\QpContentEncoder' => $vendorDir . '/symfony/mime/Encoder/QpContentEncoder.php', - 'Symfony\\Component\\Mime\\Encoder\\QpEncoder' => $vendorDir . '/symfony/mime/Encoder/QpEncoder.php', - 'Symfony\\Component\\Mime\\Encoder\\QpMimeHeaderEncoder' => $vendorDir . '/symfony/mime/Encoder/QpMimeHeaderEncoder.php', - 'Symfony\\Component\\Mime\\Encoder\\Rfc2231Encoder' => $vendorDir . '/symfony/mime/Encoder/Rfc2231Encoder.php', - 'Symfony\\Component\\Mime\\Exception\\AddressEncoderException' => $vendorDir . '/symfony/mime/Exception/AddressEncoderException.php', - 'Symfony\\Component\\Mime\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/mime/Exception/ExceptionInterface.php', - 'Symfony\\Component\\Mime\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/mime/Exception/InvalidArgumentException.php', - 'Symfony\\Component\\Mime\\Exception\\LogicException' => $vendorDir . '/symfony/mime/Exception/LogicException.php', - 'Symfony\\Component\\Mime\\Exception\\RfcComplianceException' => $vendorDir . '/symfony/mime/Exception/RfcComplianceException.php', - 'Symfony\\Component\\Mime\\Exception\\RuntimeException' => $vendorDir . '/symfony/mime/Exception/RuntimeException.php', - 'Symfony\\Component\\Mime\\FileBinaryMimeTypeGuesser' => $vendorDir . '/symfony/mime/FileBinaryMimeTypeGuesser.php', - 'Symfony\\Component\\Mime\\FileinfoMimeTypeGuesser' => $vendorDir . '/symfony/mime/FileinfoMimeTypeGuesser.php', - 'Symfony\\Component\\Mime\\Header\\AbstractHeader' => $vendorDir . '/symfony/mime/Header/AbstractHeader.php', - 'Symfony\\Component\\Mime\\Header\\DateHeader' => $vendorDir . '/symfony/mime/Header/DateHeader.php', - 'Symfony\\Component\\Mime\\Header\\HeaderInterface' => $vendorDir . '/symfony/mime/Header/HeaderInterface.php', - 'Symfony\\Component\\Mime\\Header\\Headers' => $vendorDir . '/symfony/mime/Header/Headers.php', - 'Symfony\\Component\\Mime\\Header\\IdentificationHeader' => $vendorDir . '/symfony/mime/Header/IdentificationHeader.php', - 'Symfony\\Component\\Mime\\Header\\MailboxHeader' => $vendorDir . '/symfony/mime/Header/MailboxHeader.php', - 'Symfony\\Component\\Mime\\Header\\MailboxListHeader' => $vendorDir . '/symfony/mime/Header/MailboxListHeader.php', - 'Symfony\\Component\\Mime\\Header\\ParameterizedHeader' => $vendorDir . '/symfony/mime/Header/ParameterizedHeader.php', - 'Symfony\\Component\\Mime\\Header\\PathHeader' => $vendorDir . '/symfony/mime/Header/PathHeader.php', - 'Symfony\\Component\\Mime\\Header\\UnstructuredHeader' => $vendorDir . '/symfony/mime/Header/UnstructuredHeader.php', - 'Symfony\\Component\\Mime\\HtmlToTextConverter\\DefaultHtmlToTextConverter' => $vendorDir . '/symfony/mime/HtmlToTextConverter/DefaultHtmlToTextConverter.php', - 'Symfony\\Component\\Mime\\HtmlToTextConverter\\HtmlToTextConverterInterface' => $vendorDir . '/symfony/mime/HtmlToTextConverter/HtmlToTextConverterInterface.php', - 'Symfony\\Component\\Mime\\HtmlToTextConverter\\LeagueHtmlToMarkdownConverter' => $vendorDir . '/symfony/mime/HtmlToTextConverter/LeagueHtmlToMarkdownConverter.php', - 'Symfony\\Component\\Mime\\Message' => $vendorDir . '/symfony/mime/Message.php', - 'Symfony\\Component\\Mime\\MessageConverter' => $vendorDir . '/symfony/mime/MessageConverter.php', - 'Symfony\\Component\\Mime\\MimeTypeGuesserInterface' => $vendorDir . '/symfony/mime/MimeTypeGuesserInterface.php', - 'Symfony\\Component\\Mime\\MimeTypes' => $vendorDir . '/symfony/mime/MimeTypes.php', - 'Symfony\\Component\\Mime\\MimeTypesInterface' => $vendorDir . '/symfony/mime/MimeTypesInterface.php', - 'Symfony\\Component\\Mime\\Part\\AbstractMultipartPart' => $vendorDir . '/symfony/mime/Part/AbstractMultipartPart.php', - 'Symfony\\Component\\Mime\\Part\\AbstractPart' => $vendorDir . '/symfony/mime/Part/AbstractPart.php', - 'Symfony\\Component\\Mime\\Part\\DataPart' => $vendorDir . '/symfony/mime/Part/DataPart.php', - 'Symfony\\Component\\Mime\\Part\\File' => $vendorDir . '/symfony/mime/Part/File.php', - 'Symfony\\Component\\Mime\\Part\\MessagePart' => $vendorDir . '/symfony/mime/Part/MessagePart.php', - 'Symfony\\Component\\Mime\\Part\\Multipart\\AlternativePart' => $vendorDir . '/symfony/mime/Part/Multipart/AlternativePart.php', - 'Symfony\\Component\\Mime\\Part\\Multipart\\DigestPart' => $vendorDir . '/symfony/mime/Part/Multipart/DigestPart.php', - 'Symfony\\Component\\Mime\\Part\\Multipart\\FormDataPart' => $vendorDir . '/symfony/mime/Part/Multipart/FormDataPart.php', - 'Symfony\\Component\\Mime\\Part\\Multipart\\MixedPart' => $vendorDir . '/symfony/mime/Part/Multipart/MixedPart.php', - 'Symfony\\Component\\Mime\\Part\\Multipart\\RelatedPart' => $vendorDir . '/symfony/mime/Part/Multipart/RelatedPart.php', - 'Symfony\\Component\\Mime\\Part\\SMimePart' => $vendorDir . '/symfony/mime/Part/SMimePart.php', - 'Symfony\\Component\\Mime\\Part\\TextPart' => $vendorDir . '/symfony/mime/Part/TextPart.php', - 'Symfony\\Component\\Mime\\RawMessage' => $vendorDir . '/symfony/mime/RawMessage.php', - 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailAddressContains' => $vendorDir . '/symfony/mime/Test/Constraint/EmailAddressContains.php', - 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailAttachmentCount' => $vendorDir . '/symfony/mime/Test/Constraint/EmailAttachmentCount.php', - 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailHasHeader' => $vendorDir . '/symfony/mime/Test/Constraint/EmailHasHeader.php', - 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailHeaderSame' => $vendorDir . '/symfony/mime/Test/Constraint/EmailHeaderSame.php', - 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailHtmlBodyContains' => $vendorDir . '/symfony/mime/Test/Constraint/EmailHtmlBodyContains.php', - 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailSubjectContains' => $vendorDir . '/symfony/mime/Test/Constraint/EmailSubjectContains.php', - 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailTextBodyContains' => $vendorDir . '/symfony/mime/Test/Constraint/EmailTextBodyContains.php', - 'Symfony\\Component\\Translation\\CatalogueMetadataAwareInterface' => $vendorDir . '/symfony/translation/CatalogueMetadataAwareInterface.php', - 'Symfony\\Component\\Translation\\Catalogue\\AbstractOperation' => $vendorDir . '/symfony/translation/Catalogue/AbstractOperation.php', - 'Symfony\\Component\\Translation\\Catalogue\\MergeOperation' => $vendorDir . '/symfony/translation/Catalogue/MergeOperation.php', - 'Symfony\\Component\\Translation\\Catalogue\\OperationInterface' => $vendorDir . '/symfony/translation/Catalogue/OperationInterface.php', - 'Symfony\\Component\\Translation\\Catalogue\\TargetOperation' => $vendorDir . '/symfony/translation/Catalogue/TargetOperation.php', - 'Symfony\\Component\\Translation\\Command\\TranslationLintCommand' => $vendorDir . '/symfony/translation/Command/TranslationLintCommand.php', - 'Symfony\\Component\\Translation\\Command\\TranslationPullCommand' => $vendorDir . '/symfony/translation/Command/TranslationPullCommand.php', - 'Symfony\\Component\\Translation\\Command\\TranslationPushCommand' => $vendorDir . '/symfony/translation/Command/TranslationPushCommand.php', - 'Symfony\\Component\\Translation\\Command\\TranslationTrait' => $vendorDir . '/symfony/translation/Command/TranslationTrait.php', - 'Symfony\\Component\\Translation\\Command\\XliffLintCommand' => $vendorDir . '/symfony/translation/Command/XliffLintCommand.php', - 'Symfony\\Component\\Translation\\DataCollectorTranslator' => $vendorDir . '/symfony/translation/DataCollectorTranslator.php', - 'Symfony\\Component\\Translation\\DataCollector\\TranslationDataCollector' => $vendorDir . '/symfony/translation/DataCollector/TranslationDataCollector.php', - 'Symfony\\Component\\Translation\\DependencyInjection\\DataCollectorTranslatorPass' => $vendorDir . '/symfony/translation/DependencyInjection/DataCollectorTranslatorPass.php', - 'Symfony\\Component\\Translation\\DependencyInjection\\LoggingTranslatorPass' => $vendorDir . '/symfony/translation/DependencyInjection/LoggingTranslatorPass.php', - 'Symfony\\Component\\Translation\\DependencyInjection\\TranslationDumperPass' => $vendorDir . '/symfony/translation/DependencyInjection/TranslationDumperPass.php', - 'Symfony\\Component\\Translation\\DependencyInjection\\TranslationExtractorPass' => $vendorDir . '/symfony/translation/DependencyInjection/TranslationExtractorPass.php', - 'Symfony\\Component\\Translation\\DependencyInjection\\TranslatorPass' => $vendorDir . '/symfony/translation/DependencyInjection/TranslatorPass.php', - 'Symfony\\Component\\Translation\\DependencyInjection\\TranslatorPathsPass' => $vendorDir . '/symfony/translation/DependencyInjection/TranslatorPathsPass.php', - 'Symfony\\Component\\Translation\\Dumper\\CsvFileDumper' => $vendorDir . '/symfony/translation/Dumper/CsvFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\DumperInterface' => $vendorDir . '/symfony/translation/Dumper/DumperInterface.php', - 'Symfony\\Component\\Translation\\Dumper\\FileDumper' => $vendorDir . '/symfony/translation/Dumper/FileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\IcuResFileDumper' => $vendorDir . '/symfony/translation/Dumper/IcuResFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\IniFileDumper' => $vendorDir . '/symfony/translation/Dumper/IniFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\JsonFileDumper' => $vendorDir . '/symfony/translation/Dumper/JsonFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\MoFileDumper' => $vendorDir . '/symfony/translation/Dumper/MoFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\PhpFileDumper' => $vendorDir . '/symfony/translation/Dumper/PhpFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\PoFileDumper' => $vendorDir . '/symfony/translation/Dumper/PoFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\QtFileDumper' => $vendorDir . '/symfony/translation/Dumper/QtFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\XliffFileDumper' => $vendorDir . '/symfony/translation/Dumper/XliffFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\YamlFileDumper' => $vendorDir . '/symfony/translation/Dumper/YamlFileDumper.php', - 'Symfony\\Component\\Translation\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/translation/Exception/ExceptionInterface.php', - 'Symfony\\Component\\Translation\\Exception\\IncompleteDsnException' => $vendorDir . '/symfony/translation/Exception/IncompleteDsnException.php', - 'Symfony\\Component\\Translation\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/translation/Exception/InvalidArgumentException.php', - 'Symfony\\Component\\Translation\\Exception\\InvalidResourceException' => $vendorDir . '/symfony/translation/Exception/InvalidResourceException.php', - 'Symfony\\Component\\Translation\\Exception\\LogicException' => $vendorDir . '/symfony/translation/Exception/LogicException.php', - 'Symfony\\Component\\Translation\\Exception\\MissingRequiredOptionException' => $vendorDir . '/symfony/translation/Exception/MissingRequiredOptionException.php', - 'Symfony\\Component\\Translation\\Exception\\NotFoundResourceException' => $vendorDir . '/symfony/translation/Exception/NotFoundResourceException.php', - 'Symfony\\Component\\Translation\\Exception\\ProviderException' => $vendorDir . '/symfony/translation/Exception/ProviderException.php', - 'Symfony\\Component\\Translation\\Exception\\ProviderExceptionInterface' => $vendorDir . '/symfony/translation/Exception/ProviderExceptionInterface.php', - 'Symfony\\Component\\Translation\\Exception\\RuntimeException' => $vendorDir . '/symfony/translation/Exception/RuntimeException.php', - 'Symfony\\Component\\Translation\\Exception\\UnsupportedSchemeException' => $vendorDir . '/symfony/translation/Exception/UnsupportedSchemeException.php', - 'Symfony\\Component\\Translation\\Extractor\\AbstractFileExtractor' => $vendorDir . '/symfony/translation/Extractor/AbstractFileExtractor.php', - 'Symfony\\Component\\Translation\\Extractor\\ChainExtractor' => $vendorDir . '/symfony/translation/Extractor/ChainExtractor.php', - 'Symfony\\Component\\Translation\\Extractor\\ExtractorInterface' => $vendorDir . '/symfony/translation/Extractor/ExtractorInterface.php', - 'Symfony\\Component\\Translation\\Extractor\\PhpAstExtractor' => $vendorDir . '/symfony/translation/Extractor/PhpAstExtractor.php', - 'Symfony\\Component\\Translation\\Extractor\\Visitor\\AbstractVisitor' => $vendorDir . '/symfony/translation/Extractor/Visitor/AbstractVisitor.php', - 'Symfony\\Component\\Translation\\Extractor\\Visitor\\ConstraintVisitor' => $vendorDir . '/symfony/translation/Extractor/Visitor/ConstraintVisitor.php', - 'Symfony\\Component\\Translation\\Extractor\\Visitor\\TransMethodVisitor' => $vendorDir . '/symfony/translation/Extractor/Visitor/TransMethodVisitor.php', - 'Symfony\\Component\\Translation\\Extractor\\Visitor\\TranslatableMessageVisitor' => $vendorDir . '/symfony/translation/Extractor/Visitor/TranslatableMessageVisitor.php', - 'Symfony\\Component\\Translation\\Formatter\\IntlFormatter' => $vendorDir . '/symfony/translation/Formatter/IntlFormatter.php', - 'Symfony\\Component\\Translation\\Formatter\\IntlFormatterInterface' => $vendorDir . '/symfony/translation/Formatter/IntlFormatterInterface.php', - 'Symfony\\Component\\Translation\\Formatter\\MessageFormatter' => $vendorDir . '/symfony/translation/Formatter/MessageFormatter.php', - 'Symfony\\Component\\Translation\\Formatter\\MessageFormatterInterface' => $vendorDir . '/symfony/translation/Formatter/MessageFormatterInterface.php', - 'Symfony\\Component\\Translation\\IdentityTranslator' => $vendorDir . '/symfony/translation/IdentityTranslator.php', - 'Symfony\\Component\\Translation\\Loader\\ArrayLoader' => $vendorDir . '/symfony/translation/Loader/ArrayLoader.php', - 'Symfony\\Component\\Translation\\Loader\\CsvFileLoader' => $vendorDir . '/symfony/translation/Loader/CsvFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\FileLoader' => $vendorDir . '/symfony/translation/Loader/FileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\IcuDatFileLoader' => $vendorDir . '/symfony/translation/Loader/IcuDatFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\IcuResFileLoader' => $vendorDir . '/symfony/translation/Loader/IcuResFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\IniFileLoader' => $vendorDir . '/symfony/translation/Loader/IniFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\JsonFileLoader' => $vendorDir . '/symfony/translation/Loader/JsonFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\LoaderInterface' => $vendorDir . '/symfony/translation/Loader/LoaderInterface.php', - 'Symfony\\Component\\Translation\\Loader\\MoFileLoader' => $vendorDir . '/symfony/translation/Loader/MoFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\PhpFileLoader' => $vendorDir . '/symfony/translation/Loader/PhpFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\PoFileLoader' => $vendorDir . '/symfony/translation/Loader/PoFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\QtFileLoader' => $vendorDir . '/symfony/translation/Loader/QtFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\XliffFileLoader' => $vendorDir . '/symfony/translation/Loader/XliffFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\YamlFileLoader' => $vendorDir . '/symfony/translation/Loader/YamlFileLoader.php', - 'Symfony\\Component\\Translation\\LocaleSwitcher' => $vendorDir . '/symfony/translation/LocaleSwitcher.php', - 'Symfony\\Component\\Translation\\LoggingTranslator' => $vendorDir . '/symfony/translation/LoggingTranslator.php', - 'Symfony\\Component\\Translation\\MessageCatalogue' => $vendorDir . '/symfony/translation/MessageCatalogue.php', - 'Symfony\\Component\\Translation\\MessageCatalogueInterface' => $vendorDir . '/symfony/translation/MessageCatalogueInterface.php', - 'Symfony\\Component\\Translation\\MetadataAwareInterface' => $vendorDir . '/symfony/translation/MetadataAwareInterface.php', - 'Symfony\\Component\\Translation\\Provider\\AbstractProviderFactory' => $vendorDir . '/symfony/translation/Provider/AbstractProviderFactory.php', - 'Symfony\\Component\\Translation\\Provider\\Dsn' => $vendorDir . '/symfony/translation/Provider/Dsn.php', - 'Symfony\\Component\\Translation\\Provider\\FilteringProvider' => $vendorDir . '/symfony/translation/Provider/FilteringProvider.php', - 'Symfony\\Component\\Translation\\Provider\\NullProvider' => $vendorDir . '/symfony/translation/Provider/NullProvider.php', - 'Symfony\\Component\\Translation\\Provider\\NullProviderFactory' => $vendorDir . '/symfony/translation/Provider/NullProviderFactory.php', - 'Symfony\\Component\\Translation\\Provider\\ProviderFactoryInterface' => $vendorDir . '/symfony/translation/Provider/ProviderFactoryInterface.php', - 'Symfony\\Component\\Translation\\Provider\\ProviderInterface' => $vendorDir . '/symfony/translation/Provider/ProviderInterface.php', - 'Symfony\\Component\\Translation\\Provider\\TranslationProviderCollection' => $vendorDir . '/symfony/translation/Provider/TranslationProviderCollection.php', - 'Symfony\\Component\\Translation\\Provider\\TranslationProviderCollectionFactory' => $vendorDir . '/symfony/translation/Provider/TranslationProviderCollectionFactory.php', - 'Symfony\\Component\\Translation\\PseudoLocalizationTranslator' => $vendorDir . '/symfony/translation/PseudoLocalizationTranslator.php', - 'Symfony\\Component\\Translation\\Reader\\TranslationReader' => $vendorDir . '/symfony/translation/Reader/TranslationReader.php', - 'Symfony\\Component\\Translation\\Reader\\TranslationReaderInterface' => $vendorDir . '/symfony/translation/Reader/TranslationReaderInterface.php', - 'Symfony\\Component\\Translation\\StaticMessage' => $vendorDir . '/symfony/translation/StaticMessage.php', - 'Symfony\\Component\\Translation\\Test\\AbstractProviderFactoryTestCase' => $vendorDir . '/symfony/translation/Test/AbstractProviderFactoryTestCase.php', - 'Symfony\\Component\\Translation\\Test\\IncompleteDsnTestTrait' => $vendorDir . '/symfony/translation/Test/IncompleteDsnTestTrait.php', - 'Symfony\\Component\\Translation\\Test\\ProviderFactoryTestCase' => $vendorDir . '/symfony/translation/Test/ProviderFactoryTestCase.php', - 'Symfony\\Component\\Translation\\Test\\ProviderTestCase' => $vendorDir . '/symfony/translation/Test/ProviderTestCase.php', - 'Symfony\\Component\\Translation\\TranslatableMessage' => $vendorDir . '/symfony/translation/TranslatableMessage.php', - 'Symfony\\Component\\Translation\\Translator' => $vendorDir . '/symfony/translation/Translator.php', - 'Symfony\\Component\\Translation\\TranslatorBag' => $vendorDir . '/symfony/translation/TranslatorBag.php', - 'Symfony\\Component\\Translation\\TranslatorBagInterface' => $vendorDir . '/symfony/translation/TranslatorBagInterface.php', - 'Symfony\\Component\\Translation\\Util\\ArrayConverter' => $vendorDir . '/symfony/translation/Util/ArrayConverter.php', - 'Symfony\\Component\\Translation\\Util\\XliffUtils' => $vendorDir . '/symfony/translation/Util/XliffUtils.php', - 'Symfony\\Component\\Translation\\Writer\\TranslationWriter' => $vendorDir . '/symfony/translation/Writer/TranslationWriter.php', - 'Symfony\\Component\\Translation\\Writer\\TranslationWriterInterface' => $vendorDir . '/symfony/translation/Writer/TranslationWriterInterface.php', - 'Symfony\\Contracts\\Translation\\LocaleAwareInterface' => $vendorDir . '/symfony/translation-contracts/LocaleAwareInterface.php', - 'Symfony\\Contracts\\Translation\\TranslatableInterface' => $vendorDir . '/symfony/translation-contracts/TranslatableInterface.php', - 'Symfony\\Contracts\\Translation\\TranslatorInterface' => $vendorDir . '/symfony/translation-contracts/TranslatorInterface.php', - 'Symfony\\Contracts\\Translation\\TranslatorTrait' => $vendorDir . '/symfony/translation-contracts/TranslatorTrait.php', - 'Symfony\\Polyfill\\Iconv\\Iconv' => $vendorDir . '/symfony/polyfill-iconv/Iconv.php', - 'Symfony\\Polyfill\\Intl\\Idn\\Idn' => $vendorDir . '/symfony/polyfill-intl-idn/Idn.php', - 'Symfony\\Polyfill\\Intl\\Idn\\Info' => $vendorDir . '/symfony/polyfill-intl-idn/Info.php', - 'Symfony\\Polyfill\\Intl\\Idn\\Resources\\unidata\\DisallowedRanges' => $vendorDir . '/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php', - 'Symfony\\Polyfill\\Intl\\Idn\\Resources\\unidata\\Regex' => $vendorDir . '/symfony/polyfill-intl-idn/Resources/unidata/Regex.php', - 'Symfony\\Polyfill\\Intl\\Normalizer\\Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Normalizer.php', - 'Symfony\\Polyfill\\Mbstring\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php', - 'Symfony\\Polyfill\\Php80\\Php80' => $vendorDir . '/symfony/polyfill-php80/Php80.php', - 'Symfony\\Polyfill\\Php80\\PhpToken' => $vendorDir . '/symfony/polyfill-php80/PhpToken.php', - 'Symfony\\Polyfill\\Php83\\Php83' => $vendorDir . '/symfony/polyfill-php83/Php83.php', - 'Symfony\\Polyfill\\Php84\\Php84' => $vendorDir . '/symfony/polyfill-php84/Php84.php', - 'Symfony\\Polyfill\\Php85\\Php85' => $vendorDir . '/symfony/polyfill-php85/Php85.php', 'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', 'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', - 'ZBateson\\MailMimeParser\\Error' => $vendorDir . '/zbateson/mail-mime-parser/src/Error.php', - 'ZBateson\\MailMimeParser\\ErrorBag' => $vendorDir . '/zbateson/mail-mime-parser/src/ErrorBag.php', - 'ZBateson\\MailMimeParser\\Header\\AbstractHeader' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/AbstractHeader.php', - 'ZBateson\\MailMimeParser\\Header\\AddressHeader' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/AddressHeader.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\AbstractConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/AbstractConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\AbstractGenericConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/AbstractGenericConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\AddressBaseConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/AddressBaseConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\AddressConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/AddressConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\AddressEmailConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/AddressEmailConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\AddressGroupConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/AddressGroupConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\CommentConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/CommentConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\DateConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/DateConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\GenericConsumerMimeLiteralPartService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/GenericConsumerMimeLiteralPartService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\GenericConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/GenericConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\IConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/IConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\IdBaseConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/IdBaseConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\IdConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/IdConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\ParameterConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/ParameterConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\ParameterNameValueConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/ParameterNameValueConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\ParameterValueConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/ParameterValueConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\QuotedStringConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/QuotedStringConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\QuotedStringMimeLiteralPartConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/QuotedStringMimeLiteralPartConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\QuotedStringMimeLiteralPartTokenSplitPatternTrait' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/QuotedStringMimeLiteralPartTokenSplitPatternTrait.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\ReceivedConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/ReceivedConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\Received\\DomainConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/Received/DomainConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\Received\\GenericReceivedConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/Received/GenericReceivedConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\Received\\ReceivedDateConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/Received/ReceivedDateConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\SubjectConsumerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Consumer/SubjectConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\DateHeader' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/DateHeader.php', - 'ZBateson\\MailMimeParser\\Header\\GenericHeader' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/GenericHeader.php', - 'ZBateson\\MailMimeParser\\Header\\HeaderConsts' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/HeaderConsts.php', - 'ZBateson\\MailMimeParser\\Header\\HeaderFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/HeaderFactory.php', - 'ZBateson\\MailMimeParser\\Header\\IHeader' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/IHeader.php', - 'ZBateson\\MailMimeParser\\Header\\IHeaderPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/IHeaderPart.php', - 'ZBateson\\MailMimeParser\\Header\\IdHeader' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/IdHeader.php', - 'ZBateson\\MailMimeParser\\Header\\MimeEncodedHeader' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/MimeEncodedHeader.php', - 'ZBateson\\MailMimeParser\\Header\\ParameterHeader' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/ParameterHeader.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\AddressGroupPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/AddressGroupPart.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\AddressPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/AddressPart.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\CommentPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/CommentPart.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\ContainerPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/ContainerPart.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\DatePart' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/DatePart.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\HeaderPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/HeaderPart.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\HeaderPartFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/HeaderPartFactory.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\MimeToken' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/MimeToken.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\MimeTokenPartFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/MimeTokenPartFactory.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\NameValuePart' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/NameValuePart.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\ParameterPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/ParameterPart.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\QuotedLiteralPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/QuotedLiteralPart.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\ReceivedDomainPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/ReceivedDomainPart.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\ReceivedPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/ReceivedPart.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\SplitParameterPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/SplitParameterPart.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\SubjectToken' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/SubjectToken.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\Token' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/Part/Token.php', - 'ZBateson\\MailMimeParser\\Header\\ReceivedHeader' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/ReceivedHeader.php', - 'ZBateson\\MailMimeParser\\Header\\SubjectHeader' => $vendorDir . '/zbateson/mail-mime-parser/src/Header/SubjectHeader.php', - 'ZBateson\\MailMimeParser\\IErrorBag' => $vendorDir . '/zbateson/mail-mime-parser/src/IErrorBag.php', - 'ZBateson\\MailMimeParser\\IMessage' => $vendorDir . '/zbateson/mail-mime-parser/src/IMessage.php', - 'ZBateson\\MailMimeParser\\MailMimeParser' => $vendorDir . '/zbateson/mail-mime-parser/src/MailMimeParser.php', - 'ZBateson\\MailMimeParser\\Message' => $vendorDir . '/zbateson/mail-mime-parser/src/Message.php', - 'ZBateson\\MailMimeParser\\Message\\Factory\\IMessagePartFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/Factory/IMessagePartFactory.php', - 'ZBateson\\MailMimeParser\\Message\\Factory\\IMimePartFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/Factory/IMimePartFactory.php', - 'ZBateson\\MailMimeParser\\Message\\Factory\\IUUEncodedPartFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/Factory/IUUEncodedPartFactory.php', - 'ZBateson\\MailMimeParser\\Message\\Factory\\PartChildrenContainerFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/Factory/PartChildrenContainerFactory.php', - 'ZBateson\\MailMimeParser\\Message\\Factory\\PartHeaderContainerFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/Factory/PartHeaderContainerFactory.php', - 'ZBateson\\MailMimeParser\\Message\\Factory\\PartStreamContainerFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/Factory/PartStreamContainerFactory.php', - 'ZBateson\\MailMimeParser\\Message\\Helper\\AbstractHelper' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/Helper/AbstractHelper.php', - 'ZBateson\\MailMimeParser\\Message\\Helper\\GenericHelper' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/Helper/GenericHelper.php', - 'ZBateson\\MailMimeParser\\Message\\Helper\\MultipartHelper' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/Helper/MultipartHelper.php', - 'ZBateson\\MailMimeParser\\Message\\Helper\\PrivacyHelper' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/Helper/PrivacyHelper.php', - 'ZBateson\\MailMimeParser\\Message\\IMessagePart' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/IMessagePart.php', - 'ZBateson\\MailMimeParser\\Message\\IMimePart' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/IMimePart.php', - 'ZBateson\\MailMimeParser\\Message\\IMultiPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/IMultiPart.php', - 'ZBateson\\MailMimeParser\\Message\\IUUEncodedPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/IUUEncodedPart.php', - 'ZBateson\\MailMimeParser\\Message\\MessagePart' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/MessagePart.php', - 'ZBateson\\MailMimeParser\\Message\\MimePart' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/MimePart.php', - 'ZBateson\\MailMimeParser\\Message\\MultiPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/MultiPart.php', - 'ZBateson\\MailMimeParser\\Message\\NonMimePart' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/NonMimePart.php', - 'ZBateson\\MailMimeParser\\Message\\PartChildrenContainer' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/PartChildrenContainer.php', - 'ZBateson\\MailMimeParser\\Message\\PartFilter' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/PartFilter.php', - 'ZBateson\\MailMimeParser\\Message\\PartHeaderContainer' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/PartHeaderContainer.php', - 'ZBateson\\MailMimeParser\\Message\\PartStreamContainer' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/PartStreamContainer.php', - 'ZBateson\\MailMimeParser\\Message\\UUEncodedPart' => $vendorDir . '/zbateson/mail-mime-parser/src/Message/UUEncodedPart.php', - 'ZBateson\\MailMimeParser\\Parser\\AbstractParserService' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/AbstractParserService.php', - 'ZBateson\\MailMimeParser\\Parser\\CompatibleParserNotFoundException' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/CompatibleParserNotFoundException.php', - 'ZBateson\\MailMimeParser\\Parser\\HeaderParserService' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/HeaderParserService.php', - 'ZBateson\\MailMimeParser\\Parser\\IParserService' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/IParserService.php', - 'ZBateson\\MailMimeParser\\Parser\\MessageParserService' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/MessageParserService.php', - 'ZBateson\\MailMimeParser\\Parser\\MimeParserService' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/MimeParserService.php', - 'ZBateson\\MailMimeParser\\Parser\\NonMimeParserService' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/NonMimeParserService.php', - 'ZBateson\\MailMimeParser\\Parser\\ParserManagerService' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/ParserManagerService.php', - 'ZBateson\\MailMimeParser\\Parser\\PartBuilder' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/PartBuilder.php', - 'ZBateson\\MailMimeParser\\Parser\\PartBuilderFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/PartBuilderFactory.php', - 'ZBateson\\MailMimeParser\\Parser\\Part\\ParserPartChildrenContainer' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Part/ParserPartChildrenContainer.php', - 'ZBateson\\MailMimeParser\\Parser\\Part\\ParserPartChildrenContainerFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Part/ParserPartChildrenContainerFactory.php', - 'ZBateson\\MailMimeParser\\Parser\\Part\\ParserPartStreamContainer' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Part/ParserPartStreamContainer.php', - 'ZBateson\\MailMimeParser\\Parser\\Part\\ParserPartStreamContainerFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Part/ParserPartStreamContainerFactory.php', - 'ZBateson\\MailMimeParser\\Parser\\Part\\UUEncodedPartHeaderContainer' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Part/UUEncodedPartHeaderContainer.php', - 'ZBateson\\MailMimeParser\\Parser\\Part\\UUEncodedPartHeaderContainerFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Part/UUEncodedPartHeaderContainerFactory.php', - 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserMessageProxy' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMessageProxy.php', - 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserMessageProxyFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMessageProxyFactory.php', - 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserMimePartProxy' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMimePartProxy.php', - 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserMimePartProxyFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMimePartProxyFactory.php', - 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserNonMimeMessageProxy' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserNonMimeMessageProxy.php', - 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserNonMimeMessageProxyFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserNonMimeMessageProxyFactory.php', - 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserPartProxy' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserPartProxy.php', - 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserPartProxyFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserPartProxyFactory.php', - 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserUUEncodedPartProxy' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserUUEncodedPartProxy.php', - 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserUUEncodedPartProxyFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserUUEncodedPartProxyFactory.php', - 'ZBateson\\MailMimeParser\\Stream\\HeaderStream' => $vendorDir . '/zbateson/mail-mime-parser/src/Stream/HeaderStream.php', - 'ZBateson\\MailMimeParser\\Stream\\MessagePartStream' => $vendorDir . '/zbateson/mail-mime-parser/src/Stream/MessagePartStream.php', - 'ZBateson\\MailMimeParser\\Stream\\MessagePartStreamDecorator' => $vendorDir . '/zbateson/mail-mime-parser/src/Stream/MessagePartStreamDecorator.php', - 'ZBateson\\MailMimeParser\\Stream\\MessagePartStreamReadException' => $vendorDir . '/zbateson/mail-mime-parser/src/Stream/MessagePartStreamReadException.php', - 'ZBateson\\MailMimeParser\\Stream\\StreamFactory' => $vendorDir . '/zbateson/mail-mime-parser/src/Stream/StreamFactory.php', - 'ZBateson\\MbWrapper\\MbWrapper' => $vendorDir . '/zbateson/mb-wrapper/src/MbWrapper.php', - 'ZBateson\\MbWrapper\\UnsupportedCharsetException' => $vendorDir . '/zbateson/mb-wrapper/src/UnsupportedCharsetException.php', - 'ZBateson\\StreamDecorators\\Base64Stream' => $vendorDir . '/zbateson/stream-decorators/src/Base64Stream.php', - 'ZBateson\\StreamDecorators\\CharsetStream' => $vendorDir . '/zbateson/stream-decorators/src/CharsetStream.php', - 'ZBateson\\StreamDecorators\\ChunkSplitStream' => $vendorDir . '/zbateson/stream-decorators/src/ChunkSplitStream.php', - 'ZBateson\\StreamDecorators\\DecoratedCachingStream' => $vendorDir . '/zbateson/stream-decorators/src/DecoratedCachingStream.php', - 'ZBateson\\StreamDecorators\\NonClosingStream' => $vendorDir . '/zbateson/stream-decorators/src/NonClosingStream.php', - 'ZBateson\\StreamDecorators\\PregReplaceFilterStream' => $vendorDir . '/zbateson/stream-decorators/src/PregReplaceFilterStream.php', - 'ZBateson\\StreamDecorators\\QuotedPrintableStream' => $vendorDir . '/zbateson/stream-decorators/src/QuotedPrintableStream.php', - 'ZBateson\\StreamDecorators\\SeekingLimitStream' => $vendorDir . '/zbateson/stream-decorators/src/SeekingLimitStream.php', - 'ZBateson\\StreamDecorators\\TellZeroStream' => $vendorDir . '/zbateson/stream-decorators/src/TellZeroStream.php', - 'ZBateson\\StreamDecorators\\UUStream' => $vendorDir . '/zbateson/stream-decorators/src/UUStream.php', ); diff --git a/libs/vendor/composer/autoload_files.php b/libs/vendor/composer/autoload_files.php index c61e08cd9..43342a499 100644 --- a/libs/vendor/composer/autoload_files.php +++ b/libs/vendor/composer/autoload_files.php @@ -9,16 +9,16 @@ return array( '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php', '662a729f963d39afe703c9d9b7ab4a8c' => $vendorDir . '/symfony/polyfill-php83/bootstrap.php', - 'a1105708a18b76903365ca1c4aa61b02' => $vendorDir . '/symfony/translation/Resources/functions.php', '2203a247e6fda86070a5e4e07aed533a' => $vendorDir . '/symfony/clock/Resources/now.php', 'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php', - 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', + 'a1105708a18b76903365ca1c4aa61b02' => $vendorDir . '/symfony/translation/Resources/functions.php', '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php', 'def43f6c87e4f8dfd0c9e1b1bab14fe8' => $vendorDir . '/symfony/polyfill-iconv/bootstrap.php', 'f598d06aa772fa33d905e87be6398fb1' => $vendorDir . '/symfony/polyfill-intl-idn/bootstrap.php', + 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', 'b33e3d135e5d9e47d845c576147bda89' => $vendorDir . '/php-di/php-di/src/functions.php', - '606a39d89246991a373564698c2d8383' => $vendorDir . '/symfony/polyfill-php85/bootstrap.php', '9d2b9fc6db0f153a0a149fefb182415e' => $vendorDir . '/symfony/polyfill-php84/bootstrap.php', + '606a39d89246991a373564698c2d8383' => $vendorDir . '/symfony/polyfill-php85/bootstrap.php', '23f09fe3194f8c2f70923f90d6702129' => $vendorDir . '/illuminate/collections/functions.php', '60799491728b879e74601d83e38b2cad' => $vendorDir . '/illuminate/collections/helpers.php', ); diff --git a/libs/vendor/composer/autoload_psr4.php b/libs/vendor/composer/autoload_psr4.php index 1cd61ced3..112ef67a8 100644 --- a/libs/vendor/composer/autoload_psr4.php +++ b/libs/vendor/composer/autoload_psr4.php @@ -23,12 +23,12 @@ return array( 'Symfony\\Component\\Clock\\' => array($vendorDir . '/symfony/clock'), 'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'), 'Psr\\Log\\' => array($vendorDir . '/psr/log/src'), - 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src', $vendorDir . '/psr/http-factory/src'), + 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-factory/src', $vendorDir . '/psr/http-message/src'), 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'), 'Psr\\Clock\\' => array($vendorDir . '/psr/clock/src'), 'Laravel\\SerializableClosure\\' => array($vendorDir . '/laravel/serializable-closure/src'), 'Invoker\\' => array($vendorDir . '/php-di/invoker/src'), - 'Illuminate\\Support\\' => array($vendorDir . '/illuminate/macroable', $vendorDir . '/illuminate/conditionable', $vendorDir . '/illuminate/collections'), + 'Illuminate\\Support\\' => array($vendorDir . '/illuminate/collections', $vendorDir . '/illuminate/conditionable', $vendorDir . '/illuminate/macroable'), 'Illuminate\\Contracts\\' => array($vendorDir . '/illuminate/contracts'), 'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'), 'Egulias\\EmailValidator\\' => array($vendorDir . '/egulias/email-validator/src'), diff --git a/libs/vendor/composer/autoload_static.php b/libs/vendor/composer/autoload_static.php index fca23bf09..1ac2a95e8 100644 --- a/libs/vendor/composer/autoload_static.php +++ b/libs/vendor/composer/autoload_static.php @@ -10,16 +10,16 @@ class ComposerStaticInitbadf1d01c367c06fb591106ea3486c30 '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', '662a729f963d39afe703c9d9b7ab4a8c' => __DIR__ . '/..' . '/symfony/polyfill-php83/bootstrap.php', - 'a1105708a18b76903365ca1c4aa61b02' => __DIR__ . '/..' . '/symfony/translation/Resources/functions.php', '2203a247e6fda86070a5e4e07aed533a' => __DIR__ . '/..' . '/symfony/clock/Resources/now.php', 'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php', - 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', + 'a1105708a18b76903365ca1c4aa61b02' => __DIR__ . '/..' . '/symfony/translation/Resources/functions.php', '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php', 'def43f6c87e4f8dfd0c9e1b1bab14fe8' => __DIR__ . '/..' . '/symfony/polyfill-iconv/bootstrap.php', 'f598d06aa772fa33d905e87be6398fb1' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/bootstrap.php', + 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', 'b33e3d135e5d9e47d845c576147bda89' => __DIR__ . '/..' . '/php-di/php-di/src/functions.php', - '606a39d89246991a373564698c2d8383' => __DIR__ . '/..' . '/symfony/polyfill-php85/bootstrap.php', '9d2b9fc6db0f153a0a149fefb182415e' => __DIR__ . '/..' . '/symfony/polyfill-php84/bootstrap.php', + '606a39d89246991a373564698c2d8383' => __DIR__ . '/..' . '/symfony/polyfill-php85/bootstrap.php', '23f09fe3194f8c2f70923f90d6702129' => __DIR__ . '/..' . '/illuminate/collections/functions.php', '60799491728b879e74601d83e38b2cad' => __DIR__ . '/..' . '/illuminate/collections/helpers.php', ); @@ -156,8 +156,8 @@ class ComposerStaticInitbadf1d01c367c06fb591106ea3486c30 ), 'Psr\\Http\\Message\\' => array ( - 0 => __DIR__ . '/..' . '/psr/http-message/src', - 1 => __DIR__ . '/..' . '/psr/http-factory/src', + 0 => __DIR__ . '/..' . '/psr/http-factory/src', + 1 => __DIR__ . '/..' . '/psr/http-message/src', ), 'Psr\\Container\\' => array ( @@ -177,9 +177,9 @@ class ComposerStaticInitbadf1d01c367c06fb591106ea3486c30 ), 'Illuminate\\Support\\' => array ( - 0 => __DIR__ . '/..' . '/illuminate/macroable', + 0 => __DIR__ . '/..' . '/illuminate/collections', 1 => __DIR__ . '/..' . '/illuminate/conditionable', - 2 => __DIR__ . '/..' . '/illuminate/collections', + 2 => __DIR__ . '/..' . '/illuminate/macroable', ), 'Illuminate\\Contracts\\' => array ( @@ -217,162 +217,7 @@ class ComposerStaticInitbadf1d01c367c06fb591106ea3486c30 public static $classMap = array ( 'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', - 'Carbon\\AbstractTranslator' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/AbstractTranslator.php', - 'Carbon\\Callback' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Callback.php', - 'Carbon\\Carbon' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Carbon.php', - 'Carbon\\CarbonConverterInterface' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonConverterInterface.php', - 'Carbon\\CarbonImmutable' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonImmutable.php', - 'Carbon\\CarbonInterface' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonInterface.php', - 'Carbon\\CarbonInterval' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonInterval.php', - 'Carbon\\CarbonPeriod' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonPeriod.php', - 'Carbon\\CarbonPeriodImmutable' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonPeriodImmutable.php', - 'Carbon\\CarbonTimeZone' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/CarbonTimeZone.php', - 'Carbon\\Cli\\Invoker' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Cli/Invoker.php', - 'Carbon\\Constants\\DiffOptions' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Constants/DiffOptions.php', - 'Carbon\\Constants\\Format' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Constants/Format.php', - 'Carbon\\Constants\\TranslationOptions' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Constants/TranslationOptions.php', - 'Carbon\\Constants\\UnitValue' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Constants/UnitValue.php', - 'Carbon\\Doctrine\\CarbonDoctrineType' => __DIR__ . '/..' . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonDoctrineType.php', - 'Carbon\\Doctrine\\CarbonImmutableType' => __DIR__ . '/..' . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonImmutableType.php', - 'Carbon\\Doctrine\\CarbonType' => __DIR__ . '/..' . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonType.php', - 'Carbon\\Doctrine\\CarbonTypeConverter' => __DIR__ . '/..' . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/CarbonTypeConverter.php', - 'Carbon\\Doctrine\\DateTimeDefaultPrecision' => __DIR__ . '/..' . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeDefaultPrecision.php', - 'Carbon\\Doctrine\\DateTimeImmutableType' => __DIR__ . '/..' . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeImmutableType.php', - 'Carbon\\Doctrine\\DateTimeType' => __DIR__ . '/..' . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine/DateTimeType.php', - 'Carbon\\Exceptions\\BadComparisonUnitException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php', - 'Carbon\\Exceptions\\BadFluentConstructorException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php', - 'Carbon\\Exceptions\\BadFluentSetterException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php', - 'Carbon\\Exceptions\\BadMethodCallException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php', - 'Carbon\\Exceptions\\EndLessPeriodException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php', - 'Carbon\\Exceptions\\Exception' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/Exception.php', - 'Carbon\\Exceptions\\ImmutableException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php', - 'Carbon\\Exceptions\\InvalidArgumentException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php', - 'Carbon\\Exceptions\\InvalidCastException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php', - 'Carbon\\Exceptions\\InvalidDateException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php', - 'Carbon\\Exceptions\\InvalidFormatException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php', - 'Carbon\\Exceptions\\InvalidIntervalException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php', - 'Carbon\\Exceptions\\InvalidPeriodDateException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php', - 'Carbon\\Exceptions\\InvalidPeriodParameterException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php', - 'Carbon\\Exceptions\\InvalidTimeZoneException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php', - 'Carbon\\Exceptions\\InvalidTypeException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php', - 'Carbon\\Exceptions\\NotACarbonClassException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php', - 'Carbon\\Exceptions\\NotAPeriodException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php', - 'Carbon\\Exceptions\\NotLocaleAwareException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php', - 'Carbon\\Exceptions\\OutOfRangeException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php', - 'Carbon\\Exceptions\\ParseErrorException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php', - 'Carbon\\Exceptions\\RuntimeException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php', - 'Carbon\\Exceptions\\UnitException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnitException.php', - 'Carbon\\Exceptions\\UnitNotConfiguredException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php', - 'Carbon\\Exceptions\\UnknownGetterException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php', - 'Carbon\\Exceptions\\UnknownMethodException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php', - 'Carbon\\Exceptions\\UnknownSetterException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php', - 'Carbon\\Exceptions\\UnknownUnitException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php', - 'Carbon\\Exceptions\\UnreachableException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php', - 'Carbon\\Exceptions\\UnsupportedUnitException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/UnsupportedUnitException.php', - 'Carbon\\Factory' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Factory.php', - 'Carbon\\FactoryImmutable' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/FactoryImmutable.php', - 'Carbon\\Language' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Language.php', - 'Carbon\\Laravel\\ServiceProvider' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Laravel/ServiceProvider.php', - 'Carbon\\MessageFormatter\\MessageFormatterMapper' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/MessageFormatter/MessageFormatterMapper.php', - 'Carbon\\Month' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Month.php', - 'Carbon\\OverflowMode' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/OverflowMode.php', - 'Carbon\\PHPStan\\MacroExtension' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/PHPStan/MacroExtension.php', - 'Carbon\\PHPStan\\MacroMethodReflection' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/PHPStan/MacroMethodReflection.php', - 'Carbon\\Traits\\Boundaries' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Boundaries.php', - 'Carbon\\Traits\\Cast' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Cast.php', - 'Carbon\\Traits\\Comparison' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Comparison.php', - 'Carbon\\Traits\\Converter' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Converter.php', - 'Carbon\\Traits\\Creator' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Creator.php', - 'Carbon\\Traits\\Date' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Date.php', - 'Carbon\\Traits\\DeprecatedPeriodProperties' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/DeprecatedPeriodProperties.php', - 'Carbon\\Traits\\Difference' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Difference.php', - 'Carbon\\Traits\\IntervalRounding' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/IntervalRounding.php', - 'Carbon\\Traits\\IntervalStep' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/IntervalStep.php', - 'Carbon\\Traits\\LocalFactory' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/LocalFactory.php', - 'Carbon\\Traits\\Localization' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Localization.php', - 'Carbon\\Traits\\Macro' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Macro.php', - 'Carbon\\Traits\\MagicParameter' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/MagicParameter.php', - 'Carbon\\Traits\\Mixin' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Mixin.php', - 'Carbon\\Traits\\Modifiers' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Modifiers.php', - 'Carbon\\Traits\\Mutability' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Mutability.php', - 'Carbon\\Traits\\ObjectInitialisation' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/ObjectInitialisation.php', - 'Carbon\\Traits\\Options' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Options.php', - 'Carbon\\Traits\\Rounding' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Rounding.php', - 'Carbon\\Traits\\Serialization' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Serialization.php', - 'Carbon\\Traits\\StaticLocalization' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/StaticLocalization.php', - 'Carbon\\Traits\\StaticOptions' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/StaticOptions.php', - 'Carbon\\Traits\\Test' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Test.php', - 'Carbon\\Traits\\Timestamp' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Timestamp.php', - 'Carbon\\Traits\\ToStringFormat' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/ToStringFormat.php', - 'Carbon\\Traits\\Units' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Units.php', - 'Carbon\\Traits\\Week' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Traits/Week.php', - 'Carbon\\Translator' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Translator.php', - 'Carbon\\TranslatorImmutable' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/TranslatorImmutable.php', - 'Carbon\\TranslatorStrongTypeInterface' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/TranslatorStrongTypeInterface.php', - 'Carbon\\Unit' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Unit.php', - 'Carbon\\WeekDay' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/WeekDay.php', - 'Carbon\\WrapperClock' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/WrapperClock.php', 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', - 'DI\\Attribute\\Inject' => __DIR__ . '/..' . '/php-di/php-di/src/Attribute/Inject.php', - 'DI\\Attribute\\Injectable' => __DIR__ . '/..' . '/php-di/php-di/src/Attribute/Injectable.php', - 'DI\\CompiledContainer' => __DIR__ . '/..' . '/php-di/php-di/src/CompiledContainer.php', - 'DI\\Compiler\\Compiler' => __DIR__ . '/..' . '/php-di/php-di/src/Compiler/Compiler.php', - 'DI\\Compiler\\ObjectCreationCompiler' => __DIR__ . '/..' . '/php-di/php-di/src/Compiler/ObjectCreationCompiler.php', - 'DI\\Compiler\\RequestedEntryHolder' => __DIR__ . '/..' . '/php-di/php-di/src/Compiler/RequestedEntryHolder.php', - 'DI\\Container' => __DIR__ . '/..' . '/php-di/php-di/src/Container.php', - 'DI\\ContainerBuilder' => __DIR__ . '/..' . '/php-di/php-di/src/ContainerBuilder.php', - 'DI\\Definition\\ArrayDefinition' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/ArrayDefinition.php', - 'DI\\Definition\\ArrayDefinitionExtension' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/ArrayDefinitionExtension.php', - 'DI\\Definition\\AutowireDefinition' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/AutowireDefinition.php', - 'DI\\Definition\\DecoratorDefinition' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/DecoratorDefinition.php', - 'DI\\Definition\\Definition' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Definition.php', - 'DI\\Definition\\Dumper\\ObjectDefinitionDumper' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Dumper/ObjectDefinitionDumper.php', - 'DI\\Definition\\EnvironmentVariableDefinition' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/EnvironmentVariableDefinition.php', - 'DI\\Definition\\Exception\\InvalidAttribute' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Exception/InvalidAttribute.php', - 'DI\\Definition\\Exception\\InvalidDefinition' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Exception/InvalidDefinition.php', - 'DI\\Definition\\ExtendsPreviousDefinition' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/ExtendsPreviousDefinition.php', - 'DI\\Definition\\FactoryDefinition' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/FactoryDefinition.php', - 'DI\\Definition\\Helper\\AutowireDefinitionHelper' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Helper/AutowireDefinitionHelper.php', - 'DI\\Definition\\Helper\\CreateDefinitionHelper' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Helper/CreateDefinitionHelper.php', - 'DI\\Definition\\Helper\\DefinitionHelper' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Helper/DefinitionHelper.php', - 'DI\\Definition\\Helper\\FactoryDefinitionHelper' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Helper/FactoryDefinitionHelper.php', - 'DI\\Definition\\InstanceDefinition' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/InstanceDefinition.php', - 'DI\\Definition\\ObjectDefinition' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/ObjectDefinition.php', - 'DI\\Definition\\ObjectDefinition\\MethodInjection' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/ObjectDefinition/MethodInjection.php', - 'DI\\Definition\\ObjectDefinition\\PropertyInjection' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/ObjectDefinition/PropertyInjection.php', - 'DI\\Definition\\Reference' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Reference.php', - 'DI\\Definition\\Resolver\\ArrayResolver' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Resolver/ArrayResolver.php', - 'DI\\Definition\\Resolver\\DecoratorResolver' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Resolver/DecoratorResolver.php', - 'DI\\Definition\\Resolver\\DefinitionResolver' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Resolver/DefinitionResolver.php', - 'DI\\Definition\\Resolver\\EnvironmentVariableResolver' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Resolver/EnvironmentVariableResolver.php', - 'DI\\Definition\\Resolver\\FactoryResolver' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Resolver/FactoryResolver.php', - 'DI\\Definition\\Resolver\\InstanceInjector' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Resolver/InstanceInjector.php', - 'DI\\Definition\\Resolver\\ObjectCreator' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Resolver/ObjectCreator.php', - 'DI\\Definition\\Resolver\\ParameterResolver' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Resolver/ParameterResolver.php', - 'DI\\Definition\\Resolver\\ResolverDispatcher' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Resolver/ResolverDispatcher.php', - 'DI\\Definition\\SelfResolvingDefinition' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/SelfResolvingDefinition.php', - 'DI\\Definition\\Source\\AttributeBasedAutowiring' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Source/AttributeBasedAutowiring.php', - 'DI\\Definition\\Source\\Autowiring' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Source/Autowiring.php', - 'DI\\Definition\\Source\\DefinitionArray' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Source/DefinitionArray.php', - 'DI\\Definition\\Source\\DefinitionFile' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Source/DefinitionFile.php', - 'DI\\Definition\\Source\\DefinitionNormalizer' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Source/DefinitionNormalizer.php', - 'DI\\Definition\\Source\\DefinitionSource' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Source/DefinitionSource.php', - 'DI\\Definition\\Source\\MutableDefinitionSource' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Source/MutableDefinitionSource.php', - 'DI\\Definition\\Source\\NoAutowiring' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Source/NoAutowiring.php', - 'DI\\Definition\\Source\\ReflectionBasedAutowiring' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Source/ReflectionBasedAutowiring.php', - 'DI\\Definition\\Source\\SourceCache' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Source/SourceCache.php', - 'DI\\Definition\\Source\\SourceChain' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/Source/SourceChain.php', - 'DI\\Definition\\StringDefinition' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/StringDefinition.php', - 'DI\\Definition\\ValueDefinition' => __DIR__ . '/..' . '/php-di/php-di/src/Definition/ValueDefinition.php', - 'DI\\DependencyException' => __DIR__ . '/..' . '/php-di/php-di/src/DependencyException.php', - 'DI\\FactoryInterface' => __DIR__ . '/..' . '/php-di/php-di/src/FactoryInterface.php', - 'DI\\Factory\\RequestedEntry' => __DIR__ . '/..' . '/php-di/php-di/src/Factory/RequestedEntry.php', - 'DI\\Invoker\\DefinitionParameterResolver' => __DIR__ . '/..' . '/php-di/php-di/src/Invoker/DefinitionParameterResolver.php', - 'DI\\Invoker\\FactoryParameterResolver' => __DIR__ . '/..' . '/php-di/php-di/src/Invoker/FactoryParameterResolver.php', - 'DI\\NotFoundException' => __DIR__ . '/..' . '/php-di/php-di/src/NotFoundException.php', - 'DI\\Proxy\\NativeProxyFactory' => __DIR__ . '/..' . '/php-di/php-di/src/Proxy/NativeProxyFactory.php', - 'DI\\Proxy\\ProxyFactory' => __DIR__ . '/..' . '/php-di/php-di/src/Proxy/ProxyFactory.php', - 'DI\\Proxy\\ProxyFactoryInterface' => __DIR__ . '/..' . '/php-di/php-di/src/Proxy/ProxyFactoryInterface.php', 'DateError' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateError.php', 'DateException' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateException.php', 'DateInvalidOperationException' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateInvalidOperationException.php', @@ -384,413 +229,8 @@ class ComposerStaticInitbadf1d01c367c06fb591106ea3486c30 'DateRangeError' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/DateRangeError.php', 'DelayedTargetValidation' => __DIR__ . '/..' . '/symfony/polyfill-php85/Resources/stubs/DelayedTargetValidation.php', 'Deprecated' => __DIR__ . '/..' . '/symfony/polyfill-php84/Resources/stubs/Deprecated.php', - 'DirectoryTree\\ImapEngine\\Address' => __DIR__ . '/..' . '/directorytree/imapengine/src/Address.php', - 'DirectoryTree\\ImapEngine\\Attachment' => __DIR__ . '/..' . '/directorytree/imapengine/src/Attachment.php', - 'DirectoryTree\\ImapEngine\\BodyStructureCollection' => __DIR__ . '/..' . '/directorytree/imapengine/src/BodyStructureCollection.php', - 'DirectoryTree\\ImapEngine\\BodyStructurePart' => __DIR__ . '/..' . '/directorytree/imapengine/src/BodyStructurePart.php', - 'DirectoryTree\\ImapEngine\\Collections\\FolderCollection' => __DIR__ . '/..' . '/directorytree/imapengine/src/Collections/FolderCollection.php', - 'DirectoryTree\\ImapEngine\\Collections\\MessageCollection' => __DIR__ . '/..' . '/directorytree/imapengine/src/Collections/MessageCollection.php', - 'DirectoryTree\\ImapEngine\\Collections\\PaginatedCollection' => __DIR__ . '/..' . '/directorytree/imapengine/src/Collections/PaginatedCollection.php', - 'DirectoryTree\\ImapEngine\\Collections\\ResponseCollection' => __DIR__ . '/..' . '/directorytree/imapengine/src/Collections/ResponseCollection.php', - 'DirectoryTree\\ImapEngine\\ComparesFolders' => __DIR__ . '/..' . '/directorytree/imapengine/src/ComparesFolders.php', - 'DirectoryTree\\ImapEngine\\Connection\\ConnectionInterface' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/ConnectionInterface.php', - 'DirectoryTree\\ImapEngine\\Connection\\ImapCommand' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/ImapCommand.php', - 'DirectoryTree\\ImapEngine\\Connection\\ImapConnection' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/ImapConnection.php', - 'DirectoryTree\\ImapEngine\\Connection\\ImapParser' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/ImapParser.php', - 'DirectoryTree\\ImapEngine\\Connection\\ImapQueryBuilder' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/ImapQueryBuilder.php', - 'DirectoryTree\\ImapEngine\\Connection\\ImapTokenizer' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/ImapTokenizer.php', - 'DirectoryTree\\ImapEngine\\Connection\\Loggers\\EchoLogger' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Loggers/EchoLogger.php', - 'DirectoryTree\\ImapEngine\\Connection\\Loggers\\FileLogger' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Loggers/FileLogger.php', - 'DirectoryTree\\ImapEngine\\Connection\\Loggers\\Logger' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Loggers/Logger.php', - 'DirectoryTree\\ImapEngine\\Connection\\Loggers\\LoggerInterface' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Loggers/LoggerInterface.php', - 'DirectoryTree\\ImapEngine\\Connection\\Loggers\\RayLogger' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Loggers/RayLogger.php', - 'DirectoryTree\\ImapEngine\\Connection\\RawQueryValue' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/RawQueryValue.php', - 'DirectoryTree\\ImapEngine\\Connection\\Responses\\ContinuationResponse' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Responses/ContinuationResponse.php', - 'DirectoryTree\\ImapEngine\\Connection\\Responses\\Data\\Data' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Responses/Data/Data.php', - 'DirectoryTree\\ImapEngine\\Connection\\Responses\\Data\\ListData' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Responses/Data/ListData.php', - 'DirectoryTree\\ImapEngine\\Connection\\Responses\\Data\\ResponseCodeData' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Responses/Data/ResponseCodeData.php', - 'DirectoryTree\\ImapEngine\\Connection\\Responses\\HasTokens' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Responses/HasTokens.php', - 'DirectoryTree\\ImapEngine\\Connection\\Responses\\MessageResponseParser' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Responses/MessageResponseParser.php', - 'DirectoryTree\\ImapEngine\\Connection\\Responses\\Response' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Responses/Response.php', - 'DirectoryTree\\ImapEngine\\Connection\\Responses\\TaggedResponse' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Responses/TaggedResponse.php', - 'DirectoryTree\\ImapEngine\\Connection\\Responses\\UntaggedResponse' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Responses/UntaggedResponse.php', - 'DirectoryTree\\ImapEngine\\Connection\\Result' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Result.php', - 'DirectoryTree\\ImapEngine\\Connection\\Streams\\FakeStream' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Streams/FakeStream.php', - 'DirectoryTree\\ImapEngine\\Connection\\Streams\\ImapStream' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Streams/ImapStream.php', - 'DirectoryTree\\ImapEngine\\Connection\\Streams\\StreamInterface' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Streams/StreamInterface.php', - 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\Atom' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Tokens/Atom.php', - 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\Crlf' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Tokens/Crlf.php', - 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\EmailAddress' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Tokens/EmailAddress.php', - 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\ListClose' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Tokens/ListClose.php', - 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\ListOpen' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Tokens/ListOpen.php', - 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\Literal' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Tokens/Literal.php', - 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\Nil' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Tokens/Nil.php', - 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\Number' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Tokens/Number.php', - 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\QuotedString' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Tokens/QuotedString.php', - 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\ResponseCodeClose' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Tokens/ResponseCodeClose.php', - 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\ResponseCodeOpen' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Tokens/ResponseCodeOpen.php', - 'DirectoryTree\\ImapEngine\\Connection\\Tokens\\Token' => __DIR__ . '/..' . '/directorytree/imapengine/src/Connection/Tokens/Token.php', - 'DirectoryTree\\ImapEngine\\ContentDisposition' => __DIR__ . '/..' . '/directorytree/imapengine/src/ContentDisposition.php', - 'DirectoryTree\\ImapEngine\\DraftMessage' => __DIR__ . '/..' . '/directorytree/imapengine/src/DraftMessage.php', - 'DirectoryTree\\ImapEngine\\Enums\\ContentDispositionType' => __DIR__ . '/..' . '/directorytree/imapengine/src/Enums/ContentDispositionType.php', - 'DirectoryTree\\ImapEngine\\Enums\\ImapFetchIdentifier' => __DIR__ . '/..' . '/directorytree/imapengine/src/Enums/ImapFetchIdentifier.php', - 'DirectoryTree\\ImapEngine\\Enums\\ImapFlag' => __DIR__ . '/..' . '/directorytree/imapengine/src/Enums/ImapFlag.php', - 'DirectoryTree\\ImapEngine\\Enums\\ImapSearchKey' => __DIR__ . '/..' . '/directorytree/imapengine/src/Enums/ImapSearchKey.php', - 'DirectoryTree\\ImapEngine\\Enums\\ImapSortKey' => __DIR__ . '/..' . '/directorytree/imapengine/src/Enums/ImapSortKey.php', - 'DirectoryTree\\ImapEngine\\Exceptions\\Exception' => __DIR__ . '/..' . '/directorytree/imapengine/src/Exceptions/Exception.php', - 'DirectoryTree\\ImapEngine\\Exceptions\\ImapCapabilityException' => __DIR__ . '/..' . '/directorytree/imapengine/src/Exceptions/ImapCapabilityException.php', - 'DirectoryTree\\ImapEngine\\Exceptions\\ImapCommandException' => __DIR__ . '/..' . '/directorytree/imapengine/src/Exceptions/ImapCommandException.php', - 'DirectoryTree\\ImapEngine\\Exceptions\\ImapConnectionClosedException' => __DIR__ . '/..' . '/directorytree/imapengine/src/Exceptions/ImapConnectionClosedException.php', - 'DirectoryTree\\ImapEngine\\Exceptions\\ImapConnectionException' => __DIR__ . '/..' . '/directorytree/imapengine/src/Exceptions/ImapConnectionException.php', - 'DirectoryTree\\ImapEngine\\Exceptions\\ImapConnectionFailedException' => __DIR__ . '/..' . '/directorytree/imapengine/src/Exceptions/ImapConnectionFailedException.php', - 'DirectoryTree\\ImapEngine\\Exceptions\\ImapConnectionTimedOutException' => __DIR__ . '/..' . '/directorytree/imapengine/src/Exceptions/ImapConnectionTimedOutException.php', - 'DirectoryTree\\ImapEngine\\Exceptions\\ImapParserException' => __DIR__ . '/..' . '/directorytree/imapengine/src/Exceptions/ImapParserException.php', - 'DirectoryTree\\ImapEngine\\Exceptions\\ImapResponseException' => __DIR__ . '/..' . '/directorytree/imapengine/src/Exceptions/ImapResponseException.php', - 'DirectoryTree\\ImapEngine\\Exceptions\\ImapStreamException' => __DIR__ . '/..' . '/directorytree/imapengine/src/Exceptions/ImapStreamException.php', - 'DirectoryTree\\ImapEngine\\Exceptions\\RuntimeException' => __DIR__ . '/..' . '/directorytree/imapengine/src/Exceptions/RuntimeException.php', - 'DirectoryTree\\ImapEngine\\FileMessage' => __DIR__ . '/..' . '/directorytree/imapengine/src/FileMessage.php', - 'DirectoryTree\\ImapEngine\\FlaggableInterface' => __DIR__ . '/..' . '/directorytree/imapengine/src/FlaggableInterface.php', - 'DirectoryTree\\ImapEngine\\Folder' => __DIR__ . '/..' . '/directorytree/imapengine/src/Folder.php', - 'DirectoryTree\\ImapEngine\\FolderInterface' => __DIR__ . '/..' . '/directorytree/imapengine/src/FolderInterface.php', - 'DirectoryTree\\ImapEngine\\FolderRepository' => __DIR__ . '/..' . '/directorytree/imapengine/src/FolderRepository.php', - 'DirectoryTree\\ImapEngine\\FolderRepositoryInterface' => __DIR__ . '/..' . '/directorytree/imapengine/src/FolderRepositoryInterface.php', - 'DirectoryTree\\ImapEngine\\HasFlags' => __DIR__ . '/..' . '/directorytree/imapengine/src/HasFlags.php', - 'DirectoryTree\\ImapEngine\\HasMessageAccessors' => __DIR__ . '/..' . '/directorytree/imapengine/src/HasMessageAccessors.php', - 'DirectoryTree\\ImapEngine\\HasParsedMessage' => __DIR__ . '/..' . '/directorytree/imapengine/src/HasParsedMessage.php', - 'DirectoryTree\\ImapEngine\\Idle' => __DIR__ . '/..' . '/directorytree/imapengine/src/Idle.php', - 'DirectoryTree\\ImapEngine\\Mailbox' => __DIR__ . '/..' . '/directorytree/imapengine/src/Mailbox.php', - 'DirectoryTree\\ImapEngine\\MailboxInterface' => __DIR__ . '/..' . '/directorytree/imapengine/src/MailboxInterface.php', - 'DirectoryTree\\ImapEngine\\Mbox' => __DIR__ . '/..' . '/directorytree/imapengine/src/Mbox.php', - 'DirectoryTree\\ImapEngine\\Message' => __DIR__ . '/..' . '/directorytree/imapengine/src/Message.php', - 'DirectoryTree\\ImapEngine\\MessageInterface' => __DIR__ . '/..' . '/directorytree/imapengine/src/MessageInterface.php', - 'DirectoryTree\\ImapEngine\\MessageParser' => __DIR__ . '/..' . '/directorytree/imapengine/src/MessageParser.php', - 'DirectoryTree\\ImapEngine\\MessageQuery' => __DIR__ . '/..' . '/directorytree/imapengine/src/MessageQuery.php', - 'DirectoryTree\\ImapEngine\\MessageQueryInterface' => __DIR__ . '/..' . '/directorytree/imapengine/src/MessageQueryInterface.php', - 'DirectoryTree\\ImapEngine\\Pagination\\LengthAwarePaginator' => __DIR__ . '/..' . '/directorytree/imapengine/src/Pagination/LengthAwarePaginator.php', - 'DirectoryTree\\ImapEngine\\Poll' => __DIR__ . '/..' . '/directorytree/imapengine/src/Poll.php', - 'DirectoryTree\\ImapEngine\\QueriesMessages' => __DIR__ . '/..' . '/directorytree/imapengine/src/QueriesMessages.php', - 'DirectoryTree\\ImapEngine\\Support\\BodyPartDecoder' => __DIR__ . '/..' . '/directorytree/imapengine/src/Support/BodyPartDecoder.php', - 'DirectoryTree\\ImapEngine\\Support\\ForwardsCalls' => __DIR__ . '/..' . '/directorytree/imapengine/src/Support/ForwardsCalls.php', - 'DirectoryTree\\ImapEngine\\Support\\LazyBodyPartStream' => __DIR__ . '/..' . '/directorytree/imapengine/src/Support/LazyBodyPartStream.php', - 'DirectoryTree\\ImapEngine\\Support\\MimeMessage' => __DIR__ . '/..' . '/directorytree/imapengine/src/Support/MimeMessage.php', - 'DirectoryTree\\ImapEngine\\Support\\Str' => __DIR__ . '/..' . '/directorytree/imapengine/src/Support/Str.php', - 'DirectoryTree\\ImapEngine\\Testing\\FakeFolder' => __DIR__ . '/..' . '/directorytree/imapengine/src/Testing/FakeFolder.php', - 'DirectoryTree\\ImapEngine\\Testing\\FakeFolderRepository' => __DIR__ . '/..' . '/directorytree/imapengine/src/Testing/FakeFolderRepository.php', - 'DirectoryTree\\ImapEngine\\Testing\\FakeMailbox' => __DIR__ . '/..' . '/directorytree/imapengine/src/Testing/FakeMailbox.php', - 'DirectoryTree\\ImapEngine\\Testing\\FakeMessage' => __DIR__ . '/..' . '/directorytree/imapengine/src/Testing/FakeMessage.php', - 'DirectoryTree\\ImapEngine\\Testing\\FakeMessageQuery' => __DIR__ . '/..' . '/directorytree/imapengine/src/Testing/FakeMessageQuery.php', - 'Doctrine\\Common\\Lexer\\AbstractLexer' => __DIR__ . '/..' . '/doctrine/lexer/src/AbstractLexer.php', - 'Doctrine\\Common\\Lexer\\Token' => __DIR__ . '/..' . '/doctrine/lexer/src/Token.php', - 'Egulias\\EmailValidator\\EmailLexer' => __DIR__ . '/..' . '/egulias/email-validator/src/EmailLexer.php', - 'Egulias\\EmailValidator\\EmailParser' => __DIR__ . '/..' . '/egulias/email-validator/src/EmailParser.php', - 'Egulias\\EmailValidator\\EmailValidator' => __DIR__ . '/..' . '/egulias/email-validator/src/EmailValidator.php', - 'Egulias\\EmailValidator\\MessageIDParser' => __DIR__ . '/..' . '/egulias/email-validator/src/MessageIDParser.php', - 'Egulias\\EmailValidator\\Parser' => __DIR__ . '/..' . '/egulias/email-validator/src/Parser.php', - 'Egulias\\EmailValidator\\Parser\\Comment' => __DIR__ . '/..' . '/egulias/email-validator/src/Parser/Comment.php', - 'Egulias\\EmailValidator\\Parser\\CommentStrategy\\CommentStrategy' => __DIR__ . '/..' . '/egulias/email-validator/src/Parser/CommentStrategy/CommentStrategy.php', - 'Egulias\\EmailValidator\\Parser\\CommentStrategy\\DomainComment' => __DIR__ . '/..' . '/egulias/email-validator/src/Parser/CommentStrategy/DomainComment.php', - 'Egulias\\EmailValidator\\Parser\\CommentStrategy\\LocalComment' => __DIR__ . '/..' . '/egulias/email-validator/src/Parser/CommentStrategy/LocalComment.php', - 'Egulias\\EmailValidator\\Parser\\DomainLiteral' => __DIR__ . '/..' . '/egulias/email-validator/src/Parser/DomainLiteral.php', - 'Egulias\\EmailValidator\\Parser\\DomainPart' => __DIR__ . '/..' . '/egulias/email-validator/src/Parser/DomainPart.php', - 'Egulias\\EmailValidator\\Parser\\DoubleQuote' => __DIR__ . '/..' . '/egulias/email-validator/src/Parser/DoubleQuote.php', - 'Egulias\\EmailValidator\\Parser\\FoldingWhiteSpace' => __DIR__ . '/..' . '/egulias/email-validator/src/Parser/FoldingWhiteSpace.php', - 'Egulias\\EmailValidator\\Parser\\IDLeftPart' => __DIR__ . '/..' . '/egulias/email-validator/src/Parser/IDLeftPart.php', - 'Egulias\\EmailValidator\\Parser\\IDRightPart' => __DIR__ . '/..' . '/egulias/email-validator/src/Parser/IDRightPart.php', - 'Egulias\\EmailValidator\\Parser\\LocalPart' => __DIR__ . '/..' . '/egulias/email-validator/src/Parser/LocalPart.php', - 'Egulias\\EmailValidator\\Parser\\PartParser' => __DIR__ . '/..' . '/egulias/email-validator/src/Parser/PartParser.php', - 'Egulias\\EmailValidator\\Result\\InvalidEmail' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/InvalidEmail.php', - 'Egulias\\EmailValidator\\Result\\MultipleErrors' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/MultipleErrors.php', - 'Egulias\\EmailValidator\\Result\\Reason\\AtextAfterCFWS' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/AtextAfterCFWS.php', - 'Egulias\\EmailValidator\\Result\\Reason\\CRLFAtTheEnd' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/CRLFAtTheEnd.php', - 'Egulias\\EmailValidator\\Result\\Reason\\CRLFX2' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/CRLFX2.php', - 'Egulias\\EmailValidator\\Result\\Reason\\CRNoLF' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/CRNoLF.php', - 'Egulias\\EmailValidator\\Result\\Reason\\CharNotAllowed' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/CharNotAllowed.php', - 'Egulias\\EmailValidator\\Result\\Reason\\CommaInDomain' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/CommaInDomain.php', - 'Egulias\\EmailValidator\\Result\\Reason\\CommentsInIDRight' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/CommentsInIDRight.php', - 'Egulias\\EmailValidator\\Result\\Reason\\ConsecutiveAt' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/ConsecutiveAt.php', - 'Egulias\\EmailValidator\\Result\\Reason\\ConsecutiveDot' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/ConsecutiveDot.php', - 'Egulias\\EmailValidator\\Result\\Reason\\DetailedReason' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/DetailedReason.php', - 'Egulias\\EmailValidator\\Result\\Reason\\DomainAcceptsNoMail' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/DomainAcceptsNoMail.php', - 'Egulias\\EmailValidator\\Result\\Reason\\DomainHyphened' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/DomainHyphened.php', - 'Egulias\\EmailValidator\\Result\\Reason\\DomainTooLong' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/DomainTooLong.php', - 'Egulias\\EmailValidator\\Result\\Reason\\DotAtEnd' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/DotAtEnd.php', - 'Egulias\\EmailValidator\\Result\\Reason\\DotAtStart' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/DotAtStart.php', - 'Egulias\\EmailValidator\\Result\\Reason\\EmptyReason' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/EmptyReason.php', - 'Egulias\\EmailValidator\\Result\\Reason\\ExceptionFound' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/ExceptionFound.php', - 'Egulias\\EmailValidator\\Result\\Reason\\ExpectingATEXT' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/ExpectingATEXT.php', - 'Egulias\\EmailValidator\\Result\\Reason\\ExpectingCTEXT' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/ExpectingCTEXT.php', - 'Egulias\\EmailValidator\\Result\\Reason\\ExpectingDTEXT' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/ExpectingDTEXT.php', - 'Egulias\\EmailValidator\\Result\\Reason\\ExpectingDomainLiteralClose' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/ExpectingDomainLiteralClose.php', - 'Egulias\\EmailValidator\\Result\\Reason\\LabelTooLong' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/LabelTooLong.php', - 'Egulias\\EmailValidator\\Result\\Reason\\LocalOrReservedDomain' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/LocalOrReservedDomain.php', - 'Egulias\\EmailValidator\\Result\\Reason\\NoDNSRecord' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/NoDNSRecord.php', - 'Egulias\\EmailValidator\\Result\\Reason\\NoDomainPart' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/NoDomainPart.php', - 'Egulias\\EmailValidator\\Result\\Reason\\NoLocalPart' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/NoLocalPart.php', - 'Egulias\\EmailValidator\\Result\\Reason\\RFCWarnings' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/RFCWarnings.php', - 'Egulias\\EmailValidator\\Result\\Reason\\Reason' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/Reason.php', - 'Egulias\\EmailValidator\\Result\\Reason\\SpoofEmail' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/SpoofEmail.php', - 'Egulias\\EmailValidator\\Result\\Reason\\UnOpenedComment' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/UnOpenedComment.php', - 'Egulias\\EmailValidator\\Result\\Reason\\UnableToGetDNSRecord' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/UnableToGetDNSRecord.php', - 'Egulias\\EmailValidator\\Result\\Reason\\UnclosedComment' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/UnclosedComment.php', - 'Egulias\\EmailValidator\\Result\\Reason\\UnclosedQuotedString' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/UnclosedQuotedString.php', - 'Egulias\\EmailValidator\\Result\\Reason\\UnusualElements' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Reason/UnusualElements.php', - 'Egulias\\EmailValidator\\Result\\Result' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/Result.php', - 'Egulias\\EmailValidator\\Result\\SpoofEmail' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/SpoofEmail.php', - 'Egulias\\EmailValidator\\Result\\ValidEmail' => __DIR__ . '/..' . '/egulias/email-validator/src/Result/ValidEmail.php', - 'Egulias\\EmailValidator\\Validation\\DNSCheckValidation' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/DNSCheckValidation.php', - 'Egulias\\EmailValidator\\Validation\\DNSGetRecordWrapper' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/DNSGetRecordWrapper.php', - 'Egulias\\EmailValidator\\Validation\\DNSRecords' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/DNSRecords.php', - 'Egulias\\EmailValidator\\Validation\\EmailValidation' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/EmailValidation.php', - 'Egulias\\EmailValidator\\Validation\\Exception\\EmptyValidationList' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/Exception/EmptyValidationList.php', - 'Egulias\\EmailValidator\\Validation\\Extra\\SpoofCheckValidation' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/Extra/SpoofCheckValidation.php', - 'Egulias\\EmailValidator\\Validation\\MessageIDValidation' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/MessageIDValidation.php', - 'Egulias\\EmailValidator\\Validation\\MultipleValidationWithAnd' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/MultipleValidationWithAnd.php', - 'Egulias\\EmailValidator\\Validation\\NoRFCWarningsValidation' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/NoRFCWarningsValidation.php', - 'Egulias\\EmailValidator\\Validation\\RFCValidation' => __DIR__ . '/..' . '/egulias/email-validator/src/Validation/RFCValidation.php', - 'Egulias\\EmailValidator\\Warning\\AddressLiteral' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/AddressLiteral.php', - 'Egulias\\EmailValidator\\Warning\\CFWSNearAt' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/CFWSNearAt.php', - 'Egulias\\EmailValidator\\Warning\\CFWSWithFWS' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/CFWSWithFWS.php', - 'Egulias\\EmailValidator\\Warning\\Comment' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/Comment.php', - 'Egulias\\EmailValidator\\Warning\\DeprecatedComment' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/DeprecatedComment.php', - 'Egulias\\EmailValidator\\Warning\\DomainLiteral' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/DomainLiteral.php', - 'Egulias\\EmailValidator\\Warning\\EmailTooLong' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/EmailTooLong.php', - 'Egulias\\EmailValidator\\Warning\\IPV6BadChar' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/IPV6BadChar.php', - 'Egulias\\EmailValidator\\Warning\\IPV6ColonEnd' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/IPV6ColonEnd.php', - 'Egulias\\EmailValidator\\Warning\\IPV6ColonStart' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/IPV6ColonStart.php', - 'Egulias\\EmailValidator\\Warning\\IPV6Deprecated' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/IPV6Deprecated.php', - 'Egulias\\EmailValidator\\Warning\\IPV6DoubleColon' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/IPV6DoubleColon.php', - 'Egulias\\EmailValidator\\Warning\\IPV6GroupCount' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/IPV6GroupCount.php', - 'Egulias\\EmailValidator\\Warning\\IPV6MaxGroups' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/IPV6MaxGroups.php', - 'Egulias\\EmailValidator\\Warning\\LocalTooLong' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/LocalTooLong.php', - 'Egulias\\EmailValidator\\Warning\\NoDNSMXRecord' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/NoDNSMXRecord.php', - 'Egulias\\EmailValidator\\Warning\\ObsoleteDTEXT' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/ObsoleteDTEXT.php', - 'Egulias\\EmailValidator\\Warning\\QuotedPart' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/QuotedPart.php', - 'Egulias\\EmailValidator\\Warning\\QuotedString' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/QuotedString.php', - 'Egulias\\EmailValidator\\Warning\\TLD' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/TLD.php', - 'Egulias\\EmailValidator\\Warning\\Warning' => __DIR__ . '/..' . '/egulias/email-validator/src/Warning/Warning.php', 'Filter\\FilterException' => __DIR__ . '/..' . '/symfony/polyfill-php85/Resources/stubs/Filter/FilterException.php', 'Filter\\FilterFailedException' => __DIR__ . '/..' . '/symfony/polyfill-php85/Resources/stubs/Filter/FilterFailedException.php', - 'GuzzleHttp\\Psr7\\AppendStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/AppendStream.php', - 'GuzzleHttp\\Psr7\\BufferStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/BufferStream.php', - 'GuzzleHttp\\Psr7\\CachingStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/CachingStream.php', - 'GuzzleHttp\\Psr7\\DroppingStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/DroppingStream.php', - 'GuzzleHttp\\Psr7\\Exception\\MalformedUriException' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Exception/MalformedUriException.php', - 'GuzzleHttp\\Psr7\\FnStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/FnStream.php', - 'GuzzleHttp\\Psr7\\Header' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Header.php', - 'GuzzleHttp\\Psr7\\HttpFactory' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/HttpFactory.php', - 'GuzzleHttp\\Psr7\\InflateStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/InflateStream.php', - 'GuzzleHttp\\Psr7\\LazyOpenStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/LazyOpenStream.php', - 'GuzzleHttp\\Psr7\\LimitStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/LimitStream.php', - 'GuzzleHttp\\Psr7\\Message' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Message.php', - 'GuzzleHttp\\Psr7\\MessageTrait' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/MessageTrait.php', - 'GuzzleHttp\\Psr7\\MimeType' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/MimeType.php', - 'GuzzleHttp\\Psr7\\MultipartStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/MultipartStream.php', - 'GuzzleHttp\\Psr7\\NoSeekStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/NoSeekStream.php', - 'GuzzleHttp\\Psr7\\PumpStream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/PumpStream.php', - 'GuzzleHttp\\Psr7\\Query' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Query.php', - 'GuzzleHttp\\Psr7\\Request' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Request.php', - 'GuzzleHttp\\Psr7\\Response' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Response.php', - 'GuzzleHttp\\Psr7\\Rfc3986' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Rfc3986.php', - 'GuzzleHttp\\Psr7\\Rfc7230' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Rfc7230.php', - 'GuzzleHttp\\Psr7\\ServerRequest' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/ServerRequest.php', - 'GuzzleHttp\\Psr7\\Stream' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Stream.php', - 'GuzzleHttp\\Psr7\\StreamDecoratorTrait' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/StreamDecoratorTrait.php', - 'GuzzleHttp\\Psr7\\StreamWrapper' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/StreamWrapper.php', - 'GuzzleHttp\\Psr7\\UploadedFile' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UploadedFile.php', - 'GuzzleHttp\\Psr7\\Uri' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Uri.php', - 'GuzzleHttp\\Psr7\\UriComparator' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UriComparator.php', - 'GuzzleHttp\\Psr7\\UriNormalizer' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UriNormalizer.php', - 'GuzzleHttp\\Psr7\\UriResolver' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UriResolver.php', - 'GuzzleHttp\\Psr7\\Utils' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Utils.php', - 'Illuminate\\Contracts\\Auth\\Access\\Authorizable' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Access/Authorizable.php', - 'Illuminate\\Contracts\\Auth\\Access\\Gate' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Access/Gate.php', - 'Illuminate\\Contracts\\Auth\\Authenticatable' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Authenticatable.php', - 'Illuminate\\Contracts\\Auth\\CanResetPassword' => __DIR__ . '/..' . '/illuminate/contracts/Auth/CanResetPassword.php', - 'Illuminate\\Contracts\\Auth\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Factory.php', - 'Illuminate\\Contracts\\Auth\\Guard' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Guard.php', - 'Illuminate\\Contracts\\Auth\\Middleware\\AuthenticatesRequests' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Middleware/AuthenticatesRequests.php', - 'Illuminate\\Contracts\\Auth\\MustVerifyEmail' => __DIR__ . '/..' . '/illuminate/contracts/Auth/MustVerifyEmail.php', - 'Illuminate\\Contracts\\Auth\\PasswordBroker' => __DIR__ . '/..' . '/illuminate/contracts/Auth/PasswordBroker.php', - 'Illuminate\\Contracts\\Auth\\PasswordBrokerFactory' => __DIR__ . '/..' . '/illuminate/contracts/Auth/PasswordBrokerFactory.php', - 'Illuminate\\Contracts\\Auth\\StatefulGuard' => __DIR__ . '/..' . '/illuminate/contracts/Auth/StatefulGuard.php', - 'Illuminate\\Contracts\\Auth\\SupportsBasicAuth' => __DIR__ . '/..' . '/illuminate/contracts/Auth/SupportsBasicAuth.php', - 'Illuminate\\Contracts\\Auth\\UserProvider' => __DIR__ . '/..' . '/illuminate/contracts/Auth/UserProvider.php', - 'Illuminate\\Contracts\\Broadcasting\\Broadcaster' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/Broadcaster.php', - 'Illuminate\\Contracts\\Broadcasting\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/Factory.php', - 'Illuminate\\Contracts\\Broadcasting\\HasBroadcastChannel' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/HasBroadcastChannel.php', - 'Illuminate\\Contracts\\Broadcasting\\ShouldBeUnique' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/ShouldBeUnique.php', - 'Illuminate\\Contracts\\Broadcasting\\ShouldBroadcast' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/ShouldBroadcast.php', - 'Illuminate\\Contracts\\Broadcasting\\ShouldBroadcastNow' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/ShouldBroadcastNow.php', - 'Illuminate\\Contracts\\Broadcasting\\ShouldRescue' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/ShouldRescue.php', - 'Illuminate\\Contracts\\Bus\\Dispatcher' => __DIR__ . '/..' . '/illuminate/contracts/Bus/Dispatcher.php', - 'Illuminate\\Contracts\\Bus\\QueueingDispatcher' => __DIR__ . '/..' . '/illuminate/contracts/Bus/QueueingDispatcher.php', - 'Illuminate\\Contracts\\Cache\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Cache/Factory.php', - 'Illuminate\\Contracts\\Cache\\Lock' => __DIR__ . '/..' . '/illuminate/contracts/Cache/Lock.php', - 'Illuminate\\Contracts\\Cache\\LockProvider' => __DIR__ . '/..' . '/illuminate/contracts/Cache/LockProvider.php', - 'Illuminate\\Contracts\\Cache\\LockTimeoutException' => __DIR__ . '/..' . '/illuminate/contracts/Cache/LockTimeoutException.php', - 'Illuminate\\Contracts\\Cache\\Repository' => __DIR__ . '/..' . '/illuminate/contracts/Cache/Repository.php', - 'Illuminate\\Contracts\\Cache\\Store' => __DIR__ . '/..' . '/illuminate/contracts/Cache/Store.php', - 'Illuminate\\Contracts\\Concurrency\\Driver' => __DIR__ . '/..' . '/illuminate/contracts/Concurrency/Driver.php', - 'Illuminate\\Contracts\\Config\\Repository' => __DIR__ . '/..' . '/illuminate/contracts/Config/Repository.php', - 'Illuminate\\Contracts\\Console\\Application' => __DIR__ . '/..' . '/illuminate/contracts/Console/Application.php', - 'Illuminate\\Contracts\\Console\\Isolatable' => __DIR__ . '/..' . '/illuminate/contracts/Console/Isolatable.php', - 'Illuminate\\Contracts\\Console\\Kernel' => __DIR__ . '/..' . '/illuminate/contracts/Console/Kernel.php', - 'Illuminate\\Contracts\\Console\\PromptsForMissingInput' => __DIR__ . '/..' . '/illuminate/contracts/Console/PromptsForMissingInput.php', - 'Illuminate\\Contracts\\Container\\BindingResolutionException' => __DIR__ . '/..' . '/illuminate/contracts/Container/BindingResolutionException.php', - 'Illuminate\\Contracts\\Container\\CircularDependencyException' => __DIR__ . '/..' . '/illuminate/contracts/Container/CircularDependencyException.php', - 'Illuminate\\Contracts\\Container\\Container' => __DIR__ . '/..' . '/illuminate/contracts/Container/Container.php', - 'Illuminate\\Contracts\\Container\\ContextualAttribute' => __DIR__ . '/..' . '/illuminate/contracts/Container/ContextualAttribute.php', - 'Illuminate\\Contracts\\Container\\ContextualBindingBuilder' => __DIR__ . '/..' . '/illuminate/contracts/Container/ContextualBindingBuilder.php', - 'Illuminate\\Contracts\\Container\\SelfBuilding' => __DIR__ . '/..' . '/illuminate/contracts/Container/SelfBuilding.php', - 'Illuminate\\Contracts\\Cookie\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Cookie/Factory.php', - 'Illuminate\\Contracts\\Cookie\\QueueingFactory' => __DIR__ . '/..' . '/illuminate/contracts/Cookie/QueueingFactory.php', - 'Illuminate\\Contracts\\Database\\ConcurrencyErrorDetector' => __DIR__ . '/..' . '/illuminate/contracts/Database/ConcurrencyErrorDetector.php', - 'Illuminate\\Contracts\\Database\\Eloquent\\Builder' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/Builder.php', - 'Illuminate\\Contracts\\Database\\Eloquent\\Castable' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/Castable.php', - 'Illuminate\\Contracts\\Database\\Eloquent\\CastsAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/CastsAttributes.php', - 'Illuminate\\Contracts\\Database\\Eloquent\\CastsInboundAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php', - 'Illuminate\\Contracts\\Database\\Eloquent\\ComparesCastableAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/ComparesCastableAttributes.php', - 'Illuminate\\Contracts\\Database\\Eloquent\\DeviatesCastableAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/DeviatesCastableAttributes.php', - 'Illuminate\\Contracts\\Database\\Eloquent\\SerializesCastableAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/SerializesCastableAttributes.php', - 'Illuminate\\Contracts\\Database\\Eloquent\\SupportsPartialRelations' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/SupportsPartialRelations.php', - 'Illuminate\\Contracts\\Database\\Events\\MigrationEvent' => __DIR__ . '/..' . '/illuminate/contracts/Database/Events/MigrationEvent.php', - 'Illuminate\\Contracts\\Database\\LostConnectionDetector' => __DIR__ . '/..' . '/illuminate/contracts/Database/LostConnectionDetector.php', - 'Illuminate\\Contracts\\Database\\ModelIdentifier' => __DIR__ . '/..' . '/illuminate/contracts/Database/ModelIdentifier.php', - 'Illuminate\\Contracts\\Database\\Query\\Builder' => __DIR__ . '/..' . '/illuminate/contracts/Database/Query/Builder.php', - 'Illuminate\\Contracts\\Database\\Query\\ConditionExpression' => __DIR__ . '/..' . '/illuminate/contracts/Database/Query/ConditionExpression.php', - 'Illuminate\\Contracts\\Database\\Query\\Expression' => __DIR__ . '/..' . '/illuminate/contracts/Database/Query/Expression.php', - 'Illuminate\\Contracts\\Debug\\ExceptionHandler' => __DIR__ . '/..' . '/illuminate/contracts/Debug/ExceptionHandler.php', - 'Illuminate\\Contracts\\Debug\\ShouldntReport' => __DIR__ . '/..' . '/illuminate/contracts/Debug/ShouldntReport.php', - 'Illuminate\\Contracts\\Encryption\\DecryptException' => __DIR__ . '/..' . '/illuminate/contracts/Encryption/DecryptException.php', - 'Illuminate\\Contracts\\Encryption\\EncryptException' => __DIR__ . '/..' . '/illuminate/contracts/Encryption/EncryptException.php', - 'Illuminate\\Contracts\\Encryption\\Encrypter' => __DIR__ . '/..' . '/illuminate/contracts/Encryption/Encrypter.php', - 'Illuminate\\Contracts\\Encryption\\StringEncrypter' => __DIR__ . '/..' . '/illuminate/contracts/Encryption/StringEncrypter.php', - 'Illuminate\\Contracts\\Events\\Dispatcher' => __DIR__ . '/..' . '/illuminate/contracts/Events/Dispatcher.php', - 'Illuminate\\Contracts\\Events\\ShouldDispatchAfterCommit' => __DIR__ . '/..' . '/illuminate/contracts/Events/ShouldDispatchAfterCommit.php', - 'Illuminate\\Contracts\\Events\\ShouldHandleEventsAfterCommit' => __DIR__ . '/..' . '/illuminate/contracts/Events/ShouldHandleEventsAfterCommit.php', - 'Illuminate\\Contracts\\Filesystem\\Cloud' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/Cloud.php', - 'Illuminate\\Contracts\\Filesystem\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/Factory.php', - 'Illuminate\\Contracts\\Filesystem\\FileNotFoundException' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/FileNotFoundException.php', - 'Illuminate\\Contracts\\Filesystem\\Filesystem' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/Filesystem.php', - 'Illuminate\\Contracts\\Filesystem\\LockTimeoutException' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/LockTimeoutException.php', - 'Illuminate\\Contracts\\Foundation\\Application' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/Application.php', - 'Illuminate\\Contracts\\Foundation\\CachesConfiguration' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/CachesConfiguration.php', - 'Illuminate\\Contracts\\Foundation\\CachesRoutes' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/CachesRoutes.php', - 'Illuminate\\Contracts\\Foundation\\ExceptionRenderer' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/ExceptionRenderer.php', - 'Illuminate\\Contracts\\Foundation\\MaintenanceMode' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/MaintenanceMode.php', - 'Illuminate\\Contracts\\Hashing\\Hasher' => __DIR__ . '/..' . '/illuminate/contracts/Hashing/Hasher.php', - 'Illuminate\\Contracts\\Http\\Kernel' => __DIR__ . '/..' . '/illuminate/contracts/Http/Kernel.php', - 'Illuminate\\Contracts\\JsonSchema\\JsonSchema' => __DIR__ . '/..' . '/illuminate/contracts/JsonSchema/JsonSchema.php', - 'Illuminate\\Contracts\\Log\\ContextLogProcessor' => __DIR__ . '/..' . '/illuminate/contracts/Log/ContextLogProcessor.php', - 'Illuminate\\Contracts\\Mail\\Attachable' => __DIR__ . '/..' . '/illuminate/contracts/Mail/Attachable.php', - 'Illuminate\\Contracts\\Mail\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Mail/Factory.php', - 'Illuminate\\Contracts\\Mail\\MailQueue' => __DIR__ . '/..' . '/illuminate/contracts/Mail/MailQueue.php', - 'Illuminate\\Contracts\\Mail\\Mailable' => __DIR__ . '/..' . '/illuminate/contracts/Mail/Mailable.php', - 'Illuminate\\Contracts\\Mail\\Mailer' => __DIR__ . '/..' . '/illuminate/contracts/Mail/Mailer.php', - 'Illuminate\\Contracts\\Notifications\\Dispatcher' => __DIR__ . '/..' . '/illuminate/contracts/Notifications/Dispatcher.php', - 'Illuminate\\Contracts\\Notifications\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Notifications/Factory.php', - 'Illuminate\\Contracts\\Pagination\\CursorPaginator' => __DIR__ . '/..' . '/illuminate/contracts/Pagination/CursorPaginator.php', - 'Illuminate\\Contracts\\Pagination\\LengthAwarePaginator' => __DIR__ . '/..' . '/illuminate/contracts/Pagination/LengthAwarePaginator.php', - 'Illuminate\\Contracts\\Pagination\\Paginator' => __DIR__ . '/..' . '/illuminate/contracts/Pagination/Paginator.php', - 'Illuminate\\Contracts\\Pipeline\\Hub' => __DIR__ . '/..' . '/illuminate/contracts/Pipeline/Hub.php', - 'Illuminate\\Contracts\\Pipeline\\Pipeline' => __DIR__ . '/..' . '/illuminate/contracts/Pipeline/Pipeline.php', - 'Illuminate\\Contracts\\Process\\InvokedProcess' => __DIR__ . '/..' . '/illuminate/contracts/Process/InvokedProcess.php', - 'Illuminate\\Contracts\\Process\\ProcessResult' => __DIR__ . '/..' . '/illuminate/contracts/Process/ProcessResult.php', - 'Illuminate\\Contracts\\Queue\\ClearableQueue' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ClearableQueue.php', - 'Illuminate\\Contracts\\Queue\\EntityNotFoundException' => __DIR__ . '/..' . '/illuminate/contracts/Queue/EntityNotFoundException.php', - 'Illuminate\\Contracts\\Queue\\EntityResolver' => __DIR__ . '/..' . '/illuminate/contracts/Queue/EntityResolver.php', - 'Illuminate\\Contracts\\Queue\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Queue/Factory.php', - 'Illuminate\\Contracts\\Queue\\Job' => __DIR__ . '/..' . '/illuminate/contracts/Queue/Job.php', - 'Illuminate\\Contracts\\Queue\\Monitor' => __DIR__ . '/..' . '/illuminate/contracts/Queue/Monitor.php', - 'Illuminate\\Contracts\\Queue\\Queue' => __DIR__ . '/..' . '/illuminate/contracts/Queue/Queue.php', - 'Illuminate\\Contracts\\Queue\\QueueableCollection' => __DIR__ . '/..' . '/illuminate/contracts/Queue/QueueableCollection.php', - 'Illuminate\\Contracts\\Queue\\QueueableEntity' => __DIR__ . '/..' . '/illuminate/contracts/Queue/QueueableEntity.php', - 'Illuminate\\Contracts\\Queue\\ShouldBeEncrypted' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldBeEncrypted.php', - 'Illuminate\\Contracts\\Queue\\ShouldBeUnique' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldBeUnique.php', - 'Illuminate\\Contracts\\Queue\\ShouldBeUniqueUntilProcessing' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldBeUniqueUntilProcessing.php', - 'Illuminate\\Contracts\\Queue\\ShouldQueue' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldQueue.php', - 'Illuminate\\Contracts\\Queue\\ShouldQueueAfterCommit' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldQueueAfterCommit.php', - 'Illuminate\\Contracts\\Redis\\Connection' => __DIR__ . '/..' . '/illuminate/contracts/Redis/Connection.php', - 'Illuminate\\Contracts\\Redis\\Connector' => __DIR__ . '/..' . '/illuminate/contracts/Redis/Connector.php', - 'Illuminate\\Contracts\\Redis\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Redis/Factory.php', - 'Illuminate\\Contracts\\Redis\\LimiterTimeoutException' => __DIR__ . '/..' . '/illuminate/contracts/Redis/LimiterTimeoutException.php', - 'Illuminate\\Contracts\\Routing\\BindingRegistrar' => __DIR__ . '/..' . '/illuminate/contracts/Routing/BindingRegistrar.php', - 'Illuminate\\Contracts\\Routing\\Registrar' => __DIR__ . '/..' . '/illuminate/contracts/Routing/Registrar.php', - 'Illuminate\\Contracts\\Routing\\ResponseFactory' => __DIR__ . '/..' . '/illuminate/contracts/Routing/ResponseFactory.php', - 'Illuminate\\Contracts\\Routing\\UrlGenerator' => __DIR__ . '/..' . '/illuminate/contracts/Routing/UrlGenerator.php', - 'Illuminate\\Contracts\\Routing\\UrlRoutable' => __DIR__ . '/..' . '/illuminate/contracts/Routing/UrlRoutable.php', - 'Illuminate\\Contracts\\Session\\Middleware\\AuthenticatesSessions' => __DIR__ . '/..' . '/illuminate/contracts/Session/Middleware/AuthenticatesSessions.php', - 'Illuminate\\Contracts\\Session\\Session' => __DIR__ . '/..' . '/illuminate/contracts/Session/Session.php', - 'Illuminate\\Contracts\\Support\\Arrayable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Arrayable.php', - 'Illuminate\\Contracts\\Support\\CanBeEscapedWhenCastToString' => __DIR__ . '/..' . '/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php', - 'Illuminate\\Contracts\\Support\\DeferrableProvider' => __DIR__ . '/..' . '/illuminate/contracts/Support/DeferrableProvider.php', - 'Illuminate\\Contracts\\Support\\DeferringDisplayableValue' => __DIR__ . '/..' . '/illuminate/contracts/Support/DeferringDisplayableValue.php', - 'Illuminate\\Contracts\\Support\\HasOnceHash' => __DIR__ . '/..' . '/illuminate/contracts/Support/HasOnceHash.php', - 'Illuminate\\Contracts\\Support\\Htmlable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Htmlable.php', - 'Illuminate\\Contracts\\Support\\Jsonable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Jsonable.php', - 'Illuminate\\Contracts\\Support\\MessageBag' => __DIR__ . '/..' . '/illuminate/contracts/Support/MessageBag.php', - 'Illuminate\\Contracts\\Support\\MessageProvider' => __DIR__ . '/..' . '/illuminate/contracts/Support/MessageProvider.php', - 'Illuminate\\Contracts\\Support\\Renderable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Renderable.php', - 'Illuminate\\Contracts\\Support\\Responsable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Responsable.php', - 'Illuminate\\Contracts\\Support\\ValidatedData' => __DIR__ . '/..' . '/illuminate/contracts/Support/ValidatedData.php', - 'Illuminate\\Contracts\\Translation\\HasLocalePreference' => __DIR__ . '/..' . '/illuminate/contracts/Translation/HasLocalePreference.php', - 'Illuminate\\Contracts\\Translation\\Loader' => __DIR__ . '/..' . '/illuminate/contracts/Translation/Loader.php', - 'Illuminate\\Contracts\\Translation\\Translator' => __DIR__ . '/..' . '/illuminate/contracts/Translation/Translator.php', - 'Illuminate\\Contracts\\Validation\\CompilableRules' => __DIR__ . '/..' . '/illuminate/contracts/Validation/CompilableRules.php', - 'Illuminate\\Contracts\\Validation\\DataAwareRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/DataAwareRule.php', - 'Illuminate\\Contracts\\Validation\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Validation/Factory.php', - 'Illuminate\\Contracts\\Validation\\ImplicitRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/ImplicitRule.php', - 'Illuminate\\Contracts\\Validation\\InvokableRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/InvokableRule.php', - 'Illuminate\\Contracts\\Validation\\Rule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/Rule.php', - 'Illuminate\\Contracts\\Validation\\UncompromisedVerifier' => __DIR__ . '/..' . '/illuminate/contracts/Validation/UncompromisedVerifier.php', - 'Illuminate\\Contracts\\Validation\\ValidatesWhenResolved' => __DIR__ . '/..' . '/illuminate/contracts/Validation/ValidatesWhenResolved.php', - 'Illuminate\\Contracts\\Validation\\ValidationRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/ValidationRule.php', - 'Illuminate\\Contracts\\Validation\\Validator' => __DIR__ . '/..' . '/illuminate/contracts/Validation/Validator.php', - 'Illuminate\\Contracts\\Validation\\ValidatorAwareRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/ValidatorAwareRule.php', - 'Illuminate\\Contracts\\View\\Engine' => __DIR__ . '/..' . '/illuminate/contracts/View/Engine.php', - 'Illuminate\\Contracts\\View\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/View/Factory.php', - 'Illuminate\\Contracts\\View\\View' => __DIR__ . '/..' . '/illuminate/contracts/View/View.php', - 'Illuminate\\Contracts\\View\\ViewCompilationException' => __DIR__ . '/..' . '/illuminate/contracts/View/ViewCompilationException.php', - 'Illuminate\\Support\\Arr' => __DIR__ . '/..' . '/illuminate/collections/Arr.php', - 'Illuminate\\Support\\Collection' => __DIR__ . '/..' . '/illuminate/collections/Collection.php', - 'Illuminate\\Support\\Enumerable' => __DIR__ . '/..' . '/illuminate/collections/Enumerable.php', - 'Illuminate\\Support\\HigherOrderCollectionProxy' => __DIR__ . '/..' . '/illuminate/collections/HigherOrderCollectionProxy.php', - 'Illuminate\\Support\\HigherOrderWhenProxy' => __DIR__ . '/..' . '/illuminate/conditionable/HigherOrderWhenProxy.php', - 'Illuminate\\Support\\ItemNotFoundException' => __DIR__ . '/..' . '/illuminate/collections/ItemNotFoundException.php', - 'Illuminate\\Support\\LazyCollection' => __DIR__ . '/..' . '/illuminate/collections/LazyCollection.php', - 'Illuminate\\Support\\MultipleItemsFoundException' => __DIR__ . '/..' . '/illuminate/collections/MultipleItemsFoundException.php', - 'Illuminate\\Support\\Traits\\Conditionable' => __DIR__ . '/..' . '/illuminate/conditionable/Traits/Conditionable.php', - 'Illuminate\\Support\\Traits\\EnumeratesValues' => __DIR__ . '/..' . '/illuminate/collections/Traits/EnumeratesValues.php', - 'Illuminate\\Support\\Traits\\Macroable' => __DIR__ . '/..' . '/illuminate/macroable/Traits/Macroable.php', - 'Illuminate\\Support\\Traits\\TransformsToResourceCollection' => __DIR__ . '/..' . '/illuminate/collections/Traits/TransformsToResourceCollection.php', - 'Invoker\\CallableResolver' => __DIR__ . '/..' . '/php-di/invoker/src/CallableResolver.php', - 'Invoker\\Exception\\InvocationException' => __DIR__ . '/..' . '/php-di/invoker/src/Exception/InvocationException.php', - 'Invoker\\Exception\\NotCallableException' => __DIR__ . '/..' . '/php-di/invoker/src/Exception/NotCallableException.php', - 'Invoker\\Exception\\NotEnoughParametersException' => __DIR__ . '/..' . '/php-di/invoker/src/Exception/NotEnoughParametersException.php', - 'Invoker\\Invoker' => __DIR__ . '/..' . '/php-di/invoker/src/Invoker.php', - 'Invoker\\InvokerInterface' => __DIR__ . '/..' . '/php-di/invoker/src/InvokerInterface.php', - 'Invoker\\ParameterResolver\\AssociativeArrayResolver' => __DIR__ . '/..' . '/php-di/invoker/src/ParameterResolver/AssociativeArrayResolver.php', - 'Invoker\\ParameterResolver\\Container\\ParameterNameContainerResolver' => __DIR__ . '/..' . '/php-di/invoker/src/ParameterResolver/Container/ParameterNameContainerResolver.php', - 'Invoker\\ParameterResolver\\Container\\TypeHintContainerResolver' => __DIR__ . '/..' . '/php-di/invoker/src/ParameterResolver/Container/TypeHintContainerResolver.php', - 'Invoker\\ParameterResolver\\DefaultValueResolver' => __DIR__ . '/..' . '/php-di/invoker/src/ParameterResolver/DefaultValueResolver.php', - 'Invoker\\ParameterResolver\\NumericArrayResolver' => __DIR__ . '/..' . '/php-di/invoker/src/ParameterResolver/NumericArrayResolver.php', - 'Invoker\\ParameterResolver\\ParameterResolver' => __DIR__ . '/..' . '/php-di/invoker/src/ParameterResolver/ParameterResolver.php', - 'Invoker\\ParameterResolver\\ResolverChain' => __DIR__ . '/..' . '/php-di/invoker/src/ParameterResolver/ResolverChain.php', - 'Invoker\\ParameterResolver\\TypeHintResolver' => __DIR__ . '/..' . '/php-di/invoker/src/ParameterResolver/TypeHintResolver.php', - 'Invoker\\Reflection\\CallableReflection' => __DIR__ . '/..' . '/php-di/invoker/src/Reflection/CallableReflection.php', - 'Laravel\\SerializableClosure\\Contracts\\Serializable' => __DIR__ . '/..' . '/laravel/serializable-closure/src/Contracts/Serializable.php', - 'Laravel\\SerializableClosure\\Contracts\\Signer' => __DIR__ . '/..' . '/laravel/serializable-closure/src/Contracts/Signer.php', - 'Laravel\\SerializableClosure\\Exceptions\\InvalidSignatureException' => __DIR__ . '/..' . '/laravel/serializable-closure/src/Exceptions/InvalidSignatureException.php', - 'Laravel\\SerializableClosure\\Exceptions\\MissingSecretKeyException' => __DIR__ . '/..' . '/laravel/serializable-closure/src/Exceptions/MissingSecretKeyException.php', - 'Laravel\\SerializableClosure\\SerializableClosure' => __DIR__ . '/..' . '/laravel/serializable-closure/src/SerializableClosure.php', - 'Laravel\\SerializableClosure\\Serializers\\Native' => __DIR__ . '/..' . '/laravel/serializable-closure/src/Serializers/Native.php', - 'Laravel\\SerializableClosure\\Serializers\\Signed' => __DIR__ . '/..' . '/laravel/serializable-closure/src/Serializers/Signed.php', - 'Laravel\\SerializableClosure\\Signers\\Hmac' => __DIR__ . '/..' . '/laravel/serializable-closure/src/Signers/Hmac.php', - 'Laravel\\SerializableClosure\\Support\\ClosureScope' => __DIR__ . '/..' . '/laravel/serializable-closure/src/Support/ClosureScope.php', - 'Laravel\\SerializableClosure\\Support\\ClosureStream' => __DIR__ . '/..' . '/laravel/serializable-closure/src/Support/ClosureStream.php', - 'Laravel\\SerializableClosure\\Support\\ReflectionClosure' => __DIR__ . '/..' . '/laravel/serializable-closure/src/Support/ReflectionClosure.php', - 'Laravel\\SerializableClosure\\Support\\SelfReference' => __DIR__ . '/..' . '/laravel/serializable-closure/src/Support/SelfReference.php', - 'Laravel\\SerializableClosure\\UnsignedSerializableClosure' => __DIR__ . '/..' . '/laravel/serializable-closure/src/UnsignedSerializableClosure.php', 'NoDiscard' => __DIR__ . '/..' . '/symfony/polyfill-php85/Resources/stubs/NoDiscard.php', 'Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', 'Override' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/Override.php', @@ -801,358 +241,12 @@ class ComposerStaticInitbadf1d01c367c06fb591106ea3486c30 'Pdo\\Pgsql' => __DIR__ . '/..' . '/symfony/polyfill-php84/Resources/stubs/Pdo/Pgsql.php', 'Pdo\\Sqlite' => __DIR__ . '/..' . '/symfony/polyfill-php84/Resources/stubs/Pdo/Sqlite.php', 'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php', - 'Psr\\Clock\\ClockInterface' => __DIR__ . '/..' . '/psr/clock/src/ClockInterface.php', - 'Psr\\Container\\ContainerExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerExceptionInterface.php', - 'Psr\\Container\\ContainerInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerInterface.php', - 'Psr\\Container\\NotFoundExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/NotFoundExceptionInterface.php', - 'Psr\\Http\\Message\\MessageInterface' => __DIR__ . '/..' . '/psr/http-message/src/MessageInterface.php', - 'Psr\\Http\\Message\\RequestFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/RequestFactoryInterface.php', - 'Psr\\Http\\Message\\RequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/RequestInterface.php', - 'Psr\\Http\\Message\\ResponseFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/ResponseFactoryInterface.php', - 'Psr\\Http\\Message\\ResponseInterface' => __DIR__ . '/..' . '/psr/http-message/src/ResponseInterface.php', - 'Psr\\Http\\Message\\ServerRequestFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/ServerRequestFactoryInterface.php', - 'Psr\\Http\\Message\\ServerRequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/ServerRequestInterface.php', - 'Psr\\Http\\Message\\StreamFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/StreamFactoryInterface.php', - 'Psr\\Http\\Message\\StreamInterface' => __DIR__ . '/..' . '/psr/http-message/src/StreamInterface.php', - 'Psr\\Http\\Message\\UploadedFileFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/UploadedFileFactoryInterface.php', - 'Psr\\Http\\Message\\UploadedFileInterface' => __DIR__ . '/..' . '/psr/http-message/src/UploadedFileInterface.php', - 'Psr\\Http\\Message\\UriFactoryInterface' => __DIR__ . '/..' . '/psr/http-factory/src/UriFactoryInterface.php', - 'Psr\\Http\\Message\\UriInterface' => __DIR__ . '/..' . '/psr/http-message/src/UriInterface.php', - 'Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/src/AbstractLogger.php', - 'Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/src/InvalidArgumentException.php', - 'Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/src/LogLevel.php', - 'Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/src/LoggerAwareInterface.php', - 'Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/src/LoggerAwareTrait.php', - 'Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/src/LoggerInterface.php', - 'Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/src/LoggerTrait.php', - 'Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/src/NullLogger.php', - 'Psr\\SimpleCache\\CacheException' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheException.php', - 'Psr\\SimpleCache\\CacheInterface' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheInterface.php', - 'Psr\\SimpleCache\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/simple-cache/src/InvalidArgumentException.php', 'ReflectionConstant' => __DIR__ . '/..' . '/symfony/polyfill-php84/Resources/stubs/ReflectionConstant.php', 'RoundingMode' => __DIR__ . '/..' . '/symfony/polyfill-php84/Resources/stubs/RoundingMode.php', 'SQLite3Exception' => __DIR__ . '/..' . '/symfony/polyfill-php83/Resources/stubs/SQLite3Exception.php', 'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php', - 'Symfony\\Component\\Clock\\Clock' => __DIR__ . '/..' . '/symfony/clock/Clock.php', - 'Symfony\\Component\\Clock\\ClockAwareTrait' => __DIR__ . '/..' . '/symfony/clock/ClockAwareTrait.php', - 'Symfony\\Component\\Clock\\ClockInterface' => __DIR__ . '/..' . '/symfony/clock/ClockInterface.php', - 'Symfony\\Component\\Clock\\DatePoint' => __DIR__ . '/..' . '/symfony/clock/DatePoint.php', - 'Symfony\\Component\\Clock\\MockClock' => __DIR__ . '/..' . '/symfony/clock/MockClock.php', - 'Symfony\\Component\\Clock\\MonotonicClock' => __DIR__ . '/..' . '/symfony/clock/MonotonicClock.php', - 'Symfony\\Component\\Clock\\NativeClock' => __DIR__ . '/..' . '/symfony/clock/NativeClock.php', - 'Symfony\\Component\\Clock\\Test\\ClockSensitiveTrait' => __DIR__ . '/..' . '/symfony/clock/Test/ClockSensitiveTrait.php', - 'Symfony\\Component\\Mime\\Address' => __DIR__ . '/..' . '/symfony/mime/Address.php', - 'Symfony\\Component\\Mime\\BodyRendererInterface' => __DIR__ . '/..' . '/symfony/mime/BodyRendererInterface.php', - 'Symfony\\Component\\Mime\\CharacterStream' => __DIR__ . '/..' . '/symfony/mime/CharacterStream.php', - 'Symfony\\Component\\Mime\\Crypto\\DkimOptions' => __DIR__ . '/..' . '/symfony/mime/Crypto/DkimOptions.php', - 'Symfony\\Component\\Mime\\Crypto\\DkimSigner' => __DIR__ . '/..' . '/symfony/mime/Crypto/DkimSigner.php', - 'Symfony\\Component\\Mime\\Crypto\\SMime' => __DIR__ . '/..' . '/symfony/mime/Crypto/SMime.php', - 'Symfony\\Component\\Mime\\Crypto\\SMimeEncrypter' => __DIR__ . '/..' . '/symfony/mime/Crypto/SMimeEncrypter.php', - 'Symfony\\Component\\Mime\\Crypto\\SMimeSigner' => __DIR__ . '/..' . '/symfony/mime/Crypto/SMimeSigner.php', - 'Symfony\\Component\\Mime\\DependencyInjection\\AddMimeTypeGuesserPass' => __DIR__ . '/..' . '/symfony/mime/DependencyInjection/AddMimeTypeGuesserPass.php', - 'Symfony\\Component\\Mime\\DraftEmail' => __DIR__ . '/..' . '/symfony/mime/DraftEmail.php', - 'Symfony\\Component\\Mime\\Email' => __DIR__ . '/..' . '/symfony/mime/Email.php', - 'Symfony\\Component\\Mime\\Encoder\\AddressEncoderInterface' => __DIR__ . '/..' . '/symfony/mime/Encoder/AddressEncoderInterface.php', - 'Symfony\\Component\\Mime\\Encoder\\Base64ContentEncoder' => __DIR__ . '/..' . '/symfony/mime/Encoder/Base64ContentEncoder.php', - 'Symfony\\Component\\Mime\\Encoder\\Base64Encoder' => __DIR__ . '/..' . '/symfony/mime/Encoder/Base64Encoder.php', - 'Symfony\\Component\\Mime\\Encoder\\Base64MimeHeaderEncoder' => __DIR__ . '/..' . '/symfony/mime/Encoder/Base64MimeHeaderEncoder.php', - 'Symfony\\Component\\Mime\\Encoder\\ContentEncoderInterface' => __DIR__ . '/..' . '/symfony/mime/Encoder/ContentEncoderInterface.php', - 'Symfony\\Component\\Mime\\Encoder\\EightBitContentEncoder' => __DIR__ . '/..' . '/symfony/mime/Encoder/EightBitContentEncoder.php', - 'Symfony\\Component\\Mime\\Encoder\\EncoderInterface' => __DIR__ . '/..' . '/symfony/mime/Encoder/EncoderInterface.php', - 'Symfony\\Component\\Mime\\Encoder\\IdnAddressEncoder' => __DIR__ . '/..' . '/symfony/mime/Encoder/IdnAddressEncoder.php', - 'Symfony\\Component\\Mime\\Encoder\\MimeHeaderEncoderInterface' => __DIR__ . '/..' . '/symfony/mime/Encoder/MimeHeaderEncoderInterface.php', - 'Symfony\\Component\\Mime\\Encoder\\QpContentEncoder' => __DIR__ . '/..' . '/symfony/mime/Encoder/QpContentEncoder.php', - 'Symfony\\Component\\Mime\\Encoder\\QpEncoder' => __DIR__ . '/..' . '/symfony/mime/Encoder/QpEncoder.php', - 'Symfony\\Component\\Mime\\Encoder\\QpMimeHeaderEncoder' => __DIR__ . '/..' . '/symfony/mime/Encoder/QpMimeHeaderEncoder.php', - 'Symfony\\Component\\Mime\\Encoder\\Rfc2231Encoder' => __DIR__ . '/..' . '/symfony/mime/Encoder/Rfc2231Encoder.php', - 'Symfony\\Component\\Mime\\Exception\\AddressEncoderException' => __DIR__ . '/..' . '/symfony/mime/Exception/AddressEncoderException.php', - 'Symfony\\Component\\Mime\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/mime/Exception/ExceptionInterface.php', - 'Symfony\\Component\\Mime\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/mime/Exception/InvalidArgumentException.php', - 'Symfony\\Component\\Mime\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/mime/Exception/LogicException.php', - 'Symfony\\Component\\Mime\\Exception\\RfcComplianceException' => __DIR__ . '/..' . '/symfony/mime/Exception/RfcComplianceException.php', - 'Symfony\\Component\\Mime\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/mime/Exception/RuntimeException.php', - 'Symfony\\Component\\Mime\\FileBinaryMimeTypeGuesser' => __DIR__ . '/..' . '/symfony/mime/FileBinaryMimeTypeGuesser.php', - 'Symfony\\Component\\Mime\\FileinfoMimeTypeGuesser' => __DIR__ . '/..' . '/symfony/mime/FileinfoMimeTypeGuesser.php', - 'Symfony\\Component\\Mime\\Header\\AbstractHeader' => __DIR__ . '/..' . '/symfony/mime/Header/AbstractHeader.php', - 'Symfony\\Component\\Mime\\Header\\DateHeader' => __DIR__ . '/..' . '/symfony/mime/Header/DateHeader.php', - 'Symfony\\Component\\Mime\\Header\\HeaderInterface' => __DIR__ . '/..' . '/symfony/mime/Header/HeaderInterface.php', - 'Symfony\\Component\\Mime\\Header\\Headers' => __DIR__ . '/..' . '/symfony/mime/Header/Headers.php', - 'Symfony\\Component\\Mime\\Header\\IdentificationHeader' => __DIR__ . '/..' . '/symfony/mime/Header/IdentificationHeader.php', - 'Symfony\\Component\\Mime\\Header\\MailboxHeader' => __DIR__ . '/..' . '/symfony/mime/Header/MailboxHeader.php', - 'Symfony\\Component\\Mime\\Header\\MailboxListHeader' => __DIR__ . '/..' . '/symfony/mime/Header/MailboxListHeader.php', - 'Symfony\\Component\\Mime\\Header\\ParameterizedHeader' => __DIR__ . '/..' . '/symfony/mime/Header/ParameterizedHeader.php', - 'Symfony\\Component\\Mime\\Header\\PathHeader' => __DIR__ . '/..' . '/symfony/mime/Header/PathHeader.php', - 'Symfony\\Component\\Mime\\Header\\UnstructuredHeader' => __DIR__ . '/..' . '/symfony/mime/Header/UnstructuredHeader.php', - 'Symfony\\Component\\Mime\\HtmlToTextConverter\\DefaultHtmlToTextConverter' => __DIR__ . '/..' . '/symfony/mime/HtmlToTextConverter/DefaultHtmlToTextConverter.php', - 'Symfony\\Component\\Mime\\HtmlToTextConverter\\HtmlToTextConverterInterface' => __DIR__ . '/..' . '/symfony/mime/HtmlToTextConverter/HtmlToTextConverterInterface.php', - 'Symfony\\Component\\Mime\\HtmlToTextConverter\\LeagueHtmlToMarkdownConverter' => __DIR__ . '/..' . '/symfony/mime/HtmlToTextConverter/LeagueHtmlToMarkdownConverter.php', - 'Symfony\\Component\\Mime\\Message' => __DIR__ . '/..' . '/symfony/mime/Message.php', - 'Symfony\\Component\\Mime\\MessageConverter' => __DIR__ . '/..' . '/symfony/mime/MessageConverter.php', - 'Symfony\\Component\\Mime\\MimeTypeGuesserInterface' => __DIR__ . '/..' . '/symfony/mime/MimeTypeGuesserInterface.php', - 'Symfony\\Component\\Mime\\MimeTypes' => __DIR__ . '/..' . '/symfony/mime/MimeTypes.php', - 'Symfony\\Component\\Mime\\MimeTypesInterface' => __DIR__ . '/..' . '/symfony/mime/MimeTypesInterface.php', - 'Symfony\\Component\\Mime\\Part\\AbstractMultipartPart' => __DIR__ . '/..' . '/symfony/mime/Part/AbstractMultipartPart.php', - 'Symfony\\Component\\Mime\\Part\\AbstractPart' => __DIR__ . '/..' . '/symfony/mime/Part/AbstractPart.php', - 'Symfony\\Component\\Mime\\Part\\DataPart' => __DIR__ . '/..' . '/symfony/mime/Part/DataPart.php', - 'Symfony\\Component\\Mime\\Part\\File' => __DIR__ . '/..' . '/symfony/mime/Part/File.php', - 'Symfony\\Component\\Mime\\Part\\MessagePart' => __DIR__ . '/..' . '/symfony/mime/Part/MessagePart.php', - 'Symfony\\Component\\Mime\\Part\\Multipart\\AlternativePart' => __DIR__ . '/..' . '/symfony/mime/Part/Multipart/AlternativePart.php', - 'Symfony\\Component\\Mime\\Part\\Multipart\\DigestPart' => __DIR__ . '/..' . '/symfony/mime/Part/Multipart/DigestPart.php', - 'Symfony\\Component\\Mime\\Part\\Multipart\\FormDataPart' => __DIR__ . '/..' . '/symfony/mime/Part/Multipart/FormDataPart.php', - 'Symfony\\Component\\Mime\\Part\\Multipart\\MixedPart' => __DIR__ . '/..' . '/symfony/mime/Part/Multipart/MixedPart.php', - 'Symfony\\Component\\Mime\\Part\\Multipart\\RelatedPart' => __DIR__ . '/..' . '/symfony/mime/Part/Multipart/RelatedPart.php', - 'Symfony\\Component\\Mime\\Part\\SMimePart' => __DIR__ . '/..' . '/symfony/mime/Part/SMimePart.php', - 'Symfony\\Component\\Mime\\Part\\TextPart' => __DIR__ . '/..' . '/symfony/mime/Part/TextPart.php', - 'Symfony\\Component\\Mime\\RawMessage' => __DIR__ . '/..' . '/symfony/mime/RawMessage.php', - 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailAddressContains' => __DIR__ . '/..' . '/symfony/mime/Test/Constraint/EmailAddressContains.php', - 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailAttachmentCount' => __DIR__ . '/..' . '/symfony/mime/Test/Constraint/EmailAttachmentCount.php', - 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailHasHeader' => __DIR__ . '/..' . '/symfony/mime/Test/Constraint/EmailHasHeader.php', - 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailHeaderSame' => __DIR__ . '/..' . '/symfony/mime/Test/Constraint/EmailHeaderSame.php', - 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailHtmlBodyContains' => __DIR__ . '/..' . '/symfony/mime/Test/Constraint/EmailHtmlBodyContains.php', - 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailSubjectContains' => __DIR__ . '/..' . '/symfony/mime/Test/Constraint/EmailSubjectContains.php', - 'Symfony\\Component\\Mime\\Test\\Constraint\\EmailTextBodyContains' => __DIR__ . '/..' . '/symfony/mime/Test/Constraint/EmailTextBodyContains.php', - 'Symfony\\Component\\Translation\\CatalogueMetadataAwareInterface' => __DIR__ . '/..' . '/symfony/translation/CatalogueMetadataAwareInterface.php', - 'Symfony\\Component\\Translation\\Catalogue\\AbstractOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/AbstractOperation.php', - 'Symfony\\Component\\Translation\\Catalogue\\MergeOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/MergeOperation.php', - 'Symfony\\Component\\Translation\\Catalogue\\OperationInterface' => __DIR__ . '/..' . '/symfony/translation/Catalogue/OperationInterface.php', - 'Symfony\\Component\\Translation\\Catalogue\\TargetOperation' => __DIR__ . '/..' . '/symfony/translation/Catalogue/TargetOperation.php', - 'Symfony\\Component\\Translation\\Command\\TranslationLintCommand' => __DIR__ . '/..' . '/symfony/translation/Command/TranslationLintCommand.php', - 'Symfony\\Component\\Translation\\Command\\TranslationPullCommand' => __DIR__ . '/..' . '/symfony/translation/Command/TranslationPullCommand.php', - 'Symfony\\Component\\Translation\\Command\\TranslationPushCommand' => __DIR__ . '/..' . '/symfony/translation/Command/TranslationPushCommand.php', - 'Symfony\\Component\\Translation\\Command\\TranslationTrait' => __DIR__ . '/..' . '/symfony/translation/Command/TranslationTrait.php', - 'Symfony\\Component\\Translation\\Command\\XliffLintCommand' => __DIR__ . '/..' . '/symfony/translation/Command/XliffLintCommand.php', - 'Symfony\\Component\\Translation\\DataCollectorTranslator' => __DIR__ . '/..' . '/symfony/translation/DataCollectorTranslator.php', - 'Symfony\\Component\\Translation\\DataCollector\\TranslationDataCollector' => __DIR__ . '/..' . '/symfony/translation/DataCollector/TranslationDataCollector.php', - 'Symfony\\Component\\Translation\\DependencyInjection\\DataCollectorTranslatorPass' => __DIR__ . '/..' . '/symfony/translation/DependencyInjection/DataCollectorTranslatorPass.php', - 'Symfony\\Component\\Translation\\DependencyInjection\\LoggingTranslatorPass' => __DIR__ . '/..' . '/symfony/translation/DependencyInjection/LoggingTranslatorPass.php', - 'Symfony\\Component\\Translation\\DependencyInjection\\TranslationDumperPass' => __DIR__ . '/..' . '/symfony/translation/DependencyInjection/TranslationDumperPass.php', - 'Symfony\\Component\\Translation\\DependencyInjection\\TranslationExtractorPass' => __DIR__ . '/..' . '/symfony/translation/DependencyInjection/TranslationExtractorPass.php', - 'Symfony\\Component\\Translation\\DependencyInjection\\TranslatorPass' => __DIR__ . '/..' . '/symfony/translation/DependencyInjection/TranslatorPass.php', - 'Symfony\\Component\\Translation\\DependencyInjection\\TranslatorPathsPass' => __DIR__ . '/..' . '/symfony/translation/DependencyInjection/TranslatorPathsPass.php', - 'Symfony\\Component\\Translation\\Dumper\\CsvFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/CsvFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\DumperInterface' => __DIR__ . '/..' . '/symfony/translation/Dumper/DumperInterface.php', - 'Symfony\\Component\\Translation\\Dumper\\FileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/FileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\IcuResFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/IcuResFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\IniFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/IniFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\JsonFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/JsonFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\MoFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/MoFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\PhpFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/PhpFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\PoFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/PoFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\QtFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/QtFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\XliffFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/XliffFileDumper.php', - 'Symfony\\Component\\Translation\\Dumper\\YamlFileDumper' => __DIR__ . '/..' . '/symfony/translation/Dumper/YamlFileDumper.php', - 'Symfony\\Component\\Translation\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/translation/Exception/ExceptionInterface.php', - 'Symfony\\Component\\Translation\\Exception\\IncompleteDsnException' => __DIR__ . '/..' . '/symfony/translation/Exception/IncompleteDsnException.php', - 'Symfony\\Component\\Translation\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/translation/Exception/InvalidArgumentException.php', - 'Symfony\\Component\\Translation\\Exception\\InvalidResourceException' => __DIR__ . '/..' . '/symfony/translation/Exception/InvalidResourceException.php', - 'Symfony\\Component\\Translation\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/translation/Exception/LogicException.php', - 'Symfony\\Component\\Translation\\Exception\\MissingRequiredOptionException' => __DIR__ . '/..' . '/symfony/translation/Exception/MissingRequiredOptionException.php', - 'Symfony\\Component\\Translation\\Exception\\NotFoundResourceException' => __DIR__ . '/..' . '/symfony/translation/Exception/NotFoundResourceException.php', - 'Symfony\\Component\\Translation\\Exception\\ProviderException' => __DIR__ . '/..' . '/symfony/translation/Exception/ProviderException.php', - 'Symfony\\Component\\Translation\\Exception\\ProviderExceptionInterface' => __DIR__ . '/..' . '/symfony/translation/Exception/ProviderExceptionInterface.php', - 'Symfony\\Component\\Translation\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/translation/Exception/RuntimeException.php', - 'Symfony\\Component\\Translation\\Exception\\UnsupportedSchemeException' => __DIR__ . '/..' . '/symfony/translation/Exception/UnsupportedSchemeException.php', - 'Symfony\\Component\\Translation\\Extractor\\AbstractFileExtractor' => __DIR__ . '/..' . '/symfony/translation/Extractor/AbstractFileExtractor.php', - 'Symfony\\Component\\Translation\\Extractor\\ChainExtractor' => __DIR__ . '/..' . '/symfony/translation/Extractor/ChainExtractor.php', - 'Symfony\\Component\\Translation\\Extractor\\ExtractorInterface' => __DIR__ . '/..' . '/symfony/translation/Extractor/ExtractorInterface.php', - 'Symfony\\Component\\Translation\\Extractor\\PhpAstExtractor' => __DIR__ . '/..' . '/symfony/translation/Extractor/PhpAstExtractor.php', - 'Symfony\\Component\\Translation\\Extractor\\Visitor\\AbstractVisitor' => __DIR__ . '/..' . '/symfony/translation/Extractor/Visitor/AbstractVisitor.php', - 'Symfony\\Component\\Translation\\Extractor\\Visitor\\ConstraintVisitor' => __DIR__ . '/..' . '/symfony/translation/Extractor/Visitor/ConstraintVisitor.php', - 'Symfony\\Component\\Translation\\Extractor\\Visitor\\TransMethodVisitor' => __DIR__ . '/..' . '/symfony/translation/Extractor/Visitor/TransMethodVisitor.php', - 'Symfony\\Component\\Translation\\Extractor\\Visitor\\TranslatableMessageVisitor' => __DIR__ . '/..' . '/symfony/translation/Extractor/Visitor/TranslatableMessageVisitor.php', - 'Symfony\\Component\\Translation\\Formatter\\IntlFormatter' => __DIR__ . '/..' . '/symfony/translation/Formatter/IntlFormatter.php', - 'Symfony\\Component\\Translation\\Formatter\\IntlFormatterInterface' => __DIR__ . '/..' . '/symfony/translation/Formatter/IntlFormatterInterface.php', - 'Symfony\\Component\\Translation\\Formatter\\MessageFormatter' => __DIR__ . '/..' . '/symfony/translation/Formatter/MessageFormatter.php', - 'Symfony\\Component\\Translation\\Formatter\\MessageFormatterInterface' => __DIR__ . '/..' . '/symfony/translation/Formatter/MessageFormatterInterface.php', - 'Symfony\\Component\\Translation\\IdentityTranslator' => __DIR__ . '/..' . '/symfony/translation/IdentityTranslator.php', - 'Symfony\\Component\\Translation\\Loader\\ArrayLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/ArrayLoader.php', - 'Symfony\\Component\\Translation\\Loader\\CsvFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/CsvFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\FileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/FileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\IcuDatFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/IcuDatFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\IcuResFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/IcuResFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\IniFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/IniFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\JsonFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/JsonFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\LoaderInterface' => __DIR__ . '/..' . '/symfony/translation/Loader/LoaderInterface.php', - 'Symfony\\Component\\Translation\\Loader\\MoFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/MoFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\PhpFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/PhpFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\PoFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/PoFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\QtFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/QtFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\XliffFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/XliffFileLoader.php', - 'Symfony\\Component\\Translation\\Loader\\YamlFileLoader' => __DIR__ . '/..' . '/symfony/translation/Loader/YamlFileLoader.php', - 'Symfony\\Component\\Translation\\LocaleSwitcher' => __DIR__ . '/..' . '/symfony/translation/LocaleSwitcher.php', - 'Symfony\\Component\\Translation\\LoggingTranslator' => __DIR__ . '/..' . '/symfony/translation/LoggingTranslator.php', - 'Symfony\\Component\\Translation\\MessageCatalogue' => __DIR__ . '/..' . '/symfony/translation/MessageCatalogue.php', - 'Symfony\\Component\\Translation\\MessageCatalogueInterface' => __DIR__ . '/..' . '/symfony/translation/MessageCatalogueInterface.php', - 'Symfony\\Component\\Translation\\MetadataAwareInterface' => __DIR__ . '/..' . '/symfony/translation/MetadataAwareInterface.php', - 'Symfony\\Component\\Translation\\Provider\\AbstractProviderFactory' => __DIR__ . '/..' . '/symfony/translation/Provider/AbstractProviderFactory.php', - 'Symfony\\Component\\Translation\\Provider\\Dsn' => __DIR__ . '/..' . '/symfony/translation/Provider/Dsn.php', - 'Symfony\\Component\\Translation\\Provider\\FilteringProvider' => __DIR__ . '/..' . '/symfony/translation/Provider/FilteringProvider.php', - 'Symfony\\Component\\Translation\\Provider\\NullProvider' => __DIR__ . '/..' . '/symfony/translation/Provider/NullProvider.php', - 'Symfony\\Component\\Translation\\Provider\\NullProviderFactory' => __DIR__ . '/..' . '/symfony/translation/Provider/NullProviderFactory.php', - 'Symfony\\Component\\Translation\\Provider\\ProviderFactoryInterface' => __DIR__ . '/..' . '/symfony/translation/Provider/ProviderFactoryInterface.php', - 'Symfony\\Component\\Translation\\Provider\\ProviderInterface' => __DIR__ . '/..' . '/symfony/translation/Provider/ProviderInterface.php', - 'Symfony\\Component\\Translation\\Provider\\TranslationProviderCollection' => __DIR__ . '/..' . '/symfony/translation/Provider/TranslationProviderCollection.php', - 'Symfony\\Component\\Translation\\Provider\\TranslationProviderCollectionFactory' => __DIR__ . '/..' . '/symfony/translation/Provider/TranslationProviderCollectionFactory.php', - 'Symfony\\Component\\Translation\\PseudoLocalizationTranslator' => __DIR__ . '/..' . '/symfony/translation/PseudoLocalizationTranslator.php', - 'Symfony\\Component\\Translation\\Reader\\TranslationReader' => __DIR__ . '/..' . '/symfony/translation/Reader/TranslationReader.php', - 'Symfony\\Component\\Translation\\Reader\\TranslationReaderInterface' => __DIR__ . '/..' . '/symfony/translation/Reader/TranslationReaderInterface.php', - 'Symfony\\Component\\Translation\\StaticMessage' => __DIR__ . '/..' . '/symfony/translation/StaticMessage.php', - 'Symfony\\Component\\Translation\\Test\\AbstractProviderFactoryTestCase' => __DIR__ . '/..' . '/symfony/translation/Test/AbstractProviderFactoryTestCase.php', - 'Symfony\\Component\\Translation\\Test\\IncompleteDsnTestTrait' => __DIR__ . '/..' . '/symfony/translation/Test/IncompleteDsnTestTrait.php', - 'Symfony\\Component\\Translation\\Test\\ProviderFactoryTestCase' => __DIR__ . '/..' . '/symfony/translation/Test/ProviderFactoryTestCase.php', - 'Symfony\\Component\\Translation\\Test\\ProviderTestCase' => __DIR__ . '/..' . '/symfony/translation/Test/ProviderTestCase.php', - 'Symfony\\Component\\Translation\\TranslatableMessage' => __DIR__ . '/..' . '/symfony/translation/TranslatableMessage.php', - 'Symfony\\Component\\Translation\\Translator' => __DIR__ . '/..' . '/symfony/translation/Translator.php', - 'Symfony\\Component\\Translation\\TranslatorBag' => __DIR__ . '/..' . '/symfony/translation/TranslatorBag.php', - 'Symfony\\Component\\Translation\\TranslatorBagInterface' => __DIR__ . '/..' . '/symfony/translation/TranslatorBagInterface.php', - 'Symfony\\Component\\Translation\\Util\\ArrayConverter' => __DIR__ . '/..' . '/symfony/translation/Util/ArrayConverter.php', - 'Symfony\\Component\\Translation\\Util\\XliffUtils' => __DIR__ . '/..' . '/symfony/translation/Util/XliffUtils.php', - 'Symfony\\Component\\Translation\\Writer\\TranslationWriter' => __DIR__ . '/..' . '/symfony/translation/Writer/TranslationWriter.php', - 'Symfony\\Component\\Translation\\Writer\\TranslationWriterInterface' => __DIR__ . '/..' . '/symfony/translation/Writer/TranslationWriterInterface.php', - 'Symfony\\Contracts\\Translation\\LocaleAwareInterface' => __DIR__ . '/..' . '/symfony/translation-contracts/LocaleAwareInterface.php', - 'Symfony\\Contracts\\Translation\\TranslatableInterface' => __DIR__ . '/..' . '/symfony/translation-contracts/TranslatableInterface.php', - 'Symfony\\Contracts\\Translation\\TranslatorInterface' => __DIR__ . '/..' . '/symfony/translation-contracts/TranslatorInterface.php', - 'Symfony\\Contracts\\Translation\\TranslatorTrait' => __DIR__ . '/..' . '/symfony/translation-contracts/TranslatorTrait.php', - 'Symfony\\Polyfill\\Iconv\\Iconv' => __DIR__ . '/..' . '/symfony/polyfill-iconv/Iconv.php', - 'Symfony\\Polyfill\\Intl\\Idn\\Idn' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/Idn.php', - 'Symfony\\Polyfill\\Intl\\Idn\\Info' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/Info.php', - 'Symfony\\Polyfill\\Intl\\Idn\\Resources\\unidata\\DisallowedRanges' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php', - 'Symfony\\Polyfill\\Intl\\Idn\\Resources\\unidata\\Regex' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/Resources/unidata/Regex.php', - 'Symfony\\Polyfill\\Intl\\Normalizer\\Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Normalizer.php', - 'Symfony\\Polyfill\\Mbstring\\Mbstring' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/Mbstring.php', - 'Symfony\\Polyfill\\Php80\\Php80' => __DIR__ . '/..' . '/symfony/polyfill-php80/Php80.php', - 'Symfony\\Polyfill\\Php80\\PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/PhpToken.php', - 'Symfony\\Polyfill\\Php83\\Php83' => __DIR__ . '/..' . '/symfony/polyfill-php83/Php83.php', - 'Symfony\\Polyfill\\Php84\\Php84' => __DIR__ . '/..' . '/symfony/polyfill-php84/Php84.php', - 'Symfony\\Polyfill\\Php85\\Php85' => __DIR__ . '/..' . '/symfony/polyfill-php85/Php85.php', 'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php', 'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php', - 'ZBateson\\MailMimeParser\\Error' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Error.php', - 'ZBateson\\MailMimeParser\\ErrorBag' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/ErrorBag.php', - 'ZBateson\\MailMimeParser\\Header\\AbstractHeader' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/AbstractHeader.php', - 'ZBateson\\MailMimeParser\\Header\\AddressHeader' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/AddressHeader.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\AbstractConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/AbstractConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\AbstractGenericConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/AbstractGenericConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\AddressBaseConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/AddressBaseConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\AddressConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/AddressConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\AddressEmailConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/AddressEmailConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\AddressGroupConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/AddressGroupConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\CommentConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/CommentConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\DateConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/DateConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\GenericConsumerMimeLiteralPartService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/GenericConsumerMimeLiteralPartService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\GenericConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/GenericConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\IConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/IConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\IdBaseConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/IdBaseConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\IdConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/IdConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\ParameterConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/ParameterConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\ParameterNameValueConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/ParameterNameValueConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\ParameterValueConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/ParameterValueConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\QuotedStringConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/QuotedStringConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\QuotedStringMimeLiteralPartConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/QuotedStringMimeLiteralPartConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\QuotedStringMimeLiteralPartTokenSplitPatternTrait' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/QuotedStringMimeLiteralPartTokenSplitPatternTrait.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\ReceivedConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/ReceivedConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\Received\\DomainConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/Received/DomainConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\Received\\GenericReceivedConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/Received/GenericReceivedConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\Received\\ReceivedDateConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/Received/ReceivedDateConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\Consumer\\SubjectConsumerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Consumer/SubjectConsumerService.php', - 'ZBateson\\MailMimeParser\\Header\\DateHeader' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/DateHeader.php', - 'ZBateson\\MailMimeParser\\Header\\GenericHeader' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/GenericHeader.php', - 'ZBateson\\MailMimeParser\\Header\\HeaderConsts' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/HeaderConsts.php', - 'ZBateson\\MailMimeParser\\Header\\HeaderFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/HeaderFactory.php', - 'ZBateson\\MailMimeParser\\Header\\IHeader' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/IHeader.php', - 'ZBateson\\MailMimeParser\\Header\\IHeaderPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/IHeaderPart.php', - 'ZBateson\\MailMimeParser\\Header\\IdHeader' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/IdHeader.php', - 'ZBateson\\MailMimeParser\\Header\\MimeEncodedHeader' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/MimeEncodedHeader.php', - 'ZBateson\\MailMimeParser\\Header\\ParameterHeader' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/ParameterHeader.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\AddressGroupPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/AddressGroupPart.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\AddressPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/AddressPart.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\CommentPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/CommentPart.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\ContainerPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/ContainerPart.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\DatePart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/DatePart.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\HeaderPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/HeaderPart.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\HeaderPartFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/HeaderPartFactory.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\MimeToken' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/MimeToken.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\MimeTokenPartFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/MimeTokenPartFactory.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\NameValuePart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/NameValuePart.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\ParameterPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/ParameterPart.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\QuotedLiteralPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/QuotedLiteralPart.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\ReceivedDomainPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/ReceivedDomainPart.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\ReceivedPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/ReceivedPart.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\SplitParameterPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/SplitParameterPart.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\SubjectToken' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/SubjectToken.php', - 'ZBateson\\MailMimeParser\\Header\\Part\\Token' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/Part/Token.php', - 'ZBateson\\MailMimeParser\\Header\\ReceivedHeader' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/ReceivedHeader.php', - 'ZBateson\\MailMimeParser\\Header\\SubjectHeader' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Header/SubjectHeader.php', - 'ZBateson\\MailMimeParser\\IErrorBag' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/IErrorBag.php', - 'ZBateson\\MailMimeParser\\IMessage' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/IMessage.php', - 'ZBateson\\MailMimeParser\\MailMimeParser' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/MailMimeParser.php', - 'ZBateson\\MailMimeParser\\Message' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message.php', - 'ZBateson\\MailMimeParser\\Message\\Factory\\IMessagePartFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/Factory/IMessagePartFactory.php', - 'ZBateson\\MailMimeParser\\Message\\Factory\\IMimePartFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/Factory/IMimePartFactory.php', - 'ZBateson\\MailMimeParser\\Message\\Factory\\IUUEncodedPartFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/Factory/IUUEncodedPartFactory.php', - 'ZBateson\\MailMimeParser\\Message\\Factory\\PartChildrenContainerFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/Factory/PartChildrenContainerFactory.php', - 'ZBateson\\MailMimeParser\\Message\\Factory\\PartHeaderContainerFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/Factory/PartHeaderContainerFactory.php', - 'ZBateson\\MailMimeParser\\Message\\Factory\\PartStreamContainerFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/Factory/PartStreamContainerFactory.php', - 'ZBateson\\MailMimeParser\\Message\\Helper\\AbstractHelper' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/Helper/AbstractHelper.php', - 'ZBateson\\MailMimeParser\\Message\\Helper\\GenericHelper' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/Helper/GenericHelper.php', - 'ZBateson\\MailMimeParser\\Message\\Helper\\MultipartHelper' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/Helper/MultipartHelper.php', - 'ZBateson\\MailMimeParser\\Message\\Helper\\PrivacyHelper' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/Helper/PrivacyHelper.php', - 'ZBateson\\MailMimeParser\\Message\\IMessagePart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/IMessagePart.php', - 'ZBateson\\MailMimeParser\\Message\\IMimePart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/IMimePart.php', - 'ZBateson\\MailMimeParser\\Message\\IMultiPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/IMultiPart.php', - 'ZBateson\\MailMimeParser\\Message\\IUUEncodedPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/IUUEncodedPart.php', - 'ZBateson\\MailMimeParser\\Message\\MessagePart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/MessagePart.php', - 'ZBateson\\MailMimeParser\\Message\\MimePart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/MimePart.php', - 'ZBateson\\MailMimeParser\\Message\\MultiPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/MultiPart.php', - 'ZBateson\\MailMimeParser\\Message\\NonMimePart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/NonMimePart.php', - 'ZBateson\\MailMimeParser\\Message\\PartChildrenContainer' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/PartChildrenContainer.php', - 'ZBateson\\MailMimeParser\\Message\\PartFilter' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/PartFilter.php', - 'ZBateson\\MailMimeParser\\Message\\PartHeaderContainer' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/PartHeaderContainer.php', - 'ZBateson\\MailMimeParser\\Message\\PartStreamContainer' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/PartStreamContainer.php', - 'ZBateson\\MailMimeParser\\Message\\UUEncodedPart' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Message/UUEncodedPart.php', - 'ZBateson\\MailMimeParser\\Parser\\AbstractParserService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/AbstractParserService.php', - 'ZBateson\\MailMimeParser\\Parser\\CompatibleParserNotFoundException' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/CompatibleParserNotFoundException.php', - 'ZBateson\\MailMimeParser\\Parser\\HeaderParserService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/HeaderParserService.php', - 'ZBateson\\MailMimeParser\\Parser\\IParserService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/IParserService.php', - 'ZBateson\\MailMimeParser\\Parser\\MessageParserService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/MessageParserService.php', - 'ZBateson\\MailMimeParser\\Parser\\MimeParserService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/MimeParserService.php', - 'ZBateson\\MailMimeParser\\Parser\\NonMimeParserService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/NonMimeParserService.php', - 'ZBateson\\MailMimeParser\\Parser\\ParserManagerService' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/ParserManagerService.php', - 'ZBateson\\MailMimeParser\\Parser\\PartBuilder' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/PartBuilder.php', - 'ZBateson\\MailMimeParser\\Parser\\PartBuilderFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/PartBuilderFactory.php', - 'ZBateson\\MailMimeParser\\Parser\\Part\\ParserPartChildrenContainer' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Part/ParserPartChildrenContainer.php', - 'ZBateson\\MailMimeParser\\Parser\\Part\\ParserPartChildrenContainerFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Part/ParserPartChildrenContainerFactory.php', - 'ZBateson\\MailMimeParser\\Parser\\Part\\ParserPartStreamContainer' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Part/ParserPartStreamContainer.php', - 'ZBateson\\MailMimeParser\\Parser\\Part\\ParserPartStreamContainerFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Part/ParserPartStreamContainerFactory.php', - 'ZBateson\\MailMimeParser\\Parser\\Part\\UUEncodedPartHeaderContainer' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Part/UUEncodedPartHeaderContainer.php', - 'ZBateson\\MailMimeParser\\Parser\\Part\\UUEncodedPartHeaderContainerFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Part/UUEncodedPartHeaderContainerFactory.php', - 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserMessageProxy' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMessageProxy.php', - 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserMessageProxyFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMessageProxyFactory.php', - 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserMimePartProxy' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMimePartProxy.php', - 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserMimePartProxyFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserMimePartProxyFactory.php', - 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserNonMimeMessageProxy' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserNonMimeMessageProxy.php', - 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserNonMimeMessageProxyFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserNonMimeMessageProxyFactory.php', - 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserPartProxy' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserPartProxy.php', - 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserPartProxyFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserPartProxyFactory.php', - 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserUUEncodedPartProxy' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserUUEncodedPartProxy.php', - 'ZBateson\\MailMimeParser\\Parser\\Proxy\\ParserUUEncodedPartProxyFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Parser/Proxy/ParserUUEncodedPartProxyFactory.php', - 'ZBateson\\MailMimeParser\\Stream\\HeaderStream' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Stream/HeaderStream.php', - 'ZBateson\\MailMimeParser\\Stream\\MessagePartStream' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Stream/MessagePartStream.php', - 'ZBateson\\MailMimeParser\\Stream\\MessagePartStreamDecorator' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Stream/MessagePartStreamDecorator.php', - 'ZBateson\\MailMimeParser\\Stream\\MessagePartStreamReadException' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Stream/MessagePartStreamReadException.php', - 'ZBateson\\MailMimeParser\\Stream\\StreamFactory' => __DIR__ . '/..' . '/zbateson/mail-mime-parser/src/Stream/StreamFactory.php', - 'ZBateson\\MbWrapper\\MbWrapper' => __DIR__ . '/..' . '/zbateson/mb-wrapper/src/MbWrapper.php', - 'ZBateson\\MbWrapper\\UnsupportedCharsetException' => __DIR__ . '/..' . '/zbateson/mb-wrapper/src/UnsupportedCharsetException.php', - 'ZBateson\\StreamDecorators\\Base64Stream' => __DIR__ . '/..' . '/zbateson/stream-decorators/src/Base64Stream.php', - 'ZBateson\\StreamDecorators\\CharsetStream' => __DIR__ . '/..' . '/zbateson/stream-decorators/src/CharsetStream.php', - 'ZBateson\\StreamDecorators\\ChunkSplitStream' => __DIR__ . '/..' . '/zbateson/stream-decorators/src/ChunkSplitStream.php', - 'ZBateson\\StreamDecorators\\DecoratedCachingStream' => __DIR__ . '/..' . '/zbateson/stream-decorators/src/DecoratedCachingStream.php', - 'ZBateson\\StreamDecorators\\NonClosingStream' => __DIR__ . '/..' . '/zbateson/stream-decorators/src/NonClosingStream.php', - 'ZBateson\\StreamDecorators\\PregReplaceFilterStream' => __DIR__ . '/..' . '/zbateson/stream-decorators/src/PregReplaceFilterStream.php', - 'ZBateson\\StreamDecorators\\QuotedPrintableStream' => __DIR__ . '/..' . '/zbateson/stream-decorators/src/QuotedPrintableStream.php', - 'ZBateson\\StreamDecorators\\SeekingLimitStream' => __DIR__ . '/..' . '/zbateson/stream-decorators/src/SeekingLimitStream.php', - 'ZBateson\\StreamDecorators\\TellZeroStream' => __DIR__ . '/..' . '/zbateson/stream-decorators/src/TellZeroStream.php', - 'ZBateson\\StreamDecorators\\UUStream' => __DIR__ . '/..' . '/zbateson/stream-decorators/src/UUStream.php', ); public static function getInitializer(ClassLoader $loader) diff --git a/libs/vendor/composer/installed.json b/libs/vendor/composer/installed.json index 6fd94ea36..d1947c891 100644 --- a/libs/vendor/composer/installed.json +++ b/libs/vendor/composer/installed.json @@ -74,17 +74,17 @@ }, { "name": "directorytree/imapengine", - "version": "v1.25.0", - "version_normalized": "1.25.0.0", + "version": "v1.25.1", + "version_normalized": "1.25.1.0", "source": { "type": "git", "url": "https://github.com/DirectoryTree/ImapEngine.git", - "reference": "ac8a4d028334c2d3a4bc8fd975317a75cd968a47" + "reference": "7dd94f76a800a4ca1fd06b132b71484f55b60767" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/DirectoryTree/ImapEngine/zipball/ac8a4d028334c2d3a4bc8fd975317a75cd968a47", - "reference": "ac8a4d028334c2d3a4bc8fd975317a75cd968a47", + "url": "https://api.github.com/repos/DirectoryTree/ImapEngine/zipball/7dd94f76a800a4ca1fd06b132b71484f55b60767", + "reference": "7dd94f76a800a4ca1fd06b132b71484f55b60767", "shasum": "" }, "require": { @@ -99,7 +99,7 @@ "pestphp/pest": "^2.0|^3.0|^4.0", "spatie/ray": "^1.0" }, - "time": "2026-06-19T17:03:06+00:00", + "time": "2026-07-06T16:08:31+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -127,7 +127,7 @@ ], "support": { "issues": "https://github.com/DirectoryTree/ImapEngine/issues", - "source": "https://github.com/DirectoryTree/ImapEngine/tree/v1.25.0" + "source": "https://github.com/DirectoryTree/ImapEngine/tree/v1.25.1" }, "funding": [ { diff --git a/libs/vendor/composer/installed.php b/libs/vendor/composer/installed.php index ee89f0f19..ea674c1d5 100644 --- a/libs/vendor/composer/installed.php +++ b/libs/vendor/composer/installed.php @@ -5,7 +5,7 @@ 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), - 'reference' => '171a0d38f876a1af3db48a83e312fb52d3bdac75', + 'reference' => '8da3a107fbcd462a0ded5aa8dd94bff6fb409e58', 'name' => '__root__', 'dev' => false, ), @@ -16,7 +16,7 @@ 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), - 'reference' => '171a0d38f876a1af3db48a83e312fb52d3bdac75', + 'reference' => '8da3a107fbcd462a0ded5aa8dd94bff6fb409e58', 'dev_requirement' => false, ), 'carbonphp/carbon-doctrine-types' => array( @@ -29,12 +29,12 @@ 'dev_requirement' => false, ), 'directorytree/imapengine' => array( - 'pretty_version' => 'v1.25.0', - 'version' => '1.25.0.0', + 'pretty_version' => 'v1.25.1', + 'version' => '1.25.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../directorytree/imapengine', 'aliases' => array(), - 'reference' => 'ac8a4d028334c2d3a4bc8fd975317a75cd968a47', + 'reference' => '7dd94f76a800a4ca1fd06b132b71484f55b60767', 'dev_requirement' => false, ), 'doctrine/lexer' => array( diff --git a/libs/vendor/directorytree/imapengine/src/Attachment.php b/libs/vendor/directorytree/imapengine/src/Attachment.php index 06b5fc80e..ea9952ce0 100644 --- a/libs/vendor/directorytree/imapengine/src/Attachment.php +++ b/libs/vendor/directorytree/imapengine/src/Attachment.php @@ -117,6 +117,10 @@ class Attachment implements Arrayable, JsonSerializable */ public function contents(): string { + if ($this->contentStream->isSeekable()) { + $this->contentStream->rewind(); + } + return $this->contentStream->getContents(); } From 91e9f6097b13dd7042a7d2ce069ec51df53abd15 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Mon, 13 Jul 2026 12:45:59 -0400 Subject: [PATCH 015/241] Client Overview Side Nav: Only shows counts to the user who has permission to see --- agent/includes/client_overview_side_nav.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/agent/includes/client_overview_side_nav.php b/agent/includes/client_overview_side_nav.php index 323e9062b..362c5aa4b 100644 --- a/agent/includes/client_overview_side_nav.php +++ b/agent/includes/client_overview_side_nav.php @@ -1,31 +1,31 @@ From fe7e9b2398c09145135f1eb0936b26fb4c106787 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Mon, 13 Jul 2026 13:08:03 -0400 Subject: [PATCH 016/241] Main Side Nav: Only shows counts to the user who has permission to see --- agent/includes/get_side_nav_counts.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/agent/includes/get_side_nav_counts.php b/agent/includes/get_side_nav_counts.php index 6d0afd4bb..87dac0873 100644 --- a/agent/includes/get_side_nav_counts.php +++ b/agent/includes/get_side_nav_counts.php @@ -14,19 +14,19 @@ $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('recurring_ticket_ $num_recurring_tickets = $row['num']; // Active Project Count -$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('project_id') AS num FROM projects WHERE project_archived_at IS NULL AND project_completed_at IS NULL")); +$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('project_id') AS num FROM projects LEFT JOIN clients ON project_client_id = client_id WHERE project_archived_at IS NULL AND project_completed_at IS NULL $access_permission_query")); $num_active_projects = $row['num']; // Open Invoices Count -$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('invoice_id') AS num FROM invoices WHERE (invoice_status = 'Sent' OR invoice_status = 'Viewed' OR invoice_status = 'Partial') AND invoice_archived_at IS NULL")); +$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('invoice_id') AS num FROM invoices LEFT JOIN clients ON invoice_client_id = client_id WHERE (invoice_status = 'Sent' OR invoice_status = 'Viewed' OR invoice_status = 'Partial' OR invoice_status = 'Draft') AND invoice_archived_at IS NULL $access_permission_query")); $num_open_invoices = $row['num']; // Recurring Invoice Count -$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('recurring_invoice_id') AS num FROM recurring_invoices WHERE recurring_invoice_archived_at IS NULL")); +$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('recurring_invoice_id') AS num FROM recurring_invoices LEFT JOIN clients ON recurring_invoice_client_id = client_id WHERE recurring_invoice_archived_at IS NULL $access_permission_query")); $num_recurring_invoices = $row['num']; // Open Quotes Count -$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('quote_id') AS num FROM quotes WHERE (quote_status = 'Sent' OR quote_status = 'Viewed') AND quote_archived_at IS NULL")); +$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('quote_id') AS num FROM quotes LEFT JOIN clients ON quote_client_id = client_id WHERE (quote_status = 'Sent' OR quote_status = 'Viewed') AND quote_archived_at IS NULL $access_permission_query")); $num_open_quotes = $row['num']; // Recurring Expenses Count From 95441dc3bb45b2973fa80b7e16d33ea42cc448a3 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Mon, 13 Jul 2026 13:29:24 -0400 Subject: [PATCH 017/241] Show 7 Characters of client name in client side nav instead of Abbreviation --- agent/includes/client_side_nav.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/agent/includes/client_side_nav.php b/agent/includes/client_side_nav.php index 5229569eb..4f8a169e9 100644 --- a/agent/includes/client_side_nav.php +++ b/agent/includes/client_side_nav.php @@ -5,7 +5,7 @@

- Back | + Back |

@@ -336,4 +336,4 @@
- \ No newline at end of file + From b81e57db283293ed336521ce82c82d7c91770f7f Mon Sep 17 00:00:00 2001 From: johnnyq Date: Mon, 13 Jul 2026 17:19:32 -0400 Subject: [PATCH 018/241] Show Invoice Stats in Invoice only for user permissable clients --- agent/includes/client_side_nav.php | 2 +- agent/invoices.php | 28 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/agent/includes/client_side_nav.php b/agent/includes/client_side_nav.php index 4f8a169e9..c37199f01 100644 --- a/agent/includes/client_side_nav.php +++ b/agent/includes/client_side_nav.php @@ -3,7 +3,7 @@

- + Back | diff --git a/agent/invoices.php b/agent/invoices.php index 7e75cb18b..b82879479 100644 --- a/agent/invoices.php +++ b/agent/invoices.php @@ -11,57 +11,57 @@ if (isset($_GET['client_id'])) { $client_url = "client_id=$client_id&"; } else { require_once "includes/inc_all.php"; - $client_query = ''; + $client_query = "$access_permission_query"; $client_url = ''; } // Perms enforceUserPermission('module_sales'); -$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('invoice_id') AS num FROM invoices WHERE invoice_status = 'Sent' $client_query")); +$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('invoice_id') AS num FROM invoices LEFT JOIN clients ON invoice_client_id = client_id WHERE invoice_status = 'Sent' $client_query")); $sent_count = $row['num']; -$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('invoice_id') AS num FROM invoices WHERE invoice_status = 'Viewed' $client_query")); +$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('invoice_id') AS num FROM invoices LEFT JOIN clients ON invoice_client_id = client_id WHERE invoice_status = 'Viewed' $client_query")); $viewed_count = $row['num']; -$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('invoice_id') AS num FROM invoices WHERE invoice_status = 'Partial' $client_query")); +$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('invoice_id') AS num FROM invoices LEFT JOIN clients ON invoice_client_id = client_id WHERE invoice_status = 'Partial' $client_query")); $partial_count = $row['num']; -$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('invoice_id') AS num FROM invoices WHERE invoice_status = 'Draft' $client_query")); +$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('invoice_id') AS num FROM invoices LEFT JOIN clients ON invoice_client_id = client_id WHERE invoice_status = 'Draft' $client_query")); $draft_count = $row['num']; -$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('invoice_id') AS num FROM invoices WHERE invoice_status = 'Cancelled' $client_query")); +$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('invoice_id') AS num FROM invoices LEFT JOIN clients ON invoice_client_id = client_id WHERE invoice_status = 'Cancelled' $client_query")); $cancelled_count = $row['num']; -$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('invoice_id') AS num FROM invoices WHERE invoice_status NOT LIKE 'Draft' AND invoice_status NOT LIKE 'Paid' AND invoice_status NOT LIKE 'Cancelled' AND invoice_status NOT LIKE 'Non-Billable' AND invoice_due < CURDATE() $client_query")); +$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('invoice_id') AS num FROM invoices LEFT JOIN clients ON invoice_client_id = client_id WHERE invoice_status NOT LIKE 'Draft' AND invoice_status NOT LIKE 'Paid' AND invoice_status NOT LIKE 'Cancelled' AND invoice_status NOT LIKE 'Non-Billable' AND invoice_due < CURDATE() $client_query")); $overdue_count = $row['num']; -$sql_total_draft_amount = mysqli_query($mysqli, "SELECT SUM(invoice_amount) AS total_draft_amount FROM invoices WHERE invoice_status = 'Draft' $client_query"); +$sql_total_draft_amount = mysqli_query($mysqli, "SELECT SUM(invoice_amount) AS total_draft_amount FROM invoices LEFT JOIN clients ON invoice_client_id = client_id WHERE invoice_status = 'Draft' $client_query"); $row = mysqli_fetch_assoc($sql_total_draft_amount); $total_draft_amount = floatval($row['total_draft_amount']); -$sql_total_sent_amount = mysqli_query($mysqli, "SELECT SUM(invoice_amount) AS total_sent_amount FROM invoices WHERE invoice_status = 'Sent' $client_query"); +$sql_total_sent_amount = mysqli_query($mysqli, "SELECT SUM(invoice_amount) AS total_sent_amount FROM invoices LEFT JOIN clients ON invoice_client_id = client_id WHERE invoice_status = 'Sent' $client_query"); $row = mysqli_fetch_assoc($sql_total_sent_amount); $total_sent_amount = floatval($row['total_sent_amount']); -$sql_total_viewed_amount = mysqli_query($mysqli, "SELECT SUM(invoice_amount) AS total_viewed_amount FROM invoices WHERE invoice_status = 'Viewed' $client_query"); +$sql_total_viewed_amount = mysqli_query($mysqli, "SELECT SUM(invoice_amount) AS total_viewed_amount FROM invoices LEFT JOIN clients ON invoice_client_id = client_id WHERE invoice_status = 'Viewed' $client_query"); $row = mysqli_fetch_assoc($sql_total_viewed_amount); $total_viewed_amount = floatval($row['total_viewed_amount']); -$sql_total_cancelled_amount = mysqli_query($mysqli, "SELECT SUM(invoice_amount) AS total_cancelled_amount FROM invoices WHERE invoice_status = 'Cancelled' $client_query"); +$sql_total_cancelled_amount = mysqli_query($mysqli, "SELECT SUM(invoice_amount) AS total_cancelled_amount FROM invoices LEFT JOIN clients ON invoice_client_id = client_id WHERE invoice_status = 'Cancelled' $client_query"); $row = mysqli_fetch_assoc($sql_total_cancelled_amount); $total_cancelled_amount = floatval($row['total_cancelled_amount']); -$sql_total_partial_amount = mysqli_query($mysqli, "SELECT SUM(invoice_amount) AS total_partial_amount FROM payments, invoices WHERE payment_invoice_id = invoice_id AND invoice_status = 'Partial' $client_query"); +$sql_total_partial_amount = mysqli_query($mysqli, "SELECT SUM(invoice_amount) AS total_partial_amount FROM payments, invoices LEFT JOIN clients ON invoice_client_id = client_id WHERE payment_invoice_id = invoice_id AND invoice_status = 'Partial' $client_query"); $row = mysqli_fetch_assoc($sql_total_partial_amount); $total_partial_amount = floatval($row['total_partial_amount']); $total_partial_count = mysqli_num_rows($sql_total_partial_amount); -$sql_total_overdue_partial_amount = mysqli_query($mysqli, "SELECT SUM(payment_amount) AS total_overdue_partial_amount FROM payments, invoices WHERE payment_invoice_id = invoice_id AND invoice_status = 'Partial' AND invoice_due < CURDATE() $client_query"); +$sql_total_overdue_partial_amount = mysqli_query($mysqli, "SELECT SUM(payment_amount) AS total_overdue_partial_amount FROM payments, invoices LEFT JOIN clients ON invoice_client_id = client_id WHERE payment_invoice_id = invoice_id AND invoice_status = 'Partial' AND invoice_due < CURDATE() $client_query"); $row = mysqli_fetch_assoc($sql_total_overdue_partial_amount); $total_overdue_partial_amount = floatval($row['total_overdue_partial_amount']); -$sql_total_overdue_amount = mysqli_query($mysqli, "SELECT SUM(invoice_amount) AS total_overdue_amount FROM invoices WHERE invoice_status != 'Draft' AND invoice_status != 'Paid' AND invoice_status != 'Cancelled' AND invoice_status != 'Non-Billable' AND invoice_due < CURDATE() $client_query"); +$sql_total_overdue_amount = mysqli_query($mysqli, "SELECT SUM(invoice_amount) AS total_overdue_amount FROM invoices LEFT JOIN clients ON invoice_client_id = client_id WHERE invoice_status != 'Draft' AND invoice_status != 'Paid' AND invoice_status != 'Cancelled' AND invoice_status != 'Non-Billable' AND invoice_due < CURDATE() $client_query"); $row = mysqli_fetch_assoc($sql_total_overdue_amount); $total_overdue_amount = floatval($row['total_overdue_amount']); From 79032de03299544a41005a6127ce2f8c06787f19 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Tue, 14 Jul 2026 11:23:54 -0400 Subject: [PATCH 019/241] Certificates: Allow to search by description --- agent/certificates.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agent/certificates.php b/agent/certificates.php index db65cc030..290be8d41 100644 --- a/agent/certificates.php +++ b/agent/certificates.php @@ -49,7 +49,7 @@ if (!$client_url) { $sql = mysqli_query($mysqli, "SELECT SQL_CALC_FOUND_ROWS * FROM certificates LEFT JOIN clients ON client_id = certificate_client_id WHERE $archive_query - AND (certificate_name LIKE '%$q%' OR certificate_domain LIKE '%$q%' OR certificate_issued_by LIKE '%$q%' OR client_name LIKE '%$q%') + AND (certificate_name LIKE '%$q%' OR certificate_domain LIKE '%$q%' OR certificate_description LIKE '%$q%' OR certificate_issued_by LIKE '%$q%' OR client_name LIKE '%$q%') $access_permission_query $client_query ORDER BY $sort $order LIMIT $record_from, $record_to" From c1447f5bad223725a2423bb55c9bd5cd9e568d3d Mon Sep 17 00:00:00 2001 From: johnnyq Date: Tue, 14 Jul 2026 16:08:05 -0400 Subject: [PATCH 020/241] Bump TinyMCE from 8.6.0 to 8.7.0 --- libs/tinymce/icons/default/icons.min.js | 2 +- libs/tinymce/plugins/autolink/plugin.min.js | 2 +- libs/tinymce/plugins/autosave/plugin.min.js | 2 +- libs/tinymce/plugins/codesample/plugin.min.js | 4 ++-- libs/tinymce/plugins/emoticons/plugin.min.js | 2 +- libs/tinymce/plugins/help/plugin.min.js | 2 +- libs/tinymce/plugins/image/plugin.min.js | 2 +- libs/tinymce/plugins/preview/plugin.min.js | 2 +- libs/tinymce/plugins/table/plugin.min.js | 2 +- libs/tinymce/skins/content/dark/content.js | 2 +- libs/tinymce/skins/content/dark/content.min.css | 2 +- libs/tinymce/skins/ui/oxide-dark/content.inline.js | 2 +- .../skins/ui/oxide-dark/content.inline.min.css | 2 +- libs/tinymce/skins/ui/oxide-dark/content.js | 2 +- libs/tinymce/skins/ui/oxide-dark/content.min.css | 2 +- libs/tinymce/skins/ui/oxide-dark/skin.js | 2 +- libs/tinymce/skins/ui/oxide-dark/skin.min.css | 2 +- libs/tinymce/skins/ui/oxide/content.inline.js | 2 +- libs/tinymce/skins/ui/oxide/content.inline.min.css | 2 +- libs/tinymce/skins/ui/oxide/content.js | 2 +- libs/tinymce/skins/ui/oxide/content.min.css | 2 +- libs/tinymce/skins/ui/oxide/skin.js | 2 +- libs/tinymce/skins/ui/oxide/skin.min.css | 2 +- .../skins/ui/tinymce-5-dark/content.inline.js | 2 +- .../skins/ui/tinymce-5-dark/content.inline.min.css | 2 +- libs/tinymce/skins/ui/tinymce-5-dark/content.js | 2 +- libs/tinymce/skins/ui/tinymce-5-dark/content.min.css | 2 +- libs/tinymce/skins/ui/tinymce-5-dark/skin.js | 2 +- libs/tinymce/skins/ui/tinymce-5-dark/skin.min.css | 2 +- libs/tinymce/skins/ui/tinymce-5/content.inline.js | 2 +- .../skins/ui/tinymce-5/content.inline.min.css | 2 +- libs/tinymce/skins/ui/tinymce-5/content.js | 2 +- libs/tinymce/skins/ui/tinymce-5/content.min.css | 2 +- libs/tinymce/skins/ui/tinymce-5/skin.js | 2 +- libs/tinymce/skins/ui/tinymce-5/skin.min.css | 2 +- libs/tinymce/themes/silver/theme.min.js | 4 ++-- libs/tinymce/tinymce.d.ts | 12 +++++++++++- libs/tinymce/tinymce.min.js | 6 +++--- 38 files changed, 52 insertions(+), 42 deletions(-) diff --git a/libs/tinymce/icons/default/icons.min.js b/libs/tinymce/icons/default/icons.min.js index 4880e655a..55d46ee3d 100644 --- a/libs/tinymce/icons/default/icons.min.js +++ b/libs/tinymce/icons/default/icons.min.js @@ -1 +1 @@ -tinymce.IconManager.add("default",{icons:{"accessibility-check":'',"accordion-toggle":'',accordion:'',"action-next":'',"action-prev":'',"add-file":'',addtag:'',"adjust-length":'',adjustments:'',"ai-assistant":'',"ai-chat-response":'',"ai-model":'',"ai-prompt":'',"ai-review":'',"ai-translate":'',ai:'',"align-center":'',"align-justify":'',"align-left":'',"align-none":'',"align-right":'',"alt-text":'',"arrow-left":'',"arrow-right":'',attachment:'',"auto-image-enhancement":'',blur:'',bold:'',bookmark:'',"border-style":'',"border-width":'',box:'',brightness:'',browse:'',camera:'',cancel:'',caption:'',"cell-background-color":'',"cell-border-color":'',"change-case":'',"change-tone":'',"character-count":'',"chat-commands":'',"chat-reasoning":'',"chat-send":'',"chat-web-search":'',"checklist-rtl":'',checklist:'',"checkmark-filled":'',checkmark:'',"chevron-down":'',"chevron-left":'',"chevron-right":'',"chevron-up":'',"close-filled":'',close:'',"code-sample":'',collapse:'',"color-levels":'',"color-picker":'',"color-swatch-remove-color":'',"color-swatch":'',"comment-add":'',comment:'',"continue-writing":'',contrast:'',copy:'',crop:'',"cut-column":'',"cut-row":'',cut:'',"document-gear-properties":'',"document-properties":'',drag:'',dropbox:'',"duplicate-column":'',"duplicate-row":'',duplicate:'',"edit-block":'',"edit-image":'',"embed-page":'',embed:'',emoji:'',evernote:'',explain:'',"export-pdf":'',"export-word":'',export:'',exposure:'',fb:'',feedback:'',fill:'',"fix-grammar":'',flickr:'',"flip-horizontally":'',"flip-vertically":'',folder:'',footnote:'',"format-code":'',"format-painter":'',format:'',fullscreen:'',gallery:'',gamma:'',"google-drive":'',"google-photos":'',grayscale:'',help:'',"highlight-bg-color":'',"highlight-key-points":'',home:'',"horizontal-rule":'',huddle:'',"image-decorative":'',"image-enhancements":'',"image-options":'',image:'',"import-word":'',"improve-writing":'',indent:'',info:'',"insert-character":'',"insert-time":'',instagram:'',invert:'',italic:'',language:'',"line-height":'',line:'',link:'',"list-bull-circle":'',"list-bull-default":'',"list-bull-disc":'',"list-bull-square":'',"list-num-default-rtl":'',"list-num-default":'',"list-num-lower-alpha-rtl":'',"list-num-lower-alpha":'',"list-num-lower-greek-rtl":'',"list-num-lower-greek":'',"list-num-lower-roman-rtl":'',"list-num-lower-roman":'',"list-num-upper-alpha-rtl":'',"list-num-upper-alpha":'',"list-num-upper-roman-rtl":'',"list-num-upper-roman":'',lock:'',ltr:'',"math-equation":'',mentions:'',minus:'',"more-drawer":'',"new-chat":'',"new-document":'',"new-tab":'',"non-breaking":'',notice:'',onedrive:'',"ordered-list-rtl":'',"ordered-list":'',orientation:'',"other-actions":'',outdent:'',"page-break":'',paragraph:'',"paste-column-after":'',"paste-column-before":'',"paste-row-after":'',"paste-row-before":'',"paste-text":'',paste:'',"permanent-pen":'',"photo-filter":'',pin:'',plus:'',preferences:'',preview:'',print:'',quote:'',reasoning:'',redo:'',reload:'',"remove-formatting":'',remove:'',"resize-handle":'',resize:'',"restore-draft":'',"revert-changes":'',"revision-history":'',"rotate-left":'',"rotate-right":'',rtl:'',saturation:'',save:'',search:'',"select-all":'',selected:'',send:'',settings:'',sharpen:'',"source-close":'',"source-file":'',"source-image":'',"source-link":'',"source-selection":'',sourcecode:'',"spell-check":'',stop:'',"strike-through":'',subscript:'',"suggestededits-badge":'',suggestededits:'',summarize:'',superscript:'',"table-caption":'',"table-cell-classes":'',"table-cell-properties":'',"table-cell-select-all":'',"table-cell-select-inner":'',"table-classes":'',"table-delete-column":'',"table-delete-row":'',"table-delete-table":'',"table-insert-column-after":'',"table-insert-column-before":'',"table-insert-row-above":'',"table-insert-row-after":'',"table-left-header":'',"table-merge-cells":'',"table-row-numbering-rtl":'',"table-row-numbering":'',"table-row-properties":'',"table-split-cells":'',"table-top-header":'',table:'',"template-add":'',template:'',"temporary-placeholder":'',"text-color":'',"text-size-decrease":'',"text-size-increase":'',toc:'',"transform-image":'',translate:'',typography:'',underline:'',undo:'',unlink:'',unlock:'',"unordered-list":'',unpin:'',unselected:'',"upload-from-device":'',"upload-from-link":'',upload:'',user:'',"vertical-align":'',vibrance:'',visualblocks:'',visualchars:'',vk:'',warmth:'',warning:'',"web-search":'',"zoom-in":'',"zoom-out":''}}); \ No newline at end of file +tinymce.IconManager.add("default",{icons:{"accessibility-check":'',"accordion-toggle":'',accordion:'',"action-next":'',"action-prev":'',"add-file":'',addtag:'',"adjust-length":'',adjustments:'',"ai-assistant":'',"ai-chat-response":'',"ai-model":'',"ai-prompt":'',"ai-review":'',"ai-translate":'',ai:'',"align-center":'',"align-justify":'',"align-left":'',"align-none":'',"align-right":'',"alt-text":'',"arrow-left":'',"arrow-right":'',attachment:'',"auto-image-enhancement":'',blur:'',bold:'',bookmark:'',"border-style":'',"border-width":'',box:'',brightness:'',browse:'',camera:'',cancel:'',caption:'',"cell-background-color":'',"cell-border-color":'',"change-case":'',"change-tone":'',"character-count":'',"chat-commands":'',"chat-reasoning":'',"chat-send":'',"chat-web-search":'',"checklist-rtl":'',checklist:'',"checkmark-filled":'',checkmark:'',"chevron-down":'',"chevron-left":'',"chevron-right":'',"chevron-up":'',"close-filled":'',close:'',"code-sample":'',collapse:'',"color-levels":'',"color-picker":'',"color-swatch-remove-color":'',"color-swatch":'',"comment-add":'',comment:'',"continue-writing":'',contrast:'',copy:'',crop:'',"cut-column":'',"cut-row":'',cut:'',"document-gear-properties":'',"document-properties":'',drag:'',dropbox:'',"duplicate-column":'',"duplicate-row":'',duplicate:'',"edit-block":'',"edit-image":'',"embed-page":'',embed:'',emoji:'',evernote:'',explain:'',"export-pdf":'',"export-word":'',export:'',exposure:'',fb:'',feedback:'',fill:'',"fix-grammar":'',flickr:'',"flip-horizontally":'',"flip-vertically":'',folder:'',footnote:'',"format-code":'',"format-painter":'',format:'',fullscreen:'',gallery:'',gamma:'',"google-drive":'',"google-photos":'',grayscale:'',help:'',"highlight-bg-color":'',"highlight-key-points":'',home:'',"horizontal-rule":'',huddle:'',"image-decorative":'',"image-enhancements":'',"image-options":'',image:'',"import-word":'',"improve-writing":'',indent:'',info:'',"insert-character":'',"insert-time":'',instagram:'',invert:'',italic:'',language:'',"line-height":'',line:'',link:'',"list-bull-circle":'',"list-bull-default":'',"list-bull-disc":'',"list-bull-square":'',"list-num-default-rtl":'',"list-num-default":'',"list-num-lower-alpha-rtl":'',"list-num-lower-alpha":'',"list-num-lower-greek-rtl":'',"list-num-lower-greek":'',"list-num-lower-roman-rtl":'',"list-num-lower-roman":'',"list-num-upper-alpha-rtl":'',"list-num-upper-alpha":'',"list-num-upper-roman-rtl":'',"list-num-upper-roman":'',lock:'',ltr:'',"math-equation":'',mentions:'',minus:'',"more-drawer":'',"new-chat":'',"new-document":'',"new-tab":'',"non-breaking":'',notice:'',onedrive:'',"ordered-list-rtl":'',"ordered-list":'',orientation:'',"other-actions":'',outdent:'',"page-break":'',paragraph:'',"paste-column-after":'',"paste-column-before":'',"paste-row-after":'',"paste-row-before":'',"paste-text":'',paste:'',"permanent-pen":'',"photo-filter":'',pin:'',plus:'',preferences:'',preview:'',print:'',quote:'',reasoning:'',redo:'',reload:'',"remove-formatting":'',remove:'',"resize-handle":'',resize:'',"restore-draft":'',"revert-changes":'',"revision-history":'',"rotate-left":'',"rotate-right":'',rtl:'',saturation:'',save:'',search:'',"select-all":'',selected:'',send:'',settings:'',sharpen:'',"source-close":'',"source-file":'',"source-image":'',"source-link":'',"source-selection":'',sourcecode:'',"spell-check":'',stop:'',"strike-through":'',subscript:'',"suggestededits-badge":'',"suggestededits-tracking":'',suggestededits:'',summarize:'',superscript:'',"table-caption":'',"table-cell-classes":'',"table-cell-properties":'',"table-cell-select-all":'',"table-cell-select-inner":'',"table-classes":'',"table-delete-column":'',"table-delete-row":'',"table-delete-table":'',"table-insert-column-after":'',"table-insert-column-before":'',"table-insert-row-above":'',"table-insert-row-after":'',"table-left-header":'',"table-merge-cells":'',"table-row-numbering-rtl":'',"table-row-numbering":'',"table-row-properties":'',"table-split-cells":'',"table-top-header":'',table:'',"template-add":'',template:'',"temporary-placeholder":'',"text-color":'',"text-size-decrease":'',"text-size-increase":'',toc:'',"transform-image":'',translate:'',typography:'',underline:'',undo:'',unlink:'',unlock:'',"unordered-list":'',unpin:'',unselected:'',"upload-from-device":'',"upload-from-link":'',upload:'',user:'',"vertical-align":'',vibrance:'',visualblocks:'',visualchars:'',vk:'',warmth:'',warning:'',"web-search":'',"zoom-in":'',"zoom-out":''}}); \ No newline at end of file diff --git a/libs/tinymce/plugins/autolink/plugin.min.js b/libs/tinymce/plugins/autolink/plugin.min.js index 2bf7f2805..4e36c59c5 100644 --- a/libs/tinymce/plugins/autolink/plugin.min.js +++ b/libs/tinymce/plugins/autolink/plugin.min.js @@ -1 +1 @@ -!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>"string"===(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(n=o=e,(r=String).prototype.isPrototypeOf(n)||o.constructor?.name===r.name)?"string":t;var n,o,r})(e);const n=e=>undefined===e;const o=e=>!(e=>null==e)(e),r=Object.hasOwnProperty,a=e=>"\ufeff"===e,s=e=>t=>t.options.get(e),l=s("autolink_pattern"),c=s("link_default_target"),i=s("link_default_protocol"),d=s("allow_unsafe_link_target");var u=tinymce.util.Tools.resolve("tinymce.dom.TextSeeker");const f=e=>3===e.nodeType,g=e=>1===e.nodeType,m=e=>/^[(\[{ \u00a0]$/.test(e),k=(e,t,n)=>{for(let o=t-1;o>=0;o--){const t=e.charAt(o);if(!a(t)&&n(t))return o}return-1},p=(e,t)=>{const o=e.schema.getVoidElements(),a=l(e),{dom:s,selection:c}=e;if(null!==s.getParent(c.getNode(),"a[href]")||e.mode.isReadOnly())return null;const d=c.getRng(),p=u(s,e=>{return s.isBlock(e)||(t=o,n=e.nodeName.toLowerCase(),r.call(t,n))||"false"===s.getContentEditable(e)||null!==s.getParent(e,"a[href]");var t,n}),{container:y,offset:w}=((e,t)=>{let n=e,o=t;for(;g(n)&&n.childNodes[o];)n=n.childNodes[o],o=f(n)?n.data.length:n.childNodes.length;return{container:n,offset:o}})(d.endContainer,d.endOffset),h=s.getParent(y,s.isBlock)??s.getRoot(),_=p.backwards(y,w+t,(e,t)=>{const n=e.data,o=k(n,t,(r=m,e=>!r(e)));var r,a;return-1===o||(a=n[o],/[?!,.;:]/.test(a))?o:o+1},h);if(!_)return null;let v=_.container;const A=p.backwards(_.container,_.offset,(e,t)=>{v=e;const n=k(e.data,t,m);return-1===n?n:n+1},h),C=s.createRng();A?C.setStart(A.container,A.offset):C.setStart(v,0),C.setEnd(_.container,_.offset);const b=C.toString().replace(/\uFEFF/g,"").match(a);if(b){let t=b[0];return $="www.",(P=t).length>=4&&P.substr(0,4)===$?t=i(e)+"://"+t:((e,t,o=0,r)=>{const a=e.indexOf(t,o);return-1!==a&&(!!n(r)||a+t.length<=r)})(t,"@")&&!(e=>/^([A-Za-z][A-Za-z\d.+-]*:\/\/)|mailto:/.test(e))(t)&&(t="mailto:"+t),{rng:C,url:t}}var P,$;return null},y=(e,n)=>{const{dom:o,selection:r}=e,{rng:a,url:s}=n,l=r.getBookmark();r.setRng(a);const i="createlink",u={command:i,ui:!1,value:s};if(!e.dispatch("BeforeExecCommand",u).isDefaultPrevented()){e.getDoc().execCommand(i,!1,s),e.dispatch("ExecCommand",u);const n=c(e);if(t(n)){const t=r.getNode();o.setAttrib(t,"target",n),"_blank"!==n||d(e)||o.setAttrib(t,"rel","noopener")}}r.moveToBookmark(l),e.nodeChanged()},w=e=>{const t=p(e,-1);o(t)&&y(e,t)},h=w;e.add("autolink",e=>{(e=>{const t=e.options.register;t("autolink_pattern",{processor:"regexp",default:new RegExp("^"+/(?:[A-Za-z][A-Za-z\d.+-]{0,14}:\/\/(?:[-.~*+=!&;:'%@?^${}(),\w]+@)?|www\.|[-;:&=+$,.\w]+@)[A-Za-z\d-]+(?:\.[A-Za-z\d-]+)*(?::\d+)?(?:\/(?:[-.~*+=!;:'%@$(),\/\w]*[-~*+=%@$()\/\w])?)?(?:\?(?:[-.~*+=!&;:'%@?^${}(),\/\w]+))?(?:#(?:[-.~*+=!&;:'%@?^${}(),\/\w]+))?/g.source+"$","i")}),t("link_default_target",{processor:"string"}),t("link_default_protocol",{processor:"string",default:"https"})})(e),(e=>{e.on("keydown",t=>{13!==t.keyCode||t.isDefaultPrevented()||(e=>{const t=p(e,0);o(t)&&y(e,t)})(e)}),e.on("keyup",t=>{32===t.keyCode?w(e):(48===t.keyCode&&t.shiftKey||221===t.keyCode)&&h(e)})})(e)})}(); \ No newline at end of file +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>"string"===(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(n=o=e,(r=String).prototype.isPrototypeOf(n)||o.constructor?.name===r.name)?"string":t;var n,o,r})(e);const n=e=>void 0===e;const o=e=>!(e=>null==e)(e),r=Object.hasOwnProperty,a=e=>"\ufeff"===e,s=e=>t=>t.options.get(e),l=s("autolink_pattern"),c=s("link_default_target"),i=s("link_default_protocol"),d=s("allow_unsafe_link_target");var u=tinymce.util.Tools.resolve("tinymce.dom.TextSeeker");const f=e=>3===e.nodeType,g=e=>1===e.nodeType,m=e=>/^[(\[{ \u00a0]$/.test(e),k=(e,t,n)=>{for(let o=t-1;o>=0;o--){const t=e.charAt(o);if(!a(t)&&n(t))return o}return-1},p=(e,t)=>{const o=e.schema.getVoidElements(),a=l(e),{dom:s,selection:c}=e;if(null!==s.getParent(c.getNode(),"a[href]")||e.mode.isReadOnly())return null;const d=c.getRng(),p=u(s,e=>{return s.isBlock(e)||(t=o,n=e.nodeName.toLowerCase(),r.call(t,n))||"false"===s.getContentEditable(e)||null!==s.getParent(e,"a[href]");var t,n}),{container:y,offset:w}=((e,t)=>{let n=e,o=t;for(;g(n)&&n.childNodes[o];)n=n.childNodes[o],o=f(n)?n.data.length:n.childNodes.length;return{container:n,offset:o}})(d.endContainer,d.endOffset),h=s.getParent(y,s.isBlock)??s.getRoot(),_=p.backwards(y,w+t,(e,t)=>{const n=e.data,o=k(n,t,(r=m,e=>!r(e)));var r,a;return-1===o||(a=n[o],/[?!,.;:]/.test(a))?o:o+1},h);if(!_)return null;let v=_.container;const A=p.backwards(_.container,_.offset,(e,t)=>{v=e;const n=k(e.data,t,m);return-1===n?n:n+1},h),C=s.createRng();A?C.setStart(A.container,A.offset):C.setStart(v,0),C.setEnd(_.container,_.offset);const b=C.toString().replace(/\uFEFF/g,"").match(a);if(b){let t=b[0];return $="www.",(P=t).length>=4&&P.substr(0,4)===$?t=i(e)+"://"+t:((e,t,o=0,r)=>{const a=e.indexOf(t,o);return-1!==a&&(!!n(r)||a+t.length<=r)})(t,"@")&&!(e=>/^([A-Za-z][A-Za-z\d.+-]*:\/\/)|mailto:/.test(e))(t)&&(t="mailto:"+t),{rng:C,url:t}}var P,$;return null},y=(e,n)=>{const{dom:o,selection:r}=e,{rng:a,url:s}=n,l=r.getBookmark();r.setRng(a);const i="createlink",u={command:i,ui:!1,value:s};if(!e.dispatch("BeforeExecCommand",u).isDefaultPrevented()){e.getDoc().execCommand(i,!1,s),e.dispatch("ExecCommand",u);const n=c(e);if(t(n)){const t=r.getNode();o.setAttrib(t,"target",n),"_blank"!==n||d(e)||o.setAttrib(t,"rel","noopener")}}r.moveToBookmark(l),e.nodeChanged()},w=e=>{const t=p(e,-1);o(t)&&y(e,t)},h=w;e.add("autolink",e=>{(e=>{const t=e.options.register;t("autolink_pattern",{processor:"regexp",default:new RegExp("^"+/(?:[A-Za-z][A-Za-z\d.+-]{0,14}:\/\/(?:[-.~*+=!&;:'%@?^${}(),\w]+@)?|www\.|[-;:&=+$,.\w]+@)[A-Za-z\d-]+(?:\.[A-Za-z\d-]+)*(?::\d+)?(?:\/(?:[-.~*+=!;:'%@$(),\/\w]*[-~*+=%@$()\/\w])?)?(?:\?(?:[-.~*+=!&;:'%@?^${}(),\/\w]+))?(?:#(?:[-.~*+=!&;:'%@?^${}(),\/\w]+))?/g.source+"$","i")}),t("link_default_target",{processor:"string"}),t("link_default_protocol",{processor:"string",default:"https"})})(e),(e=>{e.on("keydown",t=>{13!==t.keyCode||t.isDefaultPrevented()||(e=>{const t=p(e,0);o(t)&&y(e,t)})(e)}),e.on("keyup",t=>{32===t.keyCode?w(e):(48===t.keyCode&&t.shiftKey||221===t.keyCode)&&h(e)})})(e)})}(); \ No newline at end of file diff --git a/libs/tinymce/plugins/autosave/plugin.min.js b/libs/tinymce/plugins/autosave/plugin.min.js index 3ab020c64..85460dd15 100644 --- a/libs/tinymce/plugins/autosave/plugin.min.js +++ b/libs/tinymce/plugins/autosave/plugin.min.js @@ -1 +1 @@ -!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=t=>"string"===(t=>{const e=typeof t;return null===t?"null":"object"===e&&Array.isArray(t)?"array":"object"===e&&(r=o=t,(a=String).prototype.isPrototypeOf(r)||o.constructor?.name===a.name)?"string":e;var r,o,a})(t);const r=t=>undefined===t;var o=tinymce.util.Tools.resolve("tinymce.util.Delay"),a=tinymce.util.Tools.resolve("tinymce.util.LocalStorage"),s=tinymce.util.Tools.resolve("tinymce.util.Tools");const n=t=>{const e=/^(\d+)([ms]?)$/.exec(t);return(e&&e[2]?{s:1e3,m:6e4}[e[2]]:1)*parseInt(t,10)},i=t=>e=>e.options.get(t),u=i("autosave_ask_before_unload"),c=i("autosave_restore_when_empty"),l=i("autosave_interval"),m=i("autosave_retention"),d=t=>{const e=document.location;return t.options.get("autosave_prefix").replace(/{path}/g,e.pathname).replace(/{query}/g,e.search).replace(/{hash}/g,e.hash).replace(/{id}/g,t.id)},f=(t,e)=>{if(r(e))return t.dom.isEmpty(t.getBody());{const r=s.trim(e);if(""===r)return!0;{const e=(new DOMParser).parseFromString(r,"text/html");return t.dom.isEmpty(e)}}},v=t=>{const e=parseInt(a.getItem(d(t)+"time")??"0",10)||0;return!((new Date).getTime()-e>m(t)&&(p(t,!1),1))},p=(t,e)=>{const r=d(t);a.removeItem(r+"draft"),a.removeItem(r+"time"),!1!==e&&(t=>{t.dispatch("RemoveDraft")})(t)},y=t=>{const e=d(t);!f(t)&&t.isDirty()&&(a.setItem(e+"draft",t.getContent({format:"raw",no_events:!0})),a.setItem(e+"time",(new Date).getTime().toString()),(t=>{t.dispatch("StoreDraft")})(t))},g=t=>{const e=d(t);v(t)&&(t.setContent(a.getItem(e+"draft")??"",{format:"raw"}),(t=>{t.dispatch("RestoreDraft")})(t))};var D=tinymce.util.Tools.resolve("tinymce.EditorManager");const h=t=>e=>{const r=()=>v(t)&&!t.mode.isReadOnly();e.setEnabled(r());const o=()=>e.setEnabled(r());return t.on("StoreDraft RestoreDraft RemoveDraft",o),()=>t.off("StoreDraft RestoreDraft RemoveDraft",o)};t.add("autosave",t=>((t=>{const r=t.options.register,o=t=>{const r=e(t);return r?{value:n(t),valid:r}:{valid:!1,message:"Must be a string."}};r("autosave_ask_before_unload",{processor:"boolean",default:!0}),r("autosave_prefix",{processor:"string",default:"tinymce-autosave-{path}{query}{hash}-{id}-"}),r("autosave_restore_when_empty",{processor:"boolean",default:!1}),r("autosave_interval",{processor:o,default:"30s"}),r("autosave_retention",{processor:o,default:"20m"})})(t),(t=>{t.editorManager.on("BeforeUnload",t=>{let e;s.each(D.get(),t=>{t.plugins.autosave&&t.plugins.autosave.storeDraft(),!e&&t.isDirty()&&u(t)&&(e=t.translate("You have unsaved changes are you sure you want to navigate away?"))}),e&&(t.preventDefault(),t.returnValue=e)})})(t),(t=>{(t=>{const e=l(t);o.setEditorInterval(t,()=>{y(t)},e)})(t);const e=()=>{(t=>{t.undoManager.transact(()=>{g(t),p(t)}),t.focus()})(t)};t.ui.registry.addButton("restoredraft",{tooltip:"Restore last draft",icon:"restore-draft",onAction:e,onSetup:h(t)}),t.ui.registry.addMenuItem("restoredraft",{text:"Restore last draft",icon:"restore-draft",onAction:e,onSetup:h(t)})})(t),t.on("init",()=>{c(t)&&t.dom.isEmpty(t.getBody())&&g(t)}),(t=>({hasDraft:()=>v(t),storeDraft:()=>y(t),restoreDraft:()=>g(t),removeDraft:e=>p(t,e),isEmpty:e=>f(t,e)}))(t)))}(); \ No newline at end of file +!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=t=>"string"===(t=>{const e=typeof t;return null===t?"null":"object"===e&&Array.isArray(t)?"array":"object"===e&&(r=o=t,(a=String).prototype.isPrototypeOf(r)||o.constructor?.name===a.name)?"string":e;var r,o,a})(t);const r=t=>void 0===t;var o=tinymce.util.Tools.resolve("tinymce.util.Delay"),a=tinymce.util.Tools.resolve("tinymce.util.LocalStorage"),s=tinymce.util.Tools.resolve("tinymce.util.Tools");const n=t=>{const e=/^(\d+)([ms]?)$/.exec(t);return(e&&e[2]?{s:1e3,m:6e4}[e[2]]:1)*parseInt(t,10)},i=t=>e=>e.options.get(t),u=i("autosave_ask_before_unload"),c=i("autosave_restore_when_empty"),l=i("autosave_interval"),m=i("autosave_retention"),d=t=>{const e=document.location;return t.options.get("autosave_prefix").replace(/{path}/g,e.pathname).replace(/{query}/g,e.search).replace(/{hash}/g,e.hash).replace(/{id}/g,t.id)},f=(t,e)=>{if(r(e))return t.dom.isEmpty(t.getBody());{const r=s.trim(e);if(""===r)return!0;{const e=(new DOMParser).parseFromString(r,"text/html");return t.dom.isEmpty(e)}}},v=t=>{const e=parseInt(a.getItem(d(t)+"time")??"0",10)||0;return!((new Date).getTime()-e>m(t)&&(p(t,!1),1))},p=(t,e)=>{const r=d(t);a.removeItem(r+"draft"),a.removeItem(r+"time"),!1!==e&&(t=>{t.dispatch("RemoveDraft")})(t)},y=t=>{const e=d(t);!f(t)&&t.isDirty()&&(a.setItem(e+"draft",t.getContent({format:"raw",no_events:!0})),a.setItem(e+"time",(new Date).getTime().toString()),(t=>{t.dispatch("StoreDraft")})(t))},g=t=>{const e=d(t);v(t)&&(t.setContent(a.getItem(e+"draft")??"",{format:"raw"}),(t=>{t.dispatch("RestoreDraft")})(t))};var D=tinymce.util.Tools.resolve("tinymce.EditorManager");const h=t=>e=>{const r=()=>v(t)&&!t.mode.isReadOnly();e.setEnabled(r());const o=()=>e.setEnabled(r());return t.on("StoreDraft RestoreDraft RemoveDraft",o),()=>t.off("StoreDraft RestoreDraft RemoveDraft",o)};t.add("autosave",t=>((t=>{const r=t.options.register,o=t=>{const r=e(t);return r?{value:n(t),valid:r}:{valid:!1,message:"Must be a string."}};r("autosave_ask_before_unload",{processor:"boolean",default:!0}),r("autosave_prefix",{processor:"string",default:"tinymce-autosave-{path}{query}{hash}-{id}-"}),r("autosave_restore_when_empty",{processor:"boolean",default:!1}),r("autosave_interval",{processor:o,default:"30s"}),r("autosave_retention",{processor:o,default:"20m"})})(t),(t=>{t.editorManager.on("BeforeUnload",t=>{let e;s.each(D.get(),t=>{t.plugins.autosave&&t.plugins.autosave.storeDraft(),!e&&t.isDirty()&&u(t)&&(e=t.translate("You have unsaved changes are you sure you want to navigate away?"))}),e&&(t.preventDefault(),t.returnValue=e)})})(t),(t=>{(t=>{const e=l(t);o.setEditorInterval(t,()=>{y(t)},e)})(t);const e=()=>{(t=>{t.undoManager.transact(()=>{g(t),p(t)}),t.focus()})(t)};t.ui.registry.addButton("restoredraft",{tooltip:"Restore last draft",icon:"restore-draft",onAction:e,onSetup:h(t)}),t.ui.registry.addMenuItem("restoredraft",{text:"Restore last draft",icon:"restore-draft",onAction:e,onSetup:h(t)})})(t),t.on("init",()=>{c(t)&&t.dom.isEmpty(t.getBody())&&g(t)}),(t=>({hasDraft:()=>v(t),storeDraft:()=>y(t),restoreDraft:()=>g(t),removeDraft:e=>p(t,e),isEmpty:e=>f(t,e)}))(t)))}(); \ No newline at end of file diff --git a/libs/tinymce/plugins/codesample/plugin.min.js b/libs/tinymce/plugins/codesample/plugin.min.js index c3a1f21bb..70d5e68aa 100644 --- a/libs/tinymce/plugins/codesample/plugin.min.js +++ b/libs/tinymce/plugins/codesample/plugin.min.js @@ -1,4 +1,4 @@ -!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>!(e=>null==e)(e),n=()=>{};class a{tag;value;static singletonNone=new a(!1);constructor(e,t){this.tag=e,this.value=t}static some(e){return new a(!0,e)}static none(){return a.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?a.some(e(this.value)):a.none()}bind(e){return this.tag?e(this.value):a.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:a.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(e??"Called getOrDie on None")}static from(e){return t(e)?a.some(e):a.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}const s="undefined"!=typeof window?window:Function("return this;")(),r=(i=/^\s+|\s+$/g,e=>e.replace(i,""));var i,o=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils");const l=function(){const e=window.Prism;window.Prism={manual:!0};var t=function(e){var t=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,n=0,a={},s={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(t){return t instanceof r?new r(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);x+=_.value.length,_=_.next){var F=_.value;if(t.length>e.length)return;if(!(F instanceof r)){var A,S=1;if(y){if(!(A=i(v,x,e,m))||A.index>=e.length)break;var $=A.index,z=A.index+A[0].length,E=x;for(E+=_.value.length;$>=E;)E+=(_=_.next).value.length;if(x=E-=_.value.length,_.value instanceof r)continue;for(var C=_;C!==t.tail&&(Ed.reach&&(d.reach=O);var P=_.prev;if(B&&(P=u(t,P,B),x+=B.length),c(t,P,S),_=u(t,P,new r(g,f?s.tokenize(j,f):j,w,j)),T&&u(t,_,T),S>1){var N={cause:g+","+b,reach:O};o(e,t,n,_.prev,x,N),d&&N.reach>d.reach&&(d.reach=N.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function u(e,t,n){var a=t.next,s={value:n,prev:t,next:a};return t.next=s,a.prev=s,e.length++,s}function c(e,t,n){for(var a=t.next,s=0;s"+r.content+""},!e.document)return e.addEventListener?(s.disableWorkerMessageHandler||e.addEventListener("message",function(t){var n=JSON.parse(t.data),a=n.language,r=n.code,i=n.immediateClose;e.postMessage(s.highlight(r,s.languages[a],a)),i&&e.close()},!1),s):s;var d=s.util.currentScript();function g(){s.manual||s.highlightAll()}if(d&&(s.filename=d.src,d.hasAttribute("data-manual")&&(s.manual=!0)),!s.manual){var p=document.readyState;"loading"===p||"interactive"===p&&d&&d.defer?document.addEventListener("DOMContentLoaded",g):window.requestAnimationFrame?window.requestAnimationFrame(g):window.setTimeout(g,16)}return s}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{}); +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=e=>!(e=>null==e)(e),n=()=>{};class a{tag;value;static singletonNone=new a(!1);constructor(e,t){this.tag=e,this.value=t}static some(e){return new a(!0,e)}static none(){return a.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?a.some(e(this.value)):a.none()}bind(e){return this.tag?e(this.value):a.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:a.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(e??"Called getOrDie on None")}static from(e){return t(e)?a.some(e):a.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}const s="undefined"!=typeof window?window:Function("return this;")(),r=(i=/^\s+|\s+$/g,e=>e.replace(i,""));var i,o=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils");const l=function(){const e=window.Prism;window.Prism={manual:!0};var t=function(e){var t=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,n=0,a={},s={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(t){return t instanceof r?new r(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);x+=_.value.length,_=_.next){var F=_.value;if(t.length>e.length)return;if(!(F instanceof r)){var A,S=1;if(y){if(!(A=i(v,x,e,f))||A.index>=e.length)break;var $=A.index,z=A.index+A[0].length,E=x;for(E+=_.value.length;$>=E;)E+=(_=_.next).value.length;if(x=E-=_.value.length,_.value instanceof r)continue;for(var C=_;C!==t.tail&&(Ed.reach&&(d.reach=P);var N=_.prev;if(B&&(N=u(t,N,B),x+=B.length),c(t,N,S),_=u(t,N,new r(g,m?s.tokenize(j,m):j,w,j)),T&&u(t,_,T),S>1){var O={cause:g+","+b,reach:P};o(e,t,n,_.prev,x,O),d&&O.reach>d.reach&&(d.reach=O.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function u(e,t,n){var a=t.next,s={value:n,prev:t,next:a};return t.next=s,a.prev=s,e.length++,s}function c(e,t,n){for(var a=t.next,s=0;s"+r.content+""},!e.document)return e.addEventListener?(s.disableWorkerMessageHandler||e.addEventListener("message",function(t){var n=JSON.parse(t.data),a=n.language,r=n.code,i=n.immediateClose;e.postMessage(s.highlight(r,s.languages[a],a)),i&&e.close()},!1),s):s;var d=s.util.currentScript();function g(){s.manual||s.highlightAll()}if(d&&(s.filename=d.src,d.hasAttribute("data-manual")&&(s.manual=!0)),!s.manual){var p=document.readyState;"loading"===p||"interactive"===p&&d&&d.defer?document.addEventListener("DOMContentLoaded",g):window.requestAnimationFrame?window.requestAnimationFrame(g):window.setTimeout(g,16)}return s}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{}); /** * Prism: Lightweight, robust, elegant syntax highlighting * @@ -6,4 +6,4 @@ * @author Lea Verou * @namespace * @public - */return t.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,a,s,r){if(n.language===a){var i=n.tokenStack=[];n.code=n.code.replace(s,function(e){if("function"==typeof r&&!r(e))return e;for(var s,o=i.length;-1!==n.code.indexOf(s=t(a,o));)++o;return i[o]=e,s}),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,a){if(n.language===a&&n.tokenStack){n.grammar=e.languages[a];var s=0,r=Object.keys(n.tokenStack);!function i(o){for(var l=0;l=r.length);l++){var u=o[l];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=r[s],d=n.tokenStack[c],g="string"==typeof u?u:u.content,p=t(a,c),b=g.indexOf(p);if(b>-1){++s;var h=g.substring(0,b),f=new e.Token(a,e.tokenize(d,n.grammar),"language-"+a,d),m=g.substring(b+p.length),y=[];h&&y.push.apply(y,i([h])),y.push(f),m&&y.push.apply(y,i([m])),"string"==typeof u?o.splice.apply(o,[l,1].concat(y)):u.content=y}}else u.content&&i(u.content)}return o}(n.tokens)}}}})}(t),t.languages.c=t.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),t.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),t.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},t.languages.c.string],char:t.languages.c.char,comment:t.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:t.languages.c}}}}),t.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete t.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,function(){return t.source});e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,function(){return t.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,function(){return n})+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(t),function(e){function t(e,t){return e.replace(/<<(\d+)>>/g,function(e,n){return"(?:"+t[+n]+")"})}function n(e,n,a){return RegExp(t(e,n),a||"")}function a(e,t){for(var n=0;n>/g,function(){return"(?:"+e+")"});return e.replace(/<>/g,"[^\\s\\S]")}var s="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",r="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var u=l(r),c=RegExp(l(s+" "+r+" "+i+" "+o)),d=l(r+" "+i+" "+o),g=l(s+" "+r+" "+o),p=a(/<(?:[^<>;=+\-*/%&|^]|<>)*>/.source,2),b=a(/\((?:[^()]|<>)*\)/.source,2),h=/@?\b[A-Za-z_]\w*\b/.source,f=t(/<<0>>(?:\s*<<1>>)?/.source,[h,p]),m=t(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source,[d,f]),y=/\[\s*(?:,\s*)*\]/.source,w=t(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source,[m,y]),k=t(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source,[p,b,y]),v=t(/\(<<0>>+(?:,<<0>>+)+\)/.source,[k]),_=t(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source,[v,m,y]),x={keyword:c,punctuation:/[<>()?,.:[\]]/},F=/'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source,A=/"(?:\\.|[^\\"\r\n])*"/.source,S=/@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source;e.languages.csharp=e.languages.extend("clike",{string:[{pattern:n(/(^|[^$\\])<<0>>/.source,[S]),lookbehind:!0,greedy:!0},{pattern:n(/(^|[^@$\\])<<0>>/.source,[A]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:n(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source,[m]),lookbehind:!0,inside:x},{pattern:n(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source,[h,_]),lookbehind:!0,inside:x},{pattern:n(/(\busing\s+)<<0>>(?=\s*=)/.source,[h]),lookbehind:!0},{pattern:n(/(\b<<0>>\s+)<<1>>/.source,[u,f]),lookbehind:!0,inside:x},{pattern:n(/(\bcatch\s*\(\s*)<<0>>/.source,[m]),lookbehind:!0,inside:x},{pattern:n(/(\bwhere\s+)<<0>>/.source,[h]),lookbehind:!0},{pattern:n(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source,[w]),lookbehind:!0,inside:x},{pattern:n(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source,[_,g,h]),inside:x}],keyword:c,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:n(/([(,]\s*)<<0>>(?=\s*:)/.source,[h]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:n(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source,[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:n(/(\b(?:default|sizeof|typeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source,[b]),lookbehind:!0,alias:"class-name",inside:x},"return-type":{pattern:n(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source,[_,m]),inside:x,alias:"class-name"},"constructor-invocation":{pattern:n(/(\bnew\s+)<<0>>(?=\s*[[({])/.source,[_]),lookbehind:!0,inside:x,alias:"class-name"},"generic-method":{pattern:n(/<<0>>\s*<<1>>(?=\s*\()/.source,[h,p]),inside:{function:n(/^<<0>>/.source,[h]),generic:{pattern:RegExp(p),alias:"class-name",inside:x}}},"type-list":{pattern:n(/\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source,[u,f,h,_,c.source,b,/\bnew\s*\(\s*\)/.source]),lookbehind:!0,inside:{"record-arguments":{pattern:n(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source,[f,b]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:c,"class-name":{pattern:RegExp(_),greedy:!0,inside:x},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var $=A+"|"+F,z=t(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source,[$]),E=a(t(/[^"'/()]|<<0>>|\(<>*\)/.source,[z]),2),C=/\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source,j=t(/<<0>>(?:\s*\(<<1>>*\))?/.source,[m,E]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:n(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source,[C,j]),lookbehind:!0,greedy:!0,inside:{target:{pattern:n(/^<<0>>(?=\s*:)/.source,[C]),alias:"keyword"},"attribute-arguments":{pattern:n(/\(<<0>>*\)/.source,[E]),inside:e.languages.csharp},"class-name":{pattern:RegExp(m),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var B=/:[^}\r\n]+/.source,T=a(t(/[^"'/()]|<<0>>|\(<>*\)/.source,[z]),2),O=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[T,B]),P=a(t(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<>*\)/.source,[$]),2),N=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[P,B]);function R(t,a){return{interpolation:{pattern:n(/((?:^|[^{])(?:\{\{)*)<<0>>/.source,[t]),lookbehind:!0,inside:{"format-string":{pattern:n(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source,[a,B]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:n(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source,[O]),lookbehind:!0,greedy:!0,inside:R(O,T)},{pattern:n(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source,[N]),lookbehind:!0,greedy:!0,inside:R(N,P)}],char:{pattern:RegExp(F),greedy:!0}}),e.languages.dotnet=e.languages.cs=e.languages.csharp}(t),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+t.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(t),function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,a={pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[a,{pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:a.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+n+/[A-Z]\w*\b/.source),lookbehind:!0,inside:a.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":a,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+n+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:a.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+n+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:a.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,function(){return t.source})),lookbehind:!0,inside:{punctuation:/\./}}})}(t),t.languages.javascript=t.languages.extend("clike",{"class-name":[t.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),t.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,t.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:t.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:t.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:t.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:t.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:t.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),t.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:t.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),t.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),t.languages.markup&&(t.languages.markup.tag.addInlined("script","javascript"),t.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),t.languages.js=t.languages.javascript,t.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},t.languages.markup.tag.inside["attr-value"].inside.entity=t.languages.markup.entity,t.languages.markup.doctype.inside["internal-subset"].inside=t.languages.markup,t.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Object.defineProperty(t.languages.markup.tag,"addInlined",{value:function(e,n){var a={};a["language-"+n]={pattern:/(^$)/i,lookbehind:!0,inside:t.languages[n]},a.cdata=/^$/i;var s={"included-cdata":{pattern://i,inside:a}};s["language-"+n]={pattern:/[\s\S]+/,inside:t.languages[n]};var r={};r[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:s},t.languages.insertBefore("markup","cdata",r)}}),Object.defineProperty(t.languages.markup.tag,"addAttribute",{value:function(e,n){t.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[n,"language-"+n],inside:t.languages[n]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),t.languages.html=t.languages.markup,t.languages.mathml=t.languages.markup,t.languages.svg=t.languages.markup,t.languages.xml=t.languages.extend("markup",{}),t.languages.ssml=t.languages.xml,t.languages.atom=t.languages.xml,t.languages.rss=t.languages.xml,function(e){var t=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,n=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],a=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,s=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,r=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:t,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:a,operator:s,punctuation:r};var i={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},o=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:i}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:i}}];e.languages.insertBefore("php","variable",{string:o,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:t,string:o,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,number:a,operator:s,punctuation:r}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",function(t){/<\?/.test(t.code)&&e.languages["markup-templating"].buildPlaceholders(t,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)}),e.hooks.add("after-tokenize",function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"php")})}(t),t.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},t.languages.python["string-interpolation"].inside.interpolation.inside.rest=t.languages.python,t.languages.py=t.languages.python,function(e){e.languages.ruby=e.languages.extend("clike",{comment:{pattern:/#.*|^=begin\s[\s\S]*?^=end/m,greedy:!0},"class-name":{pattern:/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===||[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),e.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var t={pattern:/((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:e.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete e.languages.ruby.function;var n="(?:"+[/([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source,/\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source,/<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source].join("|")+")",a=/(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source;e.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp(/%r/.source+n+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp(/(^|[^:]):/.source+a),lookbehind:!0,greedy:!0},{pattern:RegExp(/([\r\n{(,][ \t]*)/.source+a+/(?=:(?!:))/.source),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),e.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp(/%[qQiIwWs]?/.source+n),greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp(/%x/.source+n),greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete e.languages.ruby.string,e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),e.languages.rb=e.languages.ruby}(t),window.Prism=e,t}(),u=e=>t=>t.options.get(e),c=u("codesample_languages"),d=u("codesample_global_prismjs"),g=e=>s.Prism&&d(e)?s.Prism:l,p=e=>t(e)&&"PRE"===e.nodeName&&-1!==e.className.indexOf("language-"),b=e=>{const t=e.selection?e.selection.getNode():null;return p(t)?a.some(t):a.none()},h=e=>{const t=(e=>c(e)||[{text:"HTML/XML",value:"markup"},{text:"JavaScript",value:"javascript"},{text:"CSS",value:"css"},{text:"PHP",value:"php"},{text:"Ruby",value:"ruby"},{text:"Python",value:"python"},{text:"Java",value:"java"},{text:"C",value:"c"},{text:"C#",value:"csharp"},{text:"C++",value:"cpp"}])(e),n=(s=t,(e=>0"",e=>e.value);var s;const r=((e,t)=>b(e).fold(()=>t,e=>{const n=e.className.match(/language-(\w+)/);return n?n[1]:t}))(e,n),i=(e=>b(e).bind(e=>a.from(e.textContent)).getOr(""))(e);e.windowManager.open({title:"Insert/Edit Code Sample",size:"large",body:{type:"panel",items:[{type:"listbox",name:"language",label:"Language",items:t},{type:"textarea",name:"code",label:"Code view",spellcheck:!1}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{language:r,code:i},onSubmit:t=>{const n=t.getData();((e,t,n)=>{const a=e.dom;e.undoManager.transact(()=>{const s=b(e);return n=o.DOM.encode(n),s.fold(()=>{e.insertContent('

'+n+"
");const s=a.select("#__new")[0];a.setAttrib(s,"id",null),e.selection.select(s)},s=>{a.setAttrib(s,"class","language-"+t),s.innerHTML=n,g(e).highlightElement(s),e.selection.select(s)})})})(e,n.language,n.code),t.close()}})};var f=tinymce.util.Tools.resolve("tinymce.util.Tools");const m=(e,t=n)=>n=>{const a=()=>{n.setEnabled(e.selection.isEditable()),t(n)};return e.on("NodeChange",a),a(),()=>{e.off("NodeChange",a)}};e.add("codesample",e=>{(e=>{const t=e.options.register;t("codesample_languages",{processor:"object[]"}),t("codesample_global_prismjs",{processor:"boolean",default:!1})})(e),(e=>{e.on("PreProcess",t=>{const n=e.dom,a=n.select("pre[contenteditable=false]",t.node);f.each(f.grep(a,p),e=>{const t=e.textContent;let a;for(n.setAttrib(e,"class",r(n.getAttrib(e,"class"))),n.setAttrib(e,"contentEditable",null),n.setAttrib(e,"data-mce-highlighted",null);a=e.firstChild;)e.removeChild(a);n.add(e,"code").textContent=t})}),e.on("SetContent",()=>{const t=e.dom,n=f.grep(t.select("pre"),e=>p(e)&&"true"!==t.getAttrib(e,"data-mce-highlighted"));n.length&&e.undoManager.transact(()=>{f.each(n,n=>{f.each(t.select("br",n),n=>{t.replace(e.getDoc().createTextNode("\n"),n)}),n.innerHTML=t.encode(n.textContent??""),g(e).highlightElement(n),t.setAttrib(n,"data-mce-highlighted",!0),n.className=r(n.className)})})}),e.on("PreInit",()=>{e.parser.addNodeFilter("pre",e=>{for(let t=0,n=e.length;t{const t=()=>e.execCommand("codesample");e.ui.registry.addToggleButton("codesample",{icon:"code-sample",tooltip:"Insert/edit code sample",onAction:t,onSetup:m(e,t=>{t.setActive((e=>{const t=e.selection.getStart();return e.dom.is(t,'pre[class*="language-"]')})(e))})}),e.ui.registry.addMenuItem("codesample",{text:"Code sample...",icon:"code-sample",onAction:t,onSetup:m(e)})})(e),(e=>{e.addCommand("codesample",()=>{const t=e.selection.getNode();e.selection.isCollapsed()||p(t)?h(e):e.formatter.toggle("code")})})(e),e.on("dblclick",t=>{p(t.target)&&h(e)})})}(); \ No newline at end of file + */return t.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,a,s,r){if(n.language===a){var i=n.tokenStack=[];n.code=n.code.replace(s,function(e){if("function"==typeof r&&!r(e))return e;for(var s,o=i.length;-1!==n.code.indexOf(s=t(a,o));)++o;return i[o]=e,s}),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,a){if(n.language===a&&n.tokenStack){n.grammar=e.languages[a];var s=0,r=Object.keys(n.tokenStack);!function i(o){for(var l=0;l=r.length);l++){var u=o[l];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=r[s],d=n.tokenStack[c],g="string"==typeof u?u:u.content,p=t(a,c),b=g.indexOf(p);if(b>-1){++s;var h=g.substring(0,b),m=new e.Token(a,e.tokenize(d,n.grammar),"language-"+a,d),f=g.substring(b+p.length),y=[];h&&y.push.apply(y,i([h])),y.push(m),f&&y.push.apply(y,i([f])),"string"==typeof u?o.splice.apply(o,[l,1].concat(y)):u.content=y}}else u.content&&i(u.content)}return o}(n.tokens)}}}})}(t),t.languages.c=t.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),t.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),t.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},t.languages.c.string],char:t.languages.c.char,comment:t.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:t.languages.c}}}}),t.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete t.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,function(){return t.source});e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,function(){return t.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,function(){return n})+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(t),function(e){function t(e,t){return e.replace(/<<(\d+)>>/g,function(e,n){return"(?:"+t[+n]+")"})}function n(e,n,a){return RegExp(t(e,n),a||"")}function a(e,t){for(var n=0;n>/g,function(){return"(?:"+e+")"});return e.replace(/<>/g,"[^\\s\\S]")}var s="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",r="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",o="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var u=l(r),c=RegExp(l(s+" "+r+" "+i+" "+o)),d=l(r+" "+i+" "+o),g=l(s+" "+r+" "+o),p=a(/<(?:[^<>;=+\-*/%&|^]|<>)*>/.source,2),b=a(/\((?:[^()]|<>)*\)/.source,2),h=/@?\b[A-Za-z_]\w*\b/.source,m=t(/<<0>>(?:\s*<<1>>)?/.source,[h,p]),f=t(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source,[d,m]),y=/\[\s*(?:,\s*)*\]/.source,w=t(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source,[f,y]),k=t(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source,[p,b,y]),v=t(/\(<<0>>+(?:,<<0>>+)+\)/.source,[k]),_=t(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source,[v,f,y]),x={keyword:c,punctuation:/[<>()?,.:[\]]/},F=/'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source,A=/"(?:\\.|[^\\"\r\n])*"/.source,S=/@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source;e.languages.csharp=e.languages.extend("clike",{string:[{pattern:n(/(^|[^$\\])<<0>>/.source,[S]),lookbehind:!0,greedy:!0},{pattern:n(/(^|[^@$\\])<<0>>/.source,[A]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:n(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source,[f]),lookbehind:!0,inside:x},{pattern:n(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source,[h,_]),lookbehind:!0,inside:x},{pattern:n(/(\busing\s+)<<0>>(?=\s*=)/.source,[h]),lookbehind:!0},{pattern:n(/(\b<<0>>\s+)<<1>>/.source,[u,m]),lookbehind:!0,inside:x},{pattern:n(/(\bcatch\s*\(\s*)<<0>>/.source,[f]),lookbehind:!0,inside:x},{pattern:n(/(\bwhere\s+)<<0>>/.source,[h]),lookbehind:!0},{pattern:n(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source,[w]),lookbehind:!0,inside:x},{pattern:n(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source,[_,g,h]),inside:x}],keyword:c,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:n(/([(,]\s*)<<0>>(?=\s*:)/.source,[h]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:n(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source,[h]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:n(/(\b(?:default|sizeof|typeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source,[b]),lookbehind:!0,alias:"class-name",inside:x},"return-type":{pattern:n(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source,[_,f]),inside:x,alias:"class-name"},"constructor-invocation":{pattern:n(/(\bnew\s+)<<0>>(?=\s*[[({])/.source,[_]),lookbehind:!0,inside:x,alias:"class-name"},"generic-method":{pattern:n(/<<0>>\s*<<1>>(?=\s*\()/.source,[h,p]),inside:{function:n(/^<<0>>/.source,[h]),generic:{pattern:RegExp(p),alias:"class-name",inside:x}}},"type-list":{pattern:n(/\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source,[u,m,h,_,c.source,b,/\bnew\s*\(\s*\)/.source]),lookbehind:!0,inside:{"record-arguments":{pattern:n(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source,[m,b]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:c,"class-name":{pattern:RegExp(_),greedy:!0,inside:x},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var $=A+"|"+F,z=t(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source,[$]),E=a(t(/[^"'/()]|<<0>>|\(<>*\)/.source,[z]),2),C=/\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source,j=t(/<<0>>(?:\s*\(<<1>>*\))?/.source,[f,E]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:n(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source,[C,j]),lookbehind:!0,greedy:!0,inside:{target:{pattern:n(/^<<0>>(?=\s*:)/.source,[C]),alias:"keyword"},"attribute-arguments":{pattern:n(/\(<<0>>*\)/.source,[E]),inside:e.languages.csharp},"class-name":{pattern:RegExp(f),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var B=/:[^}\r\n]+/.source,T=a(t(/[^"'/()]|<<0>>|\(<>*\)/.source,[z]),2),P=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[T,B]),N=a(t(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<>*\)/.source,[$]),2),O=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[N,B]);function R(t,a){return{interpolation:{pattern:n(/((?:^|[^{])(?:\{\{)*)<<0>>/.source,[t]),lookbehind:!0,inside:{"format-string":{pattern:n(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source,[a,B]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:n(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source,[P]),lookbehind:!0,greedy:!0,inside:R(P,T)},{pattern:n(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source,[O]),lookbehind:!0,greedy:!0,inside:R(O,N)}],char:{pattern:RegExp(F),greedy:!0}}),e.languages.dotnet=e.languages.cs=e.languages.csharp}(t),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+t.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(t),function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,a={pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[a,{pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:a.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+n+/[A-Z]\w*\b/.source),lookbehind:!0,inside:a.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":a,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+n+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:a.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+n+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:a.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,function(){return t.source})),lookbehind:!0,inside:{punctuation:/\./}}})}(t),t.languages.javascript=t.languages.extend("clike",{"class-name":[t.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),t.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,t.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:t.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:t.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:t.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:t.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:t.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),t.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:t.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),t.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),t.languages.markup&&(t.languages.markup.tag.addInlined("script","javascript"),t.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),t.languages.js=t.languages.javascript,t.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},t.languages.markup.tag.inside["attr-value"].inside.entity=t.languages.markup.entity,t.languages.markup.doctype.inside["internal-subset"].inside=t.languages.markup,t.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Object.defineProperty(t.languages.markup.tag,"addInlined",{value:function(e,n){var a={};a["language-"+n]={pattern:/(^$)/i,lookbehind:!0,inside:t.languages[n]},a.cdata=/^$/i;var s={"included-cdata":{pattern://i,inside:a}};s["language-"+n]={pattern:/[\s\S]+/,inside:t.languages[n]};var r={};r[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:s},t.languages.insertBefore("markup","cdata",r)}}),Object.defineProperty(t.languages.markup.tag,"addAttribute",{value:function(e,n){t.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[n,"language-"+n],inside:t.languages[n]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),t.languages.html=t.languages.markup,t.languages.mathml=t.languages.markup,t.languages.svg=t.languages.markup,t.languages.xml=t.languages.extend("markup",{}),t.languages.ssml=t.languages.xml,t.languages.atom=t.languages.xml,t.languages.rss=t.languages.xml,function(e){var t=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,n=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],a=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,s=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,r=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:t,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:a,operator:s,punctuation:r};var i={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},o=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:i}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:i}}];e.languages.insertBefore("php","variable",{string:o,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:t,string:o,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,number:a,operator:s,punctuation:r}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",function(t){/<\?/.test(t.code)&&e.languages["markup-templating"].buildPlaceholders(t,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)}),e.hooks.add("after-tokenize",function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"php")})}(t),t.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},t.languages.python["string-interpolation"].inside.interpolation.inside.rest=t.languages.python,t.languages.py=t.languages.python,function(e){e.languages.ruby=e.languages.extend("clike",{comment:{pattern:/#.*|^=begin\s[\s\S]*?^=end/m,greedy:!0},"class-name":{pattern:/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===||[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),e.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var t={pattern:/((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:e.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete e.languages.ruby.function;var n="(?:"+[/([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source,/\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source,/<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source].join("|")+")",a=/(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source;e.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp(/%r/.source+n+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp(/(^|[^:]):/.source+a),lookbehind:!0,greedy:!0},{pattern:RegExp(/([\r\n{(,][ \t]*)/.source+a+/(?=:(?!:))/.source),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),e.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp(/%[qQiIwWs]?/.source+n),greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp(/%x/.source+n),greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete e.languages.ruby.string,e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),e.languages.rb=e.languages.ruby}(t),window.Prism=e,t}(),u=e=>t=>t.options.get(e),c=u("codesample_languages"),d=u("codesample_global_prismjs"),g=e=>s.Prism&&d(e)?s.Prism:l,p=e=>t(e)&&"PRE"===e.nodeName&&-1!==e.className.indexOf("language-"),b=e=>{const t=e.selection?e.selection.getNode():null;return p(t)?a.some(t):a.none()},h=e=>{const t=(e=>c(e)||[{text:"HTML/XML",value:"markup"},{text:"JavaScript",value:"javascript"},{text:"CSS",value:"css"},{text:"PHP",value:"php"},{text:"Ruby",value:"ruby"},{text:"Python",value:"python"},{text:"Java",value:"java"},{text:"C",value:"c"},{text:"C#",value:"csharp"},{text:"C++",value:"cpp"}])(e),n=(s=t,(e=>0"",e=>e.value);var s;const r=((e,t)=>b(e).fold(()=>t,e=>{const n=e.className.match(/language-(\w+)/);return n?n[1]:t}))(e,n),i=(e=>b(e).bind(e=>a.from(e.textContent)).getOr(""))(e);e.windowManager.open({title:"Insert/Edit Code Sample",size:"large",body:{type:"panel",items:[{type:"listbox",name:"language",label:"Language",items:t},{type:"textarea",name:"code",label:"Code view",spellcheck:!1}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{language:r,code:i},onSubmit:t=>{const n=t.getData();((e,t,n)=>{const a=e.dom;e.undoManager.transact(()=>{const s=b(e);return n=o.DOM.encode(n),s.fold(()=>{e.insertContent('
'+n+"
");const s=a.select("#__new")[0];a.setAttrib(s,"id",null),e.selection.select(s)},s=>{a.setAttrib(s,"class","language-"+t),s.innerHTML=n,g(e).highlightElement(s),e.selection.select(s)})})})(e,n.language,n.code),t.close()}})};var m=tinymce.util.Tools.resolve("tinymce.util.Tools");const f=(e,t=n)=>n=>{const a=()=>{n.setEnabled(e.selection.isEditable()),t(n)};return e.on("NodeChange",a),a(),()=>{e.off("NodeChange",a)}};e.add("codesample",e=>{(e=>{const t=e.options.register;t("codesample_languages",{processor:"object[]"}),t("codesample_global_prismjs",{processor:"boolean",default:!1})})(e),(e=>{e.on("PreProcess",t=>{const n=e.dom,a=n.select("pre[contenteditable=false]",t.node);m.each(m.grep(a,p),e=>{const t=e.textContent;let a;for(n.setAttrib(e,"class",r(n.getAttrib(e,"class"))),n.setAttrib(e,"contentEditable",null),n.setAttrib(e,"data-mce-highlighted",null);a=e.firstChild;)e.removeChild(a);n.add(e,"code").textContent=t})}),e.on("SetContent",()=>{const t=e.dom,n=m.grep(t.select("pre"),e=>p(e)&&"true"!==t.getAttrib(e,"data-mce-highlighted"));n.length&&e.undoManager.transact(()=>{m.each(n,n=>{m.each(t.select("br",n),n=>{t.replace(e.getDoc().createTextNode("\n"),n)}),n.innerHTML=t.encode(n.textContent??""),g(e).highlightElement(n),t.setAttrib(n,"data-mce-highlighted",!0),n.className=r(n.className)})})}),e.on("PreInit",()=>{e.parser.addNodeFilter("pre",e=>{for(let t=0,n=e.length;t{const t=()=>e.execCommand("codesample");e.ui.registry.addToggleButton("codesample",{icon:"code-sample",tooltip:"Insert/edit code sample",onAction:t,onSetup:f(e,t=>{t.setActive((e=>{const t=e.selection.getStart();return e.dom.is(t,'pre[class*="language-"]')})(e))})}),e.ui.registry.addMenuItem("codesample",{text:"Code sample...",icon:"code-sample",onAction:t,onSetup:f(e)})})(e),(e=>{e.addCommand("codesample",()=>{const t=e.selection.getNode();e.selection.isCollapsed()||p(t)?h(e):e.formatter.toggle("code")})})(e),e.on("dblclick",t=>{p(t.target)&&h(e)})})}(); \ No newline at end of file diff --git a/libs/tinymce/plugins/emoticons/plugin.min.js b/libs/tinymce/plugins/emoticons/plugin.min.js index bb09395a9..91779805a 100644 --- a/libs/tinymce/plugins/emoticons/plugin.min.js +++ b/libs/tinymce/plugins/emoticons/plugin.min.js @@ -1 +1 @@ -!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=t=>e=>t===e,o=e(null),n=e(void 0),s=t=>"function"==typeof t;const r=()=>{},a=()=>!1;class i{tag;value;static singletonNone=new i(!1);constructor(t,e){this.tag=t,this.value=e}static some(t){return new i(!0,t)}static none(){return i.singletonNone}fold(t,e){return this.tag?e(this.value):t()}isSome(){return this.tag}isNone(){return!this.tag}map(t){return this.tag?i.some(t(this.value)):i.none()}bind(t){return this.tag?t(this.value):i.none()}exists(t){return this.tag&&t(this.value)}forall(t){return!this.tag||t(this.value)}filter(t){return!this.tag||t(this.value)?this:i.none()}getOr(t){return this.tag?this.value:t}or(t){return this.tag?this:t}getOrThunk(t){return this.tag?this.value:t()}orThunk(t){return this.tag?this:t()}getOrDie(t){if(this.tag)return this.value;throw new Error(t??"Called getOrDie on None")}static from(t){return null==t?i.none():i.some(t)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(t){this.tag&&t(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}Array.prototype.slice;const l=(t,e)=>{const o=t.length,n=new Array(o);for(let s=0;s{const o=c(t);for(let n=0,s=o.length;nu.call(t,e),d=t=>{let e=t;return{get:()=>e,set:t=>{e=t}}},h=(p=(t,e)=>e,(...t)=>{if(0===t.length)throw new Error("Can't merge zero objects");const e={};for(let o=0;o{const t=(t=>{const e=d(i.none()),o=()=>e.get().each(t);return{clear:()=>{o(),e.set(i.none())},isSet:()=>e.get().isSome(),get:()=>e.get(),set:t=>{o(),e.set(i.some(t))}}})(r);return{...t,on:e=>t.get().each(e)}},f=(t,e,o=0,s)=>{const r=t.indexOf(e,o);return-1!==r&&(!!n(s)||r+e.length<=s)};var v=tinymce.util.Tools.resolve("tinymce.Resource");const b=t=>e=>e.options.get(t),w=b("emoticons_database"),j=b("emoticons_database_url"),C=b("emoticons_database_id"),_=b("emoticons_append"),A=b("emoticons_images_url"),k="All",O={symbols:"Symbols",people:"People",animals_and_nature:"Animals and Nature",food_and_drink:"Food and Drink",activity:"Activity",travel_and_places:"Travel and Places",objects:"Objects",flags:"Flags",user:"User Defined"},x=(t,e)=>m(t,e)?t[e]:e,E=t=>{const e=_(t);return o=t=>({keywords:[],category:"user",...t}),((t,e)=>{const o={};return g(t,(t,n)=>{const s=e(t,n);o[s.k]=s.v}),o})(e,(t,e)=>({k:e,v:o(t)}));var o},L=(t,e)=>f(t.title.toLowerCase(),e)||((t,e)=>{for(let o=0,n=t.length;of(t.toLowerCase(),e)),S=(t,e,o)=>{const n=[],s=e.toLowerCase(),r=o.fold(()=>a,t=>e=>e>=t);for(let o=0;o{const n={pattern:"",results:S(e.listAll(),"",i.some(300))},s=d(k),r=(t=>{let e=null;const n=()=>{o(e)||(clearTimeout(e),e=null)};return{cancel:n,throttle:(...o)=>{n(),e=setTimeout(()=>{e=null,t.apply(null,o)},200)}}})(t=>{(t=>{const o=t.getData(),n=s.get(),r=e.listCategory(n),a=S(r,o[N],n===k?i.some(300):i.none());t.setData({results:a})})(t)}),a={label:"Search",type:"input",name:N},c={type:"collection",name:"results"},u=()=>({title:"Emojis",size:"normal",body:{type:"tabpanel",tabs:l(e.listCategories(),t=>({title:t,name:t,items:[a,c]}))},initialData:n,onTabChange:(t,e)=>{s.set(e.newTabName),r.throttle(t)},onChange:r.throttle,onAction:(e,o)=>{"results"===o.name&&(((t,e)=>{t.insertContent(e)})(t,o.value),e.close())},buttons:[{type:"cancel",text:"Close",primary:!0}]}),g=t.windowManager.open(u());g.focus(N),e.hasLoaded()||(g.block("Loading emojis..."),e.waitForLoad().then(()=>{g.redial(u()),r.throttle(g),g.focus(N),g.unblock()}).catch(t=>{g.redial({title:"Emojis",body:{type:"panel",items:[{type:"alertbanner",level:"error",icon:"warning",text:"Could not load emojis"}]},buttons:[{type:"cancel",text:"Close",primary:!0}],initialData:{pattern:"",results:[]}}),g.focus(N),g.unblock()}))},D=t=>e=>{const o=()=>{e.setEnabled(t.selection.isEditable())};return t.on("NodeChange",o),o(),()=>{t.off("NodeChange",o)}};t.add("emoticons",(t,e)=>{((t,e)=>{const o=t.options.register;o("emoticons_database",{processor:"string",default:"emojis"}),o("emoticons_database_url",{processor:"string",default:`${e}/js/${w(t)}${t.suffix}.js`}),o("emoticons_database_id",{processor:"string",default:"tinymce.plugins.emoticons"}),o("emoticons_append",{processor:"object",default:{}}),o("emoticons_images_url",{processor:"string",default:"https://cdnjs.cloudflare.com/ajax/libs/twemoji/15.1.0/72x72/"})})(t,e);const o=((t,e,o)=>{const n=y(),s=y(),r=A(t),a=t=>{return o="=4&&e.substr(0,4)===o?t.char.replace(/src="([^"]+)"/,(t,e)=>`src="${r}${e}"`):t.char;var e,o};t.on("init",()=>{v.load(o,e).then(e=>{const o=E(t);(t=>{const e={},o=[];g(t,(t,n)=>{const s={title:n,keywords:t.keywords,char:a(t),category:x(O,t.category)},r=void 0!==e[s.category]?e[s.category]:[];e[s.category]=r.concat([s]),o.push(s)}),n.set(e),s.set(o)})(h(e,o))},t=>{console.log(`Failed to load emojis: ${t}`),n.set({}),s.set([])})});const l=()=>s.get().getOr([]),u=()=>n.isSet()&&s.isSet();return{listCategories:()=>[k].concat(c(n.get().getOr({}))),hasLoaded:u,waitForLoad:()=>u()?Promise.resolve(!0):new Promise((t,o)=>{let n=15;const s=setInterval(()=>{u()?(clearInterval(s),t(!0)):(n--,n<0&&(console.log("Could not load emojis from url: "+e),clearInterval(s),o(!1)))},100)}),listAll:l,listCategory:t=>t===k?l():n.get().bind(e=>i.from(e[t])).getOr([])}})(t,j(t),C(t));return((t,e)=>{t.addCommand("mceEmoticons",()=>T(t,e))})(t,o),(t=>{const e=()=>t.execCommand("mceEmoticons");t.ui.registry.addButton("emoticons",{tooltip:"Emojis",icon:"emoji",onAction:e,onSetup:D(t)}),t.ui.registry.addMenuItem("emoticons",{text:"Emojis...",icon:"emoji",onAction:e,onSetup:D(t)})})(t),((t,e)=>{t.ui.registry.addAutocompleter("emoticons",{trigger:":",columns:"auto",minChars:2,fetch:(t,o)=>e.waitForLoad().then(()=>{const n=e.listAll();return S(n,t,i.some(o))}),onAction:(e,o,n)=>{t.selection.setRng(o),t.insertContent(n),e.hide()}})})(t,o),(t=>{t.on("PreInit",()=>{t.parser.addAttributeFilter("data-emoticon",t=>{((t,e)=>{for(let o=0,n=t.length;o{t.attr("data-mce-resize","false"),t.attr("data-mce-placeholder","1")})})})})(t),{getAllEmojis:()=>o.waitForLoad().then(()=>o.listAll())}})}(); \ No newline at end of file +!function(){"use strict";var t=tinymce.util.Tools.resolve("tinymce.PluginManager");const e=t=>e=>t===e,o=e(null),n=e(void 0),s=t=>"function"==typeof t;const r=()=>{};class a{tag;value;static singletonNone=new a(!1);constructor(t,e){this.tag=t,this.value=e}static some(t){return new a(!0,t)}static none(){return a.singletonNone}fold(t,e){return this.tag?e(this.value):t()}isSome(){return this.tag}isNone(){return!this.tag}map(t){return this.tag?a.some(t(this.value)):a.none()}bind(t){return this.tag?t(this.value):a.none()}exists(t){return this.tag&&t(this.value)}forall(t){return!this.tag||t(this.value)}filter(t){return!this.tag||t(this.value)?this:a.none()}getOr(t){return this.tag?this.value:t}or(t){return this.tag?this:t}getOrThunk(t){return this.tag?this.value:t()}orThunk(t){return this.tag?this:t()}getOrDie(t){if(this.tag)return this.value;throw new Error(t??"Called getOrDie on None")}static from(t){return null==t?a.none():a.some(t)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(t){this.tag&&t(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}Array.prototype.slice;const i=(t,e)=>{const o=t.length,n=new Array(o);for(let s=0;s{const o=l(t);for(let n=0,s=o.length;nc.call(t,e),m=t=>{let e=t;return{get:()=>e,set:t=>{e=t}}},d=(h=(t,e)=>e,(...t)=>{if(0===t.length)throw new Error("Can't merge zero objects");const e={};for(let o=0;o{const t=(t=>{const e=m(a.none()),o=()=>e.get().each(t);return{clear:()=>{o(),e.set(a.none())},isSet:()=>e.get().isSome(),get:()=>e.get(),set:t=>{o(),e.set(a.some(t))}}})(r);return{...t,on:e=>t.get().each(e)}},y=(t,e,o=0,s)=>{const r=t.indexOf(e,o);return-1!==r&&(!!n(s)||r+e.length<=s)};var f=tinymce.util.Tools.resolve("tinymce.Resource");const v=t=>e=>e.options.get(t),b=v("emoticons_database"),w=v("emoticons_database_url"),j=v("emoticons_database_id"),C=v("emoticons_append"),_=v("emoticons_images_url"),A="All",k={symbols:"Symbols",people:"People",animals_and_nature:"Animals and Nature",food_and_drink:"Food and Drink",activity:"Activity",travel_and_places:"Travel and Places",objects:"Objects",flags:"Flags",user:"User Defined"},O=(t,e)=>g(t,e)?t[e]:e,x=t=>{const e=C(t);return o=t=>({keywords:[],category:"user",...t}),((t,e)=>{const o={};return u(t,(t,n)=>{const s=e(t,n);o[s.k]=s.v}),o})(e,(t,e)=>({k:e,v:o(t)}));var o},E=(t,e)=>y(t.title.toLowerCase(),e)||((t,e)=>{for(let o=0,n=t.length;oy(t.toLowerCase(),e)),L=(t,e,o)=>{const n=[],s=e.toLowerCase();for(let r=0;rn.length>=t)));r++);return n},S="pattern",N=(t,e)=>{const n={pattern:"",results:L(e.listAll(),"",a.none())},s=m(A),r=(t=>{let e=null;const n=()=>{o(e)||(clearTimeout(e),e=null)};return{cancel:n,throttle:(...o)=>{n(),e=setTimeout(()=>{e=null,t.apply(null,o)},200)}}})(t=>{(t=>{const o=t.getData(),n=s.get(),r=e.listCategory(n),i=L(r,o[S],a.none());t.setData({results:i})})(t)}),l={label:"Search",type:"input",name:S},c={type:"collection",name:"results"},u=()=>({title:"Emojis",size:"normal",body:{type:"tabpanel",dynamicHeight:!0,tabs:i(e.listCategories(),t=>({title:t,name:t,items:[l,c]}))},initialData:n,onTabChange:(t,e)=>{s.set(e.newTabName),r.throttle(t)},onChange:r.throttle,onAction:(e,o)=>{"results"===o.name&&(((t,e)=>{t.insertContent(e)})(t,o.value),e.close())},buttons:[{type:"cancel",text:"Close",primary:!0}]}),g=t.windowManager.open(u());g.focus(S),e.hasLoaded()||(g.block("Loading emojis..."),e.waitForLoad().then(()=>{g.redial(u()),r.throttle(g),g.focus(S),g.unblock()}).catch(t=>{g.redial({title:"Emojis",body:{type:"panel",items:[{type:"alertbanner",level:"error",icon:"warning",text:"Could not load emojis"}]},buttons:[{type:"cancel",text:"Close",primary:!0}],initialData:{pattern:"",results:[]}}),g.focus(S),g.unblock()}))},T=t=>e=>{const o=()=>{e.setEnabled(t.selection.isEditable())};return t.on("NodeChange",o),o(),()=>{t.off("NodeChange",o)}};t.add("emoticons",(t,e)=>{((t,e)=>{const o=t.options.register;o("emoticons_database",{processor:"string",default:"emojis"}),o("emoticons_database_url",{processor:"string",default:`${e}/js/${b(t)}${t.suffix}.js`}),o("emoticons_database_id",{processor:"string",default:"tinymce.plugins.emoticons"}),o("emoticons_append",{processor:"object",default:{}}),o("emoticons_images_url",{processor:"string",default:"https://cdnjs.cloudflare.com/ajax/libs/twemoji/15.1.0/72x72/"})})(t,e);const o=((t,e,o)=>{const n=p(),s=p(),r=_(t),i=t=>{return o="=4&&e.substr(0,4)===o?t.char.replace(/src="([^"]+)"/,(t,e)=>`src="${r}${e}"`):t.char;var e,o};t.on("init",()=>{f.load(o,e).then(e=>{const o=x(t);(t=>{const e={},o=[];u(t,(t,n)=>{const s={title:n,keywords:t.keywords,char:i(t),category:O(k,t.category)},r=void 0!==e[s.category]?e[s.category]:[];e[s.category]=r.concat([s]),o.push(s)}),n.set(e),s.set(o)})(d(e,o))},t=>{console.log(`Failed to load emojis: ${t}`),n.set({}),s.set([])})});const c=()=>s.get().getOr([]),g=()=>n.isSet()&&s.isSet();return{listCategories:()=>[A].concat(l(n.get().getOr({}))),hasLoaded:g,waitForLoad:()=>g()?Promise.resolve(!0):new Promise((t,o)=>{let n=15;const s=setInterval(()=>{g()?(clearInterval(s),t(!0)):(n--,n<0&&(console.log("Could not load emojis from url: "+e),clearInterval(s),o(!1)))},100)}),listAll:c,listCategory:t=>t===A?c():n.get().bind(e=>a.from(e[t])).getOr([])}})(t,w(t),j(t));return((t,e)=>{t.addCommand("mceEmoticons",()=>N(t,e))})(t,o),(t=>{const e=()=>t.execCommand("mceEmoticons");t.ui.registry.addButton("emoticons",{tooltip:"Emojis",icon:"emoji",onAction:e,onSetup:T(t)}),t.ui.registry.addMenuItem("emoticons",{text:"Emojis...",icon:"emoji",onAction:e,onSetup:T(t)})})(t),((t,e)=>{t.ui.registry.addAutocompleter("emoticons",{trigger:":",columns:"auto",minChars:2,fetch:(t,o)=>e.waitForLoad().then(()=>{const n=e.listAll();return L(n,t,a.some(o))}),onAction:(e,o,n)=>{t.selection.setRng(o),t.insertContent(n),e.hide()}})})(t,o),(t=>{t.on("PreInit",()=>{t.parser.addAttributeFilter("data-emoticon",t=>{((t,e)=>{for(let o=0,n=t.length;o{t.attr("data-mce-resize","false"),t.attr("data-mce-placeholder","1")})})})})(t),{getAllEmojis:()=>o.waitForLoad().then(()=>o.listAll())}})}(); \ No newline at end of file diff --git a/libs/tinymce/plugins/help/plugin.min.js b/libs/tinymce/plugins/help/plugin.min.js index a0595d6a5..8b343f091 100644 --- a/libs/tinymce/plugins/help/plugin.min.js +++ b/libs/tinymce/plugins/help/plugin.min.js @@ -1 +1 @@ -!function(){"use strict";const e=e=>"string"===(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(n=a=e,(r=String).prototype.isPrototypeOf(n)||a.constructor?.name===r.name)?"string":t;var n,a,r})(e);const t=e=>undefined===e;const n=e=>"function"==typeof e,a=()=>false;class r{tag;value;static singletonNone=new r(!1);constructor(e,t){this.tag=e,this.value=t}static some(e){return new r(!0,e)}static none(){return r.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?r.some(e(this.value)):r.none()}bind(e){return this.tag?e(this.value):r.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:r.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(e??"Called getOrDie on None")}static from(e){return null==e?r.none():r.some(e)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}const o=Array.prototype.slice,i=Array.prototype.indexOf,s=(e,t)=>{const n=e.length,a=new Array(n);for(let r=0;r{const n=[];for(let a=0,r=e.length;a{const n=o.call(e,0);return n.sort(t),n};n(Array.from)&&Array.from;const l=Object.keys,u=Object.hasOwnProperty,p=(e,t)=>u.call(e,t);let y=0;const h=e=>{const t=(new Date).getTime(),n=Math.floor(window.crypto.getRandomValues(new Uint32Array(1))[0]/4294967295*1e9);return y++,e+"_"+n+y+String(t)};var d=tinymce.util.Tools.resolve("tinymce.PluginManager");const g=e=>t=>t.options.get(e),k=g("help_tabs"),v=g("forced_plugins");var b=tinymce.util.Tools.resolve("tinymce.Resource"),f=tinymce.util.Tools.resolve("tinymce.util.I18n");const A=(e,t)=>b.load(`tinymce.html-i18n.help-keynav.${t}`,`${e}/js/i18n/keynav/${t}.js`),w=e=>A(e,f.getCode()).catch(()=>A(e,"en"));var C=tinymce.util.Tools.resolve("tinymce.Env");const M=e=>{const t=C.os.isMacOS()||C.os.isiOS(),n=t?{alt:"⌥",ctrl:"⌃",shift:"⇧",meta:"⌘",access:"⌃⌥"}:{meta:"Ctrl ",access:"Shift + Alt "},a=e.split("+"),r=s(a,e=>{const t=e.toLowerCase().trim();return p(n,t)?n[t]:e});return t?r.join("").replace(/\s/,""):r.join("+")},S=[{shortcuts:["Meta + B"],action:"Bold"},{shortcuts:["Meta + I"],action:"Italic"},{shortcuts:["Meta + U"],action:"Underline"},{shortcuts:["Meta + A"],action:"Select all"},{shortcuts:["Meta + Y","Meta + Shift + Z"],action:"Redo"},{shortcuts:["Meta + Z"],action:"Undo"},{shortcuts:["Access + 1"],action:"Heading 1"},{shortcuts:["Access + 2"],action:"Heading 2"},{shortcuts:["Access + 3"],action:"Heading 3"},{shortcuts:["Access + 4"],action:"Heading 4"},{shortcuts:["Access + 5"],action:"Heading 5"},{shortcuts:["Access + 6"],action:"Heading 6"},{shortcuts:["Access + 7"],action:"Paragraph"},{shortcuts:["Access + 8"],action:"Div"},{shortcuts:["Access + 9"],action:"Address"},{shortcuts:["Alt + 0"],action:"Open help dialog"},{shortcuts:["Alt + F9"],action:"Focus to menubar"},{shortcuts:["Alt + F10"],action:"Focus to toolbar"},{shortcuts:["Alt + F11"],action:"Focus to element path"},{shortcuts:["Alt + F12"],action:"Focus to notification"},{shortcuts:["Ctrl + F9"],action:"Focus to contextual toolbar"},{shortcuts:["Shift + Enter"],action:"Open popup menu for split buttons"},{shortcuts:["Meta + K"],action:"Insert link (if link plugin activated)"},{shortcuts:["Meta + S"],action:"Save (if save plugin activated)"},{shortcuts:["Meta + F"],action:"Find (if searchreplace plugin activated)"},{shortcuts:["Meta + Shift + F"],action:"Switch to or from fullscreen mode"}],_=()=>({name:"shortcuts",title:"Handy Shortcuts",items:[{type:"table",header:["Action","Shortcut"],cells:s(S,e=>{const t=s(e.shortcuts,M).join(" or ");return[e.action,t]})}]}),x=s([{key:"accordion",name:"Accordion"},{key:"anchor",name:"Anchor"},{key:"autolink",name:"Autolink"},{key:"autoresize",name:"Autoresize"},{key:"autosave",name:"Autosave"},{key:"charmap",name:"Character Map"},{key:"code",name:"Code"},{key:"codesample",name:"Code Sample"},{key:"colorpicker",name:"Color Picker"},{key:"directionality",name:"Directionality"},{key:"emoticons",name:"Emoticons"},{key:"fullscreen",name:"Full Screen"},{key:"help",name:"Help"},{key:"image",name:"Image"},{key:"importcss",name:"Import CSS"},{key:"insertdatetime",name:"Insert Date/Time"},{key:"link",name:"Link"},{key:"lists",name:"Lists"},{key:"advlist",name:"List Styles"},{key:"media",name:"Media"},{key:"nonbreaking",name:"Nonbreaking"},{key:"pagebreak",name:"Page Break"},{key:"preview",name:"Preview"},{key:"quickbars",name:"Quick Toolbars"},{key:"save",name:"Save"},{key:"searchreplace",name:"Search and Replace"},{key:"table",name:"Table"},{key:"textcolor",name:"Text Color"},{key:"visualblocks",name:"Visual Blocks"},{key:"visualchars",name:"Visual Characters"},{key:"wordcount",name:"Word Count"},{key:"a11ychecker",name:"Accessibility Checker",type:"premium"},{key:"typography",name:"Advanced Typography",type:"premium",slug:"advanced-typography"},{key:"ai",name:"AI Assistant",type:"premium"},{key:"casechange",name:"Case Change",type:"premium"},{key:"checklist",name:"Checklist",type:"premium"},{key:"advcode",name:"Enhanced Code Editor",type:"premium"},{key:"mediaembed",name:"Enhanced Media Embed",type:"premium",slug:"introduction-to-mediaembed"},{key:"advtable",name:"Enhanced Tables",type:"premium"},{key:"exportpdf",name:"Export to PDF",type:"premium"},{key:"exportword",name:"Export to Word",type:"premium"},{key:"footnotes",name:"Footnotes",type:"premium"},{key:"formatpainter",name:"Format Painter",type:"premium"},{key:"editimage",name:"Image Editing",type:"premium"},{key:"uploadcare",name:"Image Optimizer Powered by Uploadcare",type:"premium"},{key:"importword",name:"Import from Word",type:"premium"},{key:"inlinecss",name:"Inline CSS",type:"premium",slug:"inline-css"},{key:"linkchecker",name:"Link Checker",type:"premium"},{key:"math",name:"Math",type:"premium"},{key:"markdown",name:"Markdown",type:"premium"},{key:"mentions",name:"Mentions",type:"premium"},{key:"mergetags",name:"Merge Tags",type:"premium"},{key:"pageembed",name:"Page Embed",type:"premium"},{key:"permanentpen",name:"Permanent Pen",type:"premium"},{key:"powerpaste",name:"PowerPaste",type:"premium",slug:"introduction-to-powerpaste"},{key:"revisionhistory",name:"Revision History",type:"premium"},{key:"tinymcespellchecker",name:"Spell Checker",type:"premium",slug:"introduction-to-tiny-spellchecker"},{key:"suggestededits",name:"Suggested Edits",type:"premium"},{key:"tinymceai",name:"TinyMCE AI",type:"premium"},{key:"autocorrect",name:"Spelling Autocorrect",type:"premium"},{key:"tableofcontents",name:"Table of Contents",type:"premium"},{key:"fullpagehtml",name:"Fullpage HTML",type:"premium"},{key:"advtemplate",name:"Templates",type:"premium",slug:"advanced-templates"},{key:"tinycomments",name:"Tiny Comments",type:"premium",slug:"introduction-to-tiny-comments"},{key:"tinydrive",name:"Tiny Drive",type:"premium",slug:"tinydrive-introduction"}],e=>({...e,type:e.type||"opensource",slug:e.slug||e.key})),T=e=>{const o=e=>`
${e.name}`,u=(e,t)=>{return(i=x,s=e=>e.key===t,((e,t,n)=>{for(let a=0,o=e.length;a((e,t)=>{const a=e.plugins[t].getMetadata;if(n(a)){const e=a();return{name:e.name,html:o(e)}}return{name:t,html:t}})(e,t),e=>{const t="premium"===e.type?`${e.name}*`:e.name;return{name:t,html:o({name:t,url:`https://www.tiny.cloud/docs/tinymce/${tinymce.majorVersion}/${e.slug}/`})}});var i,s},p=e=>{const n=(e=>{const n=l(e.plugins),a=v(e),r=t(a)?["onboarding","licensekeymanager"]:a.concat(["onboarding","licensekeymanager"]);return m(n,e=>!(((e,t)=>i.call(e,t))(r,e)>-1))})(e),a=c(s(n,t=>u(e,t)),(e,t)=>e.name.localeCompare(t.name)),r=s(a,e=>"
  • "+e.html+"
  • "),o=r.length,p=r.join("");return"

    "+f.translate(["Plugins installed ({0}):",o])+"

      "+p+"
    "},y={type:"htmlpanel",presets:"document",html:[(e=>null==e?"":"
    "+p(e)+"
    ")(e),(()=>{const e=m(x,({type:e})=>"premium"===e),t=c(s(e,e=>e.name),(e,t)=>e.localeCompare(t)),n=s(t,e=>`
  • ${e}
  • `).join("");return"

    "+f.translate("Premium plugins:")+"

    "})()].join("")};return{name:"plugins",title:"Plugins",items:[y]}};var O=tinymce.util.Tools.resolve("tinymce.EditorManager");const E=(t,n,a)=>()=>{(async(t,n,a)=>{const o=_(),i=await(async e=>({name:"keyboardnav",title:"Keyboard Navigation",items:[{type:"htmlpanel",presets:"document",html:await w(e)}]}))(a),m=T(t),c=(()=>{var e,t;const n='TinyMCE '+(e=O.majorVersion,t=O.minorVersion,(0===e.indexOf("@")?"X.X.X":e+"."+t)+"");return{name:"versions",title:"Version",items:[{type:"htmlpanel",html:"

    "+f.translate(["You are using {0}",n])+"

    ",presets:"document"}]}})(),u={[o.name]:o,[i.name]:i,[m.name]:m,[c.name]:c,...n.get()};return r.from(k(t)).fold(()=>(e=>{const t=l(e),n=t.indexOf("versions");return-1!==n&&(t.splice(n,1),t.push("versions")),{tabs:e,names:t}})(u),t=>((t,n)=>{const a={},r=s(t,t=>{if(e(t))return p(n,t)&&(a[t]=n[t]),t;{const e=t.name??h("tab-name");return a[e]=t,e}});return{tabs:a,names:r}})(t,u))})(t,n,a).then(({tabs:e,names:n})=>{const a={type:"tabpanel",tabs:(e=>{const t=[],n=e=>{t.push(e)};for(let t=0;t{return p(n=e,a=t)?r.from(n[a]):r.none();var n,a}))};t.windowManager.open({title:"Help",size:"medium",body:a,buttons:[{type:"cancel",name:"close",text:"Close",primary:!0}],initialData:{}})})};d.add("help",(e,t)=>{const n=(()=>{let e={};return{get:()=>e,set:t=>{e=t}}})(),a=(e=>({addTab:t=>{const n=t.name??h("tab-name"),a=e.get();a[n]=t,e.set(a)}}))(n);(e=>{(0,e.options.register)("help_tabs",{processor:"array"})})(e);const r=E(e,n,t);return((e,t)=>{e.ui.registry.addButton("help",{icon:"help",tooltip:"Help",onAction:t,context:"any"}),e.ui.registry.addMenuItem("help",{text:"Help",icon:"help",shortcut:"Alt+0",onAction:t,context:"any"})})(e,r),((e,t)=>{e.addCommand("mceHelp",t)})(e,r),e.shortcuts.add("Alt+0","Open help dialog","mceHelp"),((e,t)=>{e.on("init",()=>{w(t)})})(e,t),a})}(); \ No newline at end of file +!function(){"use strict";const e=e=>"string"===(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(n=a=e,(r=String).prototype.isPrototypeOf(n)||a.constructor?.name===r.name)?"string":t;var n,a,r})(e);const t=e=>void 0===e;const n=e=>"function"==typeof e,a=()=>false;class r{tag;value;static singletonNone=new r(!1);constructor(e,t){this.tag=e,this.value=t}static some(e){return new r(!0,e)}static none(){return r.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?r.some(e(this.value)):r.none()}bind(e){return this.tag?e(this.value):r.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:r.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(e??"Called getOrDie on None")}static from(e){return null==e?r.none():r.some(e)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}const o=Array.prototype.slice,i=Array.prototype.indexOf,s=(e,t)=>{const n=e.length,a=new Array(n);for(let r=0;r{const n=[];for(let a=0,r=e.length;a{const n=o.call(e,0);return n.sort(t),n};n(Array.from)&&Array.from;const l=Object.keys,u=Object.hasOwnProperty,p=(e,t)=>u.call(e,t);let y=0;const h=e=>{const t=(new Date).getTime(),n=Math.floor(window.crypto.getRandomValues(new Uint32Array(1))[0]/4294967295*1e9);return y++,e+"_"+n+y+String(t)};var d=tinymce.util.Tools.resolve("tinymce.PluginManager");const g=e=>t=>t.options.get(e),k=g("help_tabs"),v=g("forced_plugins");var b=tinymce.util.Tools.resolve("tinymce.Resource"),f=tinymce.util.Tools.resolve("tinymce.util.I18n");const A=(e,t)=>b.load(`tinymce.html-i18n.help-keynav.${t}`,`${e}/js/i18n/keynav/${t}.js`),w=e=>A(e,f.getCode()).catch(()=>A(e,"en"));var C=tinymce.util.Tools.resolve("tinymce.Env");const M=e=>{const t=C.os.isMacOS()||C.os.isiOS(),n=t?{alt:"⌥",ctrl:"⌃",shift:"⇧",meta:"⌘",access:"⌃⌥"}:{meta:"Ctrl ",access:"Shift + Alt "},a=e.split("+"),r=s(a,e=>{const t=e.toLowerCase().trim();return p(n,t)?n[t]:e});return t?r.join("").replace(/\s/,""):r.join("+")},S=[{shortcuts:["Meta + B"],action:"Bold"},{shortcuts:["Meta + I"],action:"Italic"},{shortcuts:["Meta + U"],action:"Underline"},{shortcuts:["Meta + A"],action:"Select all"},{shortcuts:["Meta + Y","Meta + Shift + Z"],action:"Redo"},{shortcuts:["Meta + Z"],action:"Undo"},{shortcuts:["Access + 1"],action:"Heading 1"},{shortcuts:["Access + 2"],action:"Heading 2"},{shortcuts:["Access + 3"],action:"Heading 3"},{shortcuts:["Access + 4"],action:"Heading 4"},{shortcuts:["Access + 5"],action:"Heading 5"},{shortcuts:["Access + 6"],action:"Heading 6"},{shortcuts:["Access + 7"],action:"Paragraph"},{shortcuts:["Access + 8"],action:"Div"},{shortcuts:["Access + 9"],action:"Address"},{shortcuts:["Alt + 0"],action:"Open help dialog"},{shortcuts:["Alt + F9"],action:"Focus to menubar"},{shortcuts:["Alt + F10"],action:"Focus to toolbar"},{shortcuts:["Alt + F11"],action:"Focus to element path"},{shortcuts:["Alt + F12"],action:"Focus to notification"},{shortcuts:["Ctrl + F9"],action:"Focus to contextual toolbar"},{shortcuts:["Shift + Enter"],action:"Open popup menu for split buttons"},{shortcuts:["Meta + K"],action:"Insert link (if link plugin activated)"},{shortcuts:["Meta + S"],action:"Save (if save plugin activated)"},{shortcuts:["Meta + F"],action:"Find (if searchreplace plugin activated)"},{shortcuts:["Meta + Shift + F"],action:"Switch to or from fullscreen mode"}],_=()=>({name:"shortcuts",title:"Handy Shortcuts",items:[{type:"table",header:["Action","Shortcut"],cells:s(S,e=>{const t=s(e.shortcuts,M).join(" or ");return[e.action,t]})}]}),x=s([{key:"accordion",name:"Accordion"},{key:"anchor",name:"Anchor"},{key:"autolink",name:"Autolink"},{key:"autoresize",name:"Autoresize"},{key:"autosave",name:"Autosave"},{key:"charmap",name:"Character Map"},{key:"code",name:"Code"},{key:"codesample",name:"Code Sample"},{key:"colorpicker",name:"Color Picker"},{key:"directionality",name:"Directionality"},{key:"emoticons",name:"Emoticons"},{key:"fullscreen",name:"Full Screen"},{key:"help",name:"Help"},{key:"image",name:"Image"},{key:"importcss",name:"Import CSS"},{key:"insertdatetime",name:"Insert Date/Time"},{key:"link",name:"Link"},{key:"lists",name:"Lists"},{key:"advlist",name:"List Styles"},{key:"media",name:"Media"},{key:"nonbreaking",name:"Nonbreaking"},{key:"pagebreak",name:"Page Break"},{key:"preview",name:"Preview"},{key:"quickbars",name:"Quick Toolbars"},{key:"save",name:"Save"},{key:"searchreplace",name:"Search and Replace"},{key:"table",name:"Table"},{key:"textcolor",name:"Text Color"},{key:"visualblocks",name:"Visual Blocks"},{key:"visualchars",name:"Visual Characters"},{key:"wordcount",name:"Word Count"},{key:"a11ychecker",name:"Accessibility Checker",type:"premium"},{key:"typography",name:"Advanced Typography",type:"premium",slug:"advanced-typography"},{key:"ai",name:"AI Assistant",type:"premium"},{key:"casechange",name:"Case Change",type:"premium"},{key:"checklist",name:"Checklist",type:"premium"},{key:"advcode",name:"Enhanced Code Editor",type:"premium"},{key:"mediaembed",name:"Enhanced Media Embed",type:"premium",slug:"introduction-to-mediaembed"},{key:"advtable",name:"Enhanced Tables",type:"premium"},{key:"exportpdf",name:"Export to PDF",type:"premium"},{key:"exportword",name:"Export to Word",type:"premium"},{key:"footnotes",name:"Footnotes",type:"premium"},{key:"formatpainter",name:"Format Painter",type:"premium"},{key:"editimage",name:"Image Editing",type:"premium"},{key:"uploadcare",name:"Image Optimizer Powered by Uploadcare",type:"premium"},{key:"importword",name:"Import from Word",type:"premium"},{key:"inlinecss",name:"Inline CSS",type:"premium",slug:"inline-css"},{key:"linkchecker",name:"Link Checker",type:"premium"},{key:"math",name:"Math",type:"premium"},{key:"markdown",name:"Markdown",type:"premium"},{key:"mentions",name:"Mentions",type:"premium"},{key:"mergetags",name:"Merge Tags",type:"premium"},{key:"pageembed",name:"Page Embed",type:"premium"},{key:"permanentpen",name:"Permanent Pen",type:"premium"},{key:"powerpaste",name:"PowerPaste",type:"premium",slug:"introduction-to-powerpaste"},{key:"revisionhistory",name:"Revision History",type:"premium"},{key:"tinymcespellchecker",name:"Spell Checker",type:"premium",slug:"introduction-to-tiny-spellchecker"},{key:"suggestededits",name:"Suggested Edits",type:"premium"},{key:"tinymceai",name:"TinyMCE AI",type:"premium"},{key:"autocorrect",name:"Spelling Autocorrect",type:"premium"},{key:"tableofcontents",name:"Table of Contents",type:"premium"},{key:"fullpagehtml",name:"Fullpage HTML",type:"premium"},{key:"advtemplate",name:"Templates",type:"premium",slug:"advanced-templates"},{key:"tinycomments",name:"Tiny Comments",type:"premium",slug:"introduction-to-tiny-comments"},{key:"tinydrive",name:"Tiny Drive",type:"premium",slug:"tinydrive-introduction"}],e=>({...e,type:e.type||"opensource",slug:e.slug||e.key})),T=e=>{const o=e=>`${e.name}`,u=(e,t)=>{return(i=x,s=e=>e.key===t,((e,t,n)=>{for(let a=0,o=e.length;a((e,t)=>{const a=e.plugins[t].getMetadata;if(n(a)){const e=a();return{name:e.name,html:o(e)}}return{name:t,html:t}})(e,t),e=>{const t="premium"===e.type?`${e.name}*`:e.name;return{name:t,html:o({name:t,url:`https://www.tiny.cloud/docs/tinymce/${tinymce.majorVersion}/${e.slug}/`})}});var i,s},p=e=>{const n=(e=>{const n=l(e.plugins),a=v(e),r=t(a)?["onboarding","licensekeymanager"]:a.concat(["onboarding","licensekeymanager"]);return m(n,e=>!(((e,t)=>i.call(e,t))(r,e)>-1))})(e),a=c(s(n,t=>u(e,t)),(e,t)=>e.name.localeCompare(t.name)),r=s(a,e=>"
  • "+e.html+"
  • "),o=r.length,p=r.join("");return"

    "+f.translate(["Plugins installed ({0}):",o])+"

      "+p+"
    "},y={type:"htmlpanel",presets:"document",html:[(e=>null==e?"":"
    "+p(e)+"
    ")(e),(()=>{const e=m(x,({type:e})=>"premium"===e),t=c(s(e,e=>e.name),(e,t)=>e.localeCompare(t)),n=s(t,e=>`
  • ${e}
  • `).join("");return"

    "+f.translate("Premium plugins:")+"

    "})()].join("")};return{name:"plugins",title:"Plugins",items:[y]}};var O=tinymce.util.Tools.resolve("tinymce.EditorManager");const E=(t,n,a)=>()=>{(async(t,n,a)=>{const o=_(),i=await(async e=>({name:"keyboardnav",title:"Keyboard Navigation",items:[{type:"htmlpanel",presets:"document",html:await w(e)}]}))(a),m=T(t),c=(()=>{var e,t;const n='TinyMCE '+(e=O.majorVersion,t=O.minorVersion,(0===e.indexOf("@")?"X.X.X":e+"."+t)+"");return{name:"versions",title:"Version",items:[{type:"htmlpanel",html:"

    "+f.translate(["You are using {0}",n])+"

    ",presets:"document"}]}})(),u={[o.name]:o,[i.name]:i,[m.name]:m,[c.name]:c,...n.get()};return r.from(k(t)).fold(()=>(e=>{const t=l(e),n=t.indexOf("versions");return-1!==n&&(t.splice(n,1),t.push("versions")),{tabs:e,names:t}})(u),t=>((t,n)=>{const a={},r=s(t,t=>{if(e(t))return p(n,t)&&(a[t]=n[t]),t;{const e=t.name??h("tab-name");return a[e]=t,e}});return{tabs:a,names:r}})(t,u))})(t,n,a).then(({tabs:e,names:n})=>{const a={type:"tabpanel",tabs:(e=>{const t=[],n=e=>{t.push(e)};for(let t=0;t{return p(n=e,a=t)?r.from(n[a]):r.none();var n,a}))};t.windowManager.open({title:"Help",size:"medium",body:a,buttons:[{type:"cancel",name:"close",text:"Close",primary:!0}],initialData:{}})})};d.add("help",(e,t)=>{const n=(()=>{let e={};return{get:()=>e,set:t=>{e=t}}})(),a=(e=>({addTab:t=>{const n=t.name??h("tab-name"),a=e.get();a[n]=t,e.set(a)}}))(n);(e=>{(0,e.options.register)("help_tabs",{processor:"array"})})(e);const r=E(e,n,t);return((e,t)=>{e.ui.registry.addButton("help",{icon:"help",tooltip:"Help",onAction:t,context:"any"}),e.ui.registry.addMenuItem("help",{text:"Help",icon:"help",shortcut:"Alt+0",onAction:t,context:"any"})})(e,r),((e,t)=>{e.addCommand("mceHelp",t)})(e,r),e.shortcuts.add("Alt+0","Open help dialog","mceHelp"),((e,t)=>{e.on("init",()=>{w(t)})})(e,t),a})}(); \ No newline at end of file diff --git a/libs/tinymce/plugins/image/plugin.min.js b/libs/tinymce/plugins/image/plugin.min.js index c1035c60d..968e450f5 100644 --- a/libs/tinymce/plugins/image/plugin.min.js +++ b/libs/tinymce/plugins/image/plugin.min.js @@ -1 +1 @@ -!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=Object.getPrototypeOf,a=(e,t,a)=>!!a(e,t.prototype)||e.constructor?.name===t.name,i=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&a(e,String,(e,t)=>t.isPrototypeOf(e))?"string":t})(t)===e,s=e=>t=>typeof t===e,r=i("string"),o=i("object"),n=e=>((e,i)=>o(e)&&a(e,i,(e,a)=>t(e)===a))(e,Object),l=i("array"),c=e=>null===e;const m=s("boolean"),d=e=>!(e=>null==e)(e),g=s("function"),p=s("number"),u=()=>{};class h{tag;value;static singletonNone=new h(!1);constructor(e,t){this.tag=e,this.value=t}static some(e){return new h(!0,e)}static none(){return h.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?h.some(e(this.value)):h.none()}bind(e){return this.tag?e(this.value):h.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:h.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(e??"Called getOrDie on None")}static from(e){return d(e)?h.some(e):h.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}Array.prototype.slice;const b=Array.prototype.push,y=e=>{const t=[];for(let a=0,i=e.length;af.call(e,t),w=(D=(e,t)=>n(e)&&n(t)?w(e,t):t,(...e)=>{if(0===e.length)throw new Error("Can't merge zero objects");const t={};for(let a=0;ae.length>0,C=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},I=C,S=(e,t,a)=>{((e,t,a)=>{if(!(r(a)||m(a)||p(a)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",a,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,a+"")})(e.dom,t,a)};var U=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),x=tinymce.util.Tools.resolve("tinymce.util.URI");const N=e=>t=>t.options.get(e),E=N("image_dimensions"),T=N("image_advtab"),L=N("image_uploadtab"),O=N("image_prepend_url"),j=N("image_class_list"),M=N("image_description"),R=N("image_title"),k=N("image_caption"),P=N("image_list"),z=N("a11y_advanced_options"),B=N("automatic_uploads"),F=(e,t)=>Math.max(parseInt(e,10),parseInt(t,10)),H=e=>(e&&(e=e.replace(/px$/,"")),e),G=e=>(e.length>0&&/^[0-9]+$/.test(e)&&(e+="px"),e),W=e=>"IMG"===e.nodeName&&(e.hasAttribute("data-mce-object")||e.hasAttribute("data-mce-placeholder")),$=(e,t)=>{const a=e.options.get;return x.isDomSafe(t,"img",{allow_html_data_urls:a("allow_html_data_urls"),allow_script_urls:a("allow_script_urls"),allow_svg_data_urls:a("allow_svg_data_urls")})},V=U.DOM,K=e=>e.style.marginLeft&&e.style.marginRight&&e.style.marginLeft===e.style.marginRight?H(e.style.marginLeft):"",Z=e=>e.style.marginTop&&e.style.marginBottom&&e.style.marginTop===e.style.marginBottom?H(e.style.marginTop):"",q=e=>e.style.borderWidth?H(e.style.borderWidth):"",J=(e,t)=>e.hasAttribute(t)?e.getAttribute(t)??"":"",Q=e=>null!==e.parentNode&&"FIGURE"===e.parentNode.nodeName,X=(e,t,a)=>{""===a||null===a?e.removeAttribute(t):e.setAttribute(t,a)},Y=(e,t)=>{const a=e.getAttribute("style"),i=t(null!==a?a:"");i.length>0?(e.setAttribute("style",i),e.setAttribute("data-mce-style",i)):e.removeAttribute("style")},ee=(e,t)=>(e,a,i)=>{const s=e.style;s[a]?(s[a]=G(i),Y(e,t)):X(e,a,i)},te=(e,t)=>e.style[t]?H(e.style[t]):J(e,t),ae=(e,t)=>{const a=G(t);e.style.marginLeft=a,e.style.marginRight=a},ie=(e,t)=>{const a=G(t);e.style.marginTop=a,e.style.marginBottom=a},se=(e,t)=>{const a=G(t);e.style.borderWidth=a},re=(e,t)=>{e.style.borderStyle=t},oe=e=>e.style.borderStyle??"",ne=e=>d(e)&&"FIGURE"===e.nodeName,le=e=>{const t=V.getAttrib(e,"alt"),a=V.getAttrib(e,"role");return e.hasAttribute("alt")&&0===t.length||"presentation"===a||"none"===a},ce=e=>le(e)?"":J(e,"alt"),me=(e,t)=>{const a=document.createElement("img");return X(a,"style",t.style),(K(a)||""!==t.hspace)&&ae(a,t.hspace),(Z(a)||""!==t.vspace)&&ie(a,t.vspace),(q(a)||""!==t.border)&&se(a,t.border),(oe(a)||""!==t.borderStyle)&&re(a,t.borderStyle),e(a.getAttribute("style")??"")},de=(e,t)=>({src:J(t,"src"),alt:ce(t),title:J(t,"title"),width:te(t,"width"),height:te(t,"height"),class:J(t,"class"),style:e(J(t,"style")),caption:Q(t),hspace:K(t),vspace:Z(t),border:q(t),borderStyle:oe(t),isDecorative:le(t)}),ge=(e,t,a,i,s)=>{a[i]!==t[i]&&s(e,i,String(a[i]))},pe=(e,t,a)=>{if(a){V.setAttrib(e,"role","presentation");const t=I(e);S(t,"alt","")}else{if(c(t)){I(e).dom.removeAttribute("alt")}else{const a=I(e);S(a,"alt",t)}"presentation"===V.getAttrib(e,"role")&&V.setAttrib(e,"role","")}},ue=(e,t)=>(a,i,s)=>{e(a,s),Y(a,t)},he=(e,t,a)=>{const i=de(e,a);ge(a,i,t,"caption",(e,t,a)=>(e=>{Q(e)?(e=>{const t=e.parentNode;d(t)&&(V.insertAfter(e,t),V.remove(t))})(e):(e=>{const t=V.create("figure",{class:"image"});V.insertAfter(t,e),t.appendChild(e),t.appendChild(V.create("figcaption",{contentEditable:"true"},"Caption")),t.contentEditable="false"})(e)})(e)),ge(a,i,t,"src",X),ge(a,i,t,"title",X),ge(a,i,t,"width",ee(0,e)),ge(a,i,t,"height",ee(0,e)),ge(a,i,t,"class",X),ge(a,i,t,"style",ue((e,t)=>X(e,"style",t),e)),ge(a,i,t,"hspace",ue(ae,e)),ge(a,i,t,"vspace",ue(ie,e)),ge(a,i,t,"border",ue(se,e)),ge(a,i,t,"borderStyle",ue(re,e)),((e,t,a)=>{a.alt===t.alt&&a.isDecorative===t.isDecorative||pe(e,a.alt,a.isDecorative)})(a,i,t)},be=(e,t)=>{const a=(e=>{if(e.margin){const t=String(e.margin).split(" ");switch(t.length){case 1:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[0],e["margin-bottom"]=e["margin-bottom"]||t[0],e["margin-left"]=e["margin-left"]||t[0];break;case 2:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[0],e["margin-left"]=e["margin-left"]||t[1];break;case 3:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[2],e["margin-left"]=e["margin-left"]||t[1];break;case 4:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[2],e["margin-left"]=e["margin-left"]||t[3]}delete e.margin}return e})(e.dom.styles.parse(t)),i=e.dom.styles.parse(e.dom.styles.serialize(a));return e.dom.styles.serialize(i)},ye=e=>{const t=e.selection.getNode(),a=e.dom.getParent(t,"figure.image");return a?e.dom.select("img",a)[0]:t&&("IMG"!==t.nodeName||W(t))?null:t},ve=(e,t)=>{const a=e.dom,i=(t=>{const a={};var i;return((e,t,a,i)=>{((e,t)=>{const a=v(e);for(let i=0,s=a.length;i{(t(e,s)?a:i)(e,s)})})(t,(t,a)=>!e.schema.isValidChild(a,"figure"),(i=a,(e,t)=>{i[t]=e}),u),a})(e.schema.getTextBlockElements()),s=a.getParent(t.parentNode,e=>{return t=i,a=e.nodeName,A(t,a)&&void 0!==t[a]&&null!==t[a];var t,a},e.getBody());return s?a.split(s,t)??t:t},fe=(e,t)=>{const a=((t,a)=>{const i=document.createElement("img");if(he(t=>be(e,t),{...a,caption:!1},i),pe(i,a.alt,a.isDecorative),a.caption){const e=V.create("figure",{class:"image"});return e.appendChild(i),e.appendChild(V.create("figcaption",{contentEditable:"true"},"Caption")),e.contentEditable="false",e}return i})(0,t);e.dom.setAttrib(a,"data-mce-id","__mcenew"),e.focus(),e.insertContent(a.outerHTML);const i=e.dom.select('*[data-mce-id="__mcenew"]')[0];if(e.dom.setAttrib(i,"data-mce-id",null),ne(i)){const t=ve(e,i);e.selection.select(t)}else e.selection.select(i)},Ae=(e,t)=>{const a=ye(e);if(a){const i={...de(t=>be(e,t),a),...t},s=((e,t)=>{const a=t.src;return{...t,src:$(e,a)?a:""}})(e,i);i.src?((e,t)=>{const a=ye(e);if(a)if(he(t=>be(e,t),t,a),((e,t)=>{e.dom.setAttrib(t,"src",t.getAttribute("src"))})(e,a),ne(a.parentNode)){e.dom.setStyle(a,"float","");const t=a.parentNode;ve(e,t),e.selection.select(a.parentNode)}else e.selection.select(a),((e,t,a)=>{const i=()=>{a.onload=a.onerror=null,e.selection&&(e.selection.select(a),e.nodeChanged())};a.onload=()=>{t.width||t.height||!E(e)||e.dom.setAttribs(a,{width:String(a.clientWidth),height:String(a.clientHeight)}),i()},a.onerror=i})(e,t,a)})(e,s):((e,t)=>{if(t){const a=e.dom.is(t.parentNode,"figure.image")?t.parentNode:t;e.dom.remove(a),e.focus(),e.nodeChanged(),e.dom.isEmpty(e.getBody())&&(e.setContent(""),e.selection.setCursorLocation())}})(e,a)}else t.src&&fe(e,{src:"",alt:"",title:"",width:"",height:"",class:"",style:"",caption:!1,hspace:"",vspace:"",border:"",borderStyle:"",isDecorative:!1,...t})};var we=tinymce.util.Tools.resolve("tinymce.util.ImageUploader"),De=tinymce.util.Tools.resolve("tinymce.util.Tools");const _e=e=>r(e.value)?e.value:"",Ce=(e,t)=>{const a=[];return De.each(e,e=>{const i=(e=>r(e.text)?e.text:r(e.title)?e.title:"")(e);if(void 0!==e.menu){const s=Ce(e.menu,t);a.push({text:i,items:s})}else{const s=t(e);a.push({text:i,value:s})}}),a},Ie=(e=_e)=>t=>t?h.from(t).map(t=>Ce(t,e)):h.none(),Se=(e,t)=>((e,t)=>{for(let a=0;a(e=>A(e,"items"))(e)?Se(e.items,t):e.value===t?h.some(e):h.none()),Ue=Ie,xe=(e,t)=>e.bind(e=>Se(e,t)),Ne=e=>{const t=Ue(t=>e.convertURL(t.value||t.url||"","src")),a=new Promise(a=>{((e,t)=>{const a=P(e);r(a)?fetch(a).then(e=>{e.ok&&e.json().then(t)}):g(a)?a(t):t(a)})(e,e=>{a(t(e).map(e=>y([[{text:"None",value:""}],e])))})}),i=(t,a)=>{e.windowManager.alert(t,a)},s=(D=j(e),Ie(_e)(D)),o=T(e),n=L(e),l=(e=>_(e.options.get("images_upload_url")))(e),c=(e=>d(e.options.get("images_upload_handler")))(e),m=(e=>{const t=ye(e);return t?de(t=>be(e,t),t):{src:"",alt:"",title:"",width:"",height:"",class:"",style:"",caption:!1,hspace:"",vspace:"",border:"",borderStyle:"",isDecorative:!1}})(e),p=M(e),u=R(e),b=E(e),v=k(e),f=z(e),A=B(e),w=h.some(O(e)).filter(e=>r(e)&&e.length>0);var D;return a.then(e=>({alertErr:i,image:m,imageList:e,classList:s,hasAdvTab:o,hasUploadTab:n,hasUploadUrl:l,hasUploadHandler:c,hasDescription:p,hasImageTitle:u,hasDimensions:b,hasImageCaption:v,prependURL:w,hasAccessibilityOptions:f,automaticUploads:A}))},Ee=e=>{const t=e.imageList.map(e=>({name:"images",type:"listbox",label:"Image list",items:e})),a={name:"alt",type:"input",label:"Alternative description",enabled:!(e.hasAccessibilityOptions&&e.image.isDecorative)},i=e.classList.map(e=>({name:"classes",type:"listbox",label:"Class",items:e}));return y([[{name:"src",type:"urlinput",filetype:"image",label:"Source",picker_text:"Browse files"}],t.toArray(),e.hasAccessibilityOptions&&e.hasDescription?[{type:"label",label:"Accessibility",items:[{name:"isDecorative",type:"checkbox",label:"Image is decorative"}]}]:[],e.hasDescription?[a]:[],e.hasImageTitle?[{name:"title",type:"input",label:"Image title"}]:[],e.hasDimensions?[{name:"dimensions",type:"sizeinput"}]:[],[{...(s=e.classList.isSome()&&e.hasImageCaption,s?{type:"grid",columns:2}:{type:"panel"}),items:y([i.toArray(),e.hasImageCaption?[{type:"label",label:"Caption",items:[{type:"checkbox",name:"caption",label:"Show caption"}]}]:[]])}]]);var s},Te=e=>({title:"General",name:"general",items:Ee(e)}),Le=Ee,Oe=e=>({src:{value:e.src,meta:{}},images:e.src,alt:e.alt,title:e.title,dimensions:{width:e.width,height:e.height},classes:e.class,caption:e.caption,style:e.style,vspace:e.vspace,border:e.border,hspace:e.hspace,borderstyle:e.borderStyle,fileinput:[],isDecorative:e.isDecorative}),je=(e,t)=>({src:e.src.value,alt:null!==e.alt&&0!==e.alt.length||!t?e.alt:null,title:e.title,width:e.dimensions.width,height:e.dimensions.height,class:e.classes,style:e.style,caption:e.caption,hspace:e.hspace,vspace:e.vspace,border:e.border,borderStyle:e.borderstyle,isDecorative:e.isDecorative}),Me=(e,t,a,i)=>{((e,t)=>{const a=t.getData();((e,t)=>/^(?:[a-zA-Z]+:)?\/\//.test(t)?h.none():e.prependURL.bind(e=>t.substring(0,e.length)!==e?h.some(e+t):h.none()))(e,a.src.value).each(e=>{t.setData({src:{value:e,meta:a.src.meta}})})})(t,i),((e,t)=>{const a=t.getData(),i=a.src.meta;if(void 0!==i){const s=w({},a);((e,t,a)=>{e.hasDescription&&r(a.alt)&&(t.alt=a.alt),e.hasAccessibilityOptions&&(t.isDecorative=a.isDecorative||t.isDecorative||!1),e.hasImageTitle&&r(a.title)&&(t.title=a.title),e.hasDimensions&&(r(a.width)&&(t.dimensions.width=a.width),r(a.height)&&(t.dimensions.height=a.height)),r(a.class)&&xe(e.classList,a.class).each(e=>{t.classes=e.value}),e.hasImageCaption&&m(a.caption)&&(t.caption=a.caption),e.hasAdvTab&&(r(a.style)&&(t.style=a.style),r(a.vspace)&&(t.vspace=a.vspace),r(a.border)&&(t.border=a.border),r(a.hspace)&&(t.hspace=a.hspace),r(a.borderstyle)&&(t.borderstyle=a.borderstyle))})(e,s,i),t.setData(s)}})(t,i),((e,t,a,i)=>{const s=i.getData(),r=s.src.value,o=s.src.meta||{};o.width||o.height||!t.hasDimensions||(_(r)?e.imageSize(r).then(e=>{a.open&&i.setData({dimensions:e})}).catch(e=>console.error(e)):i.setData({dimensions:{width:"",height:""}}))})(e,t,a,i),((e,t,a)=>{const i=a.getData(),s=xe(e.imageList,i.src.value);t.prevImage=s,a.setData({images:s.map(e=>e.value).getOr("")})})(t,a,i)},Re=(e,t,a,i)=>{const s=i.getData();var r;i.block("Uploading image"),(r=s.fileinput,(e=>0{i.unblock()},s=>{const r=URL.createObjectURL(s),o=()=>{i.unblock(),URL.revokeObjectURL(r)},n=s=>{i.setData({src:{value:s,meta:{}}}),i.showTab("general"),Me(e,t,a,i),i.focus("src")};var l;(l=s,new Promise((e,t)=>{const a=new FileReader;a.onload=()=>{e(a.result)},a.onerror=()=>{t(a.error?.message)},a.readAsDataURL(l)})).then(a=>{const l=e.createBlobCache(s,r,a);t.automaticUploads?e.uploadImage(l).then(e=>{n(e.url),o()}).catch(e=>{o(),t.alertErr(e,()=>{i.focus("fileinput")})}):(e.addToBlobCache(l),n(l.blobUri()),i.unblock())})})},ke=(e,t,a)=>(i,s)=>{"src"===s.name?Me(e,t,a,i):"images"===s.name?((e,t,a,i)=>{const s=i.getData(),r=xe(t.imageList,s.images);r.each(e=>{const t=""===s.alt||a.prevImage.map(e=>e.text===s.alt).getOr(!1);t?""===e.value?i.setData({src:e,alt:a.prevAlt}):i.setData({src:e,alt:e.text}):i.setData({src:e})}),a.prevImage=r,Me(e,t,a,i)})(e,t,a,i):"alt"===s.name?a.prevAlt=i.getData().alt:"fileinput"===s.name?Re(e,t,a,i):"isDecorative"===s.name&&i.setEnabled("alt",!i.getData().isDecorative)},Pe=e=>()=>{e.open=!1},ze=e=>{return e.hasAdvTab||e.hasUploadUrl||e.hasUploadHandler?{type:"tabpanel",tabs:y([[Te(e)],e.hasAdvTab?[{title:"Advanced",name:"advanced",items:[{type:"grid",columns:2,items:[{type:"input",label:"Vertical space",name:"vspace",inputMode:"numeric"},{type:"input",label:"Horizontal space",name:"hspace",inputMode:"numeric"},{type:"input",label:"Border width",name:"border",inputMode:"numeric"},{type:"listbox",name:"borderstyle",label:"Border style",items:[{text:"Select...",value:""},{text:"Solid",value:"solid"},{text:"Dotted",value:"dotted"},{text:"Dashed",value:"dashed"},{text:"Double",value:"double"},{text:"Groove",value:"groove"},{text:"Ridge",value:"ridge"},{text:"Inset",value:"inset"},{text:"Outset",value:"outset"},{text:"None",value:"none"},{text:"Hidden",value:"hidden"}]}]}]}]:[],e.hasUploadTab&&(e.hasUploadUrl||e.hasUploadHandler)?[(t=()=>new Promise(t=>e.alertErr("Selected images do not have allowed extensions",t)),{title:"Upload",name:"upload",items:[{type:"dropzone",name:"fileinput",onInvalidFiles:t}]})]:[]])}:{type:"panel",items:Le(e)};var t},Be=(e,t,a)=>i=>{const s=w(Oe(t.image),i.getData()),r={...s,style:me(a.normalizeCss,je(s,!1))};e.execCommand("mceUpdateImage",!1,je(r,t.hasAccessibilityOptions)),e.editorUpload.uploadImagesAuto(),i.close()},Fe=e=>t=>$(e,t)?(e=>new Promise(t=>{const a=document.createElement("img"),i=e=>{a.parentNode&&a.parentNode.removeChild(a),t(e)};a.addEventListener("load",()=>{const e={width:F(a.width,a.clientWidth),height:F(a.height,a.clientHeight)};i(Promise.resolve(e))}),a.addEventListener("error",()=>{i(Promise.reject(`Failed to get image dimensions for: ${e}`))});const s=a.style;s.visibility="hidden",s.position="fixed",s.bottom=s.left="0px",s.width=s.height="auto",document.body.appendChild(a),a.src=e}))(e.documentBaseURI.toAbsolute(t)).then(e=>({width:String(e.width),height:String(e.height)})):Promise.resolve({width:"",height:""}),He=e=>(t,a,i)=>e.editorUpload.blobCache.create({blob:t,blobUri:a,name:t.name?.replace(/\.[^\.]+$/,""),filename:t.name,base64:i.split(",")[1]}),Ge=e=>t=>{e.editorUpload.blobCache.add(t)},We=e=>t=>be(e,t),$e=e=>t=>e.dom.parseStyle(t),Ve=e=>(t,a)=>e.dom.serializeStyle(t,a),Ke=e=>t=>we(e).upload([t],!1).then(e=>0===e.length?Promise.reject("Failed to upload image"):!1===e[0].status?Promise.reject(e[0].error?.message):e[0]),Ze=e=>{const t={imageSize:Fe(e),addToBlobCache:Ge(e),createBlobCache:He(e),normalizeCss:We(e),parseStyle:$e(e),serializeStyle:Ve(e),uploadImage:Ke(e)};return{open:()=>{Ne(e).then(a=>{const i=(e=>({prevImage:xe(e.imageList,e.image.src),prevAlt:e.image.alt,open:!0}))(a);return{title:"Insert/Edit Image",size:"normal",body:ze(a),buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:Oe(a.image),onSubmit:Be(e,a,t),onChange:ke(t,a,i),onClose:Pe(i)}}).then(e.windowManager.open)}}},qe=e=>{const t=e.attr("class");return d(t)&&/\bimage\b/.test(t)},Je=e=>t=>{let a=t.length;const i=t=>{t.attr("contenteditable",e?"true":null)};for(;a--;){const s=t[a];qe(s)&&(s.attr("contenteditable",e?"false":null),De.each(s.getAll("figcaption"),i))}},Qe=e=>t=>{const a=()=>{t.setEnabled(e.selection.isEditable())};return e.on("NodeChange",a),a(),()=>{e.off("NodeChange",a)}};e.add("image",e=>{(e=>{const t=e.options.register;t("image_dimensions",{processor:"boolean",default:!0}),t("image_advtab",{processor:"boolean",default:!1}),t("image_uploadtab",{processor:"boolean",default:!0}),t("image_prepend_url",{processor:"string",default:""}),t("image_class_list",{processor:"object[]"}),t("image_description",{processor:"boolean",default:!0}),t("image_title",{processor:"boolean",default:!1}),t("image_caption",{processor:"boolean",default:!1}),t("image_list",{processor:e=>{const t=!1===e||r(e)||((e,t)=>{if(l(e)){for(let a=0,i=e.length;a{e.on("PreInit",()=>{e.parser.addNodeFilter("figure",Je(!0)),e.serializer.addNodeFilter("figure",Je(!1))})})(e),(e=>{e.ui.registry.addToggleButton("image",{icon:"image",tooltip:"Insert/edit image",onAction:Ze(e).open,onSetup:t=>{t.setActive(d(ye(e)));const a=e.selection.selectorChangedWithUnbind("img:not([data-mce-object]):not([data-mce-placeholder]),figure.image",t.setActive).unbind,i=Qe(e)(t);return()=>{a(),i()}}}),e.ui.registry.addMenuItem("image",{icon:"image",text:"Image...",onAction:Ze(e).open,onSetup:Qe(e)}),e.ui.registry.addContextMenu("image",{update:t=>e.selection.isEditable()&&(ne(t)||"IMG"===t.nodeName&&!W(t))?["image"]:[]})})(e),(e=>{e.addCommand("mceImage",Ze(e).open),e.addCommand("mceUpdateImage",(t,a)=>{e.undoManager.transact(()=>Ae(e,a))})})(e)})}(); \ No newline at end of file +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager");const t=Object.getPrototypeOf,a=(e,t,a)=>!!a(e,t.prototype)||e.constructor?.name===t.name,i=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&a(e,String,(e,t)=>t.isPrototypeOf(e))?"string":t})(t)===e,s=e=>t=>typeof t===e,r=i("string"),o=i("object"),n=e=>((e,i)=>o(e)&&a(e,i,(e,a)=>t(e)===a))(e,Object),l=i("array"),c=e=>null===e;const m=s("boolean"),d=e=>!(e=>null==e)(e),g=s("function"),u=s("number"),p=()=>{};class h{tag;value;static singletonNone=new h(!1);constructor(e,t){this.tag=e,this.value=t}static some(e){return new h(!0,e)}static none(){return h.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?h.some(e(this.value)):h.none()}bind(e){return this.tag?e(this.value):h.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:h.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(e??"Called getOrDie on None")}static from(e){return d(e)?h.some(e):h.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}Array.prototype.slice;const b=Array.prototype.push,y=e=>{const t=[];for(let a=0,i=e.length;af.call(e,t),w=(D=(e,t)=>n(e)&&n(t)?w(e,t):t,(...e)=>{if(0===e.length)throw new Error("Can't merge zero objects");const t={};for(let a=0;ae.length>0,C=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},S=C,U=(e,t,a)=>{((e,t,a)=>{if(!(r(a)||m(a)||u(a)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",a,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,a+"")})(e.dom,t,a)};var I=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),x=tinymce.util.Tools.resolve("tinymce.util.URI");const N=e=>t=>t.options.get(e),E=N("image_dimensions"),T=N("image_advtab"),L=N("image_uploadtab"),O=N("image_prepend_url"),R=N("image_class_list"),j=N("image_description"),k=N("image_title"),M=N("image_caption"),z=N("image_list"),B=N("a11y_advanced_options"),P=N("automatic_uploads"),F=e=>(e&&(e=e.replace(/px$/,"")),e),H=e=>(e.length>0&&/^[0-9]+$/.test(e)&&(e+="px"),e),G=e=>"IMG"===e.nodeName&&(e.hasAttribute("data-mce-object")||e.hasAttribute("data-mce-placeholder")),W=(e,t)=>{const a=e.options.get;return x.isDomSafe(t,"img",{allow_html_data_urls:a("allow_html_data_urls"),allow_script_urls:a("allow_script_urls"),allow_svg_data_urls:a("allow_svg_data_urls")})},$=I.DOM,V=e=>e.style.marginLeft&&e.style.marginRight&&e.style.marginLeft===e.style.marginRight?F(e.style.marginLeft):"",K=e=>e.style.marginTop&&e.style.marginBottom&&e.style.marginTop===e.style.marginBottom?F(e.style.marginTop):"",Z=e=>e.style.borderWidth?F(e.style.borderWidth):"",q=(e,t)=>e.hasAttribute(t)?e.getAttribute(t)??"":"",J=e=>null!==e.parentNode&&"FIGURE"===e.parentNode.nodeName,Q=(e,t,a)=>{""===a||null===a?e.removeAttribute(t):e.setAttribute(t,a)},X=(e,t)=>{const a=e.getAttribute("style"),i=t(null!==a?a:"");i.length>0?(e.setAttribute("style",i),e.setAttribute("data-mce-style",i)):e.removeAttribute("style")},Y=(e,t)=>(e,a,i)=>{const s=e.style;s[a]?(s[a]=H(i),X(e,t)):Q(e,a,i)},ee=(e,t)=>e.style[t]?F(e.style[t]):q(e,t),te=(e,t)=>{const a=H(t);e.style.marginLeft=a,e.style.marginRight=a},ae=(e,t)=>{const a=H(t);e.style.marginTop=a,e.style.marginBottom=a},ie=(e,t)=>{const a=H(t);e.style.borderWidth=a},se=(e,t)=>{e.style.borderStyle=t},re=e=>e.style.borderStyle??"",oe=e=>d(e)&&"FIGURE"===e.nodeName,ne=e=>{const t=$.getAttrib(e,"alt"),a=$.getAttrib(e,"role");return e.hasAttribute("alt")&&0===t.length||"presentation"===a||"none"===a},le=e=>ne(e)?"":q(e,"alt"),ce=(e,t)=>{const a=document.createElement("img");return Q(a,"style",t.style),(V(a)||""!==t.hspace)&&te(a,t.hspace),(K(a)||""!==t.vspace)&&ae(a,t.vspace),(Z(a)||""!==t.border)&&ie(a,t.border),(re(a)||""!==t.borderStyle)&&se(a,t.borderStyle),e(a.getAttribute("style")??"")},me=(e,t)=>({src:q(t,"src"),alt:le(t),title:q(t,"title"),width:ee(t,"width"),height:ee(t,"height"),class:q(t,"class"),style:e(q(t,"style")),caption:J(t),hspace:V(t),vspace:K(t),border:Z(t),borderStyle:re(t),isDecorative:ne(t)}),de=(e,t,a,i,s)=>{a[i]!==t[i]&&s(e,i,String(a[i]))},ge=(e,t,a)=>{if(a){$.setAttrib(e,"role","presentation");const t=S(e);U(t,"alt","")}else{if(c(t)){S(e).dom.removeAttribute("alt")}else{const a=S(e);U(a,"alt",t)}"presentation"===$.getAttrib(e,"role")&&$.setAttrib(e,"role","")}},ue=(e,t)=>(a,i,s)=>{e(a,s),X(a,t)},pe=(e,t,a)=>{const i=me(e,a);de(a,i,t,"caption",(e,t,a)=>(e=>{J(e)?(e=>{const t=e.parentNode;d(t)&&($.insertAfter(e,t),$.remove(t))})(e):(e=>{const t=$.create("figure",{class:"image"});$.insertAfter(t,e),t.appendChild(e),t.appendChild($.create("figcaption",{contentEditable:"true"},"Caption")),t.contentEditable="false"})(e)})(e)),de(a,i,t,"src",Q),de(a,i,t,"title",Q),de(a,i,t,"width",Y(0,e)),de(a,i,t,"height",Y(0,e)),de(a,i,t,"class",Q),de(a,i,t,"style",ue((e,t)=>Q(e,"style",t),e)),de(a,i,t,"hspace",ue(te,e)),de(a,i,t,"vspace",ue(ae,e)),de(a,i,t,"border",ue(ie,e)),de(a,i,t,"borderStyle",ue(se,e)),((e,t,a)=>{a.alt===t.alt&&a.isDecorative===t.isDecorative||ge(e,a.alt,a.isDecorative)})(a,i,t)},he=(e,t)=>{const a=(e=>{if(e.margin){const t=String(e.margin).split(" ");switch(t.length){case 1:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[0],e["margin-bottom"]=e["margin-bottom"]||t[0],e["margin-left"]=e["margin-left"]||t[0];break;case 2:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[0],e["margin-left"]=e["margin-left"]||t[1];break;case 3:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[2],e["margin-left"]=e["margin-left"]||t[1];break;case 4:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[2],e["margin-left"]=e["margin-left"]||t[3]}delete e.margin}return e})(e.dom.styles.parse(t)),i=e.dom.styles.parse(e.dom.styles.serialize(a));return e.dom.styles.serialize(i)},be=e=>{const t=e.selection.getNode(),a=e.dom.getParent(t,"figure.image");return a?e.dom.select("img",a)[0]:t&&("IMG"!==t.nodeName||G(t))?null:t},ye=(e,t)=>{const a=e.dom,i=(t=>{const a={};var i;return((e,t,a,i)=>{((e,t)=>{const a=v(e);for(let i=0,s=a.length;i{(t(e,s)?a:i)(e,s)})})(t,(t,a)=>!e.schema.isValidChild(a,"figure"),(i=a,(e,t)=>{i[t]=e}),p),a})(e.schema.getTextBlockElements()),s=a.getParent(t.parentNode,e=>{return t=i,a=e.nodeName,A(t,a)&&void 0!==t[a]&&null!==t[a];var t,a},e.getBody());return s?a.split(s,t)??t:t},ve=(e,t)=>{const a=((t,a)=>{const i=document.createElement("img");if(pe(t=>he(e,t),{...a,caption:!1},i),ge(i,a.alt,a.isDecorative),a.caption){const e=$.create("figure",{class:"image"});return e.appendChild(i),e.appendChild($.create("figcaption",{contentEditable:"true"},"Caption")),e.contentEditable="false",e}return i})(0,t);e.dom.setAttrib(a,"data-mce-id","__mcenew"),e.focus(),e.insertContent(a.outerHTML);const i=e.dom.select('*[data-mce-id="__mcenew"]')[0];if(e.dom.setAttrib(i,"data-mce-id",null),oe(i)){const t=ye(e,i);e.selection.select(t)}else e.selection.select(i)},fe=(e,t)=>{const a=be(e);if(a){const i={...me(t=>he(e,t),a),...t},s=((e,t)=>{const a=t.src;return{...t,src:W(e,a)?a:""}})(e,i);i.src?((e,t)=>{const a=be(e);if(a)if(pe(t=>he(e,t),t,a),((e,t)=>{e.dom.setAttrib(t,"src",t.getAttribute("src"))})(e,a),oe(a.parentNode)){e.dom.setStyle(a,"float","");const t=a.parentNode;ye(e,t),e.selection.select(a.parentNode)}else e.selection.select(a),((e,t,a)=>{const i=()=>{a.onload=a.onerror=null,e.selection&&(e.selection.select(a),e.nodeChanged())};a.onload=()=>{t.width||t.height||!E(e)||e.dom.setAttribs(a,{width:String(a.clientWidth),height:String(a.clientHeight)}),i()},a.onerror=i})(e,t,a)})(e,s):((e,t)=>{if(t){const a=e.dom.is(t.parentNode,"figure.image")?t.parentNode:t;e.dom.remove(a),e.focus(),e.nodeChanged(),e.dom.isEmpty(e.getBody())&&(e.setContent(""),e.selection.setCursorLocation())}})(e,a)}else t.src&&ve(e,{src:"",alt:"",title:"",width:"",height:"",class:"",style:"",caption:!1,hspace:"",vspace:"",border:"",borderStyle:"",isDecorative:!1,...t})};var Ae=tinymce.util.Tools.resolve("tinymce.util.ImageUploader"),we=tinymce.util.Tools.resolve("tinymce.util.Tools");const De=e=>r(e.value)?e.value:"",_e=(e,t)=>{const a=[];return we.each(e,e=>{const i=(e=>r(e.text)?e.text:r(e.title)?e.title:"")(e);if(void 0!==e.menu){const s=_e(e.menu,t);a.push({text:i,items:s})}else{const s=t(e);a.push({text:i,value:s})}}),a},Ce=(e=De)=>t=>t?h.from(t).map(t=>_e(t,e)):h.none(),Se=(e,t)=>((e,t)=>{for(let a=0;a(e=>A(e,"items"))(e)?Se(e.items,t):e.value===t?h.some(e):h.none()),Ue=Ce,Ie=(e,t)=>e.bind(e=>Se(e,t)),xe=e=>{const t=Ue(t=>e.convertURL(t.value||t.url||"","src")),a=new Promise(a=>{((e,t)=>{const a=z(e);r(a)?fetch(a).then(e=>{e.ok&&e.json().then(t)}):g(a)?a(t):t(a)})(e,e=>{a(t(e).map(e=>y([[{text:"None",value:""}],e])))})}),i=(t,a)=>{e.windowManager.alert(t,a)},s=(D=R(e),Ce(De)(D)),o=T(e),n=L(e),l=(e=>_(e.options.get("images_upload_url")))(e),c=(e=>d(e.options.get("images_upload_handler")))(e),m=(e=>{const t=be(e);return t?me(t=>he(e,t),t):{src:"",alt:"",title:"",width:"",height:"",class:"",style:"",caption:!1,hspace:"",vspace:"",border:"",borderStyle:"",isDecorative:!1}})(e),u=j(e),p=k(e),b=E(e),v=M(e),f=B(e),A=P(e),w=h.some(O(e)).filter(e=>r(e)&&e.length>0);var D;return a.then(e=>({alertErr:i,image:m,imageList:e,classList:s,hasAdvTab:o,hasUploadTab:n,hasUploadUrl:l,hasUploadHandler:c,hasDescription:u,hasImageTitle:p,hasDimensions:b,hasImageCaption:v,prependURL:w,hasAccessibilityOptions:f,automaticUploads:A}))},Ne=e=>{const t=e.imageList.map(e=>({name:"images",type:"listbox",label:"Image list",items:e})),a={name:"alt",type:"input",label:"Alternative description",enabled:!(e.hasAccessibilityOptions&&e.image.isDecorative)},i=e.classList.map(e=>({name:"classes",type:"listbox",label:"Class",items:e}));return y([[{name:"src",type:"urlinput",filetype:"image",label:"Source",picker_text:"Browse files"}],t.toArray(),e.hasAccessibilityOptions&&e.hasDescription?[{type:"label",label:"Accessibility",items:[{name:"isDecorative",type:"checkbox",label:"Image is decorative"}]}]:[],e.hasDescription?[a]:[],e.hasImageTitle?[{name:"title",type:"input",label:"Image title"}]:[],e.hasDimensions?[{name:"dimensions",type:"sizeinput"}]:[],[{...(s=e.classList.isSome()&&e.hasImageCaption,s?{type:"grid",columns:2}:{type:"panel"}),items:y([i.toArray(),e.hasImageCaption?[{type:"label",label:"Caption",items:[{type:"checkbox",name:"caption",label:"Show caption"}]}]:[]])}]]);var s},Ee=e=>({title:"General",name:"general",items:Ne(e)}),Te=Ne,Le=e=>({src:{value:e.src,meta:{}},images:e.src,alt:e.alt,title:e.title,dimensions:{width:e.width,height:e.height},classes:e.class,caption:e.caption,style:e.style,vspace:e.vspace,border:e.border,hspace:e.hspace,borderstyle:e.borderStyle,fileinput:[],isDecorative:e.isDecorative}),Oe=(e,t)=>({src:e.src.value,alt:null!==e.alt&&0!==e.alt.length||!t?e.alt:null,title:e.title,width:e.dimensions.width,height:e.dimensions.height,class:e.classes,style:e.style,caption:e.caption,hspace:e.hspace,vspace:e.vspace,border:e.border,borderStyle:e.borderstyle,isDecorative:e.isDecorative}),Re=(e,t,a,i)=>{((e,t)=>{const a=t.getData();((e,t)=>/^(?:[a-zA-Z]+:)?\/\//.test(t)?h.none():e.prependURL.bind(e=>t.substring(0,e.length)!==e?h.some(e+t):h.none()))(e,a.src.value).each(e=>{t.setData({src:{value:e,meta:a.src.meta}})})})(t,i),((e,t)=>{const a=t.getData(),i=a.src.meta;if(void 0!==i){const s=w({},a);((e,t,a)=>{e.hasDescription&&r(a.alt)&&(t.alt=a.alt),e.hasAccessibilityOptions&&(t.isDecorative=a.isDecorative||t.isDecorative||!1),e.hasImageTitle&&r(a.title)&&(t.title=a.title),e.hasDimensions&&(r(a.width)&&(t.dimensions.width=a.width),r(a.height)&&(t.dimensions.height=a.height)),r(a.class)&&Ie(e.classList,a.class).each(e=>{t.classes=e.value}),e.hasImageCaption&&m(a.caption)&&(t.caption=a.caption),e.hasAdvTab&&(r(a.style)&&(t.style=a.style),r(a.vspace)&&(t.vspace=a.vspace),r(a.border)&&(t.border=a.border),r(a.hspace)&&(t.hspace=a.hspace),r(a.borderstyle)&&(t.borderstyle=a.borderstyle))})(e,s,i),t.setData(s)}})(t,i),((e,t,a,i)=>{const s=i.getData(),r=s.src.value,o=s.src.meta||{};o.width||o.height||!t.hasDimensions||(_(r)?e.imageSize(r).then(e=>{a.open&&i.setData({dimensions:e})}).catch(e=>console.error(e)):i.setData({dimensions:{width:"",height:""}}))})(e,t,a,i),((e,t,a)=>{const i=a.getData(),s=Ie(e.imageList,i.src.value);t.prevImage=s,a.setData({images:s.map(e=>e.value).getOr("")})})(t,a,i)},je=(e,t,a,i)=>{const s=i.getData();var r;i.block("Uploading image"),(r=s.fileinput,(e=>0{i.unblock()},s=>{const r=URL.createObjectURL(s),o=()=>{i.unblock(),URL.revokeObjectURL(r)},n=s=>{i.setData({src:{value:s,meta:{}}}),i.showTab("general"),Re(e,t,a,i),i.focus("src")};var l;(l=s,new Promise((e,t)=>{const a=new FileReader;a.onload=()=>{e(a.result)},a.onerror=()=>{t(a.error?.message)},a.readAsDataURL(l)})).then(a=>{const l=e.createBlobCache(s,r,a);t.automaticUploads?e.uploadImage(l).then(e=>{n(e.url),o()}).catch(e=>{o(),t.alertErr(e,()=>{i.focus("fileinput")})}):(e.addToBlobCache(l),n(l.blobUri()),i.unblock())})})},ke=(e,t,a)=>(i,s)=>{"src"===s.name?Re(e,t,a,i):"images"===s.name?((e,t,a,i)=>{const s=i.getData(),r=Ie(t.imageList,s.images);r.each(e=>{const t=""===s.alt||a.prevImage.map(e=>e.text===s.alt).getOr(!1);t?""===e.value?i.setData({src:e,alt:a.prevAlt}):i.setData({src:e,alt:e.text}):i.setData({src:e})}),a.prevImage=r,Re(e,t,a,i)})(e,t,a,i):"alt"===s.name?a.prevAlt=i.getData().alt:"fileinput"===s.name?je(e,t,a,i):"isDecorative"===s.name&&i.setEnabled("alt",!i.getData().isDecorative)},Me=e=>()=>{e.open=!1},ze=e=>{return e.hasAdvTab||e.hasUploadUrl||e.hasUploadHandler?{type:"tabpanel",tabs:y([[Ee(e)],e.hasAdvTab?[{title:"Advanced",name:"advanced",items:[{type:"grid",columns:2,items:[{type:"input",label:"Vertical space",name:"vspace",inputMode:"numeric"},{type:"input",label:"Horizontal space",name:"hspace",inputMode:"numeric"},{type:"input",label:"Border width",name:"border",inputMode:"numeric"},{type:"listbox",name:"borderstyle",label:"Border style",items:[{text:"Select...",value:""},{text:"Solid",value:"solid"},{text:"Dotted",value:"dotted"},{text:"Dashed",value:"dashed"},{text:"Double",value:"double"},{text:"Groove",value:"groove"},{text:"Ridge",value:"ridge"},{text:"Inset",value:"inset"},{text:"Outset",value:"outset"},{text:"None",value:"none"},{text:"Hidden",value:"hidden"}]}]}]}]:[],e.hasUploadTab&&(e.hasUploadUrl||e.hasUploadHandler)?[(t=()=>new Promise(t=>e.alertErr("Selected images do not have allowed extensions",t)),{title:"Upload",name:"upload",items:[{type:"dropzone",name:"fileinput",onInvalidFiles:t}]})]:[]])}:{type:"panel",items:Te(e)};var t},Be=(e,t,a)=>i=>{const s=w(Le(t.image),i.getData()),r={...s,style:ce(a.normalizeCss,Oe(s,!1))};e.execCommand("mceUpdateImage",!1,Oe(r,t.hasAccessibilityOptions)),e.editorUpload.uploadImagesAuto(),i.close()},Pe=e=>t=>W(e,t)?(e=>new Promise((t,a)=>{const i=document.createElement("img");i.addEventListener("load",()=>{t({width:i.naturalWidth,height:i.naturalHeight})}),i.addEventListener("error",()=>{a(`Failed to get image dimensions for: ${e}`)}),i.src=e}))(e.documentBaseURI.toAbsolute(t)).then(e=>({width:String(e.width),height:String(e.height)})):Promise.resolve({width:"",height:""}),Fe=e=>(t,a,i)=>e.editorUpload.blobCache.create({blob:t,blobUri:a,name:t.name?.replace(/\.[^\.]+$/,""),filename:t.name,base64:i.split(",")[1]}),He=e=>t=>{e.editorUpload.blobCache.add(t)},Ge=e=>t=>he(e,t),We=e=>t=>e.dom.parseStyle(t),$e=e=>(t,a)=>e.dom.serializeStyle(t,a),Ve=e=>t=>Ae(e).upload([t],!1).then(e=>0===e.length?Promise.reject("Failed to upload image"):!1===e[0].status?Promise.reject(e[0].error?.message):e[0]),Ke=e=>{const t={imageSize:Pe(e),addToBlobCache:He(e),createBlobCache:Fe(e),normalizeCss:Ge(e),parseStyle:We(e),serializeStyle:$e(e),uploadImage:Ve(e)};return{open:()=>{xe(e).then(a=>{const i=(e=>({prevImage:Ie(e.imageList,e.image.src),prevAlt:e.image.alt,open:!0}))(a);return{title:"Insert/Edit Image",size:"normal",body:ze(a),buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:Le(a.image),onSubmit:Be(e,a,t),onChange:ke(t,a,i),onClose:Me(i)}}).then(e.windowManager.open)}}},Ze=e=>{const t=e.attr("class");return d(t)&&/\bimage\b/.test(t)},qe=e=>t=>{let a=t.length;const i=t=>{t.attr("contenteditable",e?"true":null)};for(;a--;){const s=t[a];Ze(s)&&(s.attr("contenteditable",e?"false":null),we.each(s.getAll("figcaption"),i))}},Je=e=>t=>{const a=()=>{t.setEnabled(e.selection.isEditable())};return e.on("NodeChange",a),a(),()=>{e.off("NodeChange",a)}};e.add("image",e=>{(e=>{const t=e.options.register;t("image_dimensions",{processor:"boolean",default:!0}),t("image_advtab",{processor:"boolean",default:!1}),t("image_uploadtab",{processor:"boolean",default:!0}),t("image_prepend_url",{processor:"string",default:""}),t("image_class_list",{processor:"object[]"}),t("image_description",{processor:"boolean",default:!0}),t("image_title",{processor:"boolean",default:!1}),t("image_caption",{processor:"boolean",default:!1}),t("image_list",{processor:e=>{const t=!1===e||r(e)||((e,t)=>{if(l(e)){for(let a=0,i=e.length;a{e.on("PreInit",()=>{e.parser.addNodeFilter("figure",qe(!0)),e.serializer.addNodeFilter("figure",qe(!1))})})(e),(e=>{e.ui.registry.addToggleButton("image",{icon:"image",tooltip:"Insert/edit image",onAction:Ke(e).open,onSetup:t=>{t.setActive(d(be(e)));const a=e.selection.selectorChangedWithUnbind("img:not([data-mce-object]):not([data-mce-placeholder]),figure.image",t.setActive).unbind,i=Je(e)(t);return()=>{a(),i()}}}),e.ui.registry.addMenuItem("image",{icon:"image",text:"Image...",onAction:Ke(e).open,onSetup:Je(e)}),e.ui.registry.addContextMenu("image",{update:t=>e.selection.isEditable()&&(oe(t)||"IMG"===t.nodeName&&!G(t))?["image"]:[]})})(e),(e=>{e.addCommand("mceImage",Ke(e).open),e.addCommand("mceUpdateImage",(t,a)=>{e.undoManager.transact(()=>fe(e,a))})})(e)})}(); \ No newline at end of file diff --git a/libs/tinymce/plugins/preview/plugin.min.js b/libs/tinymce/plugins/preview/plugin.min.js index 4867cd73e..e2a1bf2b2 100644 --- a/libs/tinymce/plugins/preview/plugin.min.js +++ b/libs/tinymce/plugins/preview/plugin.min.js @@ -1 +1 @@ -!function(){"use strict";const e=e=>"string"===(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&(r=n=e,(s=String).prototype.isPrototypeOf(r)||n.constructor?.name===s.name)?"string":t;var r,n,s})(e);const t=e=>undefined===e;const r=e=>"function"==typeof e,n=e=>()=>e,s=e=>e,o=n(!1);class i{tag;value;static singletonNone=new i(!1);constructor(e,t){this.tag=e,this.value=t}static some(e){return new i(!0,e)}static none(){return i.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?i.some(e(this.value)):i.none()}bind(e){return this.tag?e(this.value):i.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:i.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(e??"Called getOrDie on None")}static from(e){return null==e?i.none():i.some(e)}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}Array.prototype.slice;const a=Array.prototype.indexOf,c=(e,t)=>{const r=e.length,n=new Array(r);for(let s=0;s((e,t,r)=>{for(let n=0,s=e.length;n{const r=[];return((e,t)=>{const r=l(e);for(let n=0,s=r.length;n{r.push(t(e,n))}),r},m=(e,r,n=0,s)=>{const o=e.indexOf(r,n);return-1!==o&&(!!t(s)||o+r.length<=s)};var h=tinymce.util.Tools.resolve("tinymce.PluginManager");const g=()=>v(0,0),v=(e,t)=>({major:e,minor:t}),p={nu:v,detect:(e,t)=>{const r=String(t).toLowerCase();return 0===e.length?g():((e,t)=>{const r=((e,t)=>{for(let r=0;rNumber(t.replace(r,"$"+e));return v(n(1),n(2))})(e,r)},unknown:g},f=(e,t)=>{const r=String(t).toLowerCase();return u(e,e=>e.search(r))},y=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,w=e=>t=>m(t,e),x=[{name:"Edge",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:e=>m(e,"edge/")&&m(e,"chrome")&&m(e,"safari")&&m(e,"applewebkit")},{name:"Chromium",brand:"Chromium",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,y],search:e=>m(e,"chrome")&&!m(e,"chromeframe")},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:e=>m(e,"msie")||m(e,"trident")},{name:"Opera",versionRegexes:[y,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:w("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:w("firefox")},{name:"Safari",versionRegexes:[y,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:e=>(m(e,"safari")||m(e,"mobile/"))&&m(e,"applewebkit")}],S=[{name:"Windows",search:w("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:e=>m(e,"iphone")||m(e,"ipad"),versionRegexes:[/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,/.*cpu os ([0-9]+)_([0-9]+).*/,/.*cpu iphone os ([0-9]+)_([0-9]+).*/]},{name:"Android",search:w("android"),versionRegexes:[/.*?android\ ?([0-9]+)\.([0-9]+).*/]},{name:"macOS",search:w("mac os x"),versionRegexes:[/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]},{name:"Linux",search:w("linux"),versionRegexes:[]},{name:"Solaris",search:w("sunos"),versionRegexes:[]},{name:"FreeBSD",search:w("freebsd"),versionRegexes:[]},{name:"ChromeOS",search:w("cros"),versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/]}],b={browsers:n(x),oses:n(S)},O="Edge",A="Chromium",R="Opera",C="Firefox",k="Safari",D=e=>{const t=e.current,r=e.version,n=e=>()=>t===e;return{current:t,version:r,isEdge:n(O),isChromium:n(A),isIE:n("IE"),isOpera:n(R),isFirefox:n(C),isSafari:n(k)}},E=()=>D({current:void 0,version:p.unknown()}),I=D,P=(n(O),n(A),n("IE"),n(R),n(C),n(k),"Windows"),T="Android",L="Linux",$="macOS",_="Solaris",B="FreeBSD",N="ChromeOS",j=e=>{const t=e.current,r=e.version,n=e=>()=>t===e;return{current:t,version:r,isWindows:n(P),isiOS:n("iOS"),isAndroid:n(T),isMacOS:n($),isLinux:n(L),isSolaris:n(_),isFreeBSD:n(B),isChromeOS:n(N)}},F=()=>j({current:void 0,version:p.unknown()}),M=j,U=(n(P),n("iOS"),n(T),n(L),n($),n(_),n(B),n(N),(e,t,r)=>{const s=b.browsers(),o=b.oses(),a=t.bind(e=>((e,t)=>((e,t)=>{for(let r=0;r{const r=t.brand.toLowerCase();return u(e,e=>r===e.brand?.toLowerCase()).map(e=>({current:e.name,version:p.nu(parseInt(t.version,10),0)}))}))(s,e)).orThunk(()=>((e,t)=>f(e,t).map(e=>{const r=p.detect(e.versionRegexes,t);return{current:e.name,version:r}}))(s,e)).fold(E,I),c=((e,t)=>f(e,t).map(e=>{const r=p.detect(e.versionRegexes,t);return{current:e.name,version:r}}))(o,e).fold(F,M),l=((e,t,r,s)=>{const o=e.isiOS()&&!0===/ipad/i.test(r),i=e.isiOS()&&!o,a=e.isiOS()||e.isAndroid(),c=a||s("(pointer:coarse)"),u=o||!i&&a&&s("(min-device-width:768px)"),l=i||a&&!u,d=t.isSafari()&&e.isiOS()&&!1===/safari/i.test(r),m=!l&&!u&&!d;return{isiPad:n(o),isiPhone:n(i),isTablet:n(u),isPhone:n(l),isTouch:n(c),isAndroid:e.isAndroid,isiOS:e.isiOS,isWebView:n(d),isDesktop:n(m)}})(c,a,e,r);return{browser:a,os:c,deviceType:l}}),W=e=>window.matchMedia(e).matches;let K=(e=>{let t,r=!1;return(...n)=>(r||(r=!0,t=e.apply(null,n)),t)})(()=>U(window.navigator.userAgent,i.from(window.navigator.userAgentData),W));const V=()=>K();var z=tinymce.util.Tools.resolve("tinymce.dom.ScriptLoader"),Y=tinymce.util.Tools.resolve("tinymce.util.Tools");const q=e=>t=>t.options.get(e),G=q("content_style"),H=q("content_css_cors"),J=q("body_class"),Q=q("body_id"),X=e=>{const t=((e,t)=>{const n=[],s=r(t)?e=>((e,t)=>{for(let r=0,n=e.length;rt(r,e)):e=>((e,t)=>((e,t)=>a.call(e,t))(e,t)>-1)(n,e);for(let t=0,r=e.length;t{const r=d(z.ScriptLoader.getScriptAttributes(t),(t,r)=>` ${e.dom.encode(r)}="${e.dom.encode(t)}"`);return`"; - echo ''; - exit; - } -} - -//Flash Alert Function -function flash_alert(string $message, string $type = 'success'): void { - $_SESSION['alert_type'] = $type; - $_SESSION['alert_message'] = $message; -} - -// Sanitize File Names -function sanitize_filename($filename, $strict = false) { - // Remove path information and dots around the filename - $filename = basename($filename); - - // Replace spaces and underscores with dashes - $filename = str_replace([' ', '_'], '-', $filename); - - // Remove anything which isn't a word, number, dot, or dash - $filename = preg_replace('/[^A-Za-z0-9\.\-]/', '', $filename); - - // Optionally make filename strict alphanumeric (keep dot and dash) - if ($strict) { - $filename = preg_replace('/[^A-Za-z0-9\.\-]/', '', $filename); - } - - // Avoid multiple consecutive dashes - $filename = preg_replace('/-+/', '-', $filename); - - // Remove leading/trailing dots and dashes - $filename = trim($filename, '.-'); - - // Ensure it’s not empty - if (empty($filename)) { - $filename = 'file'; - } - - return $filename; -} - -function saveBase64Images(string $html, string $baseFsPath, string $baseWebPath, int $ownerId): string { - // Normalize paths - $baseFsPath = rtrim($baseFsPath, '/\\') . '/'; - $baseWebPath = rtrim($baseWebPath, '/\\') . '/'; - - $targetDir = $baseFsPath . $ownerId . "/"; - - $folderCreated = false; // <-- NEW FLAG - $savedAny = false; // <-- Track if ANY images processed - - libxml_use_internal_errors(true); - $dom = new DOMDocument(); - $dom->loadHTML('' . $html); - libxml_clear_errors(); - - $imgs = $dom->getElementsByTagName('img'); - - foreach ($imgs as $img) { - $src = $img->getAttribute('src'); - - // Match base64 images - if (preg_match('/^data:image\/([a-zA-Z0-9+]+);base64,(.*)$/s', $src, $matches)) { - - $savedAny = true; // <-- We are actually saving at least 1 image - - // Create folder ONLY when needed - if (!$folderCreated) { - if (!is_dir($targetDir)) { - mkdir($targetDir, 0775, true); - } - $folderCreated = true; - } - - $mimeType = strtolower($matches[1]); - $base64 = $matches[2]; - - $binary = base64_decode($base64); - if ($binary === false) { - continue; - } - - // Extension mapping - switch ($mimeType) { - case 'jpeg': - case 'jpg': $ext = 'jpg'; break; - case 'png': $ext = 'png'; break; - case 'gif': $ext = 'gif'; break; - case 'webp': $ext = 'webp'; break; - default: $ext = 'png'; - } - - // Secure random filename - $uid = bin2hex(random_bytes(16)); - $filename = "img_{$uid}.{$ext}"; - - $filePath = $targetDir . $filename; - - if (file_put_contents($filePath, $binary) !== false) { - $webPath = "/" . $baseWebPath . $ownerId . "/" . $filename; - $img->setAttribute('src', $webPath); - } - } - } - - // If no images were processed, return original HTML immediately - if (!$savedAny) { - return $html; - } - - // Extract body content only - $body = $dom->getElementsByTagName('body')->item(0); - - if ($body) { - $innerHTML = ''; - foreach ($body->childNodes as $child) { - $innerHTML .= $dom->saveHTML($child); - } - return $innerHTML; - } - - return $html; -} - -function cleanupUnusedImages(string $html, string $folderFsPath, string $folderWebPath) { - - $folderFsPath = rtrim($folderFsPath, '/\\') . '/'; - $folderWebPath = rtrim($folderWebPath, '/\\') . '/'; - - if (!is_dir($folderFsPath)) { - return; // no folder = nothing to delete - } - - // 1. Get all files currently on disk - $filesOnDisk = glob($folderFsPath . "*"); - - // 2. Find all - preg_match_all('/]+src=["\']([^"\']+)["\']/i', $html, $matches); - $htmlImagePaths = $matches[1] ?? []; - - // Normalize paths: keep only filenames belonging to this template folder - $referencedFiles = []; - - foreach ($htmlImagePaths as $src) { - if (strpos($src, $folderWebPath) !== false) { - $filename = basename($src); - $referencedFiles[] = $filename; - } - } - - // 3. Delete any physical file not referenced in the HTML - foreach ($filesOnDisk as $filePath) { - $filename = basename($filePath); - - if (!in_array($filename, $referencedFiles)) { - unlink($filePath); - } - } -} - -/** - * Simple mysqli helper functions - * - Prepared statements under the hood - * - "Old style" INSERT/UPDATE SET feeling - */ - -/** - * Core executor: prepares, binds, executes. - * - * @throws Exception on error - */ -function dbExecute(mysqli $mysqli, string $sql, array $params = []): mysqli_stmt -{ - $stmt = $mysqli->prepare($sql); - if (!$stmt) { - throw new Exception('MySQLi prepare error: ' . $mysqli->error . ' | SQL: ' . $sql); - } - - if (!empty($params)) { - $types = ''; - $values = []; - - foreach ($params as $param) { - if (is_int($param)) { - $types .= 'i'; - } elseif (is_float($param)) { - $types .= 'd'; - } elseif (is_bool($param)) { - $types .= 'i'; - $param = $param ? 1 : 0; - } elseif (is_null($param)) { - $types .= 's'; - $param = null; - } else { - $types .= 's'; - } - $values[] = $param; - } - - if (!$stmt->bind_param($types, ...$values)) { - throw new Exception('MySQLi bind_param error: ' . $stmt->error . ' | SQL: ' . $sql); - } - } - - if (!$stmt->execute()) { - throw new Exception('MySQLi execute error: ' . $stmt->error . ' | SQL: ' . $sql); - } - - return $stmt; -} - -/** - * Fetch all rows as associative arrays. - */ -function dbFetchAll(mysqli $mysqli, string $sql, array $params = []): array -{ - $stmt = dbExecute($mysqli, $sql, $params); - $result = $stmt->get_result(); - if ($result === false) { - return []; - } - return $result->fetch_all(MYSQLI_ASSOC); -} - -/** - * Fetch a single row (assoc) or null if none. - */ -function dbFetchOne(mysqli $mysqli, string $sql, array $params = []): ?array -{ - $stmt = dbExecute($mysqli, $sql, $params); - $result = $stmt->get_result(); - if ($result === false) { - return null; - } - $row = $result->fetch_assoc(); - return $row !== null ? $row : null; -} - -/** - * Fetch a single scalar value (first column of first row) or null. - */ -function dbFetchValue(mysqli $mysqli, string $sql, array $params = []) -{ - $row = dbFetchOne($mysqli, $sql, $params); - if ($row === null) { - return null; - } - return reset($row); -} - -/** - * INSERT using "SET" style. - * Example: - * $id = dbInsert($mysqli, 'clients', [ - * 'client_name' => $name, - * 'client_type' => $type, - * ]); - * - * @return int insert_id - * - * @throws InvalidArgumentException - * @throws Exception - */ -function dbInsert(mysqli $mysqli, string $table, array $data): int -{ - if (empty($data)) { - throw new InvalidArgumentException('dbInsert called with empty $data'); - } - - $setParts = []; - foreach ($data as $column => $_) { - $setParts[] = "$column = ?"; - } - - $sql = "INSERT INTO $table SET " . implode(', ', $setParts); - $params = array_values($data); - - dbExecute($mysqli, $sql, $params); - - return $mysqli->insert_id; -} - -function dbUpdate( - mysqli $mysqli, - string $table, - array $data, - $where, - array $whereParams = [] -): int { - if (empty($data)) { - throw new InvalidArgumentException('dbUpdate called with empty $data'); - } - if (empty($where)) { - throw new InvalidArgumentException('dbUpdate requires a WHERE clause'); - } - - $setParts = []; - foreach ($data as $column => $_) { - $setParts[] = "$column = ?"; - } - - if (is_array($where)) { - $whereParts = []; - $whereParams = []; - foreach ($where as $column => $value) { - $whereParts[] = "$column = ?"; - $whereParams[] = $value; - } - $whereSql = implode(' AND ', $whereParts); - } else { - $whereSql = $where; - } - - $sql = "UPDATE $table SET " . implode(', ', $setParts) . " WHERE $whereSql"; - $params = array_merge(array_values($data), $whereParams); - - $stmt = dbExecute($mysqli, $sql, $params); - return $stmt->affected_rows; -} - -/** - * DELETE helper. - * - * WHERE can be: - * - array: ['client_id' => $id] (auto "client_id = ?") - * - string: 'client_id = ?' (use with $whereParams) - * - * @return int affected_rows - * - * @throws InvalidArgumentException - * @throws Exception - */ -function dbDelete( - mysqli $mysqli, - string $table, - $where, - array $whereParams = [] -): int { - if (empty($where)) { - throw new InvalidArgumentException('dbDelete requires a WHERE clause'); - } - - if (is_array($where)) { - $whereParts = []; - $whereParams = []; - foreach ($where as $column => $value) { - $whereParts[] = "$column = ?"; - $whereParams[] = $value; - } - $whereSql = implode(' AND ', $whereParts); - } else { - $whereSql = $where; - } - - $sql = "DELETE FROM $table WHERE $whereSql"; - $stmt = dbExecute($mysqli, $sql, $whereParams); - return $stmt->affected_rows; -} - -/** - * Transaction helpers (optional sugar). - */ -function dbBegin(mysqli $mysqli): void -{ - $mysqli->begin_transaction(); -} - -function dbCommit(mysqli $mysqli): void -{ - $mysqli->commit(); -} - -function dbRollback(mysqli $mysqli): void -{ - $mysqli->rollback(); -} - -function formatDuration($time) { - // expects "HH:MM:SS" - [$h, $m, $s] = array_map('intval', explode(':', $time)); - - $parts = []; - - if ($h > 0) $parts[] = $h . 'h'; - if ($m > 0) $parts[] = $m . 'm'; - - // show seconds only if under 1 minute total OR if nothing else exists - if ($h == 0 && $m == 0) { - $parts[] = $s . 's'; - } - - return implode(' ', $parts); -} - -function validateDate($date) { - if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $date)) { - return $date; - } - return date('Y-m-d'); // Fallback -} +// functions.php is now a loader. Helper functions live in topical files +// under functions/ - see each file's header comment for scope. + +require_once __DIR__ . '/functions/security.php'; +require_once __DIR__ . '/functions/sanitize.php'; +require_once __DIR__ . '/functions/format.php'; +require_once __DIR__ . '/functions/request.php'; +require_once __DIR__ . '/functions/files.php'; +require_once __DIR__ . '/functions/domain.php'; +require_once __DIR__ . '/functions/auth.php'; +require_once __DIR__ . '/functions/logging.php'; +require_once __DIR__ . '/functions/app.php'; +require_once __DIR__ . '/functions/db.php'; diff --git a/functions/app.php b/functions/app.php new file mode 100644 index 000000000..13968e7c4 --- /dev/null +++ b/functions/app.php @@ -0,0 +1,341 @@ + $row['Type'], + 'key' => $row['Key'] + ]; + } + + // Find the primary key field if available + $id_field = null; + foreach ($columns as $col => $details) { + if ($details['key'] === 'PRI') { + $id_field = $col; + break; + } + } + // Fallback: if no primary key is found, use the first column + if (!$id_field) { + reset($columns); + $id_field = key($columns); + } + + // Ensure the requested field exists; if not, default to the id field + if (!array_key_exists($field, $columns)) { + $field = $id_field; + } + + // Build and execute the query to fetch the specified field value + $query = "SELECT `$field` FROM `$table` WHERE `$id_field` = $id"; + $sql = mysqli_query($mysqli, $query); + + if ($sql && mysqli_num_rows($sql) > 0) { + $row = mysqli_fetch_assoc($sql); + $value = $row[$field]; + + // Apply the desired escaping method or auto-detect integer type if using SQL escaping + switch ($escape_method) { + case 'raw': + return $value; // Return as-is from the database + case 'html': + return htmlspecialchars($value ?? '', ENT_QUOTES, 'UTF-8'); // Escape for HTML + case 'json': + return json_encode($value); // Escape for JSON + case 'int': + return (int)$value; // Explicitly cast value to integer + case 'sql': + default: + // Auto-detect if the field type is integer + if (stripos($columns[$field]['type'], 'int') !== false) { + return (int)$value; + } else { + return sanitizeInput($value); // Escape for SQL using a custom function + } + } + } + + return null; // Return null if no record was found +} + +// Recursive function to display folder options - Used in folders files and documents +function display_folder_options($parent_folder_id, $client_id, $indent = 0) { + global $mysqli; + + $sql_folders = mysqli_query($mysqli, "SELECT * FROM folders WHERE parent_folder = $parent_folder_id AND folder_client_id = $client_id ORDER BY folder_name ASC"); + while ($row = mysqli_fetch_assoc($sql_folders)) { + $folder_id = intval($row['folder_id']); + $folder_name = nullable_htmlentities($row['folder_name']); + + // Indentation for subfolders + $indentation = str_repeat(' ', $indent * 4); + + // Check if this folder is selected + $selected = ''; + if ((isset($_GET['folder_id']) && intval($_GET['folder_id']) === $folder_id) || + (isset($_POST['folder']) && intval($_POST['folder']) === $folder_id)) { + $selected = 'selected'; + } + + echo ""; + + // Recursively display subfolders + display_folder_options($folder_id, $client_id, $indent + 1); + } +} + +function fetchUpdates() { + + global $repo_branch; + + // Fetch the latest code changes but don't apply them + exec("git fetch", $output, $result); + $latest_version = exec("git rev-parse origin/$repo_branch"); + $current_version = exec("git rev-parse HEAD"); + + if ($current_version == $latest_version) { + $update_message = "No Updates available"; + } else { + $update_message = "New Updates are Available [$latest_version]"; + } + + + $updates = new stdClass(); + $updates->output = $output; + $updates->result = $result; + $updates->current_version = $current_version; + $updates->latest_version = $latest_version; + $updates->update_message = $update_message; + + + return $updates; + +} + +function getMonthlyTax($tax_name, $month, $year, $mysqli) +{ + // SQL to calculate monthly tax + $sql = "SELECT SUM(item_tax) AS monthly_tax FROM invoice_items + LEFT JOIN invoices ON invoice_items.item_invoice_id = invoices.invoice_id + LEFT JOIN payments ON invoices.invoice_id = payments.payment_invoice_id + WHERE YEAR(payments.payment_date) = $year AND MONTH(payments.payment_date) = $month + AND invoice_items.item_tax_id = (SELECT tax_id FROM taxes WHERE tax_name = '$tax_name')"; + $result = mysqli_query($mysqli, $sql); + $row = mysqli_fetch_assoc($result); + return $row['monthly_tax'] ?? 0; +} + +function getQuarterlyTax($tax_name, $quarter, $year, $mysqli) +{ + // Calculate start and end months for the quarter + $start_month = ($quarter - 1) * 3 + 1; + $end_month = $start_month + 2; + + // SQL to calculate quarterly tax + $sql = "SELECT SUM(item_tax) AS quarterly_tax FROM invoice_items + LEFT JOIN invoices ON invoice_items.item_invoice_id = invoices.invoice_id + LEFT JOIN payments ON invoices.invoice_id = payments.payment_invoice_id + WHERE YEAR(payments.payment_date) = $year AND MONTH(payments.payment_date) BETWEEN $start_month AND $end_month + AND invoice_items.item_tax_id = (SELECT tax_id FROM taxes WHERE tax_name = '$tax_name')"; + $result = mysqli_query($mysqli, $sql); + $row = mysqli_fetch_assoc($result); + return $row['quarterly_tax'] ?? 0; +} + +function addToMailQueue($data) { + + global $mysqli; + + foreach ($data as $email) { + $from = strval($email['from']); + $from_name = strval($email['from_name']); + $recipient = strval($email['recipient']); + $recipient_name = strval($email['recipient_name']); + $subject = strval($email['subject']); + $body = strval($email['body']); + + $cal_str = ''; + if (isset($email['cal_str'])) { + $cal_str = mysqli_escape_string($mysqli, $email['cal_str']); + } + + // Check if 'email_queued_at' is set and not empty + if (isset($email['queued_at']) && !empty($email['queued_at'])) { + $queued_at = "'" . sanitizeInput($email['queued_at']) . "'"; + } else { + // Use the current date and time if 'email_queued_at' is not set or empty + $queued_at = 'CURRENT_TIMESTAMP()'; + } + + mysqli_query($mysqli, "INSERT INTO email_queue SET email_recipient = '$recipient', email_recipient_name = '$recipient_name', email_from = '$from', email_from_name = '$from_name', email_subject = '$subject', email_content = '$body', email_queued_at = $queued_at, email_cal_str = '$cal_str'"); + } + + return true; +} + +function createiCalStr($datetime, $title, $description, $location) +{ + require_once "plugins/zapcal/zapcallib.php"; + + // Create the iCal object + $cal_event = new ZCiCal(); + $event = new ZCiCalNode("VEVENT", $cal_event->curnode); + + + // Set the method to REQUEST to indicate an invite + $event->addNode(new ZCiCalDataNode("METHOD:REQUEST")); + $event->addNode(new ZCiCalDataNode("SUMMARY:" . $title)); + $event->addNode(new ZCiCalDataNode("DTSTART:" . ZCiCal::fromSqlDateTime($datetime))); + // Assuming the end time is the same as start time. + // Todo: adjust this for actual duration + $event->addNode(new ZCiCalDataNode("DTEND:" . ZCiCal::fromSqlDateTime($datetime))); + $event->addNode(new ZCiCalDataNode("DTSTAMP:" . ZCiCal::fromSqlDateTime())); + $uid = date('Y-m-d-H-i-s') . "@" . $_SERVER['SERVER_NAME']; + $event->addNode(new ZCiCalDataNode("UID:" . $uid)); + $event->addNode(new ZCiCalDataNode("LOCATION:" . $location)); + $event->addNode(new ZCiCalDataNode("DESCRIPTION:" . $description)); + // Todo: add organizer details + // $event->addNode(new ZCiCalDataNode("ORGANIZER;CN=Organizer Name:MAILTO:organizer@example.com")); + + // Return the iCal string + return $cal_event->export(); +} + +function createiCalStrCancel($originaliCalStr) { + require_once "plugins/zapcal/zapcallib.php"; + + // Import the original iCal string + $cal_event = new ZCiCal($originaliCalStr); + + // Iterate through the iCalendar object to find VEVENT nodes + foreach($cal_event->tree->child as $node) { + if($node->getName() == "VEVENT") { + // Check if STATUS node exists, update it, or add a new one + $statusFound = false; + foreach($node->data as $key => $value) { + if($key == "STATUS") { + $value->setValue("CANCELLED"); + $statusFound = true; + break; // Exit the loop once the STATUS is updated + } + } + // If STATUS node is not found, add a new STATUS node + if (!$statusFound) { + $node->addNode(new ZCiCalDataNode("STATUS:CANCELLED")); + } + } + } + + // Return the modified iCal string + return $cal_event->export(); +} diff --git a/functions/auth.php b/functions/auth.php new file mode 100644 index 000000000..068966ae2 --- /dev/null +++ b/functions/auth.php @@ -0,0 +1,142 @@ + "read", + "2" => "write", + "3" => "full" + ]; + exit(WORDING_ROLECHECK_FAILED . "
    Tell your admin: $map[$check_access_level] access to $module is not permitted for your role."); + } +} + +function enforceClientAccess($client_id = null) { + global $mysqli, $session_user_id, $session_is_admin, $session_name; + + // Use global $client_id if none passed + if ($client_id === null) { + global $client_id; + } + + if ($session_is_admin) { + return true; + } + + $client_id = (int) $client_id; + $session_user_id = (int) $session_user_id; + + if (empty($client_id) || empty($session_user_id)) { + flash_alert('Access Denied.', 'error'); + redirect('clients.php'); + } + + // Check if this user has any client permissions set + $permissions_sql = "SELECT client_id + FROM user_client_permissions + WHERE user_id = $session_user_id + LIMIT 1"; + + $permissions_result = mysqli_query($mysqli, $permissions_sql); + + // If no permission rows exist for this user, allow access by default + if ($permissions_result && mysqli_num_rows($permissions_result) == 0) { + return true; + } + + // If permission rows exist, require this client + $access_sql = "SELECT client_id + FROM user_client_permissions + WHERE user_id = $session_user_id + AND client_id = $client_id + LIMIT 1"; + + $access_result = mysqli_query($mysqli, $access_sql); + + if ($access_result && mysqli_num_rows($access_result) > 0) { + return true; + } + + logAction( + 'Client', + 'Access', + "$session_name was denied permission from accessing client", + $client_id, + $client_id + ); + + flash_alert('Access Denied - You do not have permission to access that client!', 'error'); + redirect('clients.php'); +} diff --git a/functions/db.php b/functions/db.php new file mode 100644 index 000000000..78ae2d026 --- /dev/null +++ b/functions/db.php @@ -0,0 +1,224 @@ +prepare($sql); + if (!$stmt) { + throw new Exception('MySQLi prepare error: ' . $mysqli->error . ' | SQL: ' . $sql); + } + + if (!empty($params)) { + $types = ''; + $values = []; + + foreach ($params as $param) { + if (is_int($param)) { + $types .= 'i'; + } elseif (is_float($param)) { + $types .= 'd'; + } elseif (is_bool($param)) { + $types .= 'i'; + $param = $param ? 1 : 0; + } elseif (is_null($param)) { + $types .= 's'; + $param = null; + } else { + $types .= 's'; + } + $values[] = $param; + } + + if (!$stmt->bind_param($types, ...$values)) { + throw new Exception('MySQLi bind_param error: ' . $stmt->error . ' | SQL: ' . $sql); + } + } + + if (!$stmt->execute()) { + throw new Exception('MySQLi execute error: ' . $stmt->error . ' | SQL: ' . $sql); + } + + return $stmt; +} + +/** + * Fetch all rows as associative arrays. + */ +function dbFetchAll(mysqli $mysqli, string $sql, array $params = []): array +{ + $stmt = dbExecute($mysqli, $sql, $params); + $result = $stmt->get_result(); + if ($result === false) { + return []; + } + return $result->fetch_all(MYSQLI_ASSOC); +} + +/** + * Fetch a single row (assoc) or null if none. + */ +function dbFetchOne(mysqli $mysqli, string $sql, array $params = []): ?array +{ + $stmt = dbExecute($mysqli, $sql, $params); + $result = $stmt->get_result(); + if ($result === false) { + return null; + } + $row = $result->fetch_assoc(); + return $row !== null ? $row : null; +} + +/** + * Fetch a single scalar value (first column of first row) or null. + */ +function dbFetchValue(mysqli $mysqli, string $sql, array $params = []) +{ + $row = dbFetchOne($mysqli, $sql, $params); + if ($row === null) { + return null; + } + return reset($row); +} + +/** + * INSERT using "SET" style. + * Example: + * $id = dbInsert($mysqli, 'clients', [ + * 'client_name' => $name, + * 'client_type' => $type, + * ]); + * + * @return int insert_id + * + * @throws InvalidArgumentException + * @throws Exception + */ +function dbInsert(mysqli $mysqli, string $table, array $data): int +{ + if (empty($data)) { + throw new InvalidArgumentException('dbInsert called with empty $data'); + } + + $setParts = []; + foreach ($data as $column => $_) { + $setParts[] = "$column = ?"; + } + + $sql = "INSERT INTO $table SET " . implode(', ', $setParts); + $params = array_values($data); + + dbExecute($mysqli, $sql, $params); + + return $mysqli->insert_id; +} + +function dbUpdate( + mysqli $mysqli, + string $table, + array $data, + $where, + array $whereParams = [] +): int { + if (empty($data)) { + throw new InvalidArgumentException('dbUpdate called with empty $data'); + } + if (empty($where)) { + throw new InvalidArgumentException('dbUpdate requires a WHERE clause'); + } + + $setParts = []; + foreach ($data as $column => $_) { + $setParts[] = "$column = ?"; + } + + if (is_array($where)) { + $whereParts = []; + $whereParams = []; + foreach ($where as $column => $value) { + $whereParts[] = "$column = ?"; + $whereParams[] = $value; + } + $whereSql = implode(' AND ', $whereParts); + } else { + $whereSql = $where; + } + + $sql = "UPDATE $table SET " . implode(', ', $setParts) . " WHERE $whereSql"; + $params = array_merge(array_values($data), $whereParams); + + $stmt = dbExecute($mysqli, $sql, $params); + return $stmt->affected_rows; +} + +/** + * DELETE helper. + * + * WHERE can be: + * - array: ['client_id' => $id] (auto "client_id = ?") + * - string: 'client_id = ?' (use with $whereParams) + * + * @return int affected_rows + * + * @throws InvalidArgumentException + * @throws Exception + */ +function dbDelete( + mysqli $mysqli, + string $table, + $where, + array $whereParams = [] +): int { + if (empty($where)) { + throw new InvalidArgumentException('dbDelete requires a WHERE clause'); + } + + if (is_array($where)) { + $whereParts = []; + $whereParams = []; + foreach ($where as $column => $value) { + $whereParts[] = "$column = ?"; + $whereParams[] = $value; + } + $whereSql = implode(' AND ', $whereParts); + } else { + $whereSql = $where; + } + + $sql = "DELETE FROM $table WHERE $whereSql"; + $stmt = dbExecute($mysqli, $sql, $whereParams); + return $stmt->affected_rows; +} + +/** + * Transaction helpers (optional sugar). + */ +function dbBegin(mysqli $mysqli): void +{ + $mysqli->begin_transaction(); +} + +function dbCommit(mysqli $mysqli): void +{ + $mysqli->commit(); +} + +function dbRollback(mysqli $mysqli): void +{ + $mysqli->rollback(); +} diff --git a/functions/domain.php b/functions/domain.php new file mode 100644 index 000000000..2db7fbd58 --- /dev/null +++ b/functions/domain.php @@ -0,0 +1,228 @@ + array("capture_peer_cert" => true, "verify_peer" => false,))); + $read = stream_socket_client($socket, $errno, $errstr, 5, STREAM_CLIENT_CONNECT, $get); + + // If the socket connected + if ($read) { + $cert = stream_context_get_params($read); + $cert_public_key_obj = openssl_x509_parse($cert['options']['ssl']['peer_certificate']); + openssl_x509_export($cert['options']['ssl']['peer_certificate'], $export); + + if ($cert_public_key_obj) { + $certificate['success'] = true; + $certificate['expire'] = date('Y-m-d', $cert_public_key_obj['validTo_time_t']); + $certificate['issued_by'] = strip_tags($cert_public_key_obj['issuer']['O']); + $certificate['public_key'] = $export; + } + } + + return $certificate; +} + +function getDomainExpirationDate($domain) { + // Execute the whois command + $result = shell_exec("whois " . escapeshellarg($domain)); + if (!$result || !checkdnsrr($domain, 'SOA')) { + return null; // Return null if WHOIS query fails + } + + $expireDate = ''; + + // Regular expressions to match different date formats + $patterns = [ + '/Expiration Date: (.+)/', + '/Registry Expiry Date: (.+)/', + '/expires: (.+)/', + '/Expiry Date: (.+)/', + '/renewal date: (.+)/', + '/Expires On: (.+)/', + '/paid-till: (.+)/', + '/Expiration Time: (.+)/', + '/\[Expires on\]\s+(.+)/', + '/expire: (.+)/', + '/validity: (.+)/', + '/Expires on.*: (.+)/i', + '/Expiry on.*: (.+)/i', + '/renewal: (.+)/i', + '/Expir\w+ Date: (.+)/i', + '/Valid Until: (.+)/i', + '/Valid until: (.+)/i', + '/expire-date: (.+)/i', + '/Expiration Date: (.+)/i', + '/Registry Expiry Date: (.+)/i', + '/Expire Date: (.+)/i', + '/expiry: (.+)/i', + '/expires: (.+)/i', + '/Registry Expiry Date: (.+)/i', + '/Expiration Time: (.+)/i', + '/validity: (.+)/i', + '/expires: (.+)/i', + '/paid-till: (.+)/i', + '/Expire Date: (.+)/i', + '/Expiration Date: (.+)/i', + '/expire: (.+)/i', + '/expiry: (.+)/i', + '/renewal date: (.+)/i', + '/Expiration Date: (.+)/i', + '/Expiration Time: (.+)/i', + '/Expires: (.+)/i', + ]; + + // Known date formats + $knownFormats = [ + "d-M-Y", + "d-F-Y", + "d-m-Y", + "Y-m-d", + "d.m.Y", + "Y.m.d", + "Y/m/d", + "Y/m/d H:i:s", + "Ymd", + "Ymd H:i:s", + "d/m/Y", + "Y. m. d.", + "Y.m.d H:i:s", + "d-M-Y H:i:s", + "D M d H:i:s T Y", + "D M d Y", + "Y-m-d\TH:i:s", + "Y-m-d\TH:i:s\Z", + "Y-m-d H:i:s\Z", + "Y-m-d H:i:s", + "d M Y H:i:s", + "d/m/Y H:i:s", + "d/m/Y H:i:s T", + "B d Y", + "d.m.Y H:i:s", + "before M-Y", + "before Y-m-d", + "before Ymd", + "Y-m-d H:i:s (\T\Z\Z)", + "Y-M-d.", + ]; + + // Check each pattern to find a match + foreach ($patterns as $pattern) { + if (preg_match($pattern, $result, $matches)) { + $expireDate = trim($matches[1]); + break; + } + } + + if ($expireDate) { + // Try parsing with known formats + foreach ($knownFormats as $format) { + $parsedDate = DateTime::createFromFormat($format, $expireDate); + if ($parsedDate && $parsedDate->format($format) === $expireDate) { + return $parsedDate->format('Y-m-d'); + } + } + + // If none of the formats matched, try to parse it directly + $parsedDate = date_create($expireDate); + if ($parsedDate) { + return $parsedDate->format('Y-m-d'); + } + } + + return null; // Return null if expiration date is not found +} diff --git a/functions/files.php b/functions/files.php new file mode 100644 index 000000000..202a493e1 --- /dev/null +++ b/functions/files.php @@ -0,0 +1,168 @@ +loadHTML('' . $html); + libxml_clear_errors(); + + $imgs = $dom->getElementsByTagName('img'); + + foreach ($imgs as $img) { + $src = $img->getAttribute('src'); + + // Match base64 images + if (preg_match('/^data:image\/([a-zA-Z0-9+]+);base64,(.*)$/s', $src, $matches)) { + + $savedAny = true; // <-- We are actually saving at least 1 image + + // Create folder ONLY when needed + if (!$folderCreated) { + if (!is_dir($targetDir)) { + mkdir($targetDir, 0775, true); + } + $folderCreated = true; + } + + $mimeType = strtolower($matches[1]); + $base64 = $matches[2]; + + $binary = base64_decode($base64); + if ($binary === false) { + continue; + } + + // Extension mapping + switch ($mimeType) { + case 'jpeg': + case 'jpg': $ext = 'jpg'; break; + case 'png': $ext = 'png'; break; + case 'gif': $ext = 'gif'; break; + case 'webp': $ext = 'webp'; break; + default: $ext = 'png'; + } + + // Secure random filename + $uid = bin2hex(random_bytes(16)); + $filename = "img_{$uid}.{$ext}"; + + $filePath = $targetDir . $filename; + + if (file_put_contents($filePath, $binary) !== false) { + $webPath = "/" . $baseWebPath . $ownerId . "/" . $filename; + $img->setAttribute('src', $webPath); + } + } + } + + // If no images were processed, return original HTML immediately + if (!$savedAny) { + return $html; + } + + // Extract body content only + $body = $dom->getElementsByTagName('body')->item(0); + + if ($body) { + $innerHTML = ''; + foreach ($body->childNodes as $child) { + $innerHTML .= $dom->saveHTML($child); + } + return $innerHTML; + } + + return $html; +} + +function cleanupUnusedImages(string $html, string $folderFsPath, string $folderWebPath) { + + $folderFsPath = rtrim($folderFsPath, '/\\') . '/'; + $folderWebPath = rtrim($folderWebPath, '/\\') . '/'; + + if (!is_dir($folderFsPath)) { + return; // no folder = nothing to delete + } + + // 1. Get all files currently on disk + $filesOnDisk = glob($folderFsPath . "*"); + + // 2. Find all + preg_match_all('/]+src=["\']([^"\']+)["\']/i', $html, $matches); + $htmlImagePaths = $matches[1] ?? []; + + // Normalize paths: keep only filenames belonging to this template folder + $referencedFiles = []; + + foreach ($htmlImagePaths as $src) { + if (strpos($src, $folderWebPath) !== false) { + $filename = basename($src); + $referencedFiles[] = $filename; + } + } + + // 3. Delete any physical file not referenced in the HTML + foreach ($filesOnDisk as $filePath) { + $filename = basename($filePath); + + if (!in_array($filename, $referencedFiles)) { + unlink($filePath); + } + } +} diff --git a/functions/format.php b/functions/format.php new file mode 100644 index 000000000..c2c7aad86 --- /dev/null +++ b/functions/format.php @@ -0,0 +1,332 @@ += 9 && strlen($digits) <= 10) { + $formatted = '0' . substr($digits, 0, 2) . '-' . substr($digits, 2, 4) . '-' . substr($digits, 6); + } + break; + + case '49': // Germany + if ($startsWith($digits, '0')) { + $digits = substr($digits, 1); + } + if (strlen($digits) >= 10) { + $formatted = '0' . substr($digits, 0, 3) . ' ' . substr($digits, 3); + } + break; + + case '33': // France + if ($startsWith($digits, '0')) { + $digits = substr($digits, 1); + } + if (strlen($digits) === 9) { + $formatted = '0' . implode(' ', str_split($digits, 2)); + } + break; + + case '34': // Spain + if (strlen($digits) === 9) { + $formatted = substr($digits, 0, 3) . ' ' . substr($digits, 3, 3) . ' ' . substr($digits, 6); + } + break; + + case '39': // Italy + if ($startsWith($digits, '0')) { + $digits = substr($digits, 1); + } + $formatted = '0' . implode(' ', str_split($digits, 3)); + break; + + case '55': // Brazil + if (strlen($digits) === 11) { + $formatted = '(' . substr($digits, 0, 2) . ') ' . substr($digits, 2, 5) . '-' . substr($digits, 7); + } + break; + + case '7': // Russia + if ($startsWith($digits, '8')) { + $digits = substr($digits, 1); + } + if (strlen($digits) === 10) { + $formatted = '8 (' . substr($digits, 0, 3) . ') ' . substr($digits, 3, 3) . '-' . substr($digits, 6, 2) . '-' . substr($digits, 8); + } + break; + + case '86': // China + if (strlen($digits) === 11) { + $formatted = substr($digits, 0, 3) . ' ' . substr($digits, 3, 4) . ' ' . substr($digits, 7); + } + break; + + case '82': // South Korea + if (strlen($digits) === 11) { + $formatted = substr($digits, 0, 3) . '-' . substr($digits, 3, 4) . '-' . substr($digits, 7); + } + break; + + case '62': // Indonesia + if (!$startsWith($digits, '0')) { + $digits = '0' . $digits; + } + if (strlen($digits) === 12) { + $formatted = substr($digits, 0, 4) . ' ' . substr($digits, 4, 4) . ' ' . substr($digits, 8); + } + break; + + case '63': // Philippines + if (strlen($digits) === 11) { + $formatted = substr($digits, 0, 4) . ' ' . substr($digits, 4, 3) . ' ' . substr($digits, 7); + } + break; + + case '234': // Nigeria + if (!$startsWith($digits, '0')) { + $digits = '0' . $digits; + } + if (strlen($digits) === 11) { + $formatted = substr($digits, 0, 4) . ' ' . substr($digits, 4, 3) . ' ' . substr($digits, 7); + } + break; + + case '27': // South Africa + if (strlen($digits) >= 9 && strlen($digits) <= 10) { + $formatted = substr($digits, 0, 3) . ' ' . substr($digits, 3, 3) . ' ' . substr($digits, 6); + } + break; + + case '971': // UAE + if (strlen($digits) === 9) { + $formatted = substr($digits, 0, 3) . ' ' . substr($digits, 3, 3) . ' ' . substr($digits, 6); + } + break; + + default: + // fallback — do nothing, use raw digits later + break; + } + + if (!$formatted) { + $formatted = $digits ?: $phoneNumber; + } + + return $show_country_code && $country_code ? "+$country_code $formatted" : $formatted; +} + +function timeAgo($datetime) +{ + if (is_null($datetime)) { + return "-"; + } + + $time = strtotime($datetime); + $difference = $time - time(); // Changed to handle future dates + + if ($difference == 0) { + return 'right now'; + } + + $isFuture = $difference > 0; // Check if the date is in the future + $difference = abs($difference); // Absolute value for calculation + + $timeRules = array( + 31536000 => 'year', + 2592000 => 'month', + 604800 => 'week', + 86400 => 'day', + 3600 => 'hour', + 60 => 'minute', + 1 => 'second' + ); + + foreach ($timeRules as $secs => $str) { + $div = $difference / $secs; + if ($div >= 1) { + $t = round($div); + $timeStr = $t . ' ' . $str . ($t > 1 ? 's' : ''); + return $isFuture ? 'in ' . $timeStr : $timeStr . ' ago'; + } + } +} + +// Function to remove Emojis in messages, this seems to break the mail queue +function removeEmoji($text) +{ + return preg_replace('/\x{1F3F4}\x{E0067}\x{E0062}(?:\x{E0077}\x{E006C}\x{E0073}|\x{E0073}\x{E0063}\x{E0074}|\x{E0065}\x{E006E}\x{E0067})\x{E007F}|(?:\x{1F9D1}\x{1F3FF}\x{200D}\x{2764}(?:\x{FE0F}\x{200D}(?:\x{1F48B}\x{200D})?|\x{200D}(?:\x{1F48B}\x{200D})?)\x{1F9D1}|\x{1F469}\x{1F3FF}\x{200D}\x{1F91D}\x{200D}[\x{1F468}\x{1F469}]|\x{1FAF1}\x{1F3FF}\x{200D}\x{1FAF2})[\x{1F3FB}-\x{1F3FE}]|(?:\x{1F9D1}\x{1F3FE}\x{200D}\x{2764}(?:\x{FE0F}\x{200D}(?:\x{1F48B}\x{200D})?|\x{200D}(?:\x{1F48B}\x{200D})?)\x{1F9D1}|\x{1F469}\x{1F3FE}\x{200D}\x{1F91D}\x{200D}[\x{1F468}\x{1F469}]|\x{1FAF1}\x{1F3FE}\x{200D}\x{1FAF2})[\x{1F3FB}-\x{1F3FD}\x{1F3FF}]|(?:\x{1F9D1}\x{1F3FD}\x{200D}\x{2764}(?:\x{FE0F}\x{200D}(?:\x{1F48B}\x{200D})?|\x{200D}(?:\x{1F48B}\x{200D})?)\x{1F9D1}|\x{1F469}\x{1F3FD}\x{200D}\x{1F91D}\x{200D}[\x{1F468}\x{1F469}]|\x{1FAF1}\x{1F3FD}\x{200D}\x{1FAF2})[\x{1F3FB}\x{1F3FC}\x{1F3FE}\x{1F3FF}]|(?:\x{1F9D1}\x{1F3FC}\x{200D}\x{2764}(?:\x{FE0F}\x{200D}(?:\x{1F48B}\x{200D})?|\x{200D}(?:\x{1F48B}\x{200D})?)\x{1F9D1}|\x{1F469}\x{1F3FC}\x{200D}\x{1F91D}\x{200D}[\x{1F468}\x{1F469}]|\x{1FAF1}\x{1F3FC}\x{200D}\x{1FAF2})[\x{1F3FB}\x{1F3FD}-\x{1F3FF}]|(?:\x{1F9D1}\x{1F3FB}\x{200D}\x{2764}(?:\x{FE0F}\x{200D}(?:\x{1F48B}\x{200D})?|\x{200D}(?:\x{1F48B}\x{200D})?)\x{1F9D1}|\x{1F469}\x{1F3FB}\x{200D}\x{1F91D}\x{200D}[\x{1F468}\x{1F469}]|\x{1FAF1}\x{1F3FB}\x{200D}\x{1FAF2})[\x{1F3FC}-\x{1F3FF}]|\x{1F468}(?:\x{1F3FB}(?:\x{200D}(?:\x{2764}(?:\x{FE0F}\x{200D}(?:\x{1F48B}\x{200D}\x{1F468}[\x{1F3FB}-\x{1F3FF}]|\x{1F468}[\x{1F3FB}-\x{1F3FF}])|\x{200D}(?:\x{1F48B}\x{200D}\x{1F468}[\x{1F3FB}-\x{1F3FF}]|\x{1F468}[\x{1F3FB}-\x{1F3FF}]))|\x{1F91D}\x{200D}\x{1F468}[\x{1F3FC}-\x{1F3FF}]|[\x{2695}\x{2696}\x{2708}]\x{FE0F}|[\x{2695}\x{2696}\x{2708}]|[\x{1F33E}\x{1F373}\x{1F37C}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}]))?|[\x{1F3FC}-\x{1F3FF}]\x{200D}\x{2764}(?:\x{FE0F}\x{200D}(?:\x{1F48B}\x{200D}\x{1F468}[\x{1F3FB}-\x{1F3FF}]|\x{1F468}[\x{1F3FB}-\x{1F3FF}])|\x{200D}(?:\x{1F48B}\x{200D}\x{1F468}[\x{1F3FB}-\x{1F3FF}]|\x{1F468}[\x{1F3FB}-\x{1F3FF}]))|\x{200D}(?:\x{2764}(?:\x{FE0F}\x{200D}(?:\x{1F48B}\x{200D})?|\x{200D}(?:\x{1F48B}\x{200D})?)\x{1F468}|[\x{1F468}\x{1F469}]\x{200D}(?:\x{1F466}\x{200D}\x{1F466}|\x{1F467}\x{200D}[\x{1F466}\x{1F467}])|\x{1F466}\x{200D}\x{1F466}|\x{1F467}\x{200D}[\x{1F466}\x{1F467}]|[\x{1F33E}\x{1F373}\x{1F37C}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}])|\x{1F3FF}\x{200D}(?:\x{1F91D}\x{200D}\x{1F468}[\x{1F3FB}-\x{1F3FE}]|[\x{1F33E}\x{1F373}\x{1F37C}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}])|\x{1F3FE}\x{200D}(?:\x{1F91D}\x{200D}\x{1F468}[\x{1F3FB}-\x{1F3FD}\x{1F3FF}]|[\x{1F33E}\x{1F373}\x{1F37C}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}])|\x{1F3FD}\x{200D}(?:\x{1F91D}\x{200D}\x{1F468}[\x{1F3FB}\x{1F3FC}\x{1F3FE}\x{1F3FF}]|[\x{1F33E}\x{1F373}\x{1F37C}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}])|\x{1F3FC}\x{200D}(?:\x{1F91D}\x{200D}\x{1F468}[\x{1F3FB}\x{1F3FD}-\x{1F3FF}]|[\x{1F33E}\x{1F373}\x{1F37C}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}])|(?:\x{1F3FF}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FE}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FD}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FC}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{200D}[\x{2695}\x{2696}\x{2708}])\x{FE0F}|\x{200D}(?:[\x{1F468}\x{1F469}]\x{200D}[\x{1F466}\x{1F467}]|[\x{1F466}\x{1F467}])|\x{1F3FF}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FE}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FD}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FC}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FF}|\x{1F3FE}|\x{1F3FD}|\x{1F3FC}|\x{200D}[\x{2695}\x{2696}\x{2708}])?|(?:\x{1F469}(?:\x{1F3FB}\x{200D}\x{2764}(?:\x{FE0F}\x{200D}(?:\x{1F48B}\x{200D}[\x{1F468}\x{1F469}]|[\x{1F468}\x{1F469}])|\x{200D}(?:\x{1F48B}\x{200D}[\x{1F468}\x{1F469}]|[\x{1F468}\x{1F469}]))|[\x{1F3FC}-\x{1F3FF}]\x{200D}\x{2764}(?:\x{FE0F}\x{200D}(?:\x{1F48B}\x{200D}[\x{1F468}\x{1F469}]|[\x{1F468}\x{1F469}])|\x{200D}(?:\x{1F48B}\x{200D}[\x{1F468}\x{1F469}]|[\x{1F468}\x{1F469}])))|\x{1F9D1}[\x{1F3FB}-\x{1F3FF}]\x{200D}\x{1F91D}\x{200D}\x{1F9D1})[\x{1F3FB}-\x{1F3FF}]|\x{1F469}\x{200D}\x{1F469}\x{200D}(?:\x{1F466}\x{200D}\x{1F466}|\x{1F467}\x{200D}[\x{1F466}\x{1F467}])|\x{1F469}(?:\x{200D}(?:\x{2764}(?:\x{FE0F}\x{200D}(?:\x{1F48B}\x{200D}[\x{1F468}\x{1F469}]|[\x{1F468}\x{1F469}])|\x{200D}(?:\x{1F48B}\x{200D}[\x{1F468}\x{1F469}]|[\x{1F468}\x{1F469}]))|[\x{1F33E}\x{1F373}\x{1F37C}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}])|\x{1F3FF}\x{200D}[\x{1F33E}\x{1F373}\x{1F37C}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}]|\x{1F3FE}\x{200D}[\x{1F33E}\x{1F373}\x{1F37C}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}]|\x{1F3FD}\x{200D}[\x{1F33E}\x{1F373}\x{1F37C}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}]|\x{1F3FC}\x{200D}[\x{1F33E}\x{1F373}\x{1F37C}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}]|\x{1F3FB}\x{200D}[\x{1F33E}\x{1F373}\x{1F37C}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}])|\x{1F9D1}(?:\x{200D}(?:\x{1F91D}\x{200D}\x{1F9D1}|[\x{1F33E}\x{1F373}\x{1F37C}\x{1F384}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}])|\x{1F3FF}\x{200D}[\x{1F33E}\x{1F373}\x{1F37C}\x{1F384}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}]|\x{1F3FE}\x{200D}[\x{1F33E}\x{1F373}\x{1F37C}\x{1F384}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}]|\x{1F3FD}\x{200D}[\x{1F33E}\x{1F373}\x{1F37C}\x{1F384}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}]|\x{1F3FC}\x{200D}[\x{1F33E}\x{1F373}\x{1F37C}\x{1F384}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}]|\x{1F3FB}\x{200D}[\x{1F33E}\x{1F373}\x{1F37C}\x{1F384}\x{1F393}\x{1F3A4}\x{1F3A8}\x{1F3EB}\x{1F3ED}\x{1F4BB}\x{1F4BC}\x{1F527}\x{1F52C}\x{1F680}\x{1F692}\x{1F9AF}-\x{1F9B3}\x{1F9BC}\x{1F9BD}])|\x{1F469}\x{200D}\x{1F466}\x{200D}\x{1F466}|\x{1F469}\x{200D}\x{1F469}\x{200D}[\x{1F466}\x{1F467}]|\x{1F469}\x{200D}\x{1F467}\x{200D}[\x{1F466}\x{1F467}]|(?:\x{1F441}\x{FE0F}?\x{200D}\x{1F5E8}|\x{1F9D1}(?:\x{1F3FF}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FE}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FD}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FC}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FB}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{200D}[\x{2695}\x{2696}\x{2708}])|\x{1F469}(?:\x{1F3FF}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FE}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FD}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FC}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FB}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{200D}[\x{2695}\x{2696}\x{2708}])|\x{1F636}\x{200D}\x{1F32B}|\x{1F3F3}\x{FE0F}?\x{200D}\x{26A7}|\x{1F43B}\x{200D}\x{2744}|(?:[\x{1F3C3}\x{1F3C4}\x{1F3CA}\x{1F46E}\x{1F470}\x{1F471}\x{1F473}\x{1F477}\x{1F481}\x{1F482}\x{1F486}\x{1F487}\x{1F645}-\x{1F647}\x{1F64B}\x{1F64D}\x{1F64E}\x{1F6A3}\x{1F6B4}-\x{1F6B6}\x{1F926}\x{1F935}\x{1F937}-\x{1F939}\x{1F93D}\x{1F93E}\x{1F9B8}\x{1F9B9}\x{1F9CD}-\x{1F9CF}\x{1F9D4}\x{1F9D6}-\x{1F9DD}][\x{1F3FB}-\x{1F3FF}]|[\x{1F46F}\x{1F9DE}\x{1F9DF}])\x{200D}[\x{2640}\x{2642}]|[\x{26F9}\x{1F3CB}\x{1F3CC}\x{1F575}](?:[\x{FE0F}\x{1F3FB}-\x{1F3FF}]\x{200D}[\x{2640}\x{2642}]|\x{200D}[\x{2640}\x{2642}])|\x{1F3F4}\x{200D}\x{2620}|[\x{1F3C3}\x{1F3C4}\x{1F3CA}\x{1F46E}\x{1F470}\x{1F471}\x{1F473}\x{1F477}\x{1F481}\x{1F482}\x{1F486}\x{1F487}\x{1F645}-\x{1F647}\x{1F64B}\x{1F64D}\x{1F64E}\x{1F6A3}\x{1F6B4}-\x{1F6B6}\x{1F926}\x{1F935}\x{1F937}-\x{1F939}\x{1F93C}-\x{1F93E}\x{1F9B8}\x{1F9B9}\x{1F9CD}-\x{1F9CF}\x{1F9D4}\x{1F9D6}-\x{1F9DD}]\x{200D}[\x{2640}\x{2642}]|[\xA9\xAE\x{203C}\x{2049}\x{2122}\x{2139}\x{2194}-\x{2199}\x{21A9}\x{21AA}\x{231A}\x{231B}\x{2328}\x{23CF}\x{23ED}-\x{23EF}\x{23F1}\x{23F2}\x{23F8}-\x{23FA}\x{24C2}\x{25AA}\x{25AB}\x{25B6}\x{25C0}\x{25FB}\x{25FC}\x{25FE}\x{2600}-\x{2604}\x{260E}\x{2611}\x{2614}\x{2615}\x{2618}\x{2620}\x{2622}\x{2623}\x{2626}\x{262A}\x{262E}\x{262F}\x{2638}-\x{263A}\x{2640}\x{2642}\x{2648}-\x{2653}\x{265F}\x{2660}\x{2663}\x{2665}\x{2666}\x{2668}\x{267B}\x{267E}\x{267F}\x{2692}\x{2694}-\x{2697}\x{2699}\x{269B}\x{269C}\x{26A0}\x{26A7}\x{26AA}\x{26B0}\x{26B1}\x{26BD}\x{26BE}\x{26C4}\x{26C8}\x{26CF}\x{26D1}\x{26D3}\x{26E9}\x{26F0}-\x{26F5}\x{26F7}\x{26F8}\x{26FA}\x{2702}\x{2708}\x{2709}\x{270F}\x{2712}\x{2714}\x{2716}\x{271D}\x{2721}\x{2733}\x{2734}\x{2744}\x{2747}\x{2763}\x{27A1}\x{2934}\x{2935}\x{2B05}-\x{2B07}\x{2B1B}\x{2B1C}\x{2B55}\x{3030}\x{303D}\x{3297}\x{3299}\x{1F004}\x{1F170}\x{1F171}\x{1F17E}\x{1F17F}\x{1F202}\x{1F237}\x{1F321}\x{1F324}-\x{1F32C}\x{1F336}\x{1F37D}\x{1F396}\x{1F397}\x{1F399}-\x{1F39B}\x{1F39E}\x{1F39F}\x{1F3CD}\x{1F3CE}\x{1F3D4}-\x{1F3DF}\x{1F3F5}\x{1F3F7}\x{1F43F}\x{1F4FD}\x{1F549}\x{1F54A}\x{1F56F}\x{1F570}\x{1F573}\x{1F576}-\x{1F579}\x{1F587}\x{1F58A}-\x{1F58D}\x{1F5A5}\x{1F5A8}\x{1F5B1}\x{1F5B2}\x{1F5BC}\x{1F5C2}-\x{1F5C4}\x{1F5D1}-\x{1F5D3}\x{1F5DC}-\x{1F5DE}\x{1F5E1}\x{1F5E3}\x{1F5E8}\x{1F5EF}\x{1F5F3}\x{1F5FA}\x{1F6CB}\x{1F6CD}-\x{1F6CF}\x{1F6E0}-\x{1F6E5}\x{1F6E9}\x{1F6F0}\x{1F6F3}])\x{FE0F}|\x{1F441}\x{FE0F}?\x{200D}\x{1F5E8}|\x{1F9D1}(?:\x{1F3FF}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FE}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FD}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FC}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FB}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{200D}[\x{2695}\x{2696}\x{2708}])|\x{1F469}(?:\x{1F3FF}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FE}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FD}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FC}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{1F3FB}\x{200D}[\x{2695}\x{2696}\x{2708}]|\x{200D}[\x{2695}\x{2696}\x{2708}])|\x{1F3F3}\x{FE0F}?\x{200D}\x{1F308}|\x{1F469}\x{200D}\x{1F467}|\x{1F469}\x{200D}\x{1F466}|\x{1F636}\x{200D}\x{1F32B}|\x{1F3F3}\x{FE0F}?\x{200D}\x{26A7}|\x{1F635}\x{200D}\x{1F4AB}|\x{1F62E}\x{200D}\x{1F4A8}|\x{1F415}\x{200D}\x{1F9BA}|\x{1FAF1}(?:\x{1F3FF}|\x{1F3FE}|\x{1F3FD}|\x{1F3FC}|\x{1F3FB})?|\x{1F9D1}(?:\x{1F3FF}|\x{1F3FE}|\x{1F3FD}|\x{1F3FC}|\x{1F3FB})?|\x{1F469}(?:\x{1F3FF}|\x{1F3FE}|\x{1F3FD}|\x{1F3FC}|\x{1F3FB})?|\x{1F43B}\x{200D}\x{2744}|(?:[\x{1F3C3}\x{1F3C4}\x{1F3CA}\x{1F46E}\x{1F470}\x{1F471}\x{1F473}\x{1F477}\x{1F481}\x{1F482}\x{1F486}\x{1F487}\x{1F645}-\x{1F647}\x{1F64B}\x{1F64D}\x{1F64E}\x{1F6A3}\x{1F6B4}-\x{1F6B6}\x{1F926}\x{1F935}\x{1F937}-\x{1F939}\x{1F93D}\x{1F93E}\x{1F9B8}\x{1F9B9}\x{1F9CD}-\x{1F9CF}\x{1F9D4}\x{1F9D6}-\x{1F9DD}][\x{1F3FB}-\x{1F3FF}]|[\x{1F46F}\x{1F9DE}\x{1F9DF}])\x{200D}[\x{2640}\x{2642}]|[\x{26F9}\x{1F3CB}\x{1F3CC}\x{1F575}](?:[\x{FE0F}\x{1F3FB}-\x{1F3FF}]\x{200D}[\x{2640}\x{2642}]|\x{200D}[\x{2640}\x{2642}])|\x{1F3F4}\x{200D}\x{2620}|\x{1F1FD}\x{1F1F0}|\x{1F1F6}\x{1F1E6}|\x{1F1F4}\x{1F1F2}|\x{1F408}\x{200D}\x{2B1B}|\x{2764}(?:\x{FE0F}\x{200D}[\x{1F525}\x{1FA79}]|\x{200D}[\x{1F525}\x{1FA79}])|\x{1F441}\x{FE0F}?|\x{1F3F3}\x{FE0F}?|[\x{1F3C3}\x{1F3C4}\x{1F3CA}\x{1F46E}\x{1F470}\x{1F471}\x{1F473}\x{1F477}\x{1F481}\x{1F482}\x{1F486}\x{1F487}\x{1F645}-\x{1F647}\x{1F64B}\x{1F64D}\x{1F64E}\x{1F6A3}\x{1F6B4}-\x{1F6B6}\x{1F926}\x{1F935}\x{1F937}-\x{1F939}\x{1F93C}-\x{1F93E}\x{1F9B8}\x{1F9B9}\x{1F9CD}-\x{1F9CF}\x{1F9D4}\x{1F9D6}-\x{1F9DD}]\x{200D}[\x{2640}\x{2642}]|\x{1F1FF}[\x{1F1E6}\x{1F1F2}\x{1F1FC}]|\x{1F1FE}[\x{1F1EA}\x{1F1F9}]|\x{1F1FC}[\x{1F1EB}\x{1F1F8}]|\x{1F1FB}[\x{1F1E6}\x{1F1E8}\x{1F1EA}\x{1F1EC}\x{1F1EE}\x{1F1F3}\x{1F1FA}]|\x{1F1FA}[\x{1F1E6}\x{1F1EC}\x{1F1F2}\x{1F1F3}\x{1F1F8}\x{1F1FE}\x{1F1FF}]|\x{1F1F9}[\x{1F1E6}\x{1F1E8}\x{1F1E9}\x{1F1EB}-\x{1F1ED}\x{1F1EF}-\x{1F1F4}\x{1F1F7}\x{1F1F9}\x{1F1FB}\x{1F1FC}\x{1F1FF}]|\x{1F1F8}[\x{1F1E6}-\x{1F1EA}\x{1F1EC}-\x{1F1F4}\x{1F1F7}-\x{1F1F9}\x{1F1FB}\x{1F1FD}-\x{1F1FF}]|\x{1F1F7}[\x{1F1EA}\x{1F1F4}\x{1F1F8}\x{1F1FA}\x{1F1FC}]|\x{1F1F5}[\x{1F1E6}\x{1F1EA}-\x{1F1ED}\x{1F1F0}-\x{1F1F3}\x{1F1F7}-\x{1F1F9}\x{1F1FC}\x{1F1FE}]|\x{1F1F3}[\x{1F1E6}\x{1F1E8}\x{1F1EA}-\x{1F1EC}\x{1F1EE}\x{1F1F1}\x{1F1F4}\x{1F1F5}\x{1F1F7}\x{1F1FA}\x{1F1FF}]|\x{1F1F2}[\x{1F1E6}\x{1F1E8}-\x{1F1ED}\x{1F1F0}-\x{1F1FF}]|\x{1F1F1}[\x{1F1E6}-\x{1F1E8}\x{1F1EE}\x{1F1F0}\x{1F1F7}-\x{1F1FB}\x{1F1FE}]|\x{1F1F0}[\x{1F1EA}\x{1F1EC}-\x{1F1EE}\x{1F1F2}\x{1F1F3}\x{1F1F5}\x{1F1F7}\x{1F1FC}\x{1F1FE}\x{1F1FF}]|\x{1F1EF}[\x{1F1EA}\x{1F1F2}\x{1F1F4}\x{1F1F5}]|\x{1F1EE}[\x{1F1E8}-\x{1F1EA}\x{1F1F1}-\x{1F1F4}\x{1F1F6}-\x{1F1F9}]|\x{1F1ED}[\x{1F1F0}\x{1F1F2}\x{1F1F3}\x{1F1F7}\x{1F1F9}\x{1F1FA}]|\x{1F1EC}[\x{1F1E6}\x{1F1E7}\x{1F1E9}-\x{1F1EE}\x{1F1F1}-\x{1F1F3}\x{1F1F5}-\x{1F1FA}\x{1F1FC}\x{1F1FE}]|\x{1F1EB}[\x{1F1EE}-\x{1F1F0}\x{1F1F2}\x{1F1F4}\x{1F1F7}]|\x{1F1EA}[\x{1F1E6}\x{1F1E8}\x{1F1EA}\x{1F1EC}\x{1F1ED}\x{1F1F7}-\x{1F1FA}]|\x{1F1E9}[\x{1F1EA}\x{1F1EC}\x{1F1EF}\x{1F1F0}\x{1F1F2}\x{1F1F4}\x{1F1FF}]|\x{1F1E8}[\x{1F1E6}\x{1F1E8}\x{1F1E9}\x{1F1EB}-\x{1F1EE}\x{1F1F0}-\x{1F1F5}\x{1F1F7}\x{1F1FA}-\x{1F1FF}]|\x{1F1E7}[\x{1F1E6}\x{1F1E7}\x{1F1E9}-\x{1F1EF}\x{1F1F1}-\x{1F1F4}\x{1F1F6}-\x{1F1F9}\x{1F1FB}\x{1F1FC}\x{1F1FE}\x{1F1FF}]|\x{1F1E6}[\x{1F1E8}-\x{1F1EC}\x{1F1EE}\x{1F1F1}\x{1F1F2}\x{1F1F4}\x{1F1F6}-\x{1F1FA}\x{1F1FC}\x{1F1FD}\x{1F1FF}]|[#\*0-9]\x{FE0F}?\x{20E3}|\x{1F93C}[\x{1F3FB}-\x{1F3FF}]|\x{2764}\x{FE0F}?|[\x{1F3C3}\x{1F3C4}\x{1F3CA}\x{1F46E}\x{1F470}\x{1F471}\x{1F473}\x{1F477}\x{1F481}\x{1F482}\x{1F486}\x{1F487}\x{1F645}-\x{1F647}\x{1F64B}\x{1F64D}\x{1F64E}\x{1F6A3}\x{1F6B4}-\x{1F6B6}\x{1F926}\x{1F935}\x{1F937}-\x{1F939}\x{1F93D}\x{1F93E}\x{1F9B8}\x{1F9B9}\x{1F9CD}-\x{1F9CF}\x{1F9D4}\x{1F9D6}-\x{1F9DD}][\x{1F3FB}-\x{1F3FF}]|[\x{26F9}\x{1F3CB}\x{1F3CC}\x{1F575}][\x{FE0F}\x{1F3FB}-\x{1F3FF}]?|\x{1F3F4}|[\x{270A}\x{270B}\x{1F385}\x{1F3C2}\x{1F3C7}\x{1F442}\x{1F443}\x{1F446}-\x{1F450}\x{1F466}\x{1F467}\x{1F46B}-\x{1F46D}\x{1F472}\x{1F474}-\x{1F476}\x{1F478}\x{1F47C}\x{1F483}\x{1F485}\x{1F48F}\x{1F491}\x{1F4AA}\x{1F57A}\x{1F595}\x{1F596}\x{1F64C}\x{1F64F}\x{1F6C0}\x{1F6CC}\x{1F90C}\x{1F90F}\x{1F918}-\x{1F91F}\x{1F930}-\x{1F934}\x{1F936}\x{1F977}\x{1F9B5}\x{1F9B6}\x{1F9BB}\x{1F9D2}\x{1F9D3}\x{1F9D5}\x{1FAC3}-\x{1FAC5}\x{1FAF0}\x{1FAF2}-\x{1FAF6}][\x{1F3FB}-\x{1F3FF}]|[\x{261D}\x{270C}\x{270D}\x{1F574}\x{1F590}][\x{FE0F}\x{1F3FB}-\x{1F3FF}]|[\x{261D}\x{270A}-\x{270D}\x{1F385}\x{1F3C2}\x{1F3C7}\x{1F408}\x{1F415}\x{1F43B}\x{1F442}\x{1F443}\x{1F446}-\x{1F450}\x{1F466}\x{1F467}\x{1F46B}-\x{1F46D}\x{1F472}\x{1F474}-\x{1F476}\x{1F478}\x{1F47C}\x{1F483}\x{1F485}\x{1F48F}\x{1F491}\x{1F4AA}\x{1F574}\x{1F57A}\x{1F590}\x{1F595}\x{1F596}\x{1F62E}\x{1F635}\x{1F636}\x{1F64C}\x{1F64F}\x{1F6C0}\x{1F6CC}\x{1F90C}\x{1F90F}\x{1F918}-\x{1F91F}\x{1F930}-\x{1F934}\x{1F936}\x{1F93C}\x{1F977}\x{1F9B5}\x{1F9B6}\x{1F9BB}\x{1F9D2}\x{1F9D3}\x{1F9D5}\x{1FAC3}-\x{1FAC5}\x{1FAF0}\x{1FAF2}-\x{1FAF6}]|[\x{1F3C3}\x{1F3C4}\x{1F3CA}\x{1F46E}\x{1F470}\x{1F471}\x{1F473}\x{1F477}\x{1F481}\x{1F482}\x{1F486}\x{1F487}\x{1F645}-\x{1F647}\x{1F64B}\x{1F64D}\x{1F64E}\x{1F6A3}\x{1F6B4}-\x{1F6B6}\x{1F926}\x{1F935}\x{1F937}-\x{1F939}\x{1F93D}\x{1F93E}\x{1F9B8}\x{1F9B9}\x{1F9CD}-\x{1F9CF}\x{1F9D4}\x{1F9D6}-\x{1F9DD}]|[\x{1F46F}\x{1F9DE}\x{1F9DF}]|[\xA9\xAE\x{203C}\x{2049}\x{2122}\x{2139}\x{2194}-\x{2199}\x{21A9}\x{21AA}\x{231A}\x{231B}\x{2328}\x{23CF}\x{23ED}-\x{23EF}\x{23F1}\x{23F2}\x{23F8}-\x{23FA}\x{24C2}\x{25AA}\x{25AB}\x{25B6}\x{25C0}\x{25FB}\x{25FC}\x{25FE}\x{2600}-\x{2604}\x{260E}\x{2611}\x{2614}\x{2615}\x{2618}\x{2620}\x{2622}\x{2623}\x{2626}\x{262A}\x{262E}\x{262F}\x{2638}-\x{263A}\x{2640}\x{2642}\x{2648}-\x{2653}\x{265F}\x{2660}\x{2663}\x{2665}\x{2666}\x{2668}\x{267B}\x{267E}\x{267F}\x{2692}\x{2694}-\x{2697}\x{2699}\x{269B}\x{269C}\x{26A0}\x{26A7}\x{26AA}\x{26B0}\x{26B1}\x{26BD}\x{26BE}\x{26C4}\x{26C8}\x{26CF}\x{26D1}\x{26D3}\x{26E9}\x{26F0}-\x{26F5}\x{26F7}\x{26F8}\x{26FA}\x{2702}\x{2708}\x{2709}\x{270F}\x{2712}\x{2714}\x{2716}\x{271D}\x{2721}\x{2733}\x{2734}\x{2744}\x{2747}\x{2763}\x{27A1}\x{2934}\x{2935}\x{2B05}-\x{2B07}\x{2B1B}\x{2B1C}\x{2B55}\x{3030}\x{303D}\x{3297}\x{3299}\x{1F004}\x{1F170}\x{1F171}\x{1F17E}\x{1F17F}\x{1F202}\x{1F237}\x{1F321}\x{1F324}-\x{1F32C}\x{1F336}\x{1F37D}\x{1F396}\x{1F397}\x{1F399}-\x{1F39B}\x{1F39E}\x{1F39F}\x{1F3CD}\x{1F3CE}\x{1F3D4}-\x{1F3DF}\x{1F3F5}\x{1F3F7}\x{1F43F}\x{1F4FD}\x{1F549}\x{1F54A}\x{1F56F}\x{1F570}\x{1F573}\x{1F576}-\x{1F579}\x{1F587}\x{1F58A}-\x{1F58D}\x{1F5A5}\x{1F5A8}\x{1F5B1}\x{1F5B2}\x{1F5BC}\x{1F5C2}-\x{1F5C4}\x{1F5D1}-\x{1F5D3}\x{1F5DC}-\x{1F5DE}\x{1F5E1}\x{1F5E3}\x{1F5E8}\x{1F5EF}\x{1F5F3}\x{1F5FA}\x{1F6CB}\x{1F6CD}-\x{1F6CF}\x{1F6E0}-\x{1F6E5}\x{1F6E9}\x{1F6F0}\x{1F6F3}]|[\x{23E9}-\x{23EC}\x{23F0}\x{23F3}\x{25FD}\x{2693}\x{26A1}\x{26AB}\x{26C5}\x{26CE}\x{26D4}\x{26EA}\x{26FD}\x{2705}\x{2728}\x{274C}\x{274E}\x{2753}-\x{2755}\x{2757}\x{2795}-\x{2797}\x{27B0}\x{27BF}\x{2B50}\x{1F0CF}\x{1F18E}\x{1F191}-\x{1F19A}\x{1F201}\x{1F21A}\x{1F22F}\x{1F232}-\x{1F236}\x{1F238}-\x{1F23A}\x{1F250}\x{1F251}\x{1F300}-\x{1F320}\x{1F32D}-\x{1F335}\x{1F337}-\x{1F37C}\x{1F37E}-\x{1F384}\x{1F386}-\x{1F393}\x{1F3A0}-\x{1F3C1}\x{1F3C5}\x{1F3C6}\x{1F3C8}\x{1F3C9}\x{1F3CF}-\x{1F3D3}\x{1F3E0}-\x{1F3F0}\x{1F3F8}-\x{1F407}\x{1F409}-\x{1F414}\x{1F416}-\x{1F43A}\x{1F43C}-\x{1F43E}\x{1F440}\x{1F444}\x{1F445}\x{1F451}-\x{1F465}\x{1F46A}\x{1F479}-\x{1F47B}\x{1F47D}-\x{1F480}\x{1F484}\x{1F488}-\x{1F48E}\x{1F490}\x{1F492}-\x{1F4A9}\x{1F4AB}-\x{1F4FC}\x{1F4FF}-\x{1F53D}\x{1F54B}-\x{1F54E}\x{1F550}-\x{1F567}\x{1F5A4}\x{1F5FB}-\x{1F62D}\x{1F62F}-\x{1F634}\x{1F637}-\x{1F644}\x{1F648}-\x{1F64A}\x{1F680}-\x{1F6A2}\x{1F6A4}-\x{1F6B3}\x{1F6B7}-\x{1F6BF}\x{1F6C1}-\x{1F6C5}\x{1F6D0}-\x{1F6D2}\x{1F6D5}-\x{1F6D7}\x{1F6DD}-\x{1F6DF}\x{1F6EB}\x{1F6EC}\x{1F6F4}-\x{1F6FC}\x{1F7E0}-\x{1F7EB}\x{1F7F0}\x{1F90D}\x{1F90E}\x{1F910}-\x{1F917}\x{1F920}-\x{1F925}\x{1F927}-\x{1F92F}\x{1F93A}\x{1F93F}-\x{1F945}\x{1F947}-\x{1F976}\x{1F978}-\x{1F9B4}\x{1F9B7}\x{1F9BA}\x{1F9BC}-\x{1F9CC}\x{1F9D0}\x{1F9E0}-\x{1F9FF}\x{1FA70}-\x{1FA74}\x{1FA78}-\x{1FA7C}\x{1FA80}-\x{1FA86}\x{1FA90}-\x{1FAAC}\x{1FAB0}-\x{1FABA}\x{1FAC0}-\x{1FAC2}\x{1FAD0}-\x{1FAD9}\x{1FAE0}-\x{1FAE7}]/u', '', $text); +} + +function shortenClient($client) +{ + // Pre-process by removing any non-alphanumeric characters except for certain punctuations. + $client = html_entity_decode($client); // Decode any HTML entities + $client = str_replace("'", "", $client); // Removing all occurrences of ' + $cleaned = preg_replace('/[^a-zA-Z0-9&]+/', ' ', $client); + + // Break into words. + $words = explode(' ', trim($cleaned)); + + $shortened = ''; + + // If there's only one word. + if (count($words) == 1) { + $word = $words[0]; + + if (strlen($word) <= 3) { + return strtoupper($word); + } + + // Prefer starting and ending characters. + $shortened = $word[0] . substr($word, -2); + } else { + // Less weightage to common words. + $commonWords = ['the', 'of', 'and']; + + foreach ($words as $word) { + if (!in_array(strtolower($word), $commonWords) || strlen($shortened) < 2) { + $shortened .= $word[0]; + } + } + + // If there are still not enough characters, take from the last word. + while (strlen($shortened) < 3 && !empty($word)) { + $shortened .= substr($word, 1, 1); + $word = substr($word, 1); + } + } + + return strtoupper(substr($shortened, 0, 3)); +} + +function roundUpToNearestMultiple($n, $increment = 1000) +{ + return (int) ($increment * ceil($n / $increment)); +} + +function roundToNearest15($time) +{ + // Validate the input time format + if (!preg_match('/^(\d{2}):(\d{2}):(\d{2})$/', $time, $matches)) { + return false; // or throw an exception + } + + // Extract hours, minutes, and seconds from the matched time string + list(, $hours, $minutes, $seconds) = $matches; + + // Convert everything to seconds for easier calculation + $totalSeconds = ($hours * 3600) + ($minutes * 60) + $seconds; + + // Calculate the remainder when divided by 900 seconds (15 minutes) + $remainder = $totalSeconds % 900; + + if ($remainder > 450) { // If remainder is more than 7.5 minutes (450 seconds), round up + $totalSeconds += (900 - $remainder); + } else { // Else round down + $totalSeconds -= $remainder; + } + + // Convert total seconds to decimal hours + $decimalHours = $totalSeconds / 3600; + + // Return the decimal hours + return number_format($decimalHours, 2); +} + +function formatDuration($time) { + // expects "HH:MM:SS" + [$h, $m, $s] = array_map('intval', explode(':', $time)); + + $parts = []; + + if ($h > 0) $parts[] = $h . 'h'; + if ($m > 0) $parts[] = $m . 'm'; + + // show seconds only if under 1 minute total OR if nothing else exists + if ($h == 0 && $m == 0) { + $parts[] = $s . 's'; + } + + return implode(' ', $parts); +} + +function validateDate($date) { + if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $date)) { + return $date; + } + return date('Y-m-d'); // Fallback +} diff --git a/functions/logging.php b/functions/logging.php new file mode 100644 index 000000000..591c9cbdb --- /dev/null +++ b/functions/logging.php @@ -0,0 +1,65 @@ + " Internet Explorer", + '/firefox/i' => " Firefox", + '/safari/i' => " Safari", + '/chrome/i' => " Chrome", + '/edg/i' => " Edge", + '/opr/i' => " Opera", + '/ddg/i' => " DuckDuckGo" + ); + foreach ($browser_array as $regex => $value) { + if (preg_match($regex, $user_browser)) { + $browser = $value; + } + } + return $browser; +} + +function getOS($user_os) { + $os_platform = "-"; + $os_array = array( + '/windows/i' => " Windows", + '/macintosh|mac os x/i' => " MacOS", + '/linux/i' => " Linux", + '/ubuntu/i' => " Ubuntu", + '/fedora/i' => " Fedora", + '/iphone/i' => " iPhone", + '/ipad/i' => " iPad", + '/android/i' => " Android" + ); + foreach ($os_array as $regex => $value) { + if (preg_match($regex, $user_os)) { + $os_platform = $value; + } + } + return $os_platform; +} + +function isMobile() +{ + // Check if the user agent is a mobile device + return preg_match('/(android|avantgo|blackberry|bolt|boost|cricket|docomo|fone|hiptop|mini|opera mini|palm|phone|pie|tablet|up.browser|up.link|webos|wos)/i', $_SERVER['HTTP_USER_AGENT']); +} + +// Redirect Function +function redirect($url = null, $permanent = false) { + // Use referer if no URL is provided + if (!$url) { + $url = $_SERVER['HTTP_REFERER'] ?? 'index.php'; + } + + if (!headers_sent()) { + header('Location: ' . $url, true, $permanent ? 301 : 302); + exit; + } else { + // Fallback for headers already sent + echo ""; + echo ''; + exit; + } +} + +//Flash Alert Function +function flash_alert(string $message, string $type = 'success'): void { + $_SESSION['alert_type'] = $type; + $_SESSION['alert_message'] = $message; +} diff --git a/functions/sanitize.php b/functions/sanitize.php new file mode 100644 index 000000000..d79fe4434 --- /dev/null +++ b/functions/sanitize.php @@ -0,0 +1,148 @@ + $maxSizeBytes) { + return "File size exceeds the limit."; + } + + // Read the file content + $fileContent = file_get_contents($tmp); + + // Hash the file content using SHA-256 + $hashedContent = hash('md5', $fileContent); + + // Generate a secure filename using the hashed content + $secureFilename = $hashedContent . randomString(2) . '.' . $extension; + + return $secureFilename; +} diff --git a/functions/security.php b/functions/security.php new file mode 100644 index 000000000..16d8eea67 --- /dev/null +++ b/functions/security.php @@ -0,0 +1,217 @@ + '/', 'secure' => true, 'httponly' => true, 'samesite' => 'None']); + } else { + setcookie("user_encryption_session_key", $user_encryption_session_key, 0, "/"); + $_SESSION['alert_message'] = "Unencrypted connection flag set: Using non-secure cookies."; + } +} + +// Decrypts an encrypted password (website/asset credentials), returns it as a string +function decryptCredentialEntry($credential_password_ciphertext) +{ + + // Split the credential into IV and Ciphertext + $credential_iv = substr($credential_password_ciphertext, 0, 16); + $credential_ciphertext = $salt = substr($credential_password_ciphertext, 16); + + // Get the user session info. + $user_encryption_session_ciphertext = $_SESSION['user_encryption_session_ciphertext']; + $user_encryption_session_iv = $_SESSION['user_encryption_session_iv']; + $user_encryption_session_key = $_COOKIE['user_encryption_session_key']; + + // Decrypt the session key to get the master key + $site_encryption_master_key = openssl_decrypt($user_encryption_session_ciphertext, 'aes-128-cbc', $user_encryption_session_key, 0, $user_encryption_session_iv); + + // Decrypt the credential password using the master key + return openssl_decrypt($credential_ciphertext, 'aes-128-cbc', $site_encryption_master_key, 0, $credential_iv); +} + +// Encrypts a website/asset credential password +function encryptCredentialEntry($credential_password_cleartext) +{ + $iv = randomString(); + + // Get the user session info. + $user_encryption_session_ciphertext = $_SESSION['user_encryption_session_ciphertext']; + $user_encryption_session_iv = $_SESSION['user_encryption_session_iv']; + $user_encryption_session_key = $_COOKIE['user_encryption_session_key']; + + //Decrypt the session key to get the master key + $site_encryption_master_key = openssl_decrypt($user_encryption_session_ciphertext, 'aes-128-cbc', $user_encryption_session_key, 0, $user_encryption_session_iv); + + //Encrypt the website/asset credential using the master key + $ciphertext = openssl_encrypt($credential_password_cleartext, 'aes-128-cbc', $site_encryption_master_key, 0, $iv); + + return $iv . $ciphertext; +} + +function apiDecryptCredentialEntry($credential_ciphertext, $api_key_decrypt_hash, #[\SensitiveParameter]$api_key_decrypt_password) +{ + // Split the Credential entry (username/password) into IV and Ciphertext + $credential_iv = substr($credential_ciphertext, 0, 16); + $credential_ciphertext = $salt = substr($credential_ciphertext, 16); + + // Decrypt the api hash to get the master key + $site_encryption_master_key = decryptUserSpecificKey($api_key_decrypt_hash, $api_key_decrypt_password); + + // Decrypt the credential password using the master key + return openssl_decrypt($credential_ciphertext, 'aes-128-cbc', $site_encryption_master_key, 0, $credential_iv); +} + +function apiEncryptCredentialEntry(#[\SensitiveParameter]$credential_cleartext, $api_key_decrypt_hash, #[\SensitiveParameter]$api_key_decrypt_password) +{ + $iv = randomString(); + + // Decrypt the api hash to get the master key + $site_encryption_master_key = decryptUserSpecificKey($api_key_decrypt_hash, $api_key_decrypt_password); + + // Encrypt the credential using the master key + $ciphertext = openssl_encrypt($credential_cleartext, 'aes-128-cbc', $site_encryption_master_key, 0, $iv); + + return $iv . $ciphertext; +} + +// Cross-Site Request Forgery check for sensitive functions +// Validates the CSRF token provided matches the one in the users session +function validateCSRFToken($token) +{ + if (hash_equals($token, $_SESSION['csrf_token'])) { + return true; + } else { + $_SESSION['alert_type'] = "warning"; + $_SESSION['alert_message'] = "CSRF token verification failed. Try again, or log out to refresh your token."; + header("Location: index.php"); + exit(); + } +} + +function validateWhitelabelKey($key) +{ + $public_key = "-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr0k+4ZJudkdGMCFLx5b9 +H/sOozvWphFJsjVIF0vPVx9J0bTdml65UdS+32JagIHfPtEUTohaMnI3IAxxCDzl +655qmtjL7RHHdx9UMIKCmtAZOtd2u6rEyZH7vB7cKA49ysKGIaQSGwTQc8DCgsrK +uxRuX04xq9T7T+zuzROw3Y9WjFy9RwrONqLuG8LqO0j7bk5LKYeLAV7u3E/QiqNx +lEljN2UVJ3FZ/LkXeg8ORkV+IHs/toRIfPs/4VQnjEwk5BU6DX2STOvbeZnTqwP3 +zgjRYR/zGN5l+az6RB3+0mJRdZdv/y2aRkBlwTxx2gOrPbQAco4a/IOmkE3EbHe7 +6wIDAQAP +-----END PUBLIC KEY-----"; + + if (openssl_public_decrypt(base64_decode($key), $decrypted, $public_key)) { + $key_info = json_decode($decrypted, true); + if ($key_info['expires'] > date('Y-m-d H:i:s', strtotime('-7 day'))) { + return $key_info; + } + } + + return false; +} From 29bea9517dab3faeab695213a8a3376fe922a385 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Tue, 14 Jul 2026 16:49:14 -0400 Subject: [PATCH 022/241] Removed the last of legacy validate functions and replaced with the new enforce fumctions. --- admin/includes/inc_all_admin.php | 4 +-- admin/post/update.php | 2 +- agent/custom/index.php | 1 - agent/reports/recurring_by_client.php | 2 +- functions/auth.php | 39 +++++++-------------------- 5 files changed, 12 insertions(+), 36 deletions(-) diff --git a/admin/includes/inc_all_admin.php b/admin/includes/inc_all_admin.php index 8c051fbaf..9953cd6b9 100644 --- a/admin/includes/inc_all_admin.php +++ b/admin/includes/inc_all_admin.php @@ -4,9 +4,7 @@ require_once $_SERVER['DOCUMENT_ROOT'] . '/config.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/functions.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/check_login.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/page_title.php'; -if (!isset($session_is_admin) || !$session_is_admin) { - exit(WORDING_ROLECHECK_FAILED . "
    Tell your admin: Your role does not have admin access."); -} +enforceAdminPermission(); require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/header.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/top_nav.php'; require_once 'includes/side_nav.php'; diff --git a/admin/post/update.php b/admin/post/update.php index 37ef80213..6099a858f 100644 --- a/admin/post/update.php +++ b/admin/post/update.php @@ -4,7 +4,7 @@ defined('FROM_POST_HANDLER') || die("Direct file access is not allowed"); if (isset($_GET['update'])) { - validateAdminRole(); // Old function + enforceAdminPermission(); //git fetch downloads the latest from remote without trying to merge or rebase anything. Then the git reset resets the master branch to what you just fetched. The --hard option changes all the files in your working tree to match the files in origin/master diff --git a/agent/custom/index.php b/agent/custom/index.php index 558c87aec..d97afaa02 100644 --- a/agent/custom/index.php +++ b/agent/custom/index.php @@ -13,7 +13,6 @@

    This is a great starting point for new custom pages.

    - Tell your admin: Your role does not have admin access."); + } + return true; +} + // Ensures a user has access to a module (e.g. module_support) with at least the required permission level provided (defaults to read) function enforceUserPermission($module, $check_access_level = 1) { $permitted_access_level = lookupUserPermission($module); From bf0d799caf819321fb3a4eb5b43a6fd17fd6d2c7 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Tue, 14 Jul 2026 16:51:34 -0400 Subject: [PATCH 023/241] Remove old function comment --- admin/post/update.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/admin/post/update.php b/admin/post/update.php index 6099a858f..a047377e7 100644 --- a/admin/post/update.php +++ b/admin/post/update.php @@ -284,8 +284,6 @@ if (isset($_GET['update'])) { if (isset($_GET['update_db'])) { - //validateAdminRole(); // Old function - // Get the current version require_once ('../includes/database_version.php'); From 5eb9f6b6d5677f18bd9aaf5d03c4631d7d478cc0 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Tue, 14 Jul 2026 16:57:16 -0400 Subject: [PATCH 024/241] Fix weak RNG in key32gen (TOTP secret generation) Replace srand()/rand() with random_int() for cryptographically secure, unbiased key generation. The previous implementation seeded rand() from microtime(), making TOTP secrets predictable if the generation time could be approximated. Also removes modulo bias and dead while(1) wrapper. Output format is unchanged: 32 chars from the base32 alphabet (A-Z, 2-7), so existing TOTP enrollments are unaffected. --- functions/security.php | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/functions/security.php b/functions/security.php index 16d8eea67..eec3cdaf4 100644 --- a/functions/security.php +++ b/functions/security.php @@ -16,15 +16,10 @@ function randomString(int $length = 16): string { // Older keygen function - only used for TOTP currently function key32gen() { - $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - $chars .= "234567"; - while (1) { - $key = ''; - srand((float) microtime() * 1000000); - for ($i = 0; $i < 32; $i++) { - $key .= substr($chars, (rand() % (strlen($chars))), 1); - } - break; + $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; + $key = ''; + for ($i = 0; $i < 32; $i++) { + $key .= $chars[random_int(0, strlen($chars) - 1)]; } return $key; } From d62b6e2ae77f0cf653b196d2dbfb328e6dd61c07 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Tue, 14 Jul 2026 16:58:16 -0400 Subject: [PATCH 025/241] Update comment --- functions/security.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/security.php b/functions/security.php index eec3cdaf4..4556ab5d8 100644 --- a/functions/security.php +++ b/functions/security.php @@ -14,7 +14,7 @@ function randomString(int $length = 16): string { ); } -// Older keygen function - only used for TOTP currently +// Used only for TOTP function key32gen() { $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; $key = ''; From 7bc47a58fe5836070f226801eaea2be790f2b5de Mon Sep 17 00:00:00 2001 From: johnnyq Date: Tue, 14 Jul 2026 17:10:45 -0400 Subject: [PATCH 026/241] Replace Function nullable_htmlentities() with just escapeHtml() and update all instances throughout --- admin/ai_model.php | 8 +- admin/ai_provider.php | 6 +- admin/api_keys.php | 12 +- admin/app_log.php | 24 +- admin/audit_log.php | 36 +-- admin/category.php | 18 +- admin/contract_template.php | 34 +-- admin/custom_link.php | 8 +- admin/document_template.php | 14 +- admin/document_template_details.php | 8 +- admin/identity_provider.php | 4 +- admin/includes/side_nav.php | 6 +- admin/mail_queue.php | 24 +- admin/modals/ai/ai_model_add.php | 2 +- admin/modals/ai/ai_model_edit.php | 8 +- admin/modals/ai/ai_provider_edit.php | 6 +- admin/modals/api/api_key_add.php | 2 +- admin/modals/category/category_add.php | 4 +- admin/modals/category/category_edit.php | 8 +- .../contract_template_edit.php | 12 +- .../custom_field/custom_field_create.php | 4 +- admin/modals/custom_link/custom_link_edit.php | 6 +- .../document_template_edit.php | 6 +- .../mail_queue/mail_queue_message_view.php | 16 +- .../payment_method/payment_method_edit.php | 4 +- .../payment_provider/payment_provider_add.php | 6 +- .../payment_provider_edit.php | 12 +- .../project_template_edit.php | 4 +- .../project_template_ticket_template_add.php | 2 +- admin/modals/role/role_add.php | 4 +- admin/modals/role/role_edit.php | 10 +- .../software_template_add.php | 2 +- .../software_template_edit.php | 14 +- admin/modals/tag/tag_edit.php | 6 +- admin/modals/tax/tax_edit.php | 2 +- .../ticket_status/ticket_status_edit.php | 4 +- .../ticket_template/ticket_template_add.php | 2 +- .../ticket_template_task_edit.php | 4 +- admin/modals/user/user_add.php | 4 +- admin/modals/user/user_archive.php | 10 +- admin/modals/user/user_edit.php | 14 +- admin/modals/user/user_restore.php | 8 +- admin/modules.php | 6 +- admin/payment_method.php | 6 +- admin/payment_provider.php | 10 +- admin/post/saved_payment_method.php | 6 +- admin/project_template.php | 8 +- admin/project_template_details.php | 18 +- admin/roles.php | 10 +- admin/saved_payment_method.php | 14 +- admin/settings_company.php | 28 +-- admin/settings_custom_fields.php | 10 +- admin/settings_default.php | 20 +- admin/settings_invoice.php | 8 +- admin/settings_localization.php | 4 +- admin/settings_mail.php | 46 ++-- admin/settings_module.php | 2 +- admin/settings_project.php | 2 +- admin/settings_quote.php | 6 +- admin/settings_security.php | 6 +- admin/settings_ticket.php | 4 +- admin/software_template.php | 14 +- admin/tag.php | 8 +- admin/tax.php | 2 +- admin/ticket_status.php | 6 +- admin/ticket_template.php | 10 +- admin/ticket_template_details.php | 14 +- admin/users.php | 22 +- agent/accounts.php | 8 +- agent/ajax.php | 8 +- agent/asset_details.php | 184 +++++++------- agent/assets.php | 68 +++--- agent/calendar.php | 20 +- agent/certificates.php | 20 +- agent/client_autopay.php | 12 +- agent/client_overview.php | 108 ++++----- agent/clients.php | 70 +++--- agent/contact_details.php | 192 +++++++-------- agent/contacts.php | 50 ++-- agent/credentials.php | 54 ++--- agent/dashboard.php | 32 +-- agent/document_details.php | 40 +-- agent/domains.php | 24 +- agent/expenses.php | 34 +-- agent/files.php | 42 ++-- agent/global_search.php | 138 +++++------ agent/includes/client_side_nav.php | 2 +- agent/includes/inc_all_client.php | 58 ++--- agent/includes/side_nav.php | 8 +- agent/invoice.php | 96 ++++---- agent/invoices.php | 38 +-- agent/locations.php | 46 ++-- agent/modals/account/account_edit.php | 4 +- agent/modals/asset/asset_add.php | 18 +- agent/modals/asset/asset_bulk_add_ticket.php | 6 +- .../asset/asset_bulk_assign_contact.php | 2 +- .../asset/asset_bulk_assign_location.php | 2 +- agent/modals/asset/asset_bulk_assign_tags.php | 2 +- agent/modals/asset/asset_bulk_edit_status.php | 2 +- .../asset/asset_bulk_transfer_client.php | 2 +- agent/modals/asset/asset_copy.php | 58 ++--- agent/modals/asset/asset_details.php | 178 +++++++------- agent/modals/asset/asset_documents.php | 2 +- agent/modals/asset/asset_edit.php | 76 +++--- agent/modals/asset/asset_interface_add.php | 10 +- .../asset_interface_bulk_edit_network.php | 4 +- .../asset/asset_interface_bulk_edit_type.php | 2 +- agent/modals/asset/asset_interface_edit.php | 28 +-- .../asset/asset_interface_multiple_add.php | 6 +- agent/modals/asset/asset_link_credential.php | 4 +- agent/modals/asset/asset_link_document.php | 4 +- agent/modals/asset/asset_link_file.php | 6 +- agent/modals/asset/asset_link_service.php | 4 +- agent/modals/asset/asset_link_software.php | 4 +- agent/modals/calendar/calendar_edit.php | 4 +- agent/modals/calendar/calendar_event_add.php | 8 +- agent/modals/calendar/calendar_event_edit.php | 24 +- agent/modals/certificate/certificate_add.php | 4 +- agent/modals/certificate/certificate_edit.php | 26 +- agent/modals/client/client_add.php | 4 +- .../modals/client/client_bulk_add_ticket.php | 6 +- .../modals/client/client_bulk_assign_tags.php | 2 +- .../client/client_bulk_edit_referral.php | 2 +- agent/modals/client/client_bulk_email.php | 18 +- agent/modals/client/client_credit_add.php | 2 +- agent/modals/client/client_edit.php | 22 +- agent/modals/contact/contact_add.php | 6 +- .../contact/contact_bulk_assign_location.php | 2 +- .../contact/contact_bulk_assign_tags.php | 2 +- agent/modals/contact/contact_bulk_email.php | 18 +- agent/modals/contact/contact_details.php | 152 ++++++------ agent/modals/contact/contact_edit.php | 36 +-- agent/modals/contact/contact_link_asset.php | 4 +- .../contact/contact_link_credential.php | 4 +- .../modals/contact/contact_link_document.php | 4 +- agent/modals/contact/contact_link_file.php | 6 +- agent/modals/contact/contact_link_service.php | 4 +- .../modals/contact/contact_link_software.php | 4 +- agent/modals/contact/contact_note_add.php | 4 +- agent/modals/credential/credential_add.php | 10 +- .../credential_bulk_assign_tags.php | 2 +- agent/modals/credential/credential_edit.php | 28 +-- agent/modals/credential/credential_view.php | 18 +- .../document/document_add_file_relation.php | 4 +- .../document/document_add_from_template.php | 4 +- agent/modals/document/document_bulk_move.php | 2 +- agent/modals/document/document_edit.php | 6 +- .../document/document_edit_visibility.php | 2 +- agent/modals/document/document_link_asset.php | 4 +- .../modals/document/document_link_contact.php | 4 +- agent/modals/document/document_link_file.php | 6 +- .../document/document_link_software.php | 4 +- agent/modals/document/document_move.php | 6 +- agent/modals/document/document_rename.php | 2 +- .../modals/document/document_version_view.php | 2 +- agent/modals/document/document_view.php | 2 +- agent/modals/domain/domain_add.php | 10 +- agent/modals/domain/domain_edit.php | 30 +-- agent/modals/expense/expense_add.php | 8 +- .../expense/expense_bulk_edit_account.php | 2 +- .../expense/expense_bulk_edit_category.php | 2 +- .../expense/expense_bulk_edit_client.php | 2 +- agent/modals/expense/expense_copy.php | 20 +- agent/modals/expense/expense_edit.php | 26 +- agent/modals/expense/expense_export.php | 6 +- agent/modals/expense/expense_refund.php | 12 +- agent/modals/file/file_bulk_move.php | 2 +- agent/modals/file/file_link_asset.php | 4 +- agent/modals/file/file_move.php | 8 +- agent/modals/file/file_rename.php | 6 +- agent/modals/folder/folder_add.php | 2 +- agent/modals/folder/folder_rename.php | 2 +- agent/modals/invoice/invoice_add.php | 4 +- agent/modals/invoice/invoice_add_ticket.php | 6 +- .../invoice/invoice_bulk_edit_category.php | 2 +- agent/modals/invoice/invoice_copy.php | 4 +- agent/modals/invoice/invoice_edit.php | 14 +- agent/modals/invoice/invoice_item_edit.php | 8 +- .../modals/invoice/invoice_recurring_add.php | 2 +- agent/modals/location/location_add.php | 6 +- .../location/location_bulk_assign_tags.php | 2 +- agent/modals/location/location_edit.php | 38 +-- agent/modals/network/network_add.php | 4 +- agent/modals/network/network_edit.php | 18 +- agent/modals/payment/invoice_apply_credit.php | 2 +- agent/modals/payment/payment_add.php | 16 +- agent/modals/payment/payment_bulk_add.php | 12 +- agent/modals/payment/payment_edit.php | 10 +- .../payment/payment_saved_method_add.php | 4 +- agent/modals/product/product_add.php | 6 +- .../product/product_bulk_edit_category.php | 2 +- agent/modals/product/product_edit.php | 16 +- agent/modals/product/product_stock_add.php | 4 +- agent/modals/project/project_add.php | 6 +- agent/modals/project/project_edit.php | 20 +- .../project/project_link_closed_ticket.php | 2 +- agent/modals/project/project_link_ticket.php | 8 +- agent/modals/quote/quote_add.php | 4 +- agent/modals/quote/quote_copy.php | 6 +- agent/modals/quote/quote_edit.php | 14 +- agent/modals/quote/quote_item_edit.php | 8 +- agent/modals/quote/quote_to_invoice.php | 2 +- agent/modals/rack/rack_add.php | 4 +- agent/modals/rack/rack_device_add.php | 4 +- agent/modals/rack/rack_edit.php | 24 +- .../recurring_expense_add.php | 8 +- .../recurring_expense_edit.php | 24 +- .../recurring_invoice_add.php | 4 +- .../recurring_invoice_edit.php | 12 +- .../recurring_invoice_item_edit.php | 8 +- .../recurring_ticket/recurring_ticket_add.php | 26 +- .../recurring_ticket_bulk_agent_edit.php | 2 +- .../recurring_ticket_bulk_category_edit.php | 2 +- .../recurring_ticket_edit.php | 26 +- agent/modals/revenue/revenue_add.php | 8 +- agent/modals/revenue/revenue_edit.php | 22 +- agent/modals/service/service_add.php | 18 +- agent/modals/service/service_details.php | 42 ++-- agent/modals/service/service_edit.php | 32 +-- agent/modals/share_modal.php | 4 +- agent/modals/software/software_add.php | 18 +- .../software/software_add_from_template.php | 4 +- agent/modals/software/software_edit.php | 40 +-- agent/modals/ticket/ticket_add.php | 32 +-- agent/modals/ticket/ticket_add_v2.php | 12 +- agent/modals/ticket/ticket_add_watcher.php | 4 +- agent/modals/ticket/ticket_assign.php | 8 +- agent/modals/ticket/ticket_billable.php | 2 +- .../modals/ticket/ticket_bulk_add_project.php | 4 +- agent/modals/ticket/ticket_bulk_assign.php | 2 +- .../ticket/ticket_bulk_edit_category.php | 2 +- agent/modals/ticket/ticket_bulk_merge.php | 8 +- agent/modals/ticket/ticket_bulk_reply.php | 2 +- agent/modals/ticket/ticket_change_client.php | 4 +- agent/modals/ticket/ticket_contact.php | 8 +- agent/modals/ticket/ticket_edit.php | 38 +-- agent/modals/ticket/ticket_edit_asset.php | 12 +- agent/modals/ticket/ticket_edit_project.php | 6 +- agent/modals/ticket/ticket_edit_schedule.php | 6 +- agent/modals/ticket/ticket_invoice_add.php | 48 ++-- agent/modals/ticket/ticket_merge.php | 12 +- agent/modals/ticket/ticket_priority.php | 6 +- agent/modals/ticket/ticket_quote_add.php | 26 +- agent/modals/ticket/ticket_reply_edit.php | 4 +- agent/modals/ticket/ticket_reply_redact.php | 2 +- .../ticket/ticket_task_approver_add.php | 2 +- agent/modals/ticket/ticket_task_edit.php | 14 +- agent/modals/transfer/transfer_add.php | 12 +- agent/modals/transfer/transfer_edit.php | 18 +- agent/modals/trip/trip_add.php | 14 +- agent/modals/trip/trip_copy.php | 28 +-- agent/modals/trip/trip_edit.php | 28 +-- agent/networks.php | 26 +- agent/notifications.php | 16 +- agent/payments.php | 36 +-- agent/post/client.php | 228 +++++++++--------- agent/post/invoice.php | 116 ++++----- agent/post/quote.php | 68 +++--- agent/post/task.php | 6 +- agent/post/ticket.php | 4 +- agent/products.php | 22 +- agent/project_details.php | 54 ++--- agent/projects.php | 28 +-- agent/quote.php | 90 +++---- agent/quotes.php | 28 +-- agent/racks.php | 30 +-- agent/recurring_expenses.php | 30 +-- agent/recurring_invoice.php | 84 +++---- agent/recurring_invoices.php | 30 +-- agent/recurring_tickets.php | 20 +- agent/reports/budget.php | 2 +- agent/reports/client_ticket_time_detail.php | 20 +- agent/reports/clients_with_balance.php | 2 +- agent/reports/credential_rotation.php | 8 +- agent/reports/expense_summary.php | 2 +- agent/reports/includes/reports_side_nav.php | 4 +- agent/reports/income_by_client.php | 2 +- agent/reports/income_summary.php | 2 +- agent/reports/profit_loss.php | 4 +- agent/reports/recurring_by_client.php | 2 +- agent/reports/tax_summary.php | 4 +- agent/reports/ticket_by_client.php | 8 +- agent/reports/tickets_unbilled.php | 2 +- agent/reports/time_by_tech.php | 4 +- agent/revenues.php | 24 +- agent/services.php | 24 +- agent/software.php | 24 +- agent/ticket.php | 174 ++++++------- agent/ticket_kanban.php | 4 +- agent/ticket_list.php | 34 +-- agent/tickets.php | 20 +- agent/transfers.php | 28 +-- agent/trips.php | 26 +- agent/user/includes/user_side_nav.php | 2 +- agent/user/mfa_enforcement.php | 4 +- agent/user/user_activity.php | 16 +- agent/user/user_details.php | 8 +- agent/user/user_security.php | 2 +- client/assets.php | 20 +- client/certificates.php | 8 +- client/contact_edit.php | 10 +- client/contacts.php | 4 +- client/document.php | 10 +- client/documents.php | 6 +- client/domains.php | 4 +- client/includes/footer.php | 2 +- client/includes/header.php | 14 +- client/index.php | 8 +- client/invoices.php | 12 +- client/login_reset.php | 6 +- client/post.php | 16 +- client/profile.php | 2 +- client/quotes.php | 10 +- client/recurring_invoices.php | 14 +- client/saved_payment_methods.php | 14 +- client/ticket.php | 40 +-- client/ticket_add.php | 2 +- client/ticket_view_all.php | 8 +- client/tickets.php | 6 +- client/unpaid_invoices.php | 20 +- functions/app.php | 4 +- functions/sanitize.php | 2 +- guest/guest_ajax.php | 6 +- guest/guest_approve_ticket_task.php | 22 +- guest/guest_pay_invoice_stripe.php | 22 +- guest/guest_post.php | 148 ++++++------ guest/guest_view_invoice.php | 94 ++++---- guest/guest_view_item.php | 54 ++--- guest/guest_view_quote.php | 70 +++--- guest/guest_view_ticket.php | 30 +-- guest/includes/guest_header.php | 2 +- includes/footer.php | 2 +- includes/header.php | 2 +- includes/page_title.php | 2 +- includes/top_nav.php | 14 +- login.php | 8 +- modals/notifications.php | 6 +- setup/index.php | 2 +- 338 files changed, 3057 insertions(+), 3057 deletions(-) diff --git a/admin/ai_model.php b/admin/ai_model.php index 2eab6bdad..1f76e8ea8 100644 --- a/admin/ai_model.php +++ b/admin/ai_model.php @@ -60,11 +60,11 @@ $num_rows = mysqli_num_rows($sql); while ($row = mysqli_fetch_assoc($sql)) { $provider_id = intval($row['ai_provider_id']); - $provider_name = nullable_htmlentities($row['ai_provider_name']); + $provider_name = escapeHtml($row['ai_provider_name']); $model_id = intval($row['ai_model_id']); - $model_name = nullable_htmlentities($row['ai_model_name']); - $use_case = nullable_htmlentities($row['ai_model_use_case']); - $prompt = nl2br(nullable_htmlentities($row['ai_model_prompt'])); + $model_name = escapeHtml($row['ai_model_name']); + $use_case = escapeHtml($row['ai_model_use_case']); + $prompt = nl2br(escapeHtml($row['ai_model_prompt'])); ?> diff --git a/admin/ai_provider.php b/admin/ai_provider.php index 1f8eb398a..69001c85f 100644 --- a/admin/ai_provider.php +++ b/admin/ai_provider.php @@ -50,9 +50,9 @@ $num_rows = mysqli_num_rows($sql); while ($row = mysqli_fetch_assoc($sql)) { $provider_id = intval($row['ai_provider_id']); - $provider_name = nullable_htmlentities($row['ai_provider_name']); - $url = nullable_htmlentities($row['ai_provider_api_url']); - $key = nullable_htmlentities($row['ai_provider_api_key']); + $provider_name = escapeHtml($row['ai_provider_name']); + $url = escapeHtml($row['ai_provider_api_url']); + $key = escapeHtml($row['ai_provider_api_key']); $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('ai_model_id') AS ai_model_count FROM ai_models WHERE ai_model_ai_provider_id = $provider_id")); $ai_model_count = intval($row['ai_model_count']); diff --git a/admin/api_keys.php b/admin/api_keys.php index eb21404ca..387ae2577 100644 --- a/admin/api_keys.php +++ b/admin/api_keys.php @@ -33,7 +33,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
    - +
    @@ -107,10 +107,10 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); while ($row = mysqli_fetch_assoc($sql)) { $api_key_id = intval($row['api_key_id']); - $api_key_name = nullable_htmlentities($row['api_key_name']); - $api_key_secret = nullable_htmlentities("************" . substr($row['api_key_secret'], -4)); - $api_key_created_at = nullable_htmlentities($row['api_key_created_at']); - $api_key_expire = nullable_htmlentities($row['api_key_expire']); + $api_key_name = escapeHtml($row['api_key_name']); + $api_key_secret = escapeHtml("************" . substr($row['api_key_secret'], -4)); + $api_key_created_at = escapeHtml($row['api_key_created_at']); + $api_key_expire = escapeHtml($row['api_key_expire']); if ($api_key_expire < date("Y-m-d H:i:s")) { $api_key_expire = $api_key_expire . " (Expired)"; } @@ -118,7 +118,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); if ($row['api_key_client_id'] == 0) { $api_key_client = "All Clients"; } else { - $api_key_client = nullable_htmlentities($row['client_name']); + $api_key_client = escapeHtml($row['client_name']); } ?> diff --git a/admin/app_log.php b/admin/app_log.php index a50c6d5be..350a9d727 100644 --- a/admin/app_log.php +++ b/admin/app_log.php @@ -9,7 +9,7 @@ require_once "includes/inc_all_admin.php"; // Log Type Filter if (isset($_GET['type']) & !empty($_GET['type'])) { $log_type_query = "AND (app_log_type = '" . sanitizeInput($_GET['type']) . "')"; - $type_filter = nullable_htmlentities($_GET['type']); + $type_filter = escapeHtml($_GET['type']); } else { // Default - any $log_type_query = ''; @@ -19,7 +19,7 @@ if (isset($_GET['type']) & !empty($_GET['type'])) { // Log Category Filter if (isset($_GET['category']) & !empty($_GET['catergory'])) { $log_category_query = "AND (app_log_category = '" . sanitizeInput($_GET['category']) . "')"; - $category_filter = nullable_htmlentities($_GET['category']); + $category_filter = escapeHtml($_GET['category']); } else { // Default - any $log_category_query = ''; @@ -50,7 +50,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
    - +
    @@ -67,7 +67,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); - - - + + +
    @@ -143,10 +143,10 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); while ($row = mysqli_fetch_assoc($sql)) { $log_id = intval($row['app_log_id']); - $log_type = nullable_htmlentities($row['app_log_type']); - $log_category = nullable_htmlentities($row['app_log_category']); - $log_details = nullable_htmlentities($row['app_log_details']); - $log_created_at = nullable_htmlentities($row['app_log_created_at']); + $log_type = escapeHtml($row['app_log_type']); + $log_category = escapeHtml($row['app_log_category']); + $log_details = escapeHtml($row['app_log_details']); + $log_created_at = escapeHtml($row['app_log_created_at']); ?> diff --git a/admin/audit_log.php b/admin/audit_log.php index 0cb9a32aa..cbac28496 100644 --- a/admin/audit_log.php +++ b/admin/audit_log.php @@ -29,7 +29,7 @@ if (isset($_GET['client']) & !empty($_GET['client'])) { // Log Type Filter if (isset($_GET['type']) & !empty($_GET['type'])) { $log_type_query = "AND (log_type = '" . sanitizeInput($_GET['type']) . "')"; - $type_filter = nullable_htmlentities($_GET['type']); + $type_filter = escapeHtml($_GET['type']); } else { // Default - any $log_type_query = ''; @@ -39,7 +39,7 @@ if (isset($_GET['type']) & !empty($_GET['type'])) { // Log Action Filter if (isset($_GET['action']) & !empty($_GET['action'])) { $log_action_query = "AND (log_action = '" . sanitizeInput($_GET['action']) . "')"; - $action_filter = nullable_htmlentities($_GET['action']); + $action_filter = escapeHtml($_GET['action']); } else { // Default - any $log_action_query = ''; @@ -73,7 +73,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
    - +
    @@ -90,7 +90,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); $sql_clients_filter = mysqli_query($mysqli, "SELECT * FROM clients ORDER BY client_name ASC"); while ($row = mysqli_fetch_assoc($sql_clients_filter)) { $client_id = intval($row['client_id']); - $client_name = nullable_htmlentities($row['client_name']); + $client_name = escapeHtml($row['client_name']); ?> - - - + + +
    @@ -227,22 +227,22 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); while ($row = mysqli_fetch_assoc($sql)) { $log_id = intval($row['log_id']); - $log_type = nullable_htmlentities($row['log_type']); - $log_action = nullable_htmlentities($row['log_action']); - $log_description = nullable_htmlentities($row['log_description']); - $log_ip = nullable_htmlentities($row['log_ip']); - $log_user_agent = nullable_htmlentities($row['log_user_agent']); + $log_type = escapeHtml($row['log_type']); + $log_action = escapeHtml($row['log_action']); + $log_description = escapeHtml($row['log_description']); + $log_ip = escapeHtml($row['log_ip']); + $log_user_agent = escapeHtml($row['log_user_agent']); $log_user_os = getOS($log_user_agent); $log_user_browser = getWebBrowser($log_user_agent); - $log_created_at = nullable_htmlentities($row['log_created_at']); + $log_created_at = escapeHtml($row['log_created_at']); $user_id = intval($row['user_id']); - $user_name = nullable_htmlentities($row['user_name']); + $user_name = escapeHtml($row['user_name']); if (empty($user_name)) { $user_name_display = "-"; } else { $user_name_display = $user_name; } - $client_name = nullable_htmlentities($row['client_name']); + $client_name = escapeHtml($row['client_name']); $client_id = intval($row['client_id']); if (empty($client_name)) { $client_name_display = "-"; diff --git a/admin/category.php b/admin/category.php index 16bca1001..9e6928083 100644 --- a/admin/category.php +++ b/admin/category.php @@ -28,14 +28,14 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));

    - Categories + Categories

    - +
    - +
    + placeholder="Search Categories ">
    @@ -143,9 +143,9 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); while ($row = mysqli_fetch_assoc($sql)) { $category_id = intval($row['category_id']); - $category_name = nullable_htmlentities($row['category_name']); - $category_description = nullable_htmlentities($row['category_description']); - $category_color = nullable_htmlentities($row['category_color']); + $category_name = escapeHtml($row['category_name']); + $category_description = escapeHtml($row['category_description']); + $category_color = escapeHtml($row['category_color']); ?> diff --git a/admin/contract_template.php b/admin/contract_template.php index f8098658b..c1aa5dc1e 100644 --- a/admin/contract_template.php +++ b/admin/contract_template.php @@ -31,7 +31,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
    - +
    @@ -61,28 +61,28 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); -
    +
    diff --git a/admin/custom_link.php b/admin/custom_link.php index 08eefb790..0d930489f 100644 --- a/admin/custom_link.php +++ b/admin/custom_link.php @@ -30,7 +30,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
    - +
    @@ -74,9 +74,9 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); while ($row = mysqli_fetch_assoc($sql)) { $custom_link_id = intval($row['custom_link_id']); - $custom_link_name = nullable_htmlentities($row['custom_link_name']); - $custom_link_uri = nullable_htmlentities($row['custom_link_uri']); - $custom_link_icon = nullable_htmlentities($row['custom_link_icon']); + $custom_link_name = escapeHtml($row['custom_link_name']); + $custom_link_uri = escapeHtml($row['custom_link_uri']); + $custom_link_icon = escapeHtml($row['custom_link_icon']); $custom_link_new_tab = intval($row['custom_link_new_tab']); if ($custom_link_new_tab == 1 ) { $custom_link_new_tab_display = ""; diff --git a/admin/document_template.php b/admin/document_template.php index 5b2d808a7..131ac3c93 100644 --- a/admin/document_template.php +++ b/admin/document_template.php @@ -31,7 +31,7 @@
    - +
    @@ -68,12 +68,12 @@ while ($row = mysqli_fetch_assoc($sql)) { $document_template_id = intval($row['document_template_id']); - $document_template_name = nullable_htmlentities($row['document_template_name']); - $document_template_description = nullable_htmlentities($row['document_template_description']); - $document_template_content = nullable_htmlentities($row['document_template_content']); - $document_template_created_by_name = nullable_htmlentities($row['user_name']); - $document_template_created_at = nullable_htmlentities($row['document_template_created_at']); - $document_template_updated_at = nullable_htmlentities(getFallback($row['document_template_updated_at'])); + $document_template_name = escapeHtml($row['document_template_name']); + $document_template_description = escapeHtml($row['document_template_description']); + $document_template_content = escapeHtml($row['document_template_content']); + $document_template_created_by_name = escapeHtml($row['user_name']); + $document_template_created_at = escapeHtml($row['document_template_created_at']); + $document_template_updated_at = escapeHtml(getFallback($row['document_template_updated_at'])); ?> diff --git a/admin/document_template_details.php b/admin/document_template_details.php index fa6c3f511..6e8503eb5 100644 --- a/admin/document_template_details.php +++ b/admin/document_template_details.php @@ -25,11 +25,11 @@ if (mysqli_num_rows($sql_document) == 0) { $row = mysqli_fetch_assoc($sql_document); -$document_template_name = nullable_htmlentities($row['document_template_name']); -$document_template_description = nullable_htmlentities($row['document_template_description']); +$document_template_name = escapeHtml($row['document_template_name']); +$document_template_description = escapeHtml($row['document_template_description']); $document_template_content = $purifier->purify($row['document_template_content']); -$document_template_created_at = nullable_htmlentities($row['document_template_created_at']); -$document_template_updated_at = nullable_htmlentities($row['document_template_updated_at']); +$document_template_created_at = escapeHtml($row['document_template_created_at']); +$document_template_updated_at = escapeHtml($row['document_template_updated_at']); ?> diff --git a/admin/identity_provider.php b/admin/identity_provider.php index 6a39905e8..d3f031149 100644 --- a/admin/identity_provider.php +++ b/admin/identity_provider.php @@ -33,7 +33,7 @@ require_once "includes/inc_all_admin.php";
    - +
    @@ -43,7 +43,7 @@ require_once "includes/inc_all_admin.php";
    - +
    diff --git a/admin/includes/side_nav.php b/admin/includes/side_nav.php index 5d7b224a0..07b82578c 100644 --- a/admin/includes/side_nav.php +++ b/admin/includes/side_nav.php @@ -1,5 +1,5 @@ - \ No newline at end of file diff --git a/agent/reports/includes/reports_side_nav.php b/agent/reports/includes/reports_side_nav.php index 581d2eadd..c848d89ec 100644 --- a/agent/reports/includes/reports_side_nav.php +++ b/agent/reports/includes/reports_side_nav.php @@ -15,44 +15,48 @@
    - + \ No newline at end of file diff --git a/agent/reports/clients_with_balance.php b/agent/reports/outstanding_balances.php similarity index 100% rename from agent/reports/clients_with_balance.php rename to agent/reports/outstanding_balances.php From 54e2005224075d8346a5c65709ac4eca4024065f Mon Sep 17 00:00:00 2001 From: johnnyq Date: Tue, 21 Jul 2026 14:18:33 -0400 Subject: [PATCH 083/241] Icon change for Mail Queue --- admin/mail_queue.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/mail_queue.php b/admin/mail_queue.php index de58e8ed4..fab189a7d 100644 --- a/admin/mail_queue.php +++ b/admin/mail_queue.php @@ -20,7 +20,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
    -

    Email Queue

    +

    Email Queue

    From 66b38b7f194baf3b88fa91de8e41d8fd92525c83 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Wed, 22 Jul 2026 16:07:39 -0400 Subject: [PATCH 084/241] Get Expense from Stripe instead of Static Entry --- agent/post/payment.php | 201 ++--------------------------- client/post.php | 15 ++- cron/cron.php | 15 ++- functions.php | 1 + functions/payments.php | 22 ++++ guest/guest_pay_invoice_stripe.php | 20 ++- 6 files changed, 66 insertions(+), 208 deletions(-) create mode 100644 functions/payments.php diff --git a/agent/post/payment.php b/agent/post/payment.php index 24cacf914..0cb8cc0f9 100644 --- a/agent/post/payment.php +++ b/agent/post/payment.php @@ -377,8 +377,6 @@ if (isset($_POST['add_payment_stripe'])) { $account_id = intval($row['payment_provider_account']); $expense_category_id = intval($row['payment_provider_expense_category']); $expense_vendor_id = intval($row['payment_provider_expense_vendor']); - $expense_percentage_fee = floatval($row['payment_provider_expense_percentage_fee']); - $expense_flat_fee = floatval($row['payment_provider_expense_flat_fee']); $payment_provider_client = escapeSql($row['payment_provider_client']); $saved_payment_method = escapeSql($row['saved_payment_provider_method']); $saved_payment_description = escapeSql($row['saved_payment_description']); @@ -412,6 +410,7 @@ if (isset($_POST['add_payment_stripe'])) { 'off_session' => true, 'confirm' => true, 'description' => $pi_description, + 'expand' => ['latest_charge.balance_transaction'], 'metadata' => [ 'itflow_client_id' => $client_id, 'itflow_client_name' => $client_name, @@ -488,10 +487,16 @@ if (isset($_POST['add_payment_stripe'])) { $extended_log_desc = '(DEV MODE)'; } - // Create Stripe payment gateway fee as an expense (if configured) + // Create actual Stripe gateway fee as an expense (if configured) if ($expense_vendor_id > 0 && $expense_category_id > 0) { - $gateway_fee = round($invoice_amount * $expense_percentage_fee + $expense_flat_fee, 2); - mysqli_query($mysqli,"INSERT INTO expenses SET expense_date = '$pi_date', expense_amount = $gateway_fee, expense_currency_code = '$invoice_currency_code', expense_account_id = $account_id, expense_vendor_id = $expense_vendor_id, expense_client_id = $client_id, expense_category_id = $expense_category_id, expense_description = 'Stripe Transaction for Invoice $invoice_prefix$invoice_number In the Amount of $balance_to_pay', expense_reference = 'Stripe - $pi_id $extended_log_desc'"); + $stripe_fee = getStripeGatewayFee($payment_intent); + if ($stripe_fee) { + $gateway_fee = floatval($stripe_fee['fee']); + $gateway_fee_currency = escapeSql($stripe_fee['currency']); + mysqli_query($mysqli,"INSERT INTO expenses SET expense_date = '$pi_date', expense_amount = $gateway_fee, expense_currency_code = '$gateway_fee_currency', expense_account_id = $account_id, expense_vendor_id = $expense_vendor_id, expense_client_id = $client_id, expense_category_id = $expense_category_id, expense_description = 'Stripe fee for Invoice $invoice_prefix$invoice_number payment of $balance_to_pay', expense_reference = 'Stripe - $pi_id $extended_log_desc'"); + } else { + logApp("Stripe", "warning", "Balance transaction unavailable for $pi_id - fee expense not recorded for invoice ID $invoice_id"); + } } // Notify/log @@ -514,192 +519,6 @@ if (isset($_POST['add_payment_stripe'])) { } -/* -if (isset($_GET['add_payment_stripe'])) { - - validateCSRFToken($_GET['csrf_token']); - - enforceUserPermission('module_sales', 2); - enforceUserPermission('module_financial', 2); - - $invoice_id = intval($_GET['invoice_id']); - - // Get invoice details - $sql = mysqli_query($mysqli,"SELECT * FROM invoices - LEFT JOIN clients ON invoice_client_id = client_id - LEFT JOIN contacts ON clients.client_id = contacts.contact_client_id AND contact_primary = 1 - WHERE invoice_id = $invoice_id" - ); - $row = mysqli_fetch_assoc($sql); - $invoice_number = intval($row['invoice_number']); - $invoice_status = escapeSql($row['invoice_status']); - $invoice_amount = floatval($row['invoice_amount']); - $invoice_prefix = escapeSql($row['invoice_prefix']); - $invoice_number = intval($row['invoice_number']); - $invoice_url_key = escapeSql($row['invoice_url_key']); - $invoice_currency_code = escapeSql($row['invoice_currency_code']); - $client_id = intval($row['client_id']); - $client_name = escapeSql($row['client_name']); - $contact_name = escapeSql($row['contact_name']); - $contact_email = escapeSql($row['contact_email']); - $contact_phone = escapeSql(formatPhoneNumber($row['contact_phone'], $row['contact_phone_country_code'])); - $contact_extension = preg_replace("/[^0-9]/", '',$row['contact_extension']); - $contact_mobile = escapeSql(formatPhoneNumber($row['contact_mobile'], $row['contact_mobile_country_code'])); - - // Get ITFlow company details - $sql = mysqli_query($mysqli,"SELECT * FROM companies WHERE company_id = 1"); - $row = mysqli_fetch_assoc($sql); - $company_name = escapeSql($row['company_name']); - $company_country = escapeSql($row['company_country']); - $company_address = escapeSql($row['company_address']); - $company_city = escapeSql($row['company_city']); - $company_state = escapeSql($row['company_state']); - $company_zip = escapeSql($row['company_zip']); - $company_phone = escapeSql(formatPhoneNumber($row['company_phone'], $row['company_phone_country_code'])); - $company_email = escapeSql($row['company_email']); - $company_website = escapeSql($row['company_website']); - - // Sanitize Config vars from get_settings.php - $config_invoice_from_name = escapeSql($config_invoice_from_name); - $config_invoice_from_email = escapeSql($config_invoice_from_email); - - // Get Client Stripe details - $stripe_client_details = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT * FROM client_stripe WHERE client_id = $client_id LIMIT 1")); - $stripe_id = escapeSql($stripe_client_details['stripe_id']); - $stripe_pm = escapeSql($stripe_client_details['stripe_pm']); - - // Sanity checks - if (!$config_stripe_enable || !$stripe_id || !$stripe_pm) { - flashAlert("Stripe not enabled or no client card saved", 'error'); - redirect(); - } elseif ($invoice_status !== 'Sent' && $invoice_status !== 'Viewed') { - flashAlert("Invalid invoice state (draft/partial/paid/not billable)", 'error'); - redirect(); - } elseif ($invoice_amount == 0) { - flashAlert("Invalid invoice amount", 'error'); - redirect(); - } - - // Initialize Stripe - require_once __DIR__ . '/../libs/stripe-php/init.php'; - $stripe = new \Stripe\StripeClient($config_stripe_secret); - - $balance_to_pay = round($invoice_amount, 2); - $pi_description = "ITFlow: $client_name payment of $invoice_currency_code $balance_to_pay for $invoice_prefix$invoice_number"; - - // Create a payment intent - try { - $payment_intent = $stripe->paymentIntents->create([ - 'amount' => intval($balance_to_pay * 100), // Times by 100 as Stripe expects values in cents - 'currency' => $invoice_currency_code, - 'customer' => $stripe_id, - 'payment_method' => $stripe_pm, - 'off_session' => true, - 'confirm' => true, - 'description' => $pi_description, - 'metadata' => [ - 'itflow_client_id' => $client_id, - 'itflow_client_name' => $client_name, - 'itflow_invoice_number' => $invoice_prefix . $invoice_number, - 'itflow_invoice_id' => $invoice_id, - ] - ]); - - // Get details from PI - $pi_id = escapeSql($payment_intent->id); - $pi_date = date('Y-m-d', $payment_intent->created); - $pi_amount_paid = floatval(($payment_intent->amount_received / 100)); - $pi_currency = strtoupper(escapeSql($payment_intent->currency)); - $pi_livemode = $payment_intent->livemode; - - } catch (Exception $e) { - $error = $e->getMessage(); - error_log("Stripe payment error - encountered exception during payment intent for invoice ID $invoice_id / $invoice_prefix$invoice_number: $error"); - logApp("Stripe", "error", "Exception during PI for invoice ID $invoice_id: $error"); - } - - if ($payment_intent->status == "succeeded" && intval($balance_to_pay) == intval($pi_amount_paid)) { - - // Update Invoice Status - mysqli_query($mysqli, "UPDATE invoices SET invoice_status = 'Paid' WHERE invoice_id = $invoice_id"); - - // Add Payment to History - mysqli_query($mysqli, "INSERT INTO payments SET payment_date = '$pi_date', payment_amount = $pi_amount_paid, payment_currency_code = '$pi_currency', payment_account_id = $config_stripe_account, payment_method = 'Stripe', payment_reference = 'Stripe - $pi_id', payment_invoice_id = $invoice_id"); - mysqli_query($mysqli, "INSERT INTO history SET history_status = 'Paid', history_description = 'Online Payment added (agent)', history_invoice_id = $invoice_id"); - - // Email receipt - if (!empty($config_smtp_provider)) { - $subject = "Payment Received - Invoice $invoice_prefix$invoice_number"; - $body = "Hello $contact_name,

    We have received online payment for the amount of " . numfmt_format_currency($currency_format, $invoice_amount, $invoice_currency_code) . " for invoice $invoice_prefix$invoice_number. Please keep this email as a receipt for your records.

    Amount Paid: " . numfmt_format_currency($currency_format, $invoice_amount, $invoice_currency_code) . "

    Thank you for your business!


    --
    $company_name - Billing Department
    $config_invoice_from_email
    $company_phone"; - - // Queue Mail - $data = [ - [ - 'from' => $config_invoice_from_email, - 'from_name' => $config_invoice_from_name, - 'recipient' => $contact_email, - 'recipient_name' => $contact_name, - 'subject' => $subject, - 'body' => $body, - ] - ]; - - // Email the internal notification address too - if (!empty($config_invoice_paid_notification_email)) { - $subject = "Payment Received - $client_name - Invoice $invoice_prefix$invoice_number"; - $body = "Hello,

    This is a notification that an invoice has been paid in ITFlow. Below is a copy of the receipt sent to the client:-

    --------

    Hello $contact_name,

    We have received online payment for the amount of " . numfmt_format_currency($currency_format, $invoice_amount, $invoice_currency_code) . " for invoice $invoice_prefix$invoice_number. Please keep this email as a receipt for your records.

    Amount Paid: " . numfmt_format_currency($currency_format, $invoice_amount, $invoice_currency_code) . "

    Thank you for your business!


    --
    $company_name - Billing Department
    $config_invoice_from_email
    $company_phone"; - - $data[] = [ - 'from' => $config_invoice_from_email, - 'from_name' => $config_invoice_from_name, - 'recipient' => $config_invoice_paid_notification_email, - 'recipient_name' => $contact_name, - 'subject' => $subject, - 'body' => $body, - ]; - } - - $mail = addToMailQueue($data); - - // Email Logging - $email_id = mysqli_insert_id($mysqli); - mysqli_query($mysqli,"INSERT INTO history SET history_status = 'Sent', history_description = 'Payment Receipt sent to mail queue ID: $email_id!', history_invoice_id = $invoice_id"); - logAudit("Invoice", "Payment", "Payment receipt for invoice $invoice_prefix$invoice_number queued to $contact_email Email ID: $email_id", $client_id, $invoice_id); - } - - // Log info - $extended_log_desc = ''; - if (!$pi_livemode) { - $extended_log_desc = '(DEV MODE)'; - } - - // Create Stripe payment gateway fee as an expense (if configured) - if ($config_stripe_expense_vendor > 0 && $config_stripe_expense_category > 0) { - $gateway_fee = round($invoice_amount * $config_stripe_percentage_fee + $config_stripe_flat_fee, 2); - mysqli_query($mysqli,"INSERT INTO expenses SET expense_date = '$pi_date', expense_amount = $gateway_fee, expense_currency_code = '$invoice_currency_code', expense_account_id = $config_stripe_account, expense_vendor_id = $config_stripe_expense_vendor, expense_client_id = $client_id, expense_category_id = $config_stripe_expense_category, expense_description = 'Stripe Transaction for Invoice $invoice_prefix$invoice_number In the Amount of $balance_to_pay', expense_reference = 'Stripe - $pi_id $extended_log_desc'"); - } - - // Notify/log - appNotify("Invoice Paid", "Invoice $invoice_prefix$invoice_number automatically paid", "invoice.php?invoice_id=$invoice_id", $client_id); - logAudit("Invoice", "Payment", "$session_name initiated Stripe payment amount of " . numfmt_format_currency($currency_format, $invoice_amount, $invoice_currency_code) . " added to invoice $invoice_prefix$invoice_number - $pi_id $extended_log_desc", $client_id, $invoice_id); - triggerCustomAction('invoice_pay', $invoice_id); - - flashAlert("Payment amount " . numfmt_format_currency($currency_format, $invoice_amount, $invoice_currency_code) . " added"); - - redirect(); - - } else { - mysqli_query($mysqli, "INSERT INTO history SET history_status = 'Payment failed', history_description = 'Stripe pay failed due to payment error', history_invoice_id = $invoice_id"); - - logAudit("Invoice", "Payment", "Failed online payment amount of invoice $invoice_prefix$invoice_number due to Stripe payment error", $client_id, $invoice_id); - flashAlert("Payment failed", 'error'); - - redirect(); - } - -} -*/ - if (isset($_POST['add_bulk_payment'])) { validateCSRFToken($_POST['csrf_token']); diff --git a/client/post.php b/client/post.php index 268e229f6..7fca44474 100644 --- a/client/post.php +++ b/client/post.php @@ -550,8 +550,6 @@ if (isset($_GET['add_payment_by_provider'])) { $account_id = intval($row['payment_provider_account']); $expense_category_id = intval($row['payment_provider_expense_category']); $expense_vendor_id = intval($row['payment_provider_expense_vendor']); - $expense_percentage_fee = floatval($row['payment_provider_expense_percentage_fee']); - $expense_flat_fee = floatval($row['payment_provider_expense_flat_fee']); $payment_provider_client = escapeSql($row['payment_provider_client']); $saved_payment_method = escapeSql($row['saved_payment_provider_method']); $saved_payment_description = escapeSql($row['saved_payment_description']); @@ -593,6 +591,7 @@ if (isset($_GET['add_payment_by_provider'])) { 'off_session' => true, 'confirm' => true, 'description' => $pi_description, + 'expand' => ['latest_charge.balance_transaction'], 'metadata' => [ 'itflow_client_id' => $client_id, 'itflow_client_name' => $client_name, @@ -669,10 +668,16 @@ if (isset($_GET['add_payment_by_provider'])) { $extended_log_desc = '(DEV MODE)'; } - // Create Stripe payment gateway fee as an expense (if configured) + // Create actual Stripe gateway fee as an expense (if configured) if ($expense_vendor_id > 0 && $expense_category_id > 0) { - $gateway_fee = round($invoice_amount * $expense_percentage_fee + $expense_flat_fee, 2); - mysqli_query($mysqli,"INSERT INTO expenses SET expense_date = '$pi_date', expense_amount = $gateway_fee, expense_currency_code = '$invoice_currency_code', expense_account_id = $account_id, expense_vendor_id = $expense_vendor_id, expense_client_id = $client_id, expense_category_id = $expense_category_id, expense_description = 'Stripe Transaction for Invoice $invoice_prefix$invoice_number In the Amount of $balance_to_pay', expense_reference = 'Stripe - $pi_id $extended_log_desc'"); + $stripe_fee = getStripeGatewayFee($payment_intent); + if ($stripe_fee) { + $gateway_fee = floatval($stripe_fee['fee']); + $gateway_fee_currency = escapeSql($stripe_fee['currency']); + mysqli_query($mysqli,"INSERT INTO expenses SET expense_date = '$pi_date', expense_amount = $gateway_fee, expense_currency_code = '$gateway_fee_currency', expense_account_id = $account_id, expense_vendor_id = $expense_vendor_id, expense_client_id = $client_id, expense_category_id = $expense_category_id, expense_description = 'Stripe fee for Invoice $invoice_prefix$invoice_number payment of $balance_to_pay', expense_reference = 'Stripe - $pi_id $extended_log_desc'"); + } else { + logApp("Stripe", "warning", "Balance transaction unavailable for $pi_id - fee expense not recorded for invoice ID $invoice_id"); + } } // Notify/log diff --git a/cron/cron.php b/cron/cron.php index 2c8711bd0..744f803cb 100644 --- a/cron/cron.php +++ b/cron/cron.php @@ -820,8 +820,6 @@ while ($row = mysqli_fetch_assoc($sql_recurring_payments)) { $account_id = intval($saved_payment['payment_provider_account']); $expense_category_id = intval($saved_payment['payment_provider_expense_category']); $expense_vendor_id = intval($saved_payment['payment_provider_expense_vendor']); - $expense_percentage_fee = floatval($saved_payment['payment_provider_expense_percentage_fee']); - $expense_flat_fee = floatval($saved_payment['payment_provider_expense_flat_fee']); $saved_payment_description = escapeSql($saved_payment['saved_payment_description']); $stripe_payment_method_id = $saved_payment['saved_payment_provider_method']; @@ -853,6 +851,7 @@ while ($row = mysqli_fetch_assoc($sql_recurring_payments)) { 'off_session' => true, 'confirm' => true, 'description' => $pi_description, + 'expand' => ['latest_charge.balance_transaction'], 'metadata' => [ 'itflow_client_id' => $client_id, 'itflow_client_name' => $client_name, @@ -885,10 +884,16 @@ while ($row = mysqli_fetch_assoc($sql_recurring_payments)) { mysqli_query($mysqli, "INSERT INTO payments SET payment_date = '$pi_date', payment_amount = $pi_amount_paid, payment_currency_code = '$pi_currency', payment_account_id = $account_id, payment_method = 'Stripe', payment_reference = 'Stripe - $pi_id', payment_invoice_id = $invoice_id"); mysqli_query($mysqli, "INSERT INTO history SET history_status = 'Paid', history_description = 'Online Payment added (autopay)', history_invoice_id = $invoice_id"); - // EXPENSE: Stripe gateway fee as an expense (if configured) + // EXPENSE: Actual Stripe gateway fee as an expense (if configured) if ($expense_vendor_id > 0 && $expense_category_id > 0) { - $gateway_fee = round($invoice_amount * $expense_percentage_fee + $expense_flat_fee, 2); - mysqli_query($mysqli,"INSERT INTO expenses SET expense_date = '$pi_date', expense_amount = $gateway_fee, expense_currency_code = '$invoice_currency_code', expense_account_id = $account_id, expense_vendor_id = $expense_vendor_id, expense_client_id = $client_id, expense_category_id = $expense_category_id, expense_description = 'Stripe Transaction for Invoice $invoice_prefix$invoice_number In the Amount of $balance_to_pay', expense_reference = 'Stripe - $pi_id'"); + $stripe_fee = getStripeGatewayFee($payment_intent); + if ($stripe_fee) { + $gateway_fee = floatval($stripe_fee['fee']); + $gateway_fee_currency = escapeSql($stripe_fee['currency']); + mysqli_query($mysqli,"INSERT INTO expenses SET expense_date = '$pi_date', expense_amount = $gateway_fee, expense_currency_code = '$gateway_fee_currency', expense_account_id = $account_id, expense_vendor_id = $expense_vendor_id, expense_client_id = $client_id, expense_category_id = $expense_category_id, expense_description = 'Stripe fee for Invoice $invoice_prefix$invoice_number payment of $balance_to_pay', expense_reference = 'Stripe - $pi_id'"); + } else { + logApp("Stripe", "warning", "Balance transaction unavailable for $pi_id - fee expense not recorded for invoice ID $invoice_id"); + } } // RECEIPT EMAIL diff --git a/functions.php b/functions.php index 5abd11e9c..5183cccc8 100644 --- a/functions.php +++ b/functions.php @@ -16,3 +16,4 @@ require_once __DIR__ . '/functions/auth.php'; require_once __DIR__ . '/functions/logging.php'; require_once __DIR__ . '/functions/app.php'; require_once __DIR__ . '/functions/db.php'; +require_once __DIR__ . '/functions/payments.php'; diff --git a/functions/payments.php b/functions/payments.php new file mode 100644 index 000000000..55d5ed5f5 --- /dev/null +++ b/functions/payments.php @@ -0,0 +1,22 @@ + ['latest_charge.balance_transaction']. + * Returns ['fee' => float, 'currency' => 'USD'] or false if unavailable. + */ +function getStripeGatewayFee($payment_intent) +{ + $bt = $payment_intent->latest_charge->balance_transaction ?? null; + + // Not expanded or not yet created (async payment methods) + if (!$bt || is_string($bt)) { + return false; + } + + return [ + 'fee' => round($bt->fee / 100, 2), + 'currency' => strtoupper($bt->currency), + ]; +} \ No newline at end of file diff --git a/guest/guest_pay_invoice_stripe.php b/guest/guest_pay_invoice_stripe.php index 1d26881f0..2feb85991 100644 --- a/guest/guest_pay_invoice_stripe.php +++ b/guest/guest_pay_invoice_stripe.php @@ -13,9 +13,6 @@ $stripe_secret = escapeHtml($stripe_provider['payment_provider_private $stripe_account = intval($stripe_provider['payment_provider_account']); $stripe_expense_vendor = intval($stripe_provider['payment_provider_expense_vendor']); $stripe_expense_category = intval($stripe_provider['payment_provider_expense_category']); -$stripe_percentage_fee = floatval($stripe_provider['payment_provider_expense_percentage_fee']); -$stripe_flat_fee = floatval($stripe_provider['payment_provider_expense_flat_fee']); - // Show payment form if (isset($_GET['invoice_id'], $_GET['url_key']) && !isset($_GET['payment_intent'])) { @@ -164,7 +161,10 @@ if (isset($_GET['invoice_id'], $_GET['url_key']) && !isset($_GET['payment_intent require_once '../libs/stripe-php/init.php'; \Stripe\Stripe::setApiKey($stripe_secret); - $pi_obj = \Stripe\PaymentIntent::retrieve($pi_id); + $pi_obj = \Stripe\PaymentIntent::retrieve([ + 'id' => $pi_id, + 'expand' => ['latest_charge.balance_transaction'], + ]); if ($pi_obj->client_secret !== $pi_cs) { error_log("Stripe payment error - Payment intent ID/Secret mismatch for $pi_id"); @@ -223,10 +223,16 @@ if (isset($_GET['invoice_id'], $_GET['url_key']) && !isset($_GET['payment_intent $amount_paid_previously = floatval(mysqli_fetch_assoc($sql_amount_paid_previously)['amount_paid']); $balance_to_pay = $invoice_amount - $amount_paid_previously; - // Stripe expense + // Stripe expense (actual fee from balance transaction) if ($stripe_expense_vendor > 0 && $stripe_expense_category > 0) { - $gateway_fee = round($balance_to_pay * $stripe_percentage_fee + $stripe_flat_fee, 2); - mysqli_query($mysqli, "INSERT INTO expenses SET expense_date = '$pi_date', expense_amount = $gateway_fee, expense_currency_code = '$invoice_currency_code', expense_account_id = $stripe_account, expense_vendor_id = $stripe_expense_vendor, expense_client_id = $client_id, expense_category_id = $stripe_expense_category, expense_description = 'Stripe Transaction for Invoice $invoice_prefix$invoice_number In the Amount of $balance_to_pay', expense_reference = 'Stripe - $pi_id'"); + $stripe_fee = getStripeGatewayFee($pi_obj); + if ($stripe_fee) { + $gateway_fee = floatval($stripe_fee['fee']); + $gateway_fee_currency = escapeSql($stripe_fee['currency']); + mysqli_query($mysqli, "INSERT INTO expenses SET expense_date = '$pi_date', expense_amount = $gateway_fee, expense_currency_code = '$gateway_fee_currency', expense_account_id = $stripe_account, expense_vendor_id = $stripe_expense_vendor, expense_client_id = $client_id, expense_category_id = $stripe_expense_category, expense_description = 'Stripe fee for Invoice $invoice_prefix$invoice_number payment of $balance_to_pay', expense_reference = 'Stripe - $pi_id'"); + } else { + error_log("Stripe payment warning - balance transaction unavailable for $pi_id, fee expense not recorded"); + } } if (intval($balance_to_pay) !== intval($pi_amount_paid)) { From f4b1b6585bd6f5843209e7e0ffb64000e34cd91b Mon Sep 17 00:00:00 2001 From: johnnyq Date: Wed, 22 Jul 2026 16:16:40 -0400 Subject: [PATCH 085/241] Move Expense block for Stripe after intent --- functions/payments.php | 2 +- guest/guest_pay_invoice_stripe.php | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/functions/payments.php b/functions/payments.php index 55d5ed5f5..d7bde49c1 100644 --- a/functions/payments.php +++ b/functions/payments.php @@ -19,4 +19,4 @@ function getStripeGatewayFee($payment_intent) 'fee' => round($bt->fee / 100, 2), 'currency' => strtoupper($bt->currency), ]; -} \ No newline at end of file +} diff --git a/guest/guest_pay_invoice_stripe.php b/guest/guest_pay_invoice_stripe.php index 2feb85991..317fb7a64 100644 --- a/guest/guest_pay_invoice_stripe.php +++ b/guest/guest_pay_invoice_stripe.php @@ -223,18 +223,6 @@ if (isset($_GET['invoice_id'], $_GET['url_key']) && !isset($_GET['payment_intent $amount_paid_previously = floatval(mysqli_fetch_assoc($sql_amount_paid_previously)['amount_paid']); $balance_to_pay = $invoice_amount - $amount_paid_previously; - // Stripe expense (actual fee from balance transaction) - if ($stripe_expense_vendor > 0 && $stripe_expense_category > 0) { - $stripe_fee = getStripeGatewayFee($pi_obj); - if ($stripe_fee) { - $gateway_fee = floatval($stripe_fee['fee']); - $gateway_fee_currency = escapeSql($stripe_fee['currency']); - mysqli_query($mysqli, "INSERT INTO expenses SET expense_date = '$pi_date', expense_amount = $gateway_fee, expense_currency_code = '$gateway_fee_currency', expense_account_id = $stripe_account, expense_vendor_id = $stripe_expense_vendor, expense_client_id = $client_id, expense_category_id = $stripe_expense_category, expense_description = 'Stripe fee for Invoice $invoice_prefix$invoice_number payment of $balance_to_pay', expense_reference = 'Stripe - $pi_id'"); - } else { - error_log("Stripe payment warning - balance transaction unavailable for $pi_id, fee expense not recorded"); - } - } - if (intval($balance_to_pay) !== intval($pi_amount_paid)) { error_log("Stripe payment error - Invoice balance does not match amount paid for $pi_id"); exit(WORDING_PAYMENT_FAILED); @@ -243,10 +231,22 @@ if (isset($_GET['invoice_id'], $_GET['url_key']) && !isset($_GET['payment_intent // Update Invoice Status mysqli_query($mysqli, "UPDATE invoices SET invoice_status = 'Paid' WHERE invoice_id = $invoice_id"); - // Add Payment to History + // Add Payment to History mysqli_query($mysqli, "INSERT INTO payments SET payment_date = '$pi_date', payment_amount = $pi_amount_paid, payment_currency_code = '$pi_currency', payment_account_id = $stripe_account, payment_method = 'Stripe', payment_reference = 'Stripe - $pi_id', payment_invoice_id = $invoice_id"); mysqli_query($mysqli, "INSERT INTO history SET history_status = 'Paid', history_description = 'Online Payment added (client) - $ip - $os - $browser', history_invoice_id = $invoice_id"); + // Stripe expense (actual fee from balance transaction) + if ($stripe_expense_vendor > 0 && $stripe_expense_category > 0) { + $stripe_fee = getStripeGatewayFee($pi_obj); + if ($stripe_fee) { + $gateway_fee = floatval($stripe_fee['fee']); + $gateway_fee_currency = escapeSql($stripe_fee['currency']); + mysqli_query($mysqli, "INSERT INTO expenses SET expense_date = '$pi_date', expense_amount = $gateway_fee, expense_currency_code = '$gateway_fee_currency', expense_account_id = $stripe_account, expense_vendor_id = $stripe_expense_vendor, expense_client_id = $client_id, expense_category_id = $stripe_expense_category, expense_description = 'Stripe fee for Invoice $invoice_prefix$invoice_number payment of $balance_to_pay', expense_reference = 'Stripe - $pi_id'"); + } else { + error_log("Stripe payment warning - balance transaction unavailable for $pi_id, fee expense not recorded"); + } + } + // Notify appNotify("Invoice Paid", "Invoice $invoice_prefix$invoice_number has been paid by $client_name - $ip - $os - $browser", "/agent/invoice.php?invoice_id=$invoice_id", $pi_client_id); From 08334b22c3e720ec43f029356f809f81b22529cc Mon Sep 17 00:00:00 2001 From: johnnyq Date: Wed, 22 Jul 2026 16:47:28 -0400 Subject: [PATCH 086/241] Add Stripe fee reconciliation to cron Balance transactions aren't always attached when a payment completes, so the fee expense can be skipped at payment time. Daily cron pass now finds recent Stripe payments with no matching fee expense and records the actual fee once available. Dedupes by expense reference prefix, 30-day lookback. --- cron/cron.php | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/cron/cron.php b/cron/cron.php index 744f803cb..4f8f19040 100644 --- a/cron/cron.php +++ b/cron/cron.php @@ -953,6 +953,72 @@ while ($row = mysqli_fetch_assoc($sql_recurring_payments)) { } } +/* + * Stripe fee reconciliation + * A payment can complete before Stripe attaches the balance transaction, + * in which case the fee expense is skipped at payment time. Find recent + * Stripe payments with no matching fee expense and record the actual fee + * now that the balance transaction exists. + */ +$stripe_provider = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT * FROM payment_providers WHERE payment_provider_name = 'Stripe' LIMIT 1")); + +if ($stripe_provider) { + + $provider_private_key = $stripe_provider['payment_provider_private_key']; + $expense_vendor_id = intval($stripe_provider['payment_provider_expense_vendor']); + $expense_category_id = intval($stripe_provider['payment_provider_expense_category']); + $expense_account_id = intval($stripe_provider['payment_provider_account']); + + if ($provider_private_key && $expense_vendor_id > 0 && $expense_category_id > 0) { + + $sql_missing_fee = mysqli_query($mysqli, " + SELECT payment_reference, payment_date, payment_amount, invoice_prefix, invoice_number, invoice_client_id + FROM payments + LEFT JOIN invoices ON payment_invoice_id = invoice_id + WHERE payment_reference LIKE 'Stripe - pi\_%' + AND payment_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY) + AND NOT EXISTS ( + SELECT 1 FROM expenses WHERE LOCATE(payments.payment_reference, expenses.expense_reference) = 1 + ) + LIMIT 50 + "); + + if ($sql_missing_fee && mysqli_num_rows($sql_missing_fee) > 0) { + + require_once __DIR__ . '/../libs/stripe-php/init.php'; + $stripe = new \Stripe\StripeClient($provider_private_key); + + while ($missing = mysqli_fetch_assoc($sql_missing_fee)) { + + $payment_reference = escapeSql($missing['payment_reference']); + $payment_date = escapeSql($missing['payment_date']); + $payment_amount = floatval($missing['payment_amount']); + $invoice_prefix = escapeSql($missing['invoice_prefix']); + $invoice_number = intval($missing['invoice_number']); + $client_id = intval($missing['invoice_client_id']); + + $pi_id = str_replace('Stripe - ', '', $missing['payment_reference']); + + try { + $payment_intent = $stripe->paymentIntents->retrieve($pi_id, ['expand' => ['latest_charge.balance_transaction']]); + } catch (Exception $e) { + logApp("Stripe", "warning", "Fee reconciliation - could not retrieve $pi_id: " . $e->getMessage()); + continue; + } + + $stripe_fee = getStripeGatewayFee($payment_intent); + if ($stripe_fee) { + $gateway_fee = floatval($stripe_fee['fee']); + $gateway_fee_currency = escapeSql($stripe_fee['currency']); + mysqli_query($mysqli, "INSERT INTO expenses SET expense_date = '$payment_date', expense_amount = $gateway_fee, expense_currency_code = '$gateway_fee_currency', expense_account_id = $expense_account_id, expense_vendor_id = $expense_vendor_id, expense_client_id = $client_id, expense_category_id = $expense_category_id, expense_description = 'Stripe fee for Invoice $invoice_prefix$invoice_number payment of $payment_amount', expense_reference = '$payment_reference'"); + logApp("Stripe", "info", "Fee reconciliation - recorded Stripe fee of $gateway_fee for $pi_id"); + } + // Still-missing balance transactions get picked up on the next run + } + } + } +} + // Recurring Expenses // Loop through all recurring expenses that match today's date and is active $sql_recurring_expenses = mysqli_query($mysqli, "SELECT * FROM recurring_expenses WHERE recurring_expense_next_date = CURDATE() AND recurring_expense_status = 1"); From 8ee780566e6b92cda4f4c33f3654dad5cb99a592 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Wed, 22 Jul 2026 17:06:10 -0400 Subject: [PATCH 087/241] Cleanup Expense Code in post blocks and remove single use function since stripe payments get reconciled during nightly cron --- agent/post/payment.php | 15 --------------- client/post.php | 15 --------------- cron/cron.php | 24 +++++------------------- functions.php | 1 - functions/payments.php | 22 ---------------------- guest/guest_pay_invoice_stripe.php | 22 +++------------------- 6 files changed, 8 insertions(+), 91 deletions(-) delete mode 100644 functions/payments.php diff --git a/agent/post/payment.php b/agent/post/payment.php index 0cb8cc0f9..e1e0be638 100644 --- a/agent/post/payment.php +++ b/agent/post/payment.php @@ -375,8 +375,6 @@ if (isset($_POST['add_payment_stripe'])) { $public_key = escapeSql($row['payment_provider_public_key']); $private_key = escapeSql($row['payment_provider_private_key']); $account_id = intval($row['payment_provider_account']); - $expense_category_id = intval($row['payment_provider_expense_category']); - $expense_vendor_id = intval($row['payment_provider_expense_vendor']); $payment_provider_client = escapeSql($row['payment_provider_client']); $saved_payment_method = escapeSql($row['saved_payment_provider_method']); $saved_payment_description = escapeSql($row['saved_payment_description']); @@ -410,7 +408,6 @@ if (isset($_POST['add_payment_stripe'])) { 'off_session' => true, 'confirm' => true, 'description' => $pi_description, - 'expand' => ['latest_charge.balance_transaction'], 'metadata' => [ 'itflow_client_id' => $client_id, 'itflow_client_name' => $client_name, @@ -487,18 +484,6 @@ if (isset($_POST['add_payment_stripe'])) { $extended_log_desc = '(DEV MODE)'; } - // Create actual Stripe gateway fee as an expense (if configured) - if ($expense_vendor_id > 0 && $expense_category_id > 0) { - $stripe_fee = getStripeGatewayFee($payment_intent); - if ($stripe_fee) { - $gateway_fee = floatval($stripe_fee['fee']); - $gateway_fee_currency = escapeSql($stripe_fee['currency']); - mysqli_query($mysqli,"INSERT INTO expenses SET expense_date = '$pi_date', expense_amount = $gateway_fee, expense_currency_code = '$gateway_fee_currency', expense_account_id = $account_id, expense_vendor_id = $expense_vendor_id, expense_client_id = $client_id, expense_category_id = $expense_category_id, expense_description = 'Stripe fee for Invoice $invoice_prefix$invoice_number payment of $balance_to_pay', expense_reference = 'Stripe - $pi_id $extended_log_desc'"); - } else { - logApp("Stripe", "warning", "Balance transaction unavailable for $pi_id - fee expense not recorded for invoice ID $invoice_id"); - } - } - // Notify/log appNotify("Invoice Paid", "Invoice $invoice_prefix$invoice_number automatically paid", "/agent/invoice.php?invoice_id=$invoice_id", $client_id); logAudit("Invoice", "Payment", "$session_name initiated Stripe payment amount of " . numfmt_format_currency($currency_format, $invoice_amount, $invoice_currency_code) . " added to invoice $invoice_prefix$invoice_number - $pi_id $extended_log_desc", $client_id, $invoice_id); diff --git a/client/post.php b/client/post.php index 7fca44474..3923c1ce4 100644 --- a/client/post.php +++ b/client/post.php @@ -548,8 +548,6 @@ if (isset($_GET['add_payment_by_provider'])) { $public_key = escapeSql($row['payment_provider_public_key']); $private_key = escapeSql($row['payment_provider_private_key']); $account_id = intval($row['payment_provider_account']); - $expense_category_id = intval($row['payment_provider_expense_category']); - $expense_vendor_id = intval($row['payment_provider_expense_vendor']); $payment_provider_client = escapeSql($row['payment_provider_client']); $saved_payment_method = escapeSql($row['saved_payment_provider_method']); $saved_payment_description = escapeSql($row['saved_payment_description']); @@ -591,7 +589,6 @@ if (isset($_GET['add_payment_by_provider'])) { 'off_session' => true, 'confirm' => true, 'description' => $pi_description, - 'expand' => ['latest_charge.balance_transaction'], 'metadata' => [ 'itflow_client_id' => $client_id, 'itflow_client_name' => $client_name, @@ -668,18 +665,6 @@ if (isset($_GET['add_payment_by_provider'])) { $extended_log_desc = '(DEV MODE)'; } - // Create actual Stripe gateway fee as an expense (if configured) - if ($expense_vendor_id > 0 && $expense_category_id > 0) { - $stripe_fee = getStripeGatewayFee($payment_intent); - if ($stripe_fee) { - $gateway_fee = floatval($stripe_fee['fee']); - $gateway_fee_currency = escapeSql($stripe_fee['currency']); - mysqli_query($mysqli,"INSERT INTO expenses SET expense_date = '$pi_date', expense_amount = $gateway_fee, expense_currency_code = '$gateway_fee_currency', expense_account_id = $account_id, expense_vendor_id = $expense_vendor_id, expense_client_id = $client_id, expense_category_id = $expense_category_id, expense_description = 'Stripe fee for Invoice $invoice_prefix$invoice_number payment of $balance_to_pay', expense_reference = 'Stripe - $pi_id $extended_log_desc'"); - } else { - logApp("Stripe", "warning", "Balance transaction unavailable for $pi_id - fee expense not recorded for invoice ID $invoice_id"); - } - } - // Notify/log appNotify("Invoice Paid", "Invoice $invoice_prefix$invoice_number automatically paid", "/agent/invoice.php?invoice_id=$invoice_id", $client_id); logAudit("Invoice", "Payment", "$session_name initiated Stripe payment amount of " . numfmt_format_currency($currency_format, $invoice_amount, $invoice_currency_code) . " added to invoice $invoice_prefix$invoice_number - $pi_id $extended_log_desc", $client_id, $invoice_id); diff --git a/cron/cron.php b/cron/cron.php index 4f8f19040..0713245a6 100644 --- a/cron/cron.php +++ b/cron/cron.php @@ -818,8 +818,6 @@ while ($row = mysqli_fetch_assoc($sql_recurring_payments)) { $provider_name = escapeSql($saved_payment['payment_provider_name']); $provider_private_key = $saved_payment['payment_provider_private_key']; $account_id = intval($saved_payment['payment_provider_account']); - $expense_category_id = intval($saved_payment['payment_provider_expense_category']); - $expense_vendor_id = intval($saved_payment['payment_provider_expense_vendor']); $saved_payment_description = escapeSql($saved_payment['saved_payment_description']); $stripe_payment_method_id = $saved_payment['saved_payment_provider_method']; @@ -851,7 +849,6 @@ while ($row = mysqli_fetch_assoc($sql_recurring_payments)) { 'off_session' => true, 'confirm' => true, 'description' => $pi_description, - 'expand' => ['latest_charge.balance_transaction'], 'metadata' => [ 'itflow_client_id' => $client_id, 'itflow_client_name' => $client_name, @@ -884,18 +881,6 @@ while ($row = mysqli_fetch_assoc($sql_recurring_payments)) { mysqli_query($mysqli, "INSERT INTO payments SET payment_date = '$pi_date', payment_amount = $pi_amount_paid, payment_currency_code = '$pi_currency', payment_account_id = $account_id, payment_method = 'Stripe', payment_reference = 'Stripe - $pi_id', payment_invoice_id = $invoice_id"); mysqli_query($mysqli, "INSERT INTO history SET history_status = 'Paid', history_description = 'Online Payment added (autopay)', history_invoice_id = $invoice_id"); - // EXPENSE: Actual Stripe gateway fee as an expense (if configured) - if ($expense_vendor_id > 0 && $expense_category_id > 0) { - $stripe_fee = getStripeGatewayFee($payment_intent); - if ($stripe_fee) { - $gateway_fee = floatval($stripe_fee['fee']); - $gateway_fee_currency = escapeSql($stripe_fee['currency']); - mysqli_query($mysqli,"INSERT INTO expenses SET expense_date = '$pi_date', expense_amount = $gateway_fee, expense_currency_code = '$gateway_fee_currency', expense_account_id = $account_id, expense_vendor_id = $expense_vendor_id, expense_client_id = $client_id, expense_category_id = $expense_category_id, expense_description = 'Stripe fee for Invoice $invoice_prefix$invoice_number payment of $balance_to_pay', expense_reference = 'Stripe - $pi_id'"); - } else { - logApp("Stripe", "warning", "Balance transaction unavailable for $pi_id - fee expense not recorded for invoice ID $invoice_id"); - } - } - // RECEIPT EMAIL if (!empty($config_smtp_provider)) { $subject = "Payment Received - Invoice $invoice_prefix$invoice_number"; @@ -1006,10 +991,11 @@ if ($stripe_provider) { continue; } - $stripe_fee = getStripeGatewayFee($payment_intent); - if ($stripe_fee) { - $gateway_fee = floatval($stripe_fee['fee']); - $gateway_fee_currency = escapeSql($stripe_fee['currency']); + // Actual fee from the balance transaction (null until Stripe attaches it - retried next run) + $balance_transaction = $payment_intent->latest_charge->balance_transaction ?? null; + if ($balance_transaction && !is_string($balance_transaction)) { + $gateway_fee = round($balance_transaction->fee / 100, 2); + $gateway_fee_currency = escapeSql(strtoupper($balance_transaction->currency)); mysqli_query($mysqli, "INSERT INTO expenses SET expense_date = '$payment_date', expense_amount = $gateway_fee, expense_currency_code = '$gateway_fee_currency', expense_account_id = $expense_account_id, expense_vendor_id = $expense_vendor_id, expense_client_id = $client_id, expense_category_id = $expense_category_id, expense_description = 'Stripe fee for Invoice $invoice_prefix$invoice_number payment of $payment_amount', expense_reference = '$payment_reference'"); logApp("Stripe", "info", "Fee reconciliation - recorded Stripe fee of $gateway_fee for $pi_id"); } diff --git a/functions.php b/functions.php index 5183cccc8..5abd11e9c 100644 --- a/functions.php +++ b/functions.php @@ -16,4 +16,3 @@ require_once __DIR__ . '/functions/auth.php'; require_once __DIR__ . '/functions/logging.php'; require_once __DIR__ . '/functions/app.php'; require_once __DIR__ . '/functions/db.php'; -require_once __DIR__ . '/functions/payments.php'; diff --git a/functions/payments.php b/functions/payments.php deleted file mode 100644 index d7bde49c1..000000000 --- a/functions/payments.php +++ /dev/null @@ -1,22 +0,0 @@ - ['latest_charge.balance_transaction']. - * Returns ['fee' => float, 'currency' => 'USD'] or false if unavailable. - */ -function getStripeGatewayFee($payment_intent) -{ - $bt = $payment_intent->latest_charge->balance_transaction ?? null; - - // Not expanded or not yet created (async payment methods) - if (!$bt || is_string($bt)) { - return false; - } - - return [ - 'fee' => round($bt->fee / 100, 2), - 'currency' => strtoupper($bt->currency), - ]; -} diff --git a/guest/guest_pay_invoice_stripe.php b/guest/guest_pay_invoice_stripe.php index 317fb7a64..ab87e053f 100644 --- a/guest/guest_pay_invoice_stripe.php +++ b/guest/guest_pay_invoice_stripe.php @@ -11,8 +11,6 @@ $stripe_provider = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT * FROM payme $stripe_publishable = escapeHtml($stripe_provider['payment_provider_public_key']); $stripe_secret = escapeHtml($stripe_provider['payment_provider_private_key']); $stripe_account = intval($stripe_provider['payment_provider_account']); -$stripe_expense_vendor = intval($stripe_provider['payment_provider_expense_vendor']); -$stripe_expense_category = intval($stripe_provider['payment_provider_expense_category']); // Show payment form if (isset($_GET['invoice_id'], $_GET['url_key']) && !isset($_GET['payment_intent'])) { @@ -161,10 +159,7 @@ if (isset($_GET['invoice_id'], $_GET['url_key']) && !isset($_GET['payment_intent require_once '../libs/stripe-php/init.php'; \Stripe\Stripe::setApiKey($stripe_secret); - $pi_obj = \Stripe\PaymentIntent::retrieve([ - 'id' => $pi_id, - 'expand' => ['latest_charge.balance_transaction'], - ]); + $pi_obj = \Stripe\PaymentIntent::retrieve($pi_id); if ($pi_obj->client_secret !== $pi_cs) { error_log("Stripe payment error - Payment intent ID/Secret mismatch for $pi_id"); @@ -231,22 +226,11 @@ if (isset($_GET['invoice_id'], $_GET['url_key']) && !isset($_GET['payment_intent // Update Invoice Status mysqli_query($mysqli, "UPDATE invoices SET invoice_status = 'Paid' WHERE invoice_id = $invoice_id"); - // Add Payment to History + // Add Payment to History mysqli_query($mysqli, "INSERT INTO payments SET payment_date = '$pi_date', payment_amount = $pi_amount_paid, payment_currency_code = '$pi_currency', payment_account_id = $stripe_account, payment_method = 'Stripe', payment_reference = 'Stripe - $pi_id', payment_invoice_id = $invoice_id"); + mysqli_query($mysqli, "INSERT INTO history SET history_status = 'Paid', history_description = 'Online Payment added (client) - $ip - $os - $browser', history_invoice_id = $invoice_id"); - // Stripe expense (actual fee from balance transaction) - if ($stripe_expense_vendor > 0 && $stripe_expense_category > 0) { - $stripe_fee = getStripeGatewayFee($pi_obj); - if ($stripe_fee) { - $gateway_fee = floatval($stripe_fee['fee']); - $gateway_fee_currency = escapeSql($stripe_fee['currency']); - mysqli_query($mysqli, "INSERT INTO expenses SET expense_date = '$pi_date', expense_amount = $gateway_fee, expense_currency_code = '$gateway_fee_currency', expense_account_id = $stripe_account, expense_vendor_id = $stripe_expense_vendor, expense_client_id = $client_id, expense_category_id = $stripe_expense_category, expense_description = 'Stripe fee for Invoice $invoice_prefix$invoice_number payment of $balance_to_pay', expense_reference = 'Stripe - $pi_id'"); - } else { - error_log("Stripe payment warning - balance transaction unavailable for $pi_id, fee expense not recorded"); - } - } - // Notify appNotify("Invoice Paid", "Invoice $invoice_prefix$invoice_number has been paid by $client_name - $ip - $os - $browser", "/agent/invoice.php?invoice_id=$invoice_id", $pi_client_id); From 5402578ce6821f31ec433d70db732434ae1c18b4 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Wed, 22 Jul 2026 17:32:01 -0400 Subject: [PATCH 088/241] Remove Static payment processing fees from database and update field hints with useful info when adding / editing payment provider --- admin/database_updates.php | 14 +- .../payment_provider/payment_provider_add.php | 36 ++--- .../payment_provider_edit.php | 34 ++--- admin/payment_providers.php | 13 +- admin/post/payment_provider.php | 10 +- db.sql | 134 +++++++++++++++++- includes/database_version.php | 2 +- 7 files changed, 166 insertions(+), 77 deletions(-) diff --git a/admin/database_updates.php b/admin/database_updates.php index 6d52b6043..f9a93e4e6 100644 --- a/admin/database_updates.php +++ b/admin/database_updates.php @@ -4394,10 +4394,16 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) { } - // if (CURRENT_DATABASE_VERSION == '2.4.4') { - // // Insert queries here required to update to DB version 2.4.5 - // // Then, update the database to the next sequential version - // mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.4.5'"); + if (CURRENT_DATABASE_VERSION == '2.4.4') { + // Gateway fee expense now uses the actual fee from Stripe's balance transaction + mysqli_query($mysqli, "ALTER TABLE `payment_providers` DROP `payment_provider_expense_percentage_fee`, DROP `payment_provider_expense_flat_fee`"); + + mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.4.5'"); + } + + // if (CURRENT_DATABASE_VERSION == '2.4.5') { + // // Insert queries here required to update to DB version 2.4.6 + // mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.4.6'"); // } } else { diff --git a/admin/modals/payment_provider/payment_provider_add.php b/admin/modals/payment_provider/payment_provider_add.php index db79d3a5a..987deff8d 100644 --- a/admin/modals/payment_provider/payment_provider_add.php +++ b/admin/modals/payment_provider/payment_provider_add.php @@ -16,11 +16,6 @@ ob_start(); + Should havea seperate account created off the payment provider's name e.g. Stripe
    @@ -107,6 +103,10 @@ ob_start();
    +
    + Payment Processing Fee Expenses get reconciled nighly via the cron +
    +
    @@ -136,6 +136,7 @@ ob_start(); ?>
    + Payment Privider name e.g. Stripe
    @@ -166,29 +167,8 @@ ob_start();
    -
    - -
    - -
    -
    - -
    - -
    - See here for the latest Stripe Fees. -
    - -
    - -
    -
    - -
    - -
    - See here for the latest Stripe Fees. -
    + Processing Fee, Credit Card Fee etc +
    diff --git a/admin/modals/payment_provider/payment_provider_edit.php b/admin/modals/payment_provider/payment_provider_edit.php index a10bca726..26030f846 100644 --- a/admin/modals/payment_provider/payment_provider_edit.php +++ b/admin/modals/payment_provider/payment_provider_edit.php @@ -14,12 +14,11 @@ $account_id = intval($row['payment_provider_account']); $threshold = floatval($row['payment_provider_threshold']); $vendor_id = intval($row['payment_provider_expense_vendor']); $category_id = intval($row['payment_provider_expense_category']); -$percent_fee = floatval($row['payment_provider_expense_percentage_fee']) * 100; -$flat_fee = floatval($row['payment_provider_expense_flat_fee']); -// Generate the HTML form content using output buffering. ob_start(); + ?> + + Should havea seperate account created off the payment provider's name e.g. Stripe
    @@ -106,6 +106,10 @@ ob_start();
    +
    + Payment Processing Fee Expenses get reconciled nighly via the cron +
    +
    @@ -130,6 +134,7 @@ ob_start(); ?>
    + Payment Privider name e.g. Stripe
    @@ -160,28 +165,7 @@ ob_start();
    -
    - -
    - -
    -
    - -
    - -
    - See here for the latest Stripe Fees. -
    - -
    - -
    -
    - -
    - -
    - See here for the latest Stripe Fees. + Processing Fee, Credit Card Fee etc
    diff --git a/admin/payment_providers.php b/admin/payment_providers.php index 6bc2622a1..882d79ad0 100644 --- a/admin/payment_providers.php +++ b/admin/payment_providers.php @@ -54,9 +54,6 @@ $num_rows = mysqli_num_rows($sql); Expense Category - - Expensed Fee - Saved Payment Methods @@ -72,10 +69,13 @@ $num_rows = mysqli_num_rows($sql); $provider_description = escapeHtml($row['payment_provider_description']); $account_name = escapeHtml($row['account_name']); $threshold = floatval($row['payment_provider_threshold']); + if (!$threshold) { + $threshold = "Not Enforced"; + } else { + $threshold = numfmt_format_currency($currency_format, $threshold, $session_company_currency); + } $vendor_name = escapeHtml($row['vendor_name'] ?? "Expense Disabled"); $category = escapeHtml($row['category_name']); - $percent_fee = floatval($row['payment_provider_expense_percentage_fee']) * 100; - $flat_fee = floatval($row['payment_provider_expense_flat_fee']); $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('saved_payment_id') AS saved_payment_count FROM client_saved_payment_methods WHERE saved_payment_provider_id = $provider_id")); $saved_payment_count = intval($row['saved_payment_count']); @@ -90,10 +90,9 @@ $num_rows = mysqli_num_rows($sql); - + - % + diff --git a/admin/post/payment_provider.php b/admin/post/payment_provider.php index d8a05761d..7a66caf55 100644 --- a/admin/post/payment_provider.php +++ b/admin/post/payment_provider.php @@ -17,8 +17,6 @@ if (isset($_POST['add_payment_provider'])) { $account = intval($_POST['account']); $expense_vendor = intval($_POST['expense_vendor']) ?? 0; $expense_category = intval($_POST['expense_category']) ?? 0; - $percentage_fee = floatval($_POST['percentage_fee']) / 100 ?? 0; - $flat_fee = floatval($_POST['flat_fee']) ?? 0; // Check to ensure provider isn't added twice $sql = mysqli_query($mysqli, "SELECT 1 FROM payment_providers WHERE payment_provider_name = '$provider' LIMIT 1"); @@ -27,7 +25,7 @@ if (isset($_POST['add_payment_provider'])) { redirect(); } - mysqli_query($mysqli,"INSERT INTO payment_providers SET payment_provider_name = '$provider', payment_provider_public_key = '$public_key', payment_provider_private_key = '$private_key', payment_provider_threshold = $threshold, payment_provider_account = $account, payment_provider_expense_vendor = $expense_vendor, payment_provider_expense_category = $expense_category, payment_provider_expense_percentage_fee = $percentage_fee, payment_provider_expense_flat_fee = $flat_fee"); + mysqli_query($mysqli,"INSERT INTO payment_providers SET payment_provider_name = '$provider', payment_provider_public_key = '$public_key', payment_provider_private_key = '$private_key', payment_provider_threshold = $threshold, payment_provider_account = $account, payment_provider_expense_vendor = $expense_vendor, payment_provider_expense_category = $expense_category"); $provider_id = mysqli_insert_id($mysqli); @@ -51,10 +49,8 @@ if (isset($_POST['edit_payment_provider'])) { $account = intval($_POST['account']); $expense_vendor = intval($_POST['expense_vendor']) ?? 0; $expense_category = intval($_POST['expense_category']) ?? 0; - $percentage_fee = floatval($_POST['percentage_fee']) / 100; - $flat_fee = floatval($_POST['flat_fee']); - mysqli_query($mysqli,"UPDATE payment_providers SET payment_provider_public_key = '$public_key', payment_provider_private_key = '$private_key', payment_provider_threshold = $threshold, payment_provider_account = $account, payment_provider_expense_vendor = $expense_vendor, payment_provider_expense_category = $expense_category, payment_provider_expense_percentage_fee = $percentage_fee, payment_provider_expense_flat_fee = $flat_fee WHERE payment_provider_id = $provider_id"); + mysqli_query($mysqli,"UPDATE payment_providers SET payment_provider_public_key = '$public_key', payment_provider_private_key = '$private_key', payment_provider_threshold = $threshold, payment_provider_account = $account, payment_provider_expense_vendor = $expense_vendor, payment_provider_expense_category = $expense_category WHERE payment_provider_id = $provider_id"); logAudit("Payment Provider", "Edit", "$session_name edited Payment Provider $provider"); @@ -71,7 +67,7 @@ if (isset($_GET['delete_payment_provider'])) { $provider_id = intval($_GET['delete_payment_provider']); // When deleted it cascades deletes - // all Recurring paymentes related to payment provider + // all Recurring payments related to payment provider // Delete all Saved Cards related // Delete Client Payment Provider Releation diff --git a/db.sql b/db.sql index b9b8b8e87..4ea84512e 100644 --- a/db.sql +++ b/db.sql @@ -1,9 +1,9 @@ /*M!999999\- enable the sandbox mode */ --- MariaDB dump 10.19 Distrib 10.11.14-MariaDB, for debian-linux-gnu (x86_64) +-- MariaDB dump 10.19 Distrib 10.11.18-MariaDB, for debian-linux-gnu (x86_64) -- -- Host: localhost Database: itflow_dev -- ------------------------------------------------------ --- Server version 10.11.14-MariaDB-0+deb12u2 +-- Server version 10.11.18-MariaDB-0+deb12u1 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -962,6 +962,132 @@ CREATE TABLE `custom_fields` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; +-- +-- Table structure for table `custom_hosting_api_keys` +-- + +DROP TABLE IF EXISTS `custom_hosting_api_keys`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE `custom_hosting_api_keys` ( + `api_key_id` int(11) NOT NULL AUTO_INCREMENT, + `api_key_name` varchar(200) NOT NULL, + `api_key_url` varchar(250) NOT NULL, + `api_key_token_id` varchar(200) NOT NULL, + `api_key_token_secret` varchar(250) NOT NULL, + `api_key_created_at` datetime NOT NULL DEFAULT current_timestamp(), + PRIMARY KEY (`api_key_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `custom_hosting_networks` +-- + +DROP TABLE IF EXISTS `custom_hosting_networks`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE `custom_hosting_networks` ( + `network_id` int(11) NOT NULL AUTO_INCREMENT, + `network_name` varchar(200) NOT NULL, + `network` varchar(100) NOT NULL, + `network_mask` varchar(100) NOT NULL, + `gateway` varchar(100) NOT NULL, + `network_start` varchar(100) NOT NULL, + `network_end` varchar(100) NOT NULL, + PRIMARY KEY (`network_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `custom_hosting_plans` +-- + +DROP TABLE IF EXISTS `custom_hosting_plans`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE `custom_hosting_plans` ( + `plan_id` int(11) NOT NULL AUTO_INCREMENT, + `plan_name` varchar(250) NOT NULL, + `plan_description` text NOT NULL, + `plan_created_at` datetime NOT NULL DEFAULT current_timestamp(), + PRIMARY KEY (`plan_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `custom_hosting_regions` +-- + +DROP TABLE IF EXISTS `custom_hosting_regions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE `custom_hosting_regions` ( + `region_id` int(11) NOT NULL AUTO_INCREMENT, + `region_name` varchar(200) NOT NULL, + `region_created_at` datetime NOT NULL DEFAULT current_timestamp(), + PRIMARY KEY (`region_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `custom_hosting_servers` +-- + +DROP TABLE IF EXISTS `custom_hosting_servers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE `custom_hosting_servers` ( + `server_id` int(11) NOT NULL AUTO_INCREMENT, + `server_node` varchar(200) NOT NULL, + `server_storage` varchar(200) NOT NULL, + `server_created_at` datetime NOT NULL DEFAULT current_timestamp(), + `server_region_id` int(11) NOT NULL, + `server_api_key_id` varchar(200) NOT NULL, + PRIMARY KEY (`server_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `custom_hosting_vm_templates` +-- + +DROP TABLE IF EXISTS `custom_hosting_vm_templates`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE `custom_hosting_vm_templates` ( + `template_id` int(11) NOT NULL AUTO_INCREMENT, + `template_name` varchar(200) NOT NULL, + `vcpus` int(11) NOT NULL, + `memory` int(11) NOT NULL, + `disk` int(11) NOT NULL, + `template_created_at` datetime NOT NULL DEFAULT current_timestamp(), + `template_plan_id` int(11) NOT NULL, + PRIMARY KEY (`template_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `custom_hosting_vms` +-- + +DROP TABLE IF EXISTS `custom_hosting_vms`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE `custom_hosting_vms` ( + `vm_id` int(11) NOT NULL AUTO_INCREMENT, + `vm_hostname` varchar(200) NOT NULL, + `vm_ip` varchar(100) NOT NULL, + `vm_created_at` datetime NOT NULL DEFAULT current_timestamp(), + `vm_network_id` int(11) NOT NULL, + `vm_server_id` int(11) NOT NULL, + `vm_template_id` int(11) NOT NULL, + `vm_recurring_invoice_id` int(11) DEFAULT NULL, + `vm_client_id` int(11) NOT NULL, + PRIMARY KEY (`vm_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + -- -- Table structure for table `custom_links` -- @@ -1508,8 +1634,6 @@ CREATE TABLE `payment_providers` ( `payment_provider_account` int(11) NOT NULL, `payment_provider_expense_vendor` int(11) NOT NULL DEFAULT 0, `payment_provider_expense_category` int(11) NOT NULL DEFAULT 0, - `payment_provider_expense_percentage_fee` decimal(4,4) DEFAULT NULL, - `payment_provider_expense_flat_fee` decimal(15,2) DEFAULT NULL, `payment_provider_created_at` datetime NOT NULL DEFAULT current_timestamp(), `payment_provider_updated_at` datetime DEFAULT NULL ON UPDATE current_timestamp(), PRIMARY KEY (`payment_provider_id`) @@ -2997,4 +3121,4 @@ CREATE TABLE `vendors` ( /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2026-04-04 18:13:53 +-- Dump completed on 2026-07-22 17:26:08 diff --git a/includes/database_version.php b/includes/database_version.php index 53c431bc9..5f182ee74 100644 --- a/includes/database_version.php +++ b/includes/database_version.php @@ -5,4 +5,4 @@ * It is used in conjunction with database_updates.php */ -DEFINE("LATEST_DATABASE_VERSION", "2.4.4"); +DEFINE("LATEST_DATABASE_VERSION", "2.4.5"); From fad62ca045a2e89d32504c8289c9aa146f03792c Mon Sep 17 00:00:00 2001 From: johnnyq Date: Wed, 22 Jul 2026 17:36:55 -0400 Subject: [PATCH 089/241] Remove custom_hosting tables --- db.sql | 128 +-------------------------------------------------------- 1 file changed, 1 insertion(+), 127 deletions(-) diff --git a/db.sql b/db.sql index 4ea84512e..fb43ab2e6 100644 --- a/db.sql +++ b/db.sql @@ -962,132 +962,6 @@ CREATE TABLE `custom_fields` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; --- --- Table structure for table `custom_hosting_api_keys` --- - -DROP TABLE IF EXISTS `custom_hosting_api_keys`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8mb4 */; -CREATE TABLE `custom_hosting_api_keys` ( - `api_key_id` int(11) NOT NULL AUTO_INCREMENT, - `api_key_name` varchar(200) NOT NULL, - `api_key_url` varchar(250) NOT NULL, - `api_key_token_id` varchar(200) NOT NULL, - `api_key_token_secret` varchar(250) NOT NULL, - `api_key_created_at` datetime NOT NULL DEFAULT current_timestamp(), - PRIMARY KEY (`api_key_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `custom_hosting_networks` --- - -DROP TABLE IF EXISTS `custom_hosting_networks`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8mb4 */; -CREATE TABLE `custom_hosting_networks` ( - `network_id` int(11) NOT NULL AUTO_INCREMENT, - `network_name` varchar(200) NOT NULL, - `network` varchar(100) NOT NULL, - `network_mask` varchar(100) NOT NULL, - `gateway` varchar(100) NOT NULL, - `network_start` varchar(100) NOT NULL, - `network_end` varchar(100) NOT NULL, - PRIMARY KEY (`network_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `custom_hosting_plans` --- - -DROP TABLE IF EXISTS `custom_hosting_plans`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8mb4 */; -CREATE TABLE `custom_hosting_plans` ( - `plan_id` int(11) NOT NULL AUTO_INCREMENT, - `plan_name` varchar(250) NOT NULL, - `plan_description` text NOT NULL, - `plan_created_at` datetime NOT NULL DEFAULT current_timestamp(), - PRIMARY KEY (`plan_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `custom_hosting_regions` --- - -DROP TABLE IF EXISTS `custom_hosting_regions`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8mb4 */; -CREATE TABLE `custom_hosting_regions` ( - `region_id` int(11) NOT NULL AUTO_INCREMENT, - `region_name` varchar(200) NOT NULL, - `region_created_at` datetime NOT NULL DEFAULT current_timestamp(), - PRIMARY KEY (`region_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `custom_hosting_servers` --- - -DROP TABLE IF EXISTS `custom_hosting_servers`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8mb4 */; -CREATE TABLE `custom_hosting_servers` ( - `server_id` int(11) NOT NULL AUTO_INCREMENT, - `server_node` varchar(200) NOT NULL, - `server_storage` varchar(200) NOT NULL, - `server_created_at` datetime NOT NULL DEFAULT current_timestamp(), - `server_region_id` int(11) NOT NULL, - `server_api_key_id` varchar(200) NOT NULL, - PRIMARY KEY (`server_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `custom_hosting_vm_templates` --- - -DROP TABLE IF EXISTS `custom_hosting_vm_templates`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8mb4 */; -CREATE TABLE `custom_hosting_vm_templates` ( - `template_id` int(11) NOT NULL AUTO_INCREMENT, - `template_name` varchar(200) NOT NULL, - `vcpus` int(11) NOT NULL, - `memory` int(11) NOT NULL, - `disk` int(11) NOT NULL, - `template_created_at` datetime NOT NULL DEFAULT current_timestamp(), - `template_plan_id` int(11) NOT NULL, - PRIMARY KEY (`template_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `custom_hosting_vms` --- - -DROP TABLE IF EXISTS `custom_hosting_vms`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8mb4 */; -CREATE TABLE `custom_hosting_vms` ( - `vm_id` int(11) NOT NULL AUTO_INCREMENT, - `vm_hostname` varchar(200) NOT NULL, - `vm_ip` varchar(100) NOT NULL, - `vm_created_at` datetime NOT NULL DEFAULT current_timestamp(), - `vm_network_id` int(11) NOT NULL, - `vm_server_id` int(11) NOT NULL, - `vm_template_id` int(11) NOT NULL, - `vm_recurring_invoice_id` int(11) DEFAULT NULL, - `vm_client_id` int(11) NOT NULL, - PRIMARY KEY (`vm_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - -- -- Table structure for table `custom_links` -- @@ -3121,4 +2995,4 @@ CREATE TABLE `vendors` ( /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2026-07-22 17:26:08 +-- Dump completed on 2026-07-22 17:36:39 From 17e4c61067afce934fbd4062df51e801d16ecf54 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Wed, 22 Jul 2026 17:40:30 -0400 Subject: [PATCH 090/241] Spelling Fix --- admin/modals/payment_provider/payment_provider_add.php | 2 +- admin/modals/payment_provider/payment_provider_edit.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/admin/modals/payment_provider/payment_provider_add.php b/admin/modals/payment_provider/payment_provider_add.php index 987deff8d..0ccf2acfd 100644 --- a/admin/modals/payment_provider/payment_provider_add.php +++ b/admin/modals/payment_provider/payment_provider_add.php @@ -85,7 +85,7 @@ ob_start(); ?>
    - Should havea seperate account created off the payment provider's name e.g. Stripe + Should have a seperate account created off the payment provider's name e.g. Stripe
    diff --git a/admin/modals/payment_provider/payment_provider_edit.php b/admin/modals/payment_provider/payment_provider_edit.php index 26030f846..2fe64249e 100644 --- a/admin/modals/payment_provider/payment_provider_edit.php +++ b/admin/modals/payment_provider/payment_provider_edit.php @@ -88,7 +88,7 @@ ob_start(); ?>
    - Should havea seperate account created off the payment provider's name e.g. Stripe + Should have a seperate account created off the payment provider's name e.g. Stripe
    From 2b756f6ea4ca540c7f59b332a0168d76a5c8aaa3 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Wed, 22 Jul 2026 18:43:11 -0400 Subject: [PATCH 091/241] Split DB Updates into seperate files, with the cutoff being 2.0.0 --- CONTRIBUTING.md | 11 +- admin/database_updates.php | 4450 +---------------- admin/database_updates/2.0.0.php | 184 + admin/database_updates/2.0.1.php | 15 + admin/database_updates/2.0.2.php | 153 + admin/database_updates/2.0.3.php | 31 + admin/database_updates/2.0.4.php | 20 + admin/database_updates/2.0.5.php | 364 ++ admin/database_updates/2.0.6.php | 36 + admin/database_updates/2.0.7.php | 11 + admin/database_updates/2.0.8.php | 10 + admin/database_updates/2.0.9.php | 12 + admin/database_updates/2.1.0.php | 19 + admin/database_updates/2.1.1.php | 10 + admin/database_updates/2.1.2.php | 10 + admin/database_updates/2.1.3.php | 36 + admin/database_updates/2.1.4.php | 11 + admin/database_updates/2.1.5.php | 13 + admin/database_updates/2.1.6.php | 27 + admin/database_updates/2.1.7.php | 52 + admin/database_updates/2.1.8.php | 57 + admin/database_updates/2.1.9.php | 76 + admin/database_updates/2.2.0.php | 10 + admin/database_updates/2.2.1.php | 10 + admin/database_updates/2.2.2.php | 34 + admin/database_updates/2.2.3.php | 62 + admin/database_updates/2.2.4.php | 34 + admin/database_updates/2.2.5.php | 10 + admin/database_updates/2.2.6.php | 10 + admin/database_updates/2.2.7.php | 16 + admin/database_updates/2.2.8.php | 11 + admin/database_updates/2.2.9.php | 23 + admin/database_updates/2.3.0.php | 84 + admin/database_updates/2.3.1.php | 17 + admin/database_updates/2.3.2.php | 31 + admin/database_updates/2.3.3.php | 18 + admin/database_updates/2.3.4.php | 12 + admin/database_updates/2.3.5.php | 37 + admin/database_updates/2.3.6.php | 11 + admin/database_updates/2.3.7.php | 84 + admin/database_updates/2.3.8.php | 24 + admin/database_updates/2.3.9.php | 23 + admin/database_updates/2.4.0.php | 43 + admin/database_updates/2.4.1.php | 50 + admin/database_updates/2.4.2.php | 97 + admin/database_updates/2.4.3.php | 21 + admin/database_updates/2.4.4.php | 42 + admin/database_updates/2.4.5.php | 11 + admin/post/update.php | 12 +- includes/database_version.php | 21 +- libs/stripe-php/CHANGELOG.md | 188 + libs/stripe-php/CODEGEN_VERSION | 2 +- libs/stripe-php/OPENAPI_VERSION | 2 +- libs/stripe-php/README.md | 20 +- libs/stripe-php/VERSION | 2 +- libs/stripe-php/composer.json | 16 +- libs/stripe-php/init.php | 18 +- libs/stripe-php/justfile | 6 +- libs/stripe-php/lib/Account.php | 8 +- libs/stripe-php/lib/AccountSession.php | 6 +- libs/stripe-php/lib/ApiRequestor.php | 36 +- libs/stripe-php/lib/ApplePayDomain.php | 2 +- libs/stripe-php/lib/ApplicationFee.php | 2 +- libs/stripe-php/lib/Apps/Secret.php | 2 +- libs/stripe-php/lib/Balance.php | 2 +- libs/stripe-php/lib/BalanceSettings.php | 4 +- libs/stripe-php/lib/BalanceTransaction.php | 14 +- libs/stripe-php/lib/Billing/Alert.php | 2 +- .../stripe-php/lib/Billing/AlertTriggered.php | 2 +- .../lib/Billing/CreditBalanceSummary.php | 2 +- .../lib/Billing/CreditBalanceTransaction.php | 2 +- libs/stripe-php/lib/Billing/CreditGrant.php | 2 +- libs/stripe-php/lib/Billing/Meter.php | 2 +- libs/stripe-php/lib/Billing/MeterEvent.php | 2 +- .../lib/Billing/MeterEventAdjustment.php | 2 +- .../lib/Billing/MeterEventSummary.php | 2 +- .../lib/BillingPortal/Configuration.php | 2 +- libs/stripe-php/lib/BillingPortal/Session.php | 2 +- libs/stripe-php/lib/CashBalance.php | 2 +- libs/stripe-php/lib/Charge.php | 6 +- libs/stripe-php/lib/Checkout/Session.php | 25 +- libs/stripe-php/lib/Climate/Supplier.php | 1 + libs/stripe-php/lib/Collection.php | 4 +- libs/stripe-php/lib/ConfirmationToken.php | 4 +- .../lib/ConnectCollectionTransfer.php | 2 +- libs/stripe-php/lib/Coupon.php | 4 +- libs/stripe-php/lib/CreditNote.php | 10 +- libs/stripe-php/lib/CreditNoteLineItem.php | 3 +- libs/stripe-php/lib/Customer.php | 2 +- .../lib/CustomerBalanceTransaction.php | 2 +- .../lib/CustomerCashBalanceTransaction.php | 2 +- libs/stripe-php/lib/CustomerSession.php | 2 +- libs/stripe-php/lib/Discount.php | 4 +- libs/stripe-php/lib/Dispute.php | 8 +- .../lib/Entitlements/ActiveEntitlement.php | 2 +- .../Entitlements/ActiveEntitlementSummary.php | 2 +- libs/stripe-php/lib/Entitlements/Feature.php | 2 +- libs/stripe-php/lib/EphemeralKey.php | 2 +- libs/stripe-php/lib/ErrorObject.php | 71 +- libs/stripe-php/lib/Event.php | 2 +- ...mmerceProductCatalogImportsFailedEvent.php | 31 + ...tCatalogImportsFailedEventNotification.php | 38 + ...ceProductCatalogImportsProcessingEvent.php | 31 + ...alogImportsProcessingEventNotification.php | 38 + ...rceProductCatalogImportsSucceededEvent.php | 31 + ...talogImportsSucceededEventNotification.php | 38 + ...CatalogImportsSucceededWithErrorsEvent.php | 31 + ...tsSucceededWithErrorsEventNotification.php | 38 + libs/stripe-php/lib/FileLink.php | 2 +- .../lib/FinancialConnections/Account.php | 3 +- .../lib/FinancialConnections/Session.php | 2 +- .../lib/FinancialConnections/Transaction.php | 2 +- libs/stripe-php/lib/Forwarding/Request.php | 2 +- libs/stripe-php/lib/FundingInstructions.php | 2 +- libs/stripe-php/lib/HttpClient/CurlClient.php | 27 +- .../lib/Identity/VerificationReport.php | 2 +- .../lib/Identity/VerificationSession.php | 2 +- libs/stripe-php/lib/Invoice.php | 19 +- libs/stripe-php/lib/InvoiceItem.php | 11 +- libs/stripe-php/lib/InvoiceLineItem.php | 7 +- libs/stripe-php/lib/InvoicePayment.php | 2 +- .../lib/InvoiceRenderingTemplate.php | 2 +- libs/stripe-php/lib/Issuing/Authorization.php | 6 +- libs/stripe-php/lib/Issuing/Card.php | 11 +- libs/stripe-php/lib/Issuing/Cardholder.php | 10 +- libs/stripe-php/lib/Issuing/Dispute.php | 4 +- .../lib/Issuing/PersonalizationDesign.php | 4 +- .../stripe-php/lib/Issuing/PhysicalBundle.php | 2 +- libs/stripe-php/lib/Issuing/Token.php | 4 +- libs/stripe-php/lib/Issuing/Transaction.php | 2 +- libs/stripe-php/lib/Mandate.php | 6 +- libs/stripe-php/lib/PaymentAttemptRecord.php | 4 +- libs/stripe-php/lib/PaymentIntent.php | 13 +- libs/stripe-php/lib/PaymentLink.php | 8 +- libs/stripe-php/lib/PaymentMethod.php | 16 +- .../lib/PaymentMethodConfiguration.php | 12 +- libs/stripe-php/lib/PaymentMethodDomain.php | 2 +- libs/stripe-php/lib/PaymentRecord.php | 4 +- libs/stripe-php/lib/Payout.php | 6 +- libs/stripe-php/lib/Plan.php | 2 +- libs/stripe-php/lib/Price.php | 2 +- libs/stripe-php/lib/Product.php | 2 +- libs/stripe-php/lib/ProductFeature.php | 2 +- libs/stripe-php/lib/PromotionCode.php | 2 +- libs/stripe-php/lib/Quote.php | 2 +- .../lib/Radar/EarlyFraudWarning.php | 2 +- .../lib/Radar/PaymentEvaluation.php | 8 +- libs/stripe-php/lib/Radar/ValueList.php | 6 +- libs/stripe-php/lib/Radar/ValueListItem.php | 2 +- libs/stripe-php/lib/Refund.php | 2 +- libs/stripe-php/lib/Reporting/ReportType.php | 2 +- libs/stripe-php/lib/Reserve/Hold.php | 3 +- libs/stripe-php/lib/Reserve/Plan.php | 2 +- libs/stripe-php/lib/Reserve/Release.php | 2 +- libs/stripe-php/lib/Review.php | 2 +- .../lib/Service/AbstractService.php | 51 +- .../stripe-php/lib/Service/AccountService.php | 4 +- .../lib/Service/AccountSessionService.php | 2 +- .../lib/Service/BalanceSettingsService.php | 2 +- .../lib/Service/BalanceTransactionService.php | 8 +- libs/stripe-php/lib/Service/ChargeService.php | 2 +- .../lib/Service/Checkout/SessionService.php | 2 +- .../lib/Service/CreditNoteService.php | 12 +- .../lib/Service/CustomerService.php | 2 +- .../stripe-php/lib/Service/DisputeService.php | 2 +- .../lib/Service/InvoiceItemService.php | 4 +- .../stripe-php/lib/Service/InvoiceService.php | 28 +- .../lib/Service/Issuing/CardService.php | 4 +- .../lib/Service/Issuing/CardholderService.php | 4 +- .../lib/Service/PaymentIntentService.php | 20 +- .../lib/Service/PaymentLinkService.php | 4 +- .../PaymentMethodConfigurationService.php | 6 +- .../lib/Service/PaymentMethodService.php | 2 +- .../lib/Service/PaymentRecordService.php | 2 +- libs/stripe-php/lib/Service/PayoutService.php | 4 +- .../lib/Service/SetupIntentService.php | 6 +- .../Service/SubscriptionScheduleService.php | 4 +- .../lib/Service/SubscriptionService.php | 35 +- .../Service/Terminal/ConfigurationService.php | 4 +- .../TestHelpers/ConfirmationTokenService.php | 2 +- .../Issuing/AuthorizationService.php | 2 +- .../Service/TestHelpers/TestClockService.php | 2 +- libs/stripe-php/lib/Service/TopupService.php | 2 +- .../V2/Billing/MeterEventSessionService.php | 2 +- .../V2/Commerce/CommerceServiceFactory.php | 25 + .../Commerce/ProductCatalog/ImportService.php | 239 + .../ProductCatalogServiceFactory.php | 25 + .../Service/V2/Core/AccountLinkService.php | 4 +- .../lib/Service/V2/Core/AccountService.php | 208 +- .../Service/V2/Core/AccountTokenService.php | 39 +- .../V2/Core/Accounts/PersonService.php | 98 +- .../V2/Core/Accounts/PersonTokenService.php | 25 +- .../V2/Core/EventDestinationService.php | 2 +- .../lib/Service/V2/Core/EventService.php | 4 +- .../lib/Service/V2/V2ServiceFactory.php | 2 + libs/stripe-php/lib/SetupAttempt.php | 4 +- libs/stripe-php/lib/SetupIntent.php | 11 +- libs/stripe-php/lib/ShippingRate.php | 2 +- .../lib/Sigma/ScheduledQueryRun.php | 2 +- libs/stripe-php/lib/Source.php | 2 +- .../lib/SourceMandateNotification.php | 2 +- libs/stripe-php/lib/SourceTransaction.php | 2 +- libs/stripe-php/lib/Stripe.php | 13 +- libs/stripe-php/lib/StripeObject.php | 13 +- libs/stripe-php/lib/Subscription.php | 17 +- libs/stripe-php/lib/SubscriptionItem.php | 1 + libs/stripe-php/lib/SubscriptionSchedule.php | 8 +- libs/stripe-php/lib/Tax/Calculation.php | 6 +- .../lib/Tax/CalculationLineItem.php | 6 +- libs/stripe-php/lib/Tax/Registration.php | 2 +- libs/stripe-php/lib/Tax/Settings.php | 2 +- libs/stripe-php/lib/Tax/Transaction.php | 4 +- .../lib/Tax/TransactionLineItem.php | 6 +- libs/stripe-php/lib/TaxId.php | 8 +- libs/stripe-php/lib/TaxRate.php | 2 +- libs/stripe-php/lib/TelemetryId.php | 105 + .../stripe-php/lib/Terminal/Configuration.php | 10 +- libs/stripe-php/lib/Terminal/Location.php | 2 +- libs/stripe-php/lib/Terminal/Reader.php | 12 +- libs/stripe-php/lib/TestHelpers/TestClock.php | 4 +- libs/stripe-php/lib/Token.php | 2 +- libs/stripe-php/lib/Topup.php | 6 +- libs/stripe-php/lib/Transfer.php | 2 +- .../lib/Treasury/CreditReversal.php | 2 +- .../stripe-php/lib/Treasury/DebitReversal.php | 2 +- .../lib/Treasury/FinancialAccount.php | 2 +- .../lib/Treasury/InboundTransfer.php | 2 +- .../lib/Treasury/OutboundPayment.php | 2 +- .../lib/Treasury/OutboundTransfer.php | 2 +- .../lib/Treasury/ReceivedCredit.php | 2 +- .../stripe-php/lib/Treasury/ReceivedDebit.php | 2 +- libs/stripe-php/lib/Treasury/Transaction.php | 2 +- .../lib/Treasury/TransactionEntry.php | 2 +- libs/stripe-php/lib/Util/ApiVersion.php | 4 +- .../lib/Util/EventNotificationTypes.php | 4 + libs/stripe-php/lib/Util/EventTypes.php | 4 + libs/stripe-php/lib/Util/Int64.php | 128 + libs/stripe-php/lib/Util/ObjectTypes.php | 1 + libs/stripe-php/lib/Util/Util.php | 28 +- .../lib/V2/Billing/MeterEventAdjustment.php | 4 +- .../lib/V2/Billing/MeterEventSession.php | 6 +- .../lib/V2/Commerce/ProductCatalogImport.php | 83 + libs/stripe-php/lib/V2/Core/Account.php | 35 +- libs/stripe-php/lib/V2/Core/AccountLink.php | 2 +- libs/stripe-php/lib/V2/Core/AccountPerson.php | 12 + libs/stripe-php/lib/V2/Core/AccountToken.php | 2 +- .../lib/V2/Core/EventDestination.php | 4 +- .../lib/V2/Core/EventNotification.php | 8 +- libs/stripe-php/lib/Webhook.php | 8 +- libs/stripe-php/lib/WebhookEndpoint.php | 2 +- libs/stripe-php/lib/version_check.php | 9 + scripts/update_cli.php | 23 +- 252 files changed, 4161 insertions(+), 4875 deletions(-) create mode 100644 admin/database_updates/2.0.0.php create mode 100644 admin/database_updates/2.0.1.php create mode 100644 admin/database_updates/2.0.2.php create mode 100644 admin/database_updates/2.0.3.php create mode 100644 admin/database_updates/2.0.4.php create mode 100644 admin/database_updates/2.0.5.php create mode 100644 admin/database_updates/2.0.6.php create mode 100644 admin/database_updates/2.0.7.php create mode 100644 admin/database_updates/2.0.8.php create mode 100644 admin/database_updates/2.0.9.php create mode 100644 admin/database_updates/2.1.0.php create mode 100644 admin/database_updates/2.1.1.php create mode 100644 admin/database_updates/2.1.2.php create mode 100644 admin/database_updates/2.1.3.php create mode 100644 admin/database_updates/2.1.4.php create mode 100644 admin/database_updates/2.1.5.php create mode 100644 admin/database_updates/2.1.6.php create mode 100644 admin/database_updates/2.1.7.php create mode 100644 admin/database_updates/2.1.8.php create mode 100644 admin/database_updates/2.1.9.php create mode 100644 admin/database_updates/2.2.0.php create mode 100644 admin/database_updates/2.2.1.php create mode 100644 admin/database_updates/2.2.2.php create mode 100644 admin/database_updates/2.2.3.php create mode 100644 admin/database_updates/2.2.4.php create mode 100644 admin/database_updates/2.2.5.php create mode 100644 admin/database_updates/2.2.6.php create mode 100644 admin/database_updates/2.2.7.php create mode 100644 admin/database_updates/2.2.8.php create mode 100644 admin/database_updates/2.2.9.php create mode 100644 admin/database_updates/2.3.0.php create mode 100644 admin/database_updates/2.3.1.php create mode 100644 admin/database_updates/2.3.2.php create mode 100644 admin/database_updates/2.3.3.php create mode 100644 admin/database_updates/2.3.4.php create mode 100644 admin/database_updates/2.3.5.php create mode 100644 admin/database_updates/2.3.6.php create mode 100644 admin/database_updates/2.3.7.php create mode 100644 admin/database_updates/2.3.8.php create mode 100644 admin/database_updates/2.3.9.php create mode 100644 admin/database_updates/2.4.0.php create mode 100644 admin/database_updates/2.4.1.php create mode 100644 admin/database_updates/2.4.2.php create mode 100644 admin/database_updates/2.4.3.php create mode 100644 admin/database_updates/2.4.4.php create mode 100644 admin/database_updates/2.4.5.php create mode 100644 libs/stripe-php/lib/Events/V2CommerceProductCatalogImportsFailedEvent.php create mode 100644 libs/stripe-php/lib/Events/V2CommerceProductCatalogImportsFailedEventNotification.php create mode 100644 libs/stripe-php/lib/Events/V2CommerceProductCatalogImportsProcessingEvent.php create mode 100644 libs/stripe-php/lib/Events/V2CommerceProductCatalogImportsProcessingEventNotification.php create mode 100644 libs/stripe-php/lib/Events/V2CommerceProductCatalogImportsSucceededEvent.php create mode 100644 libs/stripe-php/lib/Events/V2CommerceProductCatalogImportsSucceededEventNotification.php create mode 100644 libs/stripe-php/lib/Events/V2CommerceProductCatalogImportsSucceededWithErrorsEvent.php create mode 100644 libs/stripe-php/lib/Events/V2CommerceProductCatalogImportsSucceededWithErrorsEventNotification.php create mode 100644 libs/stripe-php/lib/Service/V2/Commerce/CommerceServiceFactory.php create mode 100644 libs/stripe-php/lib/Service/V2/Commerce/ProductCatalog/ImportService.php create mode 100644 libs/stripe-php/lib/Service/V2/Commerce/ProductCatalog/ProductCatalogServiceFactory.php create mode 100644 libs/stripe-php/lib/TelemetryId.php create mode 100644 libs/stripe-php/lib/Util/Int64.php create mode 100644 libs/stripe-php/lib/V2/Commerce/ProductCatalogImport.php create mode 100644 libs/stripe-php/lib/version_check.php diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 401f47d79..9d35972a0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -118,11 +118,14 @@ Per [SECURITY.md](SECURITY.md) — never in a public issue. **Database naming.** Every column is prefixed with its table's singular name: `tickets.ticket_id`, `tickets.ticket_subject`, `clients.client_name`. This makes JOIN results unambiguous and is why queries can `SELECT *` across joins safely. New tables must follow it. -**Schema changes require three edits in one PR:** - +**Schema changes require two edits in one PR:** + 1. `db.sql` — so fresh installs get the new schema. -2. `includes/database_version.php` — bump `LATEST_DATABASE_VERSION`. -3. `admin/database_updates.php` — add an `if (CURRENT_DATABASE_VERSION == 'x.y.z')` block that applies the change and steps the version, so existing installs migrate. Migrations are sequential and rolling-release; never edit a historical block. +2. `admin/database_updates/.php` — a new file named for the version it upgrades **to**, containing only the queries that apply the change. Migrations are sequential and rolling-release; never edit a historical file. + +That is the whole job. `LATEST_DATABASE_VERSION` is derived from the highest-numbered filename in `admin/database_updates/`, and the runner (`admin/database_updates.php`) steps `config_current_database_version` after each file succeeds — so there is no constant to bump and no version-bump query to write. Each migration file needs the standard `defined('FROM_DB_UPDATER') || die(...)` guard at the top; copy an existing file's header. + +A single update run applies every pending migration in order, stopping at the first failure with the version left at the last file that completed, so a re-run resumes at the one that broke. **After acting, log and notify.** State changes call `logAudit($type, $action, $description, $client_id, $entity_id)` for the audit trail. User-facing events may also call `appNotify()`. Fire `triggerCustomAction()` where a site might reasonably want a hook. Then call `flashAlert($message, $type)` and `redirect()` (defaults to the referer) rather than setting session keys or `header()` manually. **Function names (post-rename).** Helpers were renamed for clarity in 2026; the old names **no longer exist** — code calling them fatals. If you're rebasing an old PR or following an old tutorial, translate: `sanitizeInput` → `escapeSql`, `nullable_htmlentities` → `escapeHtml`, `logAction` → `logAudit`, `flash_alert` → `flashAlert`, `customAction` → `triggerCustomAction`, `encryptLoginEntry`/`decryptLoginEntry` → `encryptCredentialEntry`/`decryptCredentialEntry`, `strtoAZaz09` → `toAlphanumeric`, `fetchUpdates` → `checkForUpdates`. diff --git a/admin/database_updates.php b/admin/database_updates.php index f9a93e4e6..b31be782b 100644 --- a/admin/database_updates.php +++ b/admin/database_updates.php @@ -1,4411 +1,69 @@ .php - that + * is the whole job. The latest version is derived from the directory listing + * (see includes/database_version.php) and this runner handles the version + * bump, so there is no constant to update and no bump query to remember. */ // Check if our database versions are defined -// If undefined, the file is probably being accessed directly rather than called via post.php?update_db +// If undefined, the file is probably being accessed directly rather than called via post.php?update_db or update_cli.php if (!defined("LATEST_DATABASE_VERSION") || !defined("CURRENT_DATABASE_VERSION") || !isset($mysqli)) { echo "Cannot access this file directly."; exit(); } -// Check if we need an update -if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) { +// Migration files include-guard against this constant +define("FROM_DB_UPDATER", true); - // We need updates! +// Outputs for the caller (post/update.php, update_cli.php) +$database_updates_applied = []; // Versions successfully applied this run +$database_updates_error = null; // "version: error message" if a migration failed - if (CURRENT_DATABASE_VERSION == '0.2.0') { - //Insert queries here required to update to DB version 0.2.1 - - mysqli_query($mysqli, "ALTER TABLE `vendors` - ADD `vendor_hours` VARCHAR(200) NULL DEFAULT NULL AFTER `vendor_website`, - ADD `vendor_sla` VARCHAR(200) NULL DEFAULT NULL AFTER `vendor_hours`, - ADD `vendor_code` VARCHAR(200) NULL DEFAULT NULL AFTER `vendor_sla`, - ADD `vendor_template_id` INT(11) DEFAULT 0 AFTER `vendor_archived_at` - "); - - mysqli_query($mysqli, "ALTER TABLE `vendors` - DROP `vendor_country`, - DROP `vendor_address`, - DROP `vendor_city`, - DROP `vendor_state`, - DROP `vendor_zip`, - DROP `vendor_global` - "); - - //Create New Vendor Templates Table - mysqli_query($mysqli, "CREATE TABLE `vendor_templates` (`vendor_template_id` int(11) AUTO_INCREMENT PRIMARY KEY, - `vendor_template_name` varchar(200) NOT NULL, - `vendor_template_description` varchar(200) NULL DEFAULT NULL, - `vendor_template_phone` varchar(200) NULL DEFAULT NULL, - `vendor_template_email` varchar(200) NULL DEFAULT NULL, - `vendor_template_website` varchar(200) NULL DEFAULT NULL, - `vendor_template_hours` varchar(200) NULL DEFAULT NULL, - `vendor_template_created_at` datetime DEFAULT CURRENT_TIMESTAMP, - `vendor_template_updated_at` datetime NULL ON UPDATE CURRENT_TIMESTAMP, - `vendor_template_archived_at` datetime NULL DEFAULT NULL, - `company_id` int(11) NOT NULL - )"); - - //Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.2.1'"); - } - - if (CURRENT_DATABASE_VERSION == '0.2.1') { - // Insert queries here required to update to DB version 0.2.2 - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_ticket_email_parse` INT(1) NOT NULL DEFAULT '0' AFTER `config_ticket_from_email`"); - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_imap_host` VARCHAR(200) NULL DEFAULT NULL AFTER `config_mail_from_name`, ADD `config_imap_port` INT(5) NULL DEFAULT NULL AFTER `config_imap_host`, ADD `config_imap_encryption` VARCHAR(200) NULL DEFAULT NULL AFTER `config_imap_port`;"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.2.2'"); - } - - if (CURRENT_DATABASE_VERSION == '0.2.2') { - // Insert queries here required to update to DB version 0.2.3 - - // Add contact_important field to those who don't have it (installed before March 2022) - try { - mysqli_query($mysqli, "ALTER TABLE `contacts` ADD `contact_important` tinyint(1) NOT NULL DEFAULT 0 AFTER contact_password_reset_token;"); - } catch (Exception $e) { - // Field already exists - that's fine - } - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.2.3'"); - } - - if (CURRENT_DATABASE_VERSION == '0.2.3') { - //Create New interfaces Table - mysqli_query($mysqli, "CREATE TABLE `interfaces` (`interface_id` int(11) AUTO_INCREMENT PRIMARY KEY, - `interface_number` int(11) NULL DEFAULT NULL, - `interface_description` varchar(200) NULL DEFAULT NULL, - `interface_connected_asset` varchar(200) NULL DEFAULT NULL, - `interface_ip` varchar(200) NULL DEFAULT NULL, - `interface_created_at` datetime DEFAULT CURRENT_TIMESTAMP, - `interface_updated_at` datetime NULL ON UPDATE CURRENT_TIMESTAMP, - `interface_archived_at` datetime NULL DEFAULT NULL, - `interface_connected_asset_id` int(11) NOT NULL DEFAULT 0, - `interface_network_id` int(11) NOT NULL DEFAULT 0, - `interface_asset_id` int(11) NOT NULL, - `company_id` int(11) NOT NULL - )"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.2.4'"); - - } - - if (CURRENT_DATABASE_VERSION == '0.2.4') { - mysqli_query($mysqli, "CREATE TABLE `contact_assets` (`contact_id` int(11) NOT NULL,`asset_id` int(11) NOT NULL, PRIMARY KEY (`contact_id`,`asset_id`))"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.2.5'"); - } - - if (CURRENT_DATABASE_VERSION == '0.2.5') { - mysqli_query($mysqli, "ALTER TABLE `users` ADD `user_status` TINYINT(1) DEFAULT 1 AFTER `user_password`"); - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.2.6'"); - } - - if (CURRENT_DATABASE_VERSION == '0.2.6') { - // Insert queries here required to update to DB version 0.2.7 - mysqli_query($mysqli, "ALTER TABLE `contacts` ADD `contact_token_expire` DATETIME NULL DEFAULT NULL AFTER `contact_password_reset_token`"); - - // Update config.php var with new version var for use with docker - file_put_contents("config.php", "\$repo_branch = 'master';" . PHP_EOL, FILE_APPEND); - - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.2.7'"); - } - - if (CURRENT_DATABASE_VERSION == '0.2.7') { - - mysqli_query($mysqli, "ALTER TABLE `vendors` ADD `vendor_template` TINYINT(1) DEFAULT 0 AFTER `vendor_notes`"); - mysqli_query($mysqli, "ALTER TABLE `software` ADD `software_template` TINYINT(1) DEFAULT 0 AFTER `software_notes`"); - mysqli_query($mysqli, "ALTER TABLE `vendors` DROP `vendor_template_id`"); - mysqli_query($mysqli, "DROP TABLE vendor_templates"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.2.8'"); - } - - if (CURRENT_DATABASE_VERSION == '0.2.8') { - - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_theme` VARCHAR(200) DEFAULT 'blue' AFTER `config_module_enable_ticketing`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.2.9'"); - } - - if (CURRENT_DATABASE_VERSION == '0.2.9') { - - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_ticket_client_general_notifications` INT(1) NOT NULL DEFAULT '1' AFTER `config_ticket_email_parse`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.3.0'"); - } - - if (CURRENT_DATABASE_VERSION == '0.3.0') { - mysqli_query($mysqli, "ALTER TABLE `notifications` ADD `notification_user_id` TINYINT(1) DEFAULT 0 AFTER `notification_client_id`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.3.1'"); - } - - if (CURRENT_DATABASE_VERSION == '0.3.1') { - - // Assets - - mysqli_query($mysqli, "UPDATE `assets` SET `asset_login_id` = 0 WHERE `asset_login_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `assets` CHANGE `asset_login_id` `asset_login_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `assets` SET `asset_vendor_id` = 0 WHERE `asset_vendor_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `assets` CHANGE `asset_vendor_id` `asset_vendor_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `assets` SET `asset_location_id` = 0 WHERE `asset_location_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `assets` CHANGE `asset_location_id` `asset_location_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `assets` SET `asset_network_id` = 0 WHERE `asset_network_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `assets` CHANGE `asset_network_id` `asset_network_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `assets` SET `asset_client_id` = 0 WHERE `asset_client_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `assets` CHANGE `asset_client_id` `asset_client_id` INT(11) NOT NULL DEFAULT 0"); - - // Certificates - - mysqli_query($mysqli, "UPDATE `certificates` SET `certificate_domain_id` = 0 WHERE `certificate_domain_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `certificates` CHANGE `certificate_domain_id` `certificate_domain_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "ALTER TABLE `certificates` CHANGE `certificate_client_id` `certificate_client_id` INT(11) NOT NULL DEFAULT 0"); - - // Clients - - mysqli_query($mysqli, "UPDATE `clients` SET `primary_location` = 0 WHERE `primary_location` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `clients` CHANGE `primary_location` `primary_location` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `clients` SET `primary_contact` = 0 WHERE `primary_contact` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `clients` CHANGE `primary_contact` `primary_contact` INT(11) NOT NULL DEFAULT 0"); - - // Contacts - - mysqli_query($mysqli, "UPDATE `contacts` SET `contact_location_id` = 0 WHERE `contact_location_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `contacts` CHANGE `contact_location_id` `contact_location_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "ALTER TABLE `contacts` CHANGE `contact_client_id` `contact_client_id` INT(11) NOT NULL DEFAULT 0"); - - // Documents - - mysqli_query($mysqli, "ALTER TABLE `documents` CHANGE `document_template` `document_template` TINYINT(1) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `documents` SET `document_folder_id` = 0 WHERE `document_folder_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `documents` CHANGE `document_folder_id` `document_folder_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "ALTER TABLE `documents` CHANGE `document_client_id` `document_client_id` INT(11) NOT NULL DEFAULT 0"); - - // Domains - - mysqli_query($mysqli, "UPDATE `domains` SET `domain_registrar` = 0 WHERE `domain_registrar` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `domains` CHANGE `domain_registrar` `domain_registrar` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `domains` SET `domain_webhost` = 0 WHERE `domain_webhost` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `domains` CHANGE `domain_webhost` `domain_webhost` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "ALTER TABLE `domains` CHANGE `domain_client_id` `domain_client_id` INT(11) NOT NULL DEFAULT 0"); - - // Events - - mysqli_query($mysqli, "UPDATE `events` SET `event_client_id` = 0 WHERE `event_client_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `events` CHANGE `event_client_id` `event_client_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `events` SET `event_location_id` = 0 WHERE `event_location_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `events` CHANGE `event_location_id` `event_location_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "ALTER TABLE `events` CHANGE `event_calendar_id` `event_calendar_id` INT(11) NOT NULL DEFAULT 0"); - - // Expenses - - mysqli_query($mysqli, "UPDATE `expenses` SET `expense_vendor_id` = 0 WHERE `expense_vendor_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `expenses` CHANGE `expense_vendor_id` `expense_vendor_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `expenses` SET `expense_client_id` = 0 WHERE `expense_client_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `expenses` CHANGE `expense_client_id` `expense_client_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `expenses` SET `expense_category_id` = 0 WHERE `expense_category_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `expenses` CHANGE `expense_category_id` `expense_category_id` INT(11) NOT NULL DEFAULT 0"); - - // Files - - mysqli_query($mysqli, "ALTER TABLE `files` CHANGE `file_client_id` `file_client_id` INT(11) NOT NULL DEFAULT 0"); - - // Folders - - mysqli_query($mysqli, "UPDATE `folders` SET `parent_folder` = 0 WHERE `parent_folder` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `folders` CHANGE `parent_folder` `parent_folder` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "ALTER TABLE `folders` CHANGE `folder_client_id` `folder_client_id` INT(11) NOT NULL DEFAULT 0"); - - // History - - mysqli_query($mysqli, "UPDATE `history` SET `history_invoice_id` = 0 WHERE `history_invoice_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `history` CHANGE `history_invoice_id` `history_invoice_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `history` SET `history_recurring_id` = 0 WHERE `history_recurring_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `history` CHANGE `history_recurring_id` `history_recurring_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `history` SET `history_quote_id` = 0 WHERE `history_quote_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `history` CHANGE `history_quote_id` `history_quote_id` INT(11) NOT NULL DEFAULT 0"); - - // Invoices - - mysqli_query($mysqli, "UPDATE `invoices` SET `invoice_amount` = 0.00 WHERE `invoice_amount` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `invoices` CHANGE `invoice_amount` `invoice_amount` DECIMAL(15,2) NOT NULL DEFAULT 0.00"); - - // Invoice Items - - mysqli_query($mysqli, "ALTER TABLE `invoice_items` CHANGE `item_quantity` `item_quantity` DECIMAL(15,2) NOT NULL DEFAULT 0.00"); - - mysqli_query($mysqli, "ALTER TABLE `invoice_items` CHANGE `item_price` `item_price` DECIMAL(15,2) NOT NULL DEFAULT 0.00"); - - mysqli_query($mysqli, "ALTER TABLE `invoice_items` CHANGE `item_subtotal` `item_subtotal` DECIMAL(15,2) NOT NULL DEFAULT 0.00"); - - mysqli_query($mysqli, "UPDATE `invoice_items` SET `item_tax` = 0.00 WHERE `item_tax` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `invoice_items` CHANGE `item_tax` `item_tax` DECIMAL(15,2) NOT NULL DEFAULT 0.00"); - - mysqli_query($mysqli, "ALTER TABLE `invoice_items` CHANGE `item_total` `item_total` DECIMAL(15,2) NOT NULL DEFAULT 0.00"); - - mysqli_query($mysqli, "UPDATE `invoice_items` SET `item_tax_id` = 0 WHERE `item_tax_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `invoice_items` CHANGE `item_tax_id` `item_tax_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `invoice_items` SET `item_quote_id` = 0 WHERE `item_quote_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `invoice_items` CHANGE `item_quote_id` `item_quote_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `invoice_items` SET `item_recurring_id` = 0 WHERE `item_recurring_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `invoice_items` CHANGE `item_recurring_id` `item_recurring_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `invoice_items` SET `item_invoice_id` = 0 WHERE `item_invoice_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `invoice_items` CHANGE `item_invoice_id` `item_invoice_id` INT(11) NOT NULL DEFAULT 0"); - - // Locations - - mysqli_query($mysqli, "UPDATE `locations` SET `location_contact_id` = 0 WHERE `location_contact_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `locations` CHANGE `location_contact_id` `location_contact_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `locations` SET `location_client_id` = 0 WHERE `location_client_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `locations` CHANGE `location_client_id` `location_client_id` INT(11) NOT NULL DEFAULT 0"); - - // Logins - - mysqli_query($mysqli, "UPDATE `logins` SET `login_vendor_id` = 0 WHERE `login_vendor_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `logins` CHANGE `login_vendor_id` `login_vendor_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `logins` SET `login_asset_id` = 0 WHERE `login_asset_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `logins` CHANGE `login_asset_id` `login_asset_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `logins` SET `login_software_id` = 0 WHERE `login_software_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `logins` CHANGE `login_software_id` `login_software_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `logins` SET `login_client_id` = 0 WHERE `login_client_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `logins` CHANGE `login_client_id` `login_client_id` INT(11) NOT NULL DEFAULT 0"); - - // Logs - - mysqli_query($mysqli, "UPDATE `logs` SET `log_client_id` = 0 WHERE `log_client_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `logs` CHANGE `log_client_id` `log_client_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "ALTER TABLE `logs` DROP `log_invoice_id`"); - mysqli_query($mysqli, "ALTER TABLE `logs` DROP `log_quote_id`"); - mysqli_query($mysqli, "ALTER TABLE `logs` DROP `log_recurring_id`"); - mysqli_query($mysqli, "ALTER TABLE `logs` DROP `log_entity_id`"); - - mysqli_query($mysqli, "UPDATE `logs` SET `log_user_id` = 0 WHERE `log_user_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `logs` CHANGE `log_user_id` `log_user_id` INT(11) NOT NULL DEFAULT 0"); - - // Networks - - mysqli_query($mysqli, "UPDATE `networks` SET `network_location_id` = 0 WHERE `network_location_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `networks` CHANGE `network_location_id` `network_location_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "ALTER TABLE `networks` CHANGE `network_client_id` `network_client_id` INT(11) NOT NULL DEFAULT 0"); - - // Notifications - - mysqli_query($mysqli, "UPDATE `notifications` SET `notification_client_id` = 0 WHERE `notification_client_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `notifications` CHANGE `notification_client_id` `notification_client_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "ALTER TABLE `notifications` CHANGE `notification_user_id` `notification_user_id` INT(11) NOT NULL DEFAULT 0"); - - // Payments - - mysqli_query($mysqli, "UPDATE `payments` SET `payment_invoice_id` = 0 WHERE `payment_invoice_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `payments` CHANGE `payment_invoice_id` `payment_invoice_id` INT(11) NOT NULL DEFAULT 0"); - - // Products - - mysqli_query($mysqli, "UPDATE `products` SET `product_tax_id` = 0 WHERE `product_tax_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `products` CHANGE `product_tax_id` `product_tax_id` INT(11) NOT NULL DEFAULT 0"); - - // Quotes - - mysqli_query($mysqli, "UPDATE `quotes` SET `quote_amount` = 0.00 WHERE `quote_amount` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `quotes` CHANGE `quote_amount` `quote_amount` DECIMAL(15,2) NOT NULL DEFAULT 0.00"); - - // Recurring - - mysqli_query($mysqli, "UPDATE `recurring` SET `recurring_amount` = 0.00 WHERE `recurring_amount` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `recurring` CHANGE `recurring_amount` `recurring_amount` DECIMAL(15,2) NOT NULL DEFAULT 0.00"); - - // Revenues - - mysqli_query($mysqli, "UPDATE `revenues` SET `revenue_amount` = 0.00 WHERE `revenue_amount` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `revenues` CHANGE `revenue_amount` `revenue_amount` DECIMAL(15,2) NOT NULL DEFAULT 0.00"); - - mysqli_query($mysqli, "UPDATE `revenues` SET `revenue_category_id` = 0 WHERE `revenue_category_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `revenues` CHANGE `revenue_category_id` `revenue_category_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `revenues` SET `revenue_client_id` = 0 WHERE `revenue_client_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `revenues` CHANGE `revenue_client_id` `revenue_client_id` INT(11) NOT NULL DEFAULT 0"); - - // Scheduled Tickets - - mysqli_query($mysqli, "ALTER TABLE `scheduled_tickets` CHANGE `scheduled_ticket_created_by` `scheduled_ticket_created_by` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `scheduled_tickets` SET `scheduled_ticket_client_id` = 0 WHERE `scheduled_ticket_client_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `scheduled_tickets` CHANGE `scheduled_ticket_client_id` `scheduled_ticket_client_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `scheduled_tickets` SET `scheduled_ticket_contact_id` = 0 WHERE `scheduled_ticket_contact_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `scheduled_tickets` CHANGE `scheduled_ticket_contact_id` `scheduled_ticket_contact_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `scheduled_tickets` SET `scheduled_ticket_asset_id` = 0 WHERE `scheduled_ticket_asset_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `scheduled_tickets` CHANGE `scheduled_ticket_asset_id` `scheduled_ticket_asset_id` INT(11) NOT NULL DEFAULT 0"); - - // Settings - - mysqli_query($mysqli, "ALTER TABLE `settings` CHANGE `config_ticket_email_parse` `config_ticket_email_parse` TINYINT(1) NOT NULL DEFAULT 0"); - mysqli_query($mysqli, "ALTER TABLE `settings` CHANGE `config_ticket_client_general_notifications` `config_ticket_client_general_notifications` TINYINT(1) NOT NULL DEFAULT 1"); - mysqli_query($mysqli, "ALTER TABLE `settings` CHANGE `config_enable_cron` `config_enable_cron` TINYINT(1) NOT NULL DEFAULT 0"); - mysqli_query($mysqli, "ALTER TABLE `settings` CHANGE `config_recurring_auto_send_invoice` `config_recurring_auto_send_invoice` TINYINT(1) NOT NULL DEFAULT 1"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_enable_alert_domain_expire` = 1 WHERE `config_enable_alert_domain_expire` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `settings` CHANGE `config_enable_alert_domain_expire` `config_enable_alert_domain_expire` TINYINT(1) NOT NULL DEFAULT 1"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_send_invoice_reminders` = 1 WHERE `config_send_invoice_reminders` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `settings` CHANGE `config_send_invoice_reminders` `config_send_invoice_reminders` TINYINT(1) NOT NULL DEFAULT 1"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_stripe_enable` = 0 WHERE `config_stripe_enable` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `settings` CHANGE `config_stripe_enable` `config_stripe_enable` TINYINT(1) NOT NULL DEFAULT 0"); - - // Software - - mysqli_query($mysqli, "UPDATE `software` SET `software_template` = 0 WHERE `software_template` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `software` CHANGE `software_template` `software_template` TINYINT(1) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `software` SET `software_login_id` = 0 WHERE `software_login_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `software` CHANGE `software_login_id` `software_login_id` INT(11) NOT NULL DEFAULT 0"); - - // Tags - - mysqli_query($mysqli, "ALTER TABLE `tags` ADD `tag_archived_at` DATETIME NULL DEFAULT NULL AFTER `tag_updated_at`"); - - // Tickets - - mysqli_query($mysqli, "UPDATE `tickets` SET `ticket_closed_by` = 0 WHERE `ticket_closed_by` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `tickets` CHANGE `ticket_closed_by` `ticket_closed_by` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `tickets` SET `ticket_vendor_id` = 0 WHERE `ticket_vendor_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `tickets` CHANGE `ticket_vendor_id` `ticket_vendor_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `tickets` SET `ticket_client_id` = 0 WHERE `ticket_client_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `tickets` CHANGE `ticket_client_id` `ticket_client_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `tickets` SET `ticket_contact_id` = 0 WHERE `ticket_contact_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `tickets` CHANGE `ticket_contact_id` `ticket_contact_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `tickets` SET `ticket_location_id` = 0 WHERE `ticket_location_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `tickets` CHANGE `ticket_location_id` `ticket_location_id` INT(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `tickets` SET `ticket_asset_id` = 0 WHERE `ticket_asset_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `tickets` CHANGE `ticket_asset_id` `ticket_asset_id` INT(11) NOT NULL DEFAULT 0"); - - //Trips - - mysqli_query($mysqli, "UPDATE `trips` SET `trip_client_id` = 0 WHERE `trip_client_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `trips` CHANGE `trip_client_id` `trip_client_id` INT(11) NOT NULL DEFAULT 0"); - - // Users - - mysqli_query($mysqli, "ALTER TABLE `users` CHANGE `user_status` `user_status` TINYINT(1) NOT NULL DEFAULT 1"); - - // Vendors - - mysqli_query($mysqli, "ALTER TABLE `vendors` CHANGE `vendor_template` `vendor_template` TINYINT(1) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "UPDATE `vendors` SET `vendor_client_id` = 0 WHERE `vendor_client_id` IS NULL"); - mysqli_query($mysqli, "ALTER TABLE `vendors` CHANGE `vendor_client_id` `vendor_client_id` INT(11) NOT NULL DEFAULT 0"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.3.2'"); - } - - if (CURRENT_DATABASE_VERSION == '0.3.2') { - mysqli_query($mysqli, "ALTER TABLE `contacts` ADD `contact_billing` TINYINT(1) DEFAULT 0 AFTER `contact_important`"); - mysqli_query($mysqli, "ALTER TABLE `contacts` ADD `contact_technical` TINYINT(1) DEFAULT 0 AFTER `contact_billing`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.3.3'"); - } - - if (CURRENT_DATABASE_VERSION == '0.3.3') { - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_telemetry` TINYINT(1) DEFAULT 0 AFTER `config_theme`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.3.4'"); - } - - if (CURRENT_DATABASE_VERSION == '0.3.4') { - // Insert queries here required to update to DB version 0.3.5 - - //Get & upgrade user login encryption - $sql_logins = mysqli_query($mysqli, "SELECT login_id, login_username FROM logins WHERE login_username IS NOT NULL"); - foreach ($sql_logins as $row) { - $login_id = $row['login_id']; - $login_username = $row['login_username']; - $login_encrypted_username = encryptLoginEntry($row['login_username']); - mysqli_query($mysqli, "UPDATE logins SET login_username = '$login_encrypted_username' WHERE login_id = '$login_id'"); - } - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.3.5'"); - } - - if (CURRENT_DATABASE_VERSION == '0.3.5') { - $installation_id = randomString(32); - - // Update config.php var with new version var for use with docker - file_put_contents("config.php", "\n\$installation_id = '$installation_id';" . PHP_EOL, FILE_APPEND); - - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.3.6'"); - } - - if (CURRENT_DATABASE_VERSION == '0.3.6') { - // Insert queries here required to update to DB version 0.3.7 - mysqli_query($mysqli, "ALTER TABLE `shared_items` ADD `item_encrypted_username` VARCHAR(255) NULL DEFAULT NULL AFTER `item_related_id`"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.3.7'"); - } - - if (CURRENT_DATABASE_VERSION == '0.3.7') { - - mysqli_query($mysqli, "ALTER TABLE `logins` ADD `login_important` TINYINT(1) NOT NULL DEFAULT 0 AFTER `login_note`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.3.8'"); - } - - if (CURRENT_DATABASE_VERSION == '0.3.8') { - mysqli_query($mysqli, "ALTER TABLE `contacts` ADD `contact_accessed_at` DATETIME NULL DEFAULT NULL AFTER `contact_archived_at`"); - mysqli_query($mysqli, "ALTER TABLE `locations` ADD `location_accessed_at` DATETIME NULL DEFAULT NULL AFTER `location_archived_at`"); - mysqli_query($mysqli, "ALTER TABLE `assets` ADD `asset_accessed_at` DATETIME NULL DEFAULT NULL AFTER `asset_archived_at`"); - mysqli_query($mysqli, "ALTER TABLE `software` ADD `software_accessed_at` DATETIME NULL DEFAULT NULL AFTER `software_archived_at`"); - mysqli_query($mysqli, "ALTER TABLE `logins` ADD `login_accessed_at` DATETIME NULL DEFAULT NULL AFTER `login_archived_at`"); - mysqli_query($mysqli, "ALTER TABLE `networks` ADD `network_accessed_at` DATETIME NULL DEFAULT NULL AFTER `network_archived_at`"); - mysqli_query($mysqli, "ALTER TABLE `certificates` ADD `certificate_accessed_at` DATETIME NULL DEFAULT NULL AFTER `certificate_archived_at`"); - mysqli_query($mysqli, "ALTER TABLE `domains` ADD `domain_accessed_at` DATETIME NULL DEFAULT NULL AFTER `domain_archived_at`"); - mysqli_query($mysqli, "ALTER TABLE `services` ADD `service_accessed_at` DATETIME NULL DEFAULT NULL AFTER `service_updated_at`"); - mysqli_query($mysqli, "ALTER TABLE `vendors` ADD `vendor_accessed_at` DATETIME NULL DEFAULT NULL AFTER `vendor_archived_at`"); - mysqli_query($mysqli, "ALTER TABLE `files` ADD `file_accessed_at` DATETIME NULL DEFAULT NULL AFTER `file_archived_at`"); - mysqli_query($mysqli, "ALTER TABLE `documents` ADD `document_accessed_at` DATETIME NULL DEFAULT NULL AFTER `document_archived_at`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.3.9'"); - } - - if (CURRENT_DATABASE_VERSION == '0.3.9') { - - mysqli_query($mysqli, "ALTER TABLE `vendors` ADD `vendor_template_id` INT(11) NOT NULL DEFAULT 0 AFTER `vendor_client_id`"); - mysqli_query($mysqli, "ALTER TABLE `software` ADD `software_template_id` INT(11) NOT NULL DEFAULT 0 AFTER `software_client_id`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.4.0'"); - } - - if (CURRENT_DATABASE_VERSION == '0.4.0') { - mysqli_query($mysqli, "ALTER TABLE `logs` ADD `log_entity_id` INT NOT NULL DEFAULT '0' AFTER `log_user_id`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.4.1'"); - } - - if (CURRENT_DATABASE_VERSION == '0.4.1') { - mysqli_query($mysqli, "ALTER TABLE settings ADD `config_stripe_account` TINYINT(1) NOT NULL DEFAULT '0' AFTER config_stripe_secret"); - //Insert queries here required to update to DB version 0.4.2 - - //Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.4.2'"); - } - - if (CURRENT_DATABASE_VERSION == '0.4.2') { - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_timezone` VARCHAR(200) NOT NULL DEFAULT 'America/New_York' AFTER `config_telemetry`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.4.3'"); - } - - if (CURRENT_DATABASE_VERSION == '0.4.3') { - // Insert queries here required to update to DB version 0.4.4 - mysqli_query($mysqli, "ALTER TABLE `client_tags` CHANGE `client_id` `client_tags_client_id` INT NOT NULL"); - mysqli_query($mysqli, "ALTER TABLE `client_tags` CHANGE `tag_id` `client_tags_tag_id` INT NOT NULL"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.4.4'"); - } - - if (CURRENT_DATABASE_VERSION == '0.4.4') { - // Insert queries here required to update to DB version 0.4.5 - mysqli_query($mysqli, "ALTER TABLE `client_tags` CHANGE `client_tags_client_id` `client_tag_client_id` INT NOT NULL"); - mysqli_query($mysqli, "ALTER TABLE `client_tags` CHANGE `client_tags_tag_id` `client_tag_tag_id` INT NOT NULL"); - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.4.5'"); - } - - if (CURRENT_DATABASE_VERSION == '0.4.5') { - // Insert queries here required to update to DB version 0.4.6 - mysqli_query($mysqli, "ALTER TABLE `contacts` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `locations` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `assets` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `software` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `logins` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `networks` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `certificates` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `domains` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `tickets` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `ticket_replies` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `scheduled_tickets` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `services` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `vendors` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `calendars` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `events` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `files` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `documents` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `folders` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `invoices` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `recurring` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `quotes` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `history` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `invoice_items` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `payments` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `trips` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `clients` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `expenses` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `transfers` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `revenues` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `api_keys` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `taxes` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `categories` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `tags` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `accounts` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `interfaces` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `records` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `logs` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `notifications` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `products` DROP `company_id`"); - mysqli_query($mysqli, "ALTER TABLE `companies` DROP `company_archived_at`"); - mysqli_query($mysqli, "ALTER TABLE `user_settings` DROP `user_default_company`"); - mysqli_query($mysqli, "DROP TABLE `user_companies`"); - mysqli_query($mysqli, "DROP TABLE `user_keys`"); //Unused Table - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.4.6'"); - } - - if (CURRENT_DATABASE_VERSION == '0.4.6') { - - mysqli_query($mysqli, "ALTER TABLE `notifications` ADD `notification_entity_id` INT(11) DEFAULT 0 AFTER `notification_user_id`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.4.7'"); - } - - if (CURRENT_DATABASE_VERSION == '0.4.7') { - - mysqli_query($mysqli, "ALTER TABLE `clients` ADD `client_rate` DECIMAL(15,2) NULL DEFAULT NULL AFTER `client_referral`"); - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.4.8'"); - } - - if (CURRENT_DATABASE_VERSION == '0.4.8') { - mysqli_query($mysqli, "ALTER TABLE `tickets` ADD `ticket_source` VARCHAR(255) NULL DEFAULT NULL AFTER `ticket_number`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.4.9'"); - } - - if (CURRENT_DATABASE_VERSION == '0.4.9') { - // Insert queries here required to update to DB version 0.5.0 - mysqli_query($mysqli, "ALTER TABLE `clients` ADD `client_tax_id_number` VARCHAR(255) NULL DEFAULT NULL AFTER `client_net_terms`"); - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.5.0'"); - } - - if (CURRENT_DATABASE_VERSION == '0.5.0') { - // Insert queries here required to update to DB version 0.5.1 - mysqli_query($mysqli, "CREATE TABLE `ticket_attachments` ( - `ticket_attachment_id` int(11) NOT NULL AUTO_INCREMENT, - `ticket_attachment_name` varchar(255) NOT NULL, - `ticket_attachment_reference_name` varchar(255) NOT NULL, - `ticket_attachment_created_at` datetime NOT NULL DEFAULT current_timestamp(), - `ticket_attachment_ticket_id` int(11) NOT NULL, - `ticket_attachment_reply_id` int(11) DEFAULT NULL, - PRIMARY KEY (`ticket_attachment_id`) - )"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.5.1'"); - } - - if (CURRENT_DATABASE_VERSION == '0.5.1') { - //Insert queries here required to update to DB version 0.5.2 - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_ticket_autoclose` TINYINT(1) NOT NULL DEFAULT 0 AFTER `config_ticket_client_general_notifications`"); - - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_cron_key` VARCHAR(255) NULL DEFAULT NULL AFTER `config_enable_cron`"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.5.2'"); - } - - if (CURRENT_DATABASE_VERSION == '0.5.2') { - //Insert queries here required to update to DB version 0.5.3 - //Custom Fields and Values - - mysqli_query($mysqli, "CREATE TABLE `custom_fields` ( - `custom_field_id` int(11) NOT NULL AUTO_INCREMENT, - `custom_field_table` varchar(255) NOT NULL, - `custom_field_label` varchar(255) NOT NULL, - `custom_field_type` varchar(255) NOT NULL DEFAULT 'text', - `custom_field_location` int(11) NOT NULL DEFAULT 0, - `custom_field_order` int(11) NOT NULL DEFAULT 999, - PRIMARY KEY (`custom_field_id`) - )"); - - mysqli_query($mysqli, "CREATE TABLE `custom_values` ( - `custom_value_id` int(11) NOT NULL AUTO_INCREMENT, - `custom_value_value` text NOT NULL, - `custom_value_field` int(11) NOT NULL, - PRIMARY KEY (`custom_value_id`) - )"); - - mysqli_query($mysqli, "CREATE TABLE `asset_custom` ( - `asset_custom_id` int(11) NOT NULL AUTO_INCREMENT, - `asset_custom_field_value` int(11) NOT NULL, - `asset_custom_field_id` int(11) NOT NULL, - `asset_custom_asset_id` int(11) NOT NULL, - PRIMARY KEY (`asset_custom_id`) - )"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.5.3'"); - } - - if (CURRENT_DATABASE_VERSION == '0.5.3') { - //Insert queries here required to update to DB version 0.5.4 - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_ticket_autoclose_hours` INT(5) NOT NULL DEFAULT 72 AFTER `config_ticket_autoclose`"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.5.4'"); - } - - if (CURRENT_DATABASE_VERSION == '0.5.4') { - //Insert queries here required to update to DB version 0.5.5 - mysqli_query($mysqli, "CREATE TABLE `projects` ( - `project_id` int(11) NOT NULL AUTO_INCREMENT, - `project_template` tinyint(1) NOT NULL DEFAULT 0, - `project_name` varchar(255) NOT NULL, - `project_description` text NULL DEFAULT NULL, - `project_created_at` datetime NOT NULL DEFAULT current_timestamp(), - `project_updated_at` datetime NULL DEFAULT NULL on update CURRENT_TIMESTAMP, - `project_archived_at` datetime NULL DEFAULT NULL, - `project_client_id` int(11) NOT NULL DEFAULT 0, - PRIMARY KEY (`project_id`) - )"); - - mysqli_query($mysqli, "CREATE TABLE `tasks` ( - `task_id` int(11) NOT NULL AUTO_INCREMENT, - `task_template` tinyint(1) NOT NULL DEFAULT 0, - `task_name` varchar(255) NOT NULL, - `task_description` text NULL DEFAULT NULL, - `task_finish_date` date NULL DEFAULT NULL, - `task_status` varchar(255) NULL DEFAULT NULL, - `task_completed_at` datetime NULL DEFAULT NULL, - `task_completed_by` int(11) NULL DEFAULT NULL, - `task_created_at` datetime NOT NULL DEFAULT current_timestamp(), - `task_updated_at` datetime NULL DEFAULT NULL on update CURRENT_TIMESTAMP, - `task_ticket_id` int(11) NULL DEFAULT NULL, - `task_project_id` int(11) NULL DEFAULT NULL, - PRIMARY KEY (`task_id`) - )"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.5.5'"); - } - - if (CURRENT_DATABASE_VERSION == '0.5.5') { - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_login_key_required` TINYINT(1) NOT NULL DEFAULT '0' AFTER `config_module_enable_accounting`, ADD `config_login_key_secret` VARCHAR(255) NULL DEFAULT NULL AFTER `config_login_key_required`; "); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.5.6'"); - } - - if (CURRENT_DATABASE_VERSION == '0.5.6') { - - mysqli_query($mysqli, "CREATE TABLE `email_queue` ( - `email_id` int(11) NOT NULL AUTO_INCREMENT, - `email_recipient` varchar(255) NOT NULL, - `email_from` varchar(255) NOT NULL, - `email_from_name` varchar(255) NOT NULL, - `email_subject` varchar(255) NOT NULL, - `email_content` longtext NOT NULL, - `email_queued_at` datetime NOT NULL DEFAULT current_timestamp(), - `email_sent_at` datetime NULL DEFAULT NULL, - PRIMARY KEY (`email_id`) - )"); - - mysqli_query($mysqli, "ALTER TABLE `assets` ADD `asset_description` VARCHAR(255) NULL DEFAULT NULL AFTER `asset_name`"); - - mysqli_query($mysqli, "ALTER TABLE `logins` ADD `login_description` VARCHAR(255) NULL DEFAULT NULL AFTER `login_name`"); - - mysqli_query($mysqli, "ALTER TABLE `contacts` ADD `contact_pin` VARCHAR(255) NULL DEFAULT NULL AFTER `contact_photo`"); - - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_client_portal_enable` TINYINT(1) NOT NULL DEFAULT '1' AFTER `config_module_enable_accounting`"); - - mysqli_query($mysqli, "ALTER TABLE `tickets` ADD `ticket_vendor_ticket_number` VARCHAR(255) NULL DEFAULT NULL AFTER `ticket_status`"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.5.7'"); - } - - if (CURRENT_DATABASE_VERSION == '0.5.7') { - mysqli_query($mysqli, "ALTER TABLE `email_queue` ADD `email_status` TINYINT(1) NOT NULL DEFAULT '0' AFTER `email_id`"); - mysqli_query($mysqli, "ALTER TABLE `email_queue` ADD `email_recipient_name` VARCHAR(255) NULL DEFAULT NULL AFTER `email_recipient`"); - mysqli_query($mysqli, "ALTER TABLE `email_queue` ADD `email_failed_at` DATETIME NULL DEFAULT NULL AFTER `email_queued_at`"); - mysqli_query($mysqli, "ALTER TABLE `email_queue` ADD `email_attempts` TINYINT(1) NOT NULL DEFAULT '0' AFTER `email_failed_at`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.5.8'"); - } - - if (CURRENT_DATABASE_VERSION == '0.5.8') { - mysqli_query($mysqli, "ALTER TABLE `contacts` ADD `contact_primary` TINYINT(1) NOT NULL DEFAULT 0 AFTER `contact_token_expire`"); - mysqli_query($mysqli, "ALTER TABLE `locations` ADD `location_primary` TINYINT(1) NOT NULL DEFAULT 0 AFTER `location_photo`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.5.9'"); - } - - if (CURRENT_DATABASE_VERSION == '0.5.9') { - - // Copy primary_location and primary_contact to their new vars in their own respecting tables - $sql = mysqli_query($mysqli, "SELECT * FROM clients"); - while($row = mysqli_fetch_assoc($sql)) { - $primary_contact = $row['primary_contact']; - $primary_location = $row['primary_location']; - - if($primary_contact > 0){ - mysqli_query($mysqli, "UPDATE contacts SET contact_primary = 1, contact_important = 1 WHERE contact_id = $primary_contact"); - } - if($primary_location > 0){ - mysqli_query($mysqli, "UPDATE locations SET location_primary = 1 WHERE location_id = $primary_location"); - } - } - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.6.0'"); - } - - if (CURRENT_DATABASE_VERSION == '0.6.0') { - mysqli_query($mysqli, "ALTER TABLE `clients` DROP `primary_contact`"); - mysqli_query($mysqli, "ALTER TABLE `clients` DROP `primary_location`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.6.1'"); - } - - if (CURRENT_DATABASE_VERSION == '0.6.1') { - mysqli_query($mysqli, "ALTER TABLE `settings` ADD COLUMN `config_imap_username` VARCHAR(200) NULL DEFAULT NULL AFTER `config_imap_encryption`"); - mysqli_query($mysqli, "ALTER TABLE `settings` ADD COLUMN `config_imap_password` VARCHAR(200) NULL DEFAULT NULL AFTER `config_imap_username`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.6.2'"); - } - - if (CURRENT_DATABASE_VERSION == '0.6.2') { - //Insert queries here required to update to DB version 0.6.3 - - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_invoice_late_fee_enable` TINYINT(1) NOT NULL DEFAULT 0 AFTER `config_invoice_from_email`"); - - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_invoice_late_fee_percent` DECIMAL(5,2) NOT NULL DEFAULT 0 AFTER `config_invoice_late_fee_enable`"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.6.3'"); - } - - if (CURRENT_DATABASE_VERSION == '0.6.3') { - mysqli_query($mysqli, "ALTER TABLE `quotes` ADD COLUMN `quote_expire` DATE NULL DEFAULT NULL AFTER `quote_date`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.6.4'"); - } - - if (CURRENT_DATABASE_VERSION == '0.6.4') { - //Insert queries here required to update to DB version 0.6.5 - - mysqli_query($mysqli, "CREATE TABLE `ticket_watchers` ( - `watcher_id` int(11) NOT NULL AUTO_INCREMENT, - `watcher_name` varchar(255) NULL DEFAULT NULL, - `watcher_email` varchar(255) NOT NULL, - `watcher_created_at` datetime NOT NULL DEFAULT current_timestamp(), - `watcher_ticket_id` int(11) NOT NULL, - PRIMARY KEY (`watcher_id`) - )"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.6.5'"); - } - - if (CURRENT_DATABASE_VERSION == '0.6.5') { - //Insert queries here required to update to DB version 0.6.6 - mysqli_query($mysqli, "ALTER TABLE `ticket_watchers` DROP `watcher_created_at`"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.6.6'"); - } - - if (CURRENT_DATABASE_VERSION == '0.6.6') { - - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_start_page` VARCHAR(200) DEFAULT 'clients.php' AFTER `config_current_database_version`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.6.7'"); - } - - if (CURRENT_DATABASE_VERSION == '0.6.7') { - - mysqli_query($mysqli, "CREATE TABLE `recurring_expenses` ( - `recurring_expense_id` INT(11) NOT NULL AUTO_INCREMENT, - `recurring_expense_frequency` TINYINT(1) NOT NULL, - `recurring_expense_day` TINYINT DEFAULT NULL, - `recurring_expense_month` TINYINT DEFAULT NULL, - `recurring_expense_last_sent` DATE NULL DEFAULT NULL, - `recurring_expense_next_date` DATE NOT NULL, - `recurring_expense_status` TINYINT(1) NOT NULL DEFAULT 1, - `recurring_expense_description` TEXT DEFAULT NULL, - `recurring_expense_amount` DECIMAL(15,2) NOT NULL, - `recurring_expense_payment_method` VARCHAR(200) DEFAULT NULL, - `recurring_expense_payment_reference` VARCHAR(200) DEFAULT NULL, - `recurring_expense_currency_code` VARCHAR(200) NOT NULL, - `recurring_expense_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(), - `recurring_expense_updated_at` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, - `recurring_expense_archived_at` DATETIME DEFAULT NULL, - `recurring_expense_vendor_id` INT(11) NOT NULL, - `recurring_expense_client_id` INT(11) NOT NULL DEFAULT 0, - `recurring_expense_category_id` INT(11) NOT NULL, - `recurring_expense_account_id` INT(11) NOT NULL, - PRIMARY KEY (`recurring_expense_id`) - )"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.6.8'"); - } - - if (CURRENT_DATABASE_VERSION == '0.6.8') { - //Insert queries here required to update to DB version 0.6.9 - mysqli_query($mysqli, "ALTER TABLE `recurring_expenses` CHANGE `recurring_expense_payment_reference` `recurring_expense_reference` VARCHAR(255) DEFAULT NULL"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.6.9'"); - } - - if (CURRENT_DATABASE_VERSION == '0.6.9') { - - mysqli_query($mysqli, "ALTER TABLE `user_settings` ADD `user_config_records_per_page` INT(11) NOT NULL DEFAULT 10 AFTER `user_role`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.7.0'"); - } - - if (CURRENT_DATABASE_VERSION == '0.7.0') { - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_login_message` TEXT DEFAULT NULL AFTER `config_client_portal_enable`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.7.1'"); - } - - if (CURRENT_DATABASE_VERSION == '0.7.1') { - mysqli_query($mysqli, "CREATE TABLE `budget` ( - `budget_id` INT(11) NOT NULL AUTO_INCREMENT, - `budget_month` TINYINT NOT NULL, - `budget_year` TINYINT NOT NULL, - `budget_amount` DECIMAL(15,2) NOT NULL, - `budget_description` VARCHAR(255) DEFAULT NULL, - `budget_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(), - `budget_updated_at` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, - `budget_category_id` INT(11) NOT NULL, - PRIMARY KEY (`budget_id`) - )"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.7.2'"); - } - - if (CURRENT_DATABASE_VERSION == '0.7.2') { - mysqli_query($mysqli, "ALTER TABLE `budget` CHANGE `budget_year` `budget_year` INT NOT NULL"); - mysqli_query($mysqli, "ALTER TABLE `budget` CHANGE `budget_amount` `budget_amount` DECIMAL(15,2) DEFAULT 0.00"); - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.7.3'"); - } - - if (CURRENT_DATABASE_VERSION == '0.7.3') { - //Insert queries here required to update to DB version 0.7.4 - mysqli_query($mysqli, "ALTER TABLE `files` ADD `file_folder_id` INT(11) NOT NULL DEFAULT 0 AFTER `file_accessed_at`"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.7.4'"); - } - - if (CURRENT_DATABASE_VERSION == '0.7.4') { - //Insert queries here required to update to DB version 0.7.5 - mysqli_query($mysqli, "ALTER TABLE `files` ADD `file_hash` VARCHAR(200) DEFAULT NULL AFTER `file_ext`"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.7.5'"); - } - - if (CURRENT_DATABASE_VERSION == '0.7.5') { - //Insert queries here required to update to DB version 0.7.6 - mysqli_query($mysqli, "ALTER TABLE `folders` ADD `folder_location` INT DEFAULT 0 AFTER `parent_folder`"); - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.7.6'"); - } - - if (CURRENT_DATABASE_VERSION == '0.7.6') { - //Insert queries here required to update to DB version 0.7.7 - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_ticket_new_ticket_notification_email` VARCHAR(200) DEFAULT NULL AFTER `config_ticket_autoclose_hours`"); - - //Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.7.7'"); - } - - if (CURRENT_DATABASE_VERSION == '0.7.7') { - //Insert queries here required to update to DB version 0.7.8 - mysqli_query($mysqli, "ALTER TABLE `notifications` ADD `notification_action` VARCHAR(250) DEFAULT NULL AFTER `notification`"); - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.7.8'"); - } - - if (CURRENT_DATABASE_VERSION == '0.7.8') { - //Insert queries here required to update to DB version 0.7.9 - mysqli_query($mysqli, "ALTER TABLE `user_settings` ADD `user_config_force_mfa` TINYINT(1) NOT NULL DEFAULT 0 AFTER `user_role`"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.7.9'"); - } - - if (CURRENT_DATABASE_VERSION == '0.7.9') { - //Insert queries here required to update to DB version 0.8.0 - mysqli_query($mysqli, "ALTER TABLE `assets` ADD `asset_uri` VARCHAR(250) DEFAULT NULL AFTER `asset_mac`"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.8.0'"); - } - - if (CURRENT_DATABASE_VERSION == '0.8.0') { - //Insert queries here required to update to DB version 0.8.1 - mysqli_query($mysqli, "ALTER TABLE `categories` ADD `category_icon` VARCHAR(200) DEFAULT NULL AFTER `category_color`"); - mysqli_query($mysqli, "ALTER TABLE `categories` ADD `category_parent` INT(11) DEFAULT 0 AFTER `category_icon`"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.8.1'"); - } - - if (CURRENT_DATABASE_VERSION == '0.8.1') { - //Insert queries here required to update to DB version 0.8.2 - mysqli_query($mysqli, "CREATE TABLE `document_files` (`document_id` int(11) NOT NULL,`file_id` int(11) NOT NULL, PRIMARY KEY (`document_id`,`file_id`))"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.8.2'"); - } - - if (CURRENT_DATABASE_VERSION == '0.8.2') { - //Insert queries here required to update to DB version 0.8.3 - mysqli_query($mysqli, "ALTER TABLE `documents` ADD `document_parent` INT(11) NOT NULL DEFAULT 0 AFTER `document_content_raw`"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.8.3'"); - } - - if (CURRENT_DATABASE_VERSION == '0.8.3') { - //Insert queries here required to update to DB version 0.8.4 - - mysqli_query($mysqli, "UPDATE `documents` SET `document_parent` = `document_id`"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.8.4'"); - } - - if (CURRENT_DATABASE_VERSION == '0.8.4') { - //Insert queries here required to update to DB version 0.8.5 - mysqli_query($mysqli, "ALTER TABLE `documents` ADD `document_description` TEXT DEFAULT NULL AFTER `document_name`"); - mysqli_query($mysqli, "ALTER TABLE `documents` ADD `document_created_by` INT(11) NOT NULL DEFAULT 0 AFTER `document_folder_id`"); - mysqli_query($mysqli, "ALTER TABLE `documents` ADD `document_updated_by` INT(11) NOT NULL DEFAULT 0 AFTER `document_created_by`"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.8.5'"); - } - - if (CURRENT_DATABASE_VERSION == '0.8.5') { - // Insert queries here required to update to DB version 0.8.6 (Adding login entry password change tracking) - mysqli_query($mysqli, "ALTER TABLE `logins` ADD `login_password_changed_at` datetime DEFAULT current_timestamp() AFTER `login_accessed_at`"); - - // For the safest initial value, set login_password_changed_at to when the login entry was created (as there is no guarantee the password was changed just because the record was updated) - $sql_logins = mysqli_query($mysqli, "SELECT login_id, login_created_at FROM logins WHERE login_password IS NOT NULL AND login_archived_at IS NULL"); - foreach ($sql_logins as $row) { - $login_id = $row['login_id']; - $login_password_changed_at = $row['login_created_at']; - mysqli_query($mysqli, "UPDATE logins SET login_password_changed_at = '$login_password_changed_at' WHERE login_id = '$login_id'"); - } - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.8.6'"); - } - - if (CURRENT_DATABASE_VERSION == '0.8.6') { - // Insert queries here required to update to DB version 0.8.7 - mysqli_query($mysqli, "ALTER TABLE `accounts` ADD `account_type` int(6) DEFAULT NULL AFTER `account_notes`"); - mysqli_query($mysqli, "CREATE TABLE `account_types` (`account_type_id` int(11) NOT NULL AUTO_INCREMENT,`account_type_name` varchar(255) NOT NULL,`account_type_description` text DEFAULT NULL,`account_type_created_at` datetime NOT NULL DEFAULT current_timestamp(),`account_type_updated_at` datetime DEFAULT NULL ON UPDATE current_timestamp(),`account_type_archived_at` datetime DEFAULT NULL,PRIMARY KEY (`account_type_id`))"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.8.7'"); - } - - if (CURRENT_DATABASE_VERSION == '0.8.7') { - //Create Main Account Types - mysqli_query($mysqli,"INSERT INTO account_types SET account_type_name = 'Asset', account_type_id= '10', account_type_description = 'Assets are economic resources which are expected to benefit the business in the future.'"); - mysqli_query($mysqli,"INSERT INTO account_types SET account_type_name = 'Liability', account_type_id= '20', account_type_description = 'Liabilities are obligations of the business entity. They are usually classified as current liabilities (due within one year or less) and long-term liabilities (due after one year).'"); - mysqli_query($mysqli,"INSERT INTO account_types SET account_type_name = 'Equity', account_type_id= '30', account_type_description = 'Equity represents the owners stake in the business after liabilities have been deducted.'"); - //Create Secondary Account Types - mysqli_query($mysqli,"INSERT INTO account_types SET account_type_name = 'Current Asset', account_type_id= '11', account_type_description = 'Current assets are expected to be consumed within one year or less.'"); - mysqli_query($mysqli,"INSERT INTO account_types SET account_type_name = 'Fixed Asset', account_type_id= '12', account_type_description = 'Fixed assets are expected to benefit the business for more than one year.'"); - mysqli_query($mysqli,"INSERT INTO account_types SET account_type_name = 'Other Asset', account_type_id= '19', account_type_description = 'Other assets are assets that do not fit into any of the other asset categories.'"); - - mysqli_query($mysqli,"INSERT INTO account_types SET account_type_name = 'Current Liability', account_type_id= '21', account_type_description = 'Current liabilities are expected to be paid within one year or less.'"); - mysqli_query($mysqli,"INSERT INTO account_types SET account_type_name = 'Long Term Liability', account_type_id= '22', account_type_description = 'Long term liabilities are expected to be paid after one year.'"); - mysqli_query($mysqli,"INSERT INTO account_types SET account_type_name = 'Other Liability', account_type_id= '29', account_type_description = 'Other liabilities are liabilities that do not fit into any of the other liability categories.'"); - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.8.8'"); - } - - - if (CURRENT_DATABASE_VERSION == '0.8.8') { - // Insert queries here required to update to DB version 0.8.9 - mysqli_query($mysqli, "ALTER TABLE `invoice_items` ADD `item_order` INT(11) NOT NULL DEFAULT 0 AFTER `item_total`"); - // Update existing invoices so that item_order is set to item_id - $sql_invoices = mysqli_query($mysqli, "SELECT invoice_id FROM invoices WHERE invoice_id IS NOT NULL"); - foreach ($sql_invoices as $row) { - $invoice_id = $row['invoice_id']; - $sql_invoice_items = mysqli_query($mysqli, "SELECT item_id FROM invoice_items WHERE item_invoice_id = '$invoice_id' ORDER BY item_id ASC"); - $item_order = 1; - foreach ($sql_invoice_items as $row) { - $item_id = $row['item_id']; - mysqli_query($mysqli, "UPDATE invoice_items SET item_order = '$item_order' WHERE item_id = '$item_id'"); - $item_order++; - //Log changes made to invoice - mysqli_query($mysqli,"INSERT INTO logs SET log_type = 'Invoice', log_action = 'Modify', log_description = 'Updated item_order to item_id: $item_order'"); - - } - } - - // - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.8.9'"); - } - - - if (CURRENT_DATABASE_VERSION == '0.8.9') { - // Insert queries here required to update to DB version 0.9.0 - // Update existing quotes and recurrings so that item_order is set to item_id - $sql_quotes = mysqli_query($mysqli, "SELECT quote_id FROM quotes WHERE quote_id IS NOT NULL"); - $sql_recurrings = mysqli_query($mysqli, "SELECT recurring_id FROM recurring WHERE recurring_id IS NOT NULL"); - - foreach ($sql_quotes as $row) { - $quote_id = $row['quote_id']; - $sql_quote_items = mysqli_query($mysqli, "SELECT item_id FROM invoice_items WHERE item_quote_id = '$quote_id' ORDER BY item_id ASC"); - $item_order = 1; - foreach ($sql_quote_items as $row) { - $item_id = $row['item_id']; - mysqli_query($mysqli, "UPDATE invoice_items SET item_order = '$item_order' WHERE item_id = '$item_id'"); - $item_order++; - //Log changes made to quote - mysqli_query($mysqli,"INSERT INTO logs SET log_type = 'Quote', log_action = 'Modify', log_description = 'Updated item_order to item_id: $item_order'"); - } - } - - foreach ($sql_recurrings as $row) { - $recurring_id = $row['recurring_id']; - $sql_recurring_items = mysqli_query($mysqli, "SELECT item_id FROM invoice_items WHERE item_recurring_id = '$recurring_id' ORDER BY item_id ASC"); - $item_order = 1; - foreach ($sql_recurring_items as $row) { - $item_id = $row['item_id']; - mysqli_query($mysqli, "UPDATE invoice_items SET item_order = '$item_order' WHERE item_id = '$item_id'"); - $item_order++; - //Log changes made to recurring - mysqli_query($mysqli,"INSERT INTO logs SET log_type = 'Recurring', log_action = 'Modify', log_description = 'Updated item_order to item_id: $item_order'"); - } - } - - - // - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.9.0'"); - } - - - if (CURRENT_DATABASE_VERSION == '0.9.0') { - //add leads column to clients table - mysqli_query($mysqli, "ALTER TABLE `clients` ADD `client_lead` TINYINT(1) NOT NULL DEFAULT 0 AFTER `client_id`"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.9.1'"); - } - - if (CURRENT_DATABASE_VERSION == '0.9.1') { - // Insert queries here required to update to DB version 0.9.2 - mysqli_query($mysqli, "ALTER TABLE `invoices` ADD `invoice_discount_amount` DECIMAL(15,2) NOT NULL DEFAULT 0.00 AFTER `invoice_due`"); - mysqli_query($mysqli, "ALTER TABLE `recurring` ADD `recurring_discount_amount` DECIMAL(15,2) NOT NULL DEFAULT 0.00 AFTER `recurring_status`"); - mysqli_query($mysqli, "ALTER TABLE `quotes` ADD `quote_discount_amount` DECIMAL(15,2) NOT NULL DEFAULT 0.00 AFTER `quote_status`"); - - // Then update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.9.2'"); - - } - - if (CURRENT_DATABASE_VERSION == '0.9.2') { - mysqli_query($mysqli, "ALTER TABLE `account_types` ADD `account_type_parent` INT(11) NOT NULL DEFAULT 1 AFTER `account_type_id`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.9.3'"); - - } - - if (CURRENT_DATABASE_VERSION == '0.9.3') { - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_default_hourly_rate` DECIMAL(15,2) NOT NULL DEFAULT 0.00 AFTER `config_default_net_terms`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.9.4'"); - - } - - if (CURRENT_DATABASE_VERSION == '0.9.4') { - // Insert queries here required to update to DB version 0.9.5 - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_stripe_client_pays_fees` TINYINT(1) NOT NULL DEFAULT 0 AFTER `config_stripe_account`"); - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.9.5'"); - } - - if (CURRENT_DATABASE_VERSION == '0.9.5') { - mysqli_query($mysqli, "ALTER TABLE `user_settings` ADD `user_config_remember_me_token` VARCHAR(255) NULL DEFAULT NULL AFTER `user_role`"); - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.9.6'"); - } - - if (CURRENT_DATABASE_VERSION == '0.9.6') { - // Insert queries here required to update to DB version 0.9.7 - mysqli_query($mysqli, "ALTER TABLE `tickets` ADD `ticket_invoice_id` INT(11) NOT NULL DEFAULT 0 AFTER `ticket_asset_id`"); - mysqli_query($mysqli, "ALTER TABLE `tickets` ADD `ticket_billable` TINYINT(1) NOT NULL DEFAULT 0 AFTER `ticket_status`"); - //set all invoice id - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.9.7'"); - } - - if (CURRENT_DATABASE_VERSION == '0.9.7') { - // Insert queries here required to update to DB version 0.9.8 - mysqli_query($mysqli, "ALTER TABLE `user_settings` ADD `user_config_dashboard_financial_enable` TINYINT(1) NOT NULL DEFAULT 0 AFTER `user_config_records_per_page`"); - mysqli_query($mysqli, "ALTER TABLE `user_settings` ADD `user_config_dashboard_technical_enable` TINYINT(1) NOT NULL DEFAULT 0 AFTER `user_config_dashboard_financial_enable`"); - //set all invoice id - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.9.8'"); - } - - if (CURRENT_DATABASE_VERSION == '0.9.8') { - //Insert queries here required to update to DB version 0.9.9 - mysqli_query($mysqli, "ALTER TABLE `domains` ADD `domain_notes` TEXT NULL DEFAULT NULL AFTER `domain_raw_whois`"); - - //Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '0.9.9'"); - } - - if (CURRENT_DATABASE_VERSION == '0.9.9') { - //Insert queries here required to update to DB version 1.0.0 - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_destructive_deletes_enable` TINYINT(1) NOT NULL DEFAULT 0 AFTER `config_timezone`"); - - //Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.0.0'"); - } - - if (CURRENT_DATABASE_VERSION == '1.0.0') { - //Insert queries here required to update to DB version 1.0.1 - mysqli_query($mysqli, "ALTER TABLE `assets` MODIFY `asset_uri` VARCHAR(500) DEFAULT NULL"); - mysqli_query($mysqli, "ALTER TABLE `assets` ADD `asset_uri_2` VARCHAR(500) DEFAULT NULL AFTER `asset_uri`"); - - //Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.0.1'"); - } - - if (CURRENT_DATABASE_VERSION == '1.0.1') { - //Insert queries here required to update to DB version 1.0.2 - mysqli_query($mysqli, "ALTER TABLE `logins` MODIFY `login_uri` VARCHAR(500) DEFAULT NULL"); - mysqli_query($mysqli, "ALTER TABLE `logins` ADD `login_uri_2` VARCHAR(500) DEFAULT NULL AFTER `login_uri`"); - mysqli_query($mysqli, "ALTER TABLE `assets` ADD `asset_nat_ip` VARCHAR(200) DEFAULT NULL AFTER `asset_ip`"); - - //Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.0.2'"); - } - - - - if (CURRENT_DATABASE_VERSION == '1.0.2') { - //Insert queries here required to update to DB version 1.0.3 - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_stripe_expense_vendor` INT(11) NOT NULL DEFAULT 0 AFTER `config_stripe_account`"); - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_stripe_expense_category` INT(11) NOT NULL DEFAULT 0 AFTER `config_stripe_expense_vendor`"); - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_stripe_percentage_fee` DECIMAL(4,4) NOT NULL DEFAULT 0.029 AFTER `config_stripe_expense_category`"); - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_stripe_flat_fee` DECIMAL(15,2) NOT NULL DEFAULT 0.30 AFTER `config_stripe_percentage_fee`"); - mysqli_query($mysqli, "ALTER TABLE `settings` CHANGE `config_stripe_account` `config_stripe_account` INT(11) NOT NULL DEFAULT 0"); - - //Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.0.3'"); - } - - if (CURRENT_DATABASE_VERSION == '1.0.3') { - //Insert queries here required to update to DB version 1.0.4 - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_ai_enable` TINYINT(1) DEFAULT 0 AFTER `config_stripe_percentage_fee`"); - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_ai_provider` VARCHAR(250) DEFAULT NULL AFTER `config_ai_enable`"); - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_ai_url` VARCHAR(250) DEFAULT NULL AFTER `config_ai_provider`"); - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_ai_api_key` VARCHAR(250) DEFAULT NULL AFTER `config_ai_url`"); - - //Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.0.4'"); - } - - // Be sure to change database_version.php to reflect the version you are updating to here - // Please add this same comment block to the bottom of this file, and update the version number. - // Uncomment Below Lines, to add additional database updates - // - - if (CURRENT_DATABASE_VERSION == '1.0.4') { - //Insert queries here required to update to DB version 1.0.5 - mysqli_query($mysqli, "ALTER TABLE `tickets` ADD `ticket_schedule` DATETIME DEFAULT NULL AFTER `ticket_billable`"); - mysqli_query($mysqli, "ALTER TABLE `tickets` ADD `ticket_onsite` TINYINT(1) NOT NULL DEFAULT 0 AFTER `ticket_schedule`"); - mysqli_query($mysqli, "ALTER TABLE `email_queue` ADD `email_cal_str` VARCHAR(1024) DEFAULT NULL AFTER `email_content`"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.0.5'"); - } - - if (CURRENT_DATABASE_VERSION == '1.0.5') { - //Insert queries here required to update to DB version 1.0.6 - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_ai_model` VARCHAR(250) DEFAULT NULL AFTER `config_ai_provider`"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.0.6'"); - } - - if (CURRENT_DATABASE_VERSION == '1.0.6') { - // Insert queries here required to update to DB version 1.0.7 - mysqli_query($mysqli, "CREATE TABLE `remember_tokens` (`remember_token_id` int(11) NOT NULL AUTO_INCREMENT,`remember_token_token` varchar(255) NOT NULL,`remember_token_user_id` int(11) NOT NULL,`remember_token_created_at` datetime NOT NULL DEFAULT current_timestamp(), PRIMARY KEY (`remember_token_id`))"); - - // Then, update the database to the next sequential version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.0.7'"); - } - - if (CURRENT_DATABASE_VERSION == '1.0.7') { - mysqli_query($mysqli, "ALTER TABLE `user_settings` DROP `user_config_remember_me_token`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.0.8'"); - } - - if (CURRENT_DATABASE_VERSION == '1.0.8') { - // Removed this as login_asset_id is present in the logins table and allow 1 asset to have many logins. - mysqli_query($mysqli, "ALTER TABLE `assets` DROP `asset_login_id`"); - // Dropped this unused Table as we don't need many to many relationship between assets and logins - mysqli_query($mysqli, "DROP TABLE asset_logins"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.0.9'"); - } - - if (CURRENT_DATABASE_VERSION == '1.0.9') { - mysqli_query($mysqli, "ALTER TABLE `transfers` ADD `transfer_method` VARCHAR(200) DEFAULT NULL AFTER `transfer_id`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.1.0'"); - } - - if (CURRENT_DATABASE_VERSION == '1.1.0') { - mysqli_query($mysqli, "ALTER TABLE `files` ADD `file_description` TEXT DEFAULT NULL AFTER `file_name`"); - mysqli_query($mysqli, "ALTER TABLE `files` ADD `file_important` TINYINT(1) NOT NULL DEFAULT '0' AFTER `file_hash`"); - - mysqli_query($mysqli, "ALTER TABLE `documents` ADD `document_important` TINYINT(1) NOT NULL DEFAULT '0' AFTER `document_content_raw`"); - - mysqli_query($mysqli, "ALTER TABLE `assets` ADD `asset_important` TINYINT(1) NOT NULL DEFAULT '0' AFTER `asset_notes`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.1.1'"); - } - - if (CURRENT_DATABASE_VERSION == '1.1.1') { - mysqli_query($mysqli, "ALTER TABLE `scheduled_tickets` ADD `scheduled_ticket_assigned_to` INT(11) NOT NULL DEFAULT '0' AFTER `scheduled_ticket_created_by`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.1.2'"); - } - - if (CURRENT_DATABASE_VERSION == '1.1.2') { - // Add DB support for multiple contacts under a vendor - mysqli_query($mysqli, "ALTER TABLE `contacts` ADD `contact_vendor_id` INT(11) NOT NULL DEFAULT '0' AFTER `contact_location_id`"); - - // Add DB Support to Associate files to an asset example pictures, config backups etc - mysqli_query($mysqli, "ALTER TABLE `files` ADD `file_asset_id` INT(11) NOT NULL DEFAULT '0' AFTER `file_folder_id`"); - - // Add DB Support for missing Short Description fields - mysqli_query($mysqli, "ALTER TABLE `locations` ADD `location_description` TEXT DEFAULT NULL AFTER `location_name`"); - mysqli_query($mysqli, "ALTER TABLE `software` ADD `software_description` TEXT DEFAULT NULL AFTER `software_name`"); - mysqli_query($mysqli, "ALTER TABLE `networks` ADD `network_description` TEXT DEFAULT NULL AFTER `network_name`"); - mysqli_query($mysqli, "ALTER TABLE `certificates` ADD `certificate_description` TEXT DEFAULT NULL AFTER `certificate_name`"); - mysqli_query($mysqli, "ALTER TABLE `domains` ADD `domain_description` TEXT DEFAULT NULL AFTER `domain_name`"); - - // Add DB Support for Location for Events - mysqli_query($mysqli, "ALTER TABLE `events` ADD `event_location` TEXT DEFAULT NULL AFTER `event_title`"); - - // Add Event Attendees Table to allow multiple Attendees per event - mysqli_query($mysqli, "CREATE TABLE `event_attendees` ( - `attendee_id` INT(11) NOT NULL AUTO_INCREMENT, - `attendee_name` VARCHAR(200) DEFAULT NULL, - `attendee_email` VARCHAR(200) DEFAULT NULL, - `attendee_invitation_status` TINYINT(1) NOT NULL DEFAULT 0, - `attendee_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(), - `attendee_updated_at` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, - `attendee_archived_at` DATETIME DEFAULT NULL, - `attendee_contact_id` INT(11) NOT NULL DEFAULT 0, - `attendee_event_id` INT(11) NOT NULL, - PRIMARY KEY (`attendee_id`) - )"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.1.3'"); - } - - if (CURRENT_DATABASE_VERSION == '1.1.3') { - mysqli_query($mysqli, "ALTER TABLE `networks` ADD `network_subnet` VARCHAR(200) DEFAULT NULL AFTER `network`"); - mysqli_query($mysqli, "ALTER TABLE `networks` ADD `network_primary_dns` VARCHAR(200) DEFAULT NULL AFTER `network_gateway`"); - mysqli_query($mysqli, "ALTER TABLE `networks` ADD `network_secondary_dns` VARCHAR(200) DEFAULT NULL AFTER `network_primary_dns`"); - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.1.4'"); - } - - if (CURRENT_DATABASE_VERSION == '1.1.4') { - - // Add Project Templates - mysqli_query($mysqli, "CREATE TABLE `project_templates` ( - `project_template_id` INT(11) NOT NULL AUTO_INCREMENT, - `project_template_name` VARCHAR(200) NOT NULL, - `project_template_description` TEXT DEFAULT NULL, - `project_template_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(), - `project_template_updated_at` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, - `project_template_archived_at` DATETIME DEFAULT NULL, - PRIMARY KEY (`project_template_id`) - )"); - - // Add Ticket Templates - mysqli_query($mysqli, "CREATE TABLE `ticket_templates` ( - `ticket_template_id` INT(11) NOT NULL AUTO_INCREMENT, - `ticket_template_name` VARCHAR(200) NOT NULL, - `ticket_template_description` TEXT DEFAULT NULL, - `ticket_template_subject` VARCHAR(200) DEFAULT NULL, - `ticket_template_details` LONGTEXT DEFAULT NULL, - `ticket_template_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(), - `ticket_template_updated_at` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, - `ticket_template_archived_at` DATETIME DEFAULT NULL, - `ticket_template_project_template_id` INT(11) NOT NULL DEFAULT 0, - PRIMARY KEY (`ticket_template_id`) - )"); - - // Add Task Templates - mysqli_query($mysqli, "CREATE TABLE `task_templates` ( - `task_template_id` INT(11) NOT NULL AUTO_INCREMENT, - `task_template_name` VARCHAR(200) NOT NULL, - `task_template_description` TEXT DEFAULT NULL, - `task_template_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(), - `task_template_updated_at` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, - `task_template_archived_at` DATETIME DEFAULT NULL, - `task_template_ticket_template_id` INT(11) NOT NULL, - PRIMARY KEY (`task_template_id`) - )"); - - mysqli_query($mysqli, "ALTER TABLE `projects` ADD `project_completed_at` DATETIME DEFAULT NULL AFTER `project_updated_at`"); - - mysqli_query($mysqli, "ALTER TABLE `tickets` ADD `ticket_project_id` INT(11) NOT NULL DEFAULT 0 AFTER `ticket_invoice_id`"); - - mysqli_query($mysqli, "ALTER TABLE `tasks` DROP `task_template`"); - mysqli_query($mysqli, "ALTER TABLE `tasks` DROP `task_finish_date`"); - mysqli_query($mysqli, "ALTER TABLE `tasks` DROP `task_project_id`"); - - mysqli_query($mysqli, "ALTER TABLE `projects` DROP `project_template`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.1.5'"); - } - - if (CURRENT_DATABASE_VERSION == '1.1.5') { - - // Add new ticket_statuses table - mysqli_query($mysqli, - "CREATE TABLE `ticket_statuses` ( - `ticket_status_id` INT(11) NOT NULL AUTO_INCREMENT, - `ticket_status_name` VARCHAR(200) NOT NULL, - `ticket_status_color` VARCHAR(200) NOT NULL, - `ticket_status_active` TINYINT(1) NOT NULL DEFAULT '1', - PRIMARY KEY (`ticket_status_id`) - )"); - - // Pre-seed default system/built-in ticket statuses - mysqli_query($mysqli, "INSERT INTO ticket_statuses SET ticket_status_name = 'New', ticket_status_color = 'danger'"); // Default ID for new tickets is 1 - mysqli_query($mysqli, "INSERT INTO ticket_statuses SET ticket_status_name = 'Open', ticket_status_color = 'primary'"); // 2 - mysqli_query($mysqli, "INSERT INTO ticket_statuses SET ticket_status_name = 'On Hold', ticket_status_color = 'success'"); // 3 - mysqli_query($mysqli, "INSERT INTO ticket_statuses SET ticket_status_name = 'Auto Close', ticket_status_color = 'dark'"); // 4 - mysqli_query($mysqli, "INSERT INTO ticket_statuses SET ticket_status_name = 'Closed', ticket_status_color = 'dark'"); // 5 - - // Update existing tickets to use new values - mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 1 WHERE ticket_status = 'New'"); // New - mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 2 WHERE ticket_status = 'Open'"); // Open - mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 3 WHERE ticket_status = 'On Hold'"); // On Hold - mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 4 WHERE ticket_status = 'Auto Close'"); // Auto Close - mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 5 WHERE ticket_closed_at IS NOT NULL"); // Closed - - // Fix Bulk Ticket Closure not having a closed_at Time - mysqli_query($mysqli, "UPDATE tickets SET ticket_closed_at = NOW(), ticket_status = 5 WHERE ticket_status = 'Closed' AND ticket_closed_at IS NULL"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.1.6'"); - } - - if (CURRENT_DATABASE_VERSION == '1.1.6') { - - // Update existing tickets that did not use the defined statuses to Open - //mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 2 WHERE ticket_status NOT IN ('New', 'Open', 'On Hold', 'Auto Close') AND ticket_closed_at IS NULL"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.1.7'"); - } - - if (CURRENT_DATABASE_VERSION == '1.1.7') { - - mysqli_query($mysqli, "ALTER TABLE `projects` ADD `project_due` DATE DEFAULT NULL AFTER `project_description`"); - mysqli_query($mysqli, "ALTER TABLE `tasks` ADD `task_order` INT(11) NOT NULL DEFAULT 0 AFTER `task_status`"); - mysqli_query($mysqli, "ALTER TABLE `task_templates` ADD `task_template_order` INT(11) NOT NULL DEFAULT 0 AFTER `task_template_description`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.1.8'"); - } - - if (CURRENT_DATABASE_VERSION == '1.1.8') { - // Update Ticket Status color to use colors to allow more predefined colors - mysqli_query($mysqli, "UPDATE ticket_statuses SET ticket_status_color = '#dc3545' WHERE ticket_status_id = 1"); // New - mysqli_query($mysqli, "UPDATE ticket_statuses SET ticket_status_color = '#007bff' WHERE ticket_status_id = 2"); // Open - mysqli_query($mysqli, "UPDATE ticket_statuses SET ticket_status_color = '#28a745' WHERE ticket_status_id = 3"); // On Hold - mysqli_query($mysqli, "UPDATE ticket_statuses SET ticket_status_color = '#343a40' WHERE ticket_status_id = 4"); // Auto Close - mysqli_query($mysqli, "UPDATE ticket_statuses SET ticket_status_color = '#343a40' WHERE ticket_status_id = 5"); // Closed - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.1.9'"); - } - - if (CURRENT_DATABASE_VERSION == '1.1.9') { - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_login_remember_me_expire` INT(11) NOT NULL DEFAULT 3 AFTER `config_login_key_secret`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.2.0'"); - } - - if (CURRENT_DATABASE_VERSION == '1.2.0') { - mysqli_query($mysqli, "ALTER TABLE `ticket_templates` ADD `ticket_template_order` INT(11) NOT NULL DEFAULT 0 AFTER `ticket_template_details`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.2.1'"); - } - - if (CURRENT_DATABASE_VERSION == '1.2.1') { - - // Ticket Templates can have many project templates and Project Template can have have many ticket template, so instead create a many to many table relationship - mysqli_query($mysqli, "ALTER TABLE `ticket_templates` DROP `ticket_template_order`"); - mysqli_query($mysqli, "ALTER TABLE `ticket_templates` DROP `ticket_template_project_template_id`"); - - mysqli_query($mysqli, - "CREATE TABLE `project_template_ticket_templates` ( - `ticket_template_id` INT(11) NOT NULL, - `project_template_id` INT(11) NOT NULL, - `ticket_template_order` INT(11) NOT NULL DEFAULT 0, - PRIMARY KEY (`ticket_template_id`,`project_template_id`) - )"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.2.2'"); - } - - if (CURRENT_DATABASE_VERSION == '1.2.2') { - - mysqli_query($mysqli, "ALTER TABLE `tasks` DROP `task_description`"); - mysqli_query($mysqli, "ALTER TABLE `task_templates` DROP `task_template_description`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.2.3'"); - } - - if (CURRENT_DATABASE_VERSION == '1.2.3') { - - mysqli_query($mysqli, "ALTER TABLE `projects` ADD `project_manager` INT(11) NOT NULL DEFAULT 0 AFTER `project_due`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.2.4'"); - } - - if (CURRENT_DATABASE_VERSION == '1.2.4') { - - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_project_prefix` VARCHAR(200) NOT NULL DEFAULT 'PRJ-' AFTER `config_default_hourly_rate`"); - - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_project_next_number` INT(11) NOT NULL DEFAULT 1 AFTER `config_project_prefix`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.2.5'"); - } - - if (CURRENT_DATABASE_VERSION == '1.2.5') { - - mysqli_query($mysqli, "ALTER TABLE `projects` ADD `project_prefix` VARCHAR(200) DEFAULT NULL AFTER `project_id`"); - mysqli_query($mysqli, "ALTER TABLE `projects` ADD `project_number` INT(11) NOT NULL DEFAULT 1 AFTER `project_prefix`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.2.6'"); - } - - if (CURRENT_DATABASE_VERSION == '1.2.6') { - - mysqli_query($mysqli, "ALTER TABLE `domains` ADD `domain_dnshost` INT(11) NOT NULL DEFAULT 0 AFTER `domain_webhost`"); - mysqli_query($mysqli, "ALTER TABLE `domains` ADD `domain_mailhost` INT(11) NOT NULL DEFAULT 0 AFTER `domain_dnshost`"); - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.2.7'"); - } - - if (CURRENT_DATABASE_VERSION == '1.2.7') { - - mysqli_query($mysqli, "ALTER TABLE `recurring` ADD `recurring_invoice_email_notify` TINYINT(1) NOT NULL DEFAULT 1 AFTER `recurring_note`"); - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.2.8'"); - } - - if (CURRENT_DATABASE_VERSION == '1.2.8') { - - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_phone_mask` TINYINT(1) NOT NULL DEFAULT 1 AFTER `config_destructive_deletes_enable`"); - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.2.9'"); - } - - if (CURRENT_DATABASE_VERSION == '1.2.9') { - - mysqli_query($mysqli, "CREATE TABLE `user_permissions` (`user_id` int(11) NOT NULL,`client_id` int(11) NOT NULL, PRIMARY KEY (`user_id`,`client_id`))"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.3.0'"); - } - - if (CURRENT_DATABASE_VERSION == '1.3.0') { - - mysqli_query($mysqli, "CREATE TABLE `user_roles` ( - `user_role_id` INT(11) NOT NULL AUTO_INCREMENT, - `user_role_name` VARCHAR(200) NOT NULL, - `user_role_description` VARCHAR(200) NULL DEFAULT NULL, - `user_role_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - `user_role_updated_at` DATETIME ON UPDATE CURRENT_TIMESTAMP NULL, - `user_role_archived_at` DATETIME NULL, - PRIMARY KEY (`user_role_id`) - )"); - - mysqli_query($mysqli, "INSERT INTO `user_roles` SET user_role_id = 1, user_role_name = 'Accountant', user_role_description = 'Built-in - Limited access to financial-focused modules'"); - mysqli_query($mysqli, "INSERT INTO `user_roles` SET user_role_id = 2, user_role_name = 'Technician', user_role_description = 'Built-in - Limited access to technical-focused modules'"); - mysqli_query($mysqli, "INSERT INTO `user_roles` SET user_role_id = 3, user_role_name = 'Administrator', user_role_description = 'Built-in - Full administrative access to all modules (including user management)'"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.3.1'"); - } - - if (CURRENT_DATABASE_VERSION == '1.3.1') { - mysqli_query($mysqli, "ALTER TABLE `user_settings` ADD `user_config_calendar_first_day` TINYINT(1) NOT NULL DEFAULT 0 AFTER `user_config_dashboard_technical_enable`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.3.2'"); - } - - if (CURRENT_DATABASE_VERSION == '1.3.2') { - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_ticket_default_billable` TINYINT(1) NOT NULL DEFAULT 0 AFTER `config_ticket_new_ticket_notification_email`"); - mysqli_query($mysqli, "ALTER TABLE `scheduled_tickets` ADD `scheduled_ticket_billable` TINYINT(1) NOT NULL DEFAULT 0 AFTER `scheduled_ticket_frequency`"); - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.3.3'"); - } - - if (CURRENT_DATABASE_VERSION == '1.3.3') { - // // Insert queries here required to update to DB version 1.3.3 - // // Then, update the database to the next sequential version - mysqli_query($mysqli, "CREATE TABLE `location_tags` (`location_id` int(11) NOT NULL,`tag_id` int(11) NOT NULL, PRIMARY KEY (`location_id`,`tag_id`))"); - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.3.4'"); - } - - if (CURRENT_DATABASE_VERSION == '1.3.4') { - mysqli_query($mysqli, "ALTER TABLE `client_tags` CHANGE `client_tag_client_id` `client_id` INT(11) NOT NULL"); - mysqli_query($mysqli, "ALTER TABLE `client_tags` CHANGE `client_tag_tag_id` `tag_id` INT(11) NOT NULL"); - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.3.5'"); - } - - if (CURRENT_DATABASE_VERSION == '1.3.5') { - mysqli_query($mysqli, "CREATE TABLE `contact_tags` (`contact_id` int(11) NOT NULL,`tag_id` int(11) NOT NULL, PRIMARY KEY (`contact_id`,`tag_id`))"); - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.3.6'"); - } - - if (CURRENT_DATABASE_VERSION == '1.3.6') { - mysqli_query($mysqli, "ALTER TABLE `clients` ADD `client_abbreviation` VARCHAR(10) DEFAULT NULL AFTER `client_tax_id_number`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.3.7'"); - } - - if (CURRENT_DATABASE_VERSION == '1.3.7') { - mysqli_query($mysqli, "ALTER TABLE `assets` ADD `asset_ipv6` VARCHAR(200) DEFAULT NULL AFTER `asset_ip`"); - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.3.8'"); - } - - if (CURRENT_DATABASE_VERSION == '1.3.8') { - mysqli_query($mysqli, "DROP TABLE `interfaces`"); - - mysqli_query($mysqli, "CREATE TABLE `asset_interfaces` ( - `interface_id` INT(11) NOT NULL AUTO_INCREMENT, - `interface_name` VARCHAR(200) NOT NULL, - `interface_mac` VARCHAR(200) DEFAULT NULL, - `interface_ip` VARCHAR(200) DEFAULT NULL, - `interface_nat_ip` VARCHAR(200) DEFAULT NULL, - `interface_ipv6` VARCHAR(200) DEFAULT NULL, - `interface_port` VARCHAR(200) DEFAULT NULL, - `interface_notes` TEXT DEFAULT NULL, - `interface_primary` TINYINT(1) DEFAULT 0, - `interface_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - `interface_updated_at` DATETIME ON UPDATE CURRENT_TIMESTAMP NULL, - `interface_archived_at` DATETIME NULL, - `interface_network_id` INT(11) DEFAULT NULL, - `interface_asset_id` INT(11) NOT NULL, - PRIMARY KEY (`interface_id`) - )"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.3.9'"); - - } - - if (CURRENT_DATABASE_VERSION == '1.3.9') { - // Migrate all Network Info from Assets to Interface Table and make it primary interface - $sql = mysqli_query($mysqli, "SELECT * FROM assets"); - while ($row = mysqli_fetch_assoc($sql)) { - $asset_id = intval($row['asset_id']); - $mac = escapeSql($row['asset_mac']); - $ip = escapeSql($row['asset_ip']); - $nat_ip = escapeSql($row['asset_nat_ip']); - $ipv6 = escapeSql($row['asset_ipv6']); - $network = intval($row['asset_network_id']); - - mysqli_query($mysqli, "INSERT INTO `asset_interfaces` SET interface_name = 'Primary', interface_mac = '$mac', interface_ip = '$ip', interface_nat_ip = '$nat_ip', interface_ipv6 = '$ipv6', interface_port = 'eth0', interface_primary = 1, interface_network_id = $network, interface_asset_id = $asset_id"); - } - - // Drop Fields from assets as they moved to asset_interfaces - mysqli_query($mysqli, "ALTER TABLE `assets` DROP `asset_ip`"); - mysqli_query($mysqli, "ALTER TABLE `assets` DROP `asset_ipv6`"); - mysqli_query($mysqli, "ALTER TABLE `assets` DROP `asset_nat_ip`"); - mysqli_query($mysqli, "ALTER TABLE `assets` DROP `asset_mac`"); - mysqli_query($mysqli, "ALTER TABLE `assets` DROP `asset_network_id`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.4.0'"); - - } - - if (CURRENT_DATABASE_VERSION == '1.4.0') { - - mysqli_query($mysqli, "CREATE TABLE `racks` ( - `rack_id` INT(11) NOT NULL AUTO_INCREMENT, - `rack_name` VARCHAR(200) NOT NULL, - `rack_description` TEXT DEFAULT NULL, - `rack_model` VARCHAR(200) DEFAULT NULL, - `rack_depth` VARCHAR(50) DEFAULT NULL, - `rack_type` VARCHAR(50) DEFAULT NULL, - `rack_units` INT(11) NOT NULL, - `rack_photo` VARCHAR(200) DEFAULT NULL, - `rack_physical_location` VARCHAR(200) DEFAULT NULL, - `rack_notes` TEXT DEFAULT NULL, - `rack_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - `rack_updated_at` DATETIME ON UPDATE CURRENT_TIMESTAMP NULL, - `rack_archived_at` DATETIME NULL, - `rack_location_id` INT(11) DEFAULT NULL, - `rack_client_id` INT(11) NOT NULL, - PRIMARY KEY (`rack_id`) - )"); - - mysqli_query($mysqli, "CREATE TABLE `rack_units` ( - `unit_id` INT(11) NOT NULL AUTO_INCREMENT, - `unit_start_number` INT(11) NOT NULL, - `unit_end_number` INT(11) NOT NULL, - `unit_device` VARCHAR(200) DEFAULT NULL, - `unit_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - `unit_updated_at` DATETIME ON UPDATE CURRENT_TIMESTAMP NULL, - `unit_archived_at` DATETIME NULL, - `unit_asset_id` INT(11) DEFAULT NULL, - `unit_rack_id` INT(11) NOT NULL, - PRIMARY KEY (`unit_id`), - FOREIGN KEY (`unit_rack_id`) REFERENCES `racks`(`rack_id`) ON DELETE CASCADE - )"); - - mysqli_query($mysqli, "CREATE TABLE `patch_panels` ( - `patch_panel_id` INT(11) NOT NULL AUTO_INCREMENT, - `patch_panel_name` VARCHAR(200) NOT NULL, - `patch_panel_description` TEXT DEFAULT NULL, - `patch_panel_type` VARCHAR(200) DEFAULT NULL, - `patch_panel_ports` INT(11) NOT NULL, - `patch_panel_physical_location` VARCHAR(200) DEFAULT NULL, - `patch_panel_notes` TEXT DEFAULT NULL, - `patch_panel_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - `patch_panel_updated_at` DATETIME ON UPDATE CURRENT_TIMESTAMP NULL, - `patch_panel_archived_at` DATETIME NULL, - `patch_panel_location_id` INT(11) DEFAULT NULL, - `patch_panel_rack_id` INT(11) DEFAULT NULL, - `patch_panel_client_id` INT(11) NOT NULL, - PRIMARY KEY (`patch_panel_id`) - )"); - - mysqli_query($mysqli, "CREATE TABLE `patch_panel_ports` ( - `port_id` INT(11) NOT NULL AUTO_INCREMENT, - `port_number` INT(11) NOT NULL, - `port_name` VARCHAR(200) DEFAULT NULL, - `port_description` TEXT DEFAULT NULL, - `port_type` VARCHAR(200) DEFAULT NULL, - `port_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - `port_updated_at` DATETIME ON UPDATE CURRENT_TIMESTAMP NULL, - `port_archived_at` DATETIME NULL, - `port_asset_id` INT(11) DEFAULT NULL, - `port_patch_panel_id` INT(11) NOT NULL, - PRIMARY KEY (`port_id`), - FOREIGN KEY (`port_patch_panel_id`) REFERENCES `patch_panels`(`patch_panel_id`) ON DELETE CASCADE - )"); - - mysqli_query($mysqli, "ALTER TABLE `assets` ADD `asset_photo` VARCHAR(200) DEFAULT NULL AFTER `asset_install_date`"); - - mysqli_query($mysqli, "ALTER TABLE `assets` ADD `asset_physical_location` VARCHAR(200) DEFAULT NULL AFTER `asset_photo`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.4.1'"); - } - - if (CURRENT_DATABASE_VERSION == '1.4.1') { - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_log_retention` INT(11) NOT NULL DEFAULT '90' AFTER `config_login_remember_me_expire`;"); - mysqli_query($mysqli, "UPDATE `settings` SET `config_log_retention` = '2555' WHERE company_id = 1;"); // Set to 7 years for existing installs - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.4.2'"); - } - - if (CURRENT_DATABASE_VERSION == '1.4.2') { - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_ticket_email_parse_unknown_senders` INT(1) NOT NULL DEFAULT '0' AFTER `config_ticket_email_parse`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.4.3'"); - } - - if (CURRENT_DATABASE_VERSION == '1.4.3') { - - // Add ticket URL key column - mysqli_query($mysqli, "ALTER TABLE `tickets` ADD `ticket_url_key` VARCHAR(200) DEFAULT NULL AFTER `ticket_feedback`"); - // Populate pre-existing columns for open tickets - $sql_tickets_1 = mysqli_query($mysqli, "SELECT ticket_id FROM tickets WHERE tickets.ticket_closed_at IS NULL"); - foreach ($sql_tickets_1 as $row) { - $ticket_id = intval($row['ticket_id']); - $url_key = randomString(156); - mysqli_query($mysqli, "UPDATE tickets SET ticket_url_key = '$url_key' WHERE ticket_id = '$ticket_id'"); - } - - // Add ticket resolved at column - mysqli_query($mysqli, "ALTER TABLE `tickets` ADD `ticket_resolved_at` DATETIME DEFAULT NULL AFTER `ticket_updated_at`"); - // Populate pre-existing columns for closed tickets - $sql_tickets_2 = mysqli_query($mysqli, "SELECT ticket_id, ticket_updated_at, ticket_closed_at FROM tickets WHERE tickets.ticket_closed_at IS NOT NULL"); - foreach ($sql_tickets_2 as $row) { - $ticket_id = intval($row['ticket_id']); - $ticket_updated_at = escapeSql($row['ticket_updated_at']); // To keep old updated_at time - $ticket_closed_at = escapeSql($row['ticket_closed_at']); - mysqli_query($mysqli, "UPDATE tickets SET ticket_resolved_at = '$ticket_closed_at', ticket_updated_at = '$ticket_updated_at' WHERE ticket_id = '$ticket_id'"); - } - - // Change ticket status 'Auto close' to 'Resolved' - mysqli_query($mysqli, "UPDATE `ticket_statuses` SET `ticket_status_name` = 'Resolved' WHERE `ticket_statuses`.`ticket_status_id` = 4"); - - // Auto-close is no longer optional - mysqli_query($mysqli, "ALTER TABLE `settings` DROP `config_ticket_autoclose`"); - mysqli_query($mysqli, "UPDATE `settings` SET `config_ticket_autoclose_hours` = '72'"); - - // DB Version - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.4.4'"); - - } - - if (CURRENT_DATABASE_VERSION == '1.4.4') { - mysqli_query($mysqli, "ALTER TABLE `api_keys` ADD `api_key_decrypt_hash` VARCHAR(200) NOT NULL AFTER `api_key_secret`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.4.5'"); - } - - if (CURRENT_DATABASE_VERSION == '1.4.5') { - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_whitelabel_enabled` INT(11) NOT NULL DEFAULT '0' AFTER `config_phone_mask`"); - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_whitelabel_key` TEXT NULL DEFAULT NULL AFTER `config_whitelabel_enabled`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.4.6'"); - } - - if (CURRENT_DATABASE_VERSION == '1.4.6') { - mysqli_query($mysqli, "CREATE TABLE `custom_links` ( - `custom_link_id` INT(11) NOT NULL AUTO_INCREMENT, - `custom_link_name` VARCHAR(200) NOT NULL, - `custom_link_description` TEXT DEFAULT NULL, - `custom_link_uri` VARCHAR(500) NOT NULL, - `custom_link_icon` VARCHAR(200) DEFAULT NULL, - `custom_link_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - `custom_link_updated_at` DATETIME ON UPDATE CURRENT_TIMESTAMP NULL, - `custom_link_archived_at` DATETIME NULL, - PRIMARY KEY (`custom_link_id`) - )"); - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.4.7'"); - } - - if (CURRENT_DATABASE_VERSION == '1.4.7') { - mysqli_query($mysqli, "ALTER TABLE `documents` ADD `document_client_visible` INT(11) NOT NULL DEFAULT '1' AFTER `document_parent`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.4.8'"); - } - - if (CURRENT_DATABASE_VERSION == '1.4.8') { - mysqli_query($mysqli, "ALTER TABLE `settings` DROP `config_stripe_client_pays_fees`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.4.9'"); - } - - if (CURRENT_DATABASE_VERSION == '1.4.9') { - - // Add new "is admin" identifier on user roles - mysqli_query($mysqli, "ALTER TABLE `user_roles` ADD `user_role_is_admin` INT(11) NOT NULL DEFAULT '0' AFTER `user_role_description`"); - mysqli_query($mysqli, "UPDATE `user_roles` SET `user_role_is_admin` = '1' WHERE `user_role_id` = 3"); - - // Add modules - mysqli_query($mysqli, "CREATE TABLE `modules` ( - `module_id` INT(11) NOT NULL AUTO_INCREMENT, - `module_name` VARCHAR(200) NOT NULL, - `module_description` VARCHAR(200) NULL, - PRIMARY KEY (`module_id`) - )"); - - mysqli_query($mysqli, "INSERT INTO modules SET module_name = 'module_client', module_description = 'General client & contact management'"); - mysqli_query($mysqli, "INSERT INTO modules SET module_name = 'module_support', module_description = 'Access to ticketing, assets and documentation'"); - mysqli_query($mysqli, "INSERT INTO modules SET module_name = 'module_credential', module_description = 'Access to client credentials - usernames, passwords and 2FA codes'"); - mysqli_query($mysqli, "INSERT INTO modules SET module_name = 'module_sales', module_description = 'Access to quotes, invoices and products'"); - mysqli_query($mysqli, "INSERT INTO modules SET module_name = 'module_financial', module_description = 'Access to payments, accounts, expenses and budgets'"); - mysqli_query($mysqli, "INSERT INTO modules SET module_name = 'module_reporting', module_description = 'Access to all reports'"); - - // Add table for storing role<->module permissions - mysqli_query($mysqli, "CREATE TABLE `user_role_permissions` ( - `user_role_id` INT(11) NOT NULL, - `module_id` INT(11) NOT NULL, - `user_role_permission_level` INT(11) NOT NULL - )"); - - // Add default permissions for accountant role - mysqli_query($mysqli, "INSERT INTO user_role_permissions SET user_role_id = 1, module_id = 1, user_role_permission_level = 1"); // Read clients - mysqli_query($mysqli, "INSERT INTO user_role_permissions SET user_role_id = 1, module_id = 2, user_role_permission_level = 1"); // Read support - mysqli_query($mysqli, "INSERT INTO user_role_permissions SET user_role_id = 1, module_id = 4, user_role_permission_level = 1"); // Read sales - mysqli_query($mysqli, "INSERT INTO user_role_permissions SET user_role_id = 1, module_id = 5, user_role_permission_level = 2"); // Modify financial - mysqli_query($mysqli, "INSERT INTO user_role_permissions SET user_role_id = 1, module_id = 6, user_role_permission_level = 1"); // Read reports - - // Add default permissions for tech role - mysqli_query($mysqli, "INSERT INTO user_role_permissions SET user_role_id = 2, module_id = 1, user_role_permission_level = 2"); // Modify clients - mysqli_query($mysqli, "INSERT INTO user_role_permissions SET user_role_id = 2, module_id = 2, user_role_permission_level = 2"); // Modify support - mysqli_query($mysqli, "INSERT INTO user_role_permissions SET user_role_id = 2, module_id = 3, user_role_permission_level = 2"); // Modify credentials - mysqli_query($mysqli, "INSERT INTO user_role_permissions SET user_role_id = 2, module_id = 4, user_role_permission_level = 2"); // Modify sales - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.5.0'"); - } - - if (CURRENT_DATABASE_VERSION == '1.5.0') { - - mysqli_query($mysqli, "DROP TABLE `account_types`"); - - mysqli_query($mysqli, "ALTER TABLE `accounts` ADD `account_description` VARCHAR(250) DEFAULT NULL AFTER `account_name`"); - - mysqli_query($mysqli, "ALTER TABLE `user_roles` MODIFY `user_role_is_admin` TINYINT(1) NOT NULL DEFAULT '0'"); - - mysqli_query($mysqli, "ALTER TABLE `shared_items` ADD `item_recipient` VARCHAR(250) DEFAULT NULL AFTER `item_note`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.5.1'"); - } - - if (CURRENT_DATABASE_VERSION == '1.5.1') { - - mysqli_query($mysqli, "ALTER TABLE `custom_links` ADD `custom_link_location` INT(11) NOT NULL DEFAULT 1 AFTER `custom_link_icon`"); - mysqli_query($mysqli, "ALTER TABLE `custom_links` ADD `custom_link_new_tab` TINYINT(1) NOT NULL DEFAULT 0 AFTER `custom_link_uri`"); - mysqli_query($mysqli, "ALTER TABLE `custom_links` ADD `custom_link_order` INT(11) NOT NULL DEFAULT 0 AFTER `custom_link_location`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.5.2'"); - } - - if (CURRENT_DATABASE_VERSION == '1.5.2') { - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_invoice_paid_notification_email` VARCHAR(200) DEFAULT NULL AFTER `config_invoice_late_fee_percent`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.5.3'"); - } - - if (CURRENT_DATABASE_VERSION == '1.5.3') { - mysqli_query($mysqli, "ALTER TABLE `users` ADD `user_type` TINYINT(1) NOT NULL DEFAULT 1 AFTER `user_password`"); - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.5.4'"); - } - - if (CURRENT_DATABASE_VERSION == '1.5.4') { - mysqli_query($mysqli, "ALTER TABLE `user_roles` ADD `user_role_type` TINYINT(1) NOT NULL DEFAULT 1 AFTER `user_role_description`"); - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.5.5'"); - } - - if (CURRENT_DATABASE_VERSION == '1.5.5') { - mysqli_query($mysqli, "ALTER TABLE `contacts` ADD `contact_user_id` INT(11) NOT NULL DEFAULT 0 AFTER `contact_vendor_id`"); - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.5.6'"); - } - - if (CURRENT_DATABASE_VERSION == '1.5.6') { - mysqli_query($mysqli, "ALTER TABLE `users` ADD `user_auth_method` VARCHAR(200) NOT NULL DEFAULT 'local' AFTER `user_password`"); - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.5.7'"); - } - - if (CURRENT_DATABASE_VERSION == '1.5.7') { - // Create Users for contacts that have logins enabled and that are not archived - $contacts_sql = mysqli_query($mysqli, "SELECT * FROM `contacts` WHERE contact_archived_at IS NULL AND (contact_auth_method = 'local' OR contact_auth_method = 'azure')"); - while($row = mysqli_fetch_assoc($contacts_sql)) { - $contact_id = intval($row['contact_id']); - $contact_name = mysqli_real_escape_string($mysqli, $row['contact_name']); - $contact_email = mysqli_real_escape_string($mysqli, $row['contact_email']); - $contact_password_hash = mysqli_real_escape_string($mysqli, $row['contact_password_hash']); - $contact_auth_method = mysqli_real_escape_string($mysqli, $row['contact_auth_method']); - - mysqli_query($mysqli, "INSERT INTO users SET user_name = '$contact_name', user_email = '$contact_email', user_password = '$contact_password_hash', user_auth_method = '$contact_auth_method', user_type = 2"); - - $user_id = mysqli_insert_id($mysqli); - - mysqli_query($mysqli, "UPDATE `contacts` SET `contact_user_id` = $user_id WHERE contact_id = $contact_id"); - } - - // Drop Login Related fields from contacts tables as everyone who has a login has been moved over - mysqli_query($mysqli, "ALTER TABLE `contacts` DROP `contact_auth_method`, DROP `contact_password_hash`, DROP `contact_password_reset_token`, DROP `contact_token_expire`"); - - // Add Password Reset Tokens to users tables - mysqli_query($mysqli, "ALTER TABLE `users` ADD `user_password_reset_token` VARCHAR(200) NULL DEFAULT NULL AFTER `user_token`"); - mysqli_query($mysqli, "ALTER TABLE `users` ADD `user_password_reset_token_expire` DATETIME NULL DEFAULT NULL AFTER `user_password_reset_token`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.5.8'"); - } - - if (CURRENT_DATABASE_VERSION == '1.5.8') { - // Add task completetion estimate time to tasks and task templates - mysqli_query($mysqli, "ALTER TABLE `tasks` ADD `task_completion_estimate` INT(11) NOT NULL DEFAULT 0 AFTER `task_order`"); - mysqli_query($mysqli, "ALTER TABLE `task_templates` ADD `task_template_completion_estimate` INT(11) NOT NULL DEFAULT 0 AFTER `task_template_order`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.5.9'"); - } - - if (CURRENT_DATABASE_VERSION == '1.5.9') { - - // Check if the column already exists - $result = mysqli_query($mysqli, "SHOW COLUMNS FROM `logins` LIKE 'login_folder_id'"); - if (mysqli_num_rows($result) == 0) { - mysqli_query($mysqli, "ALTER TABLE `logins` ADD `login_folder_id` INT(11) NOT NULL DEFAULT 0 AFTER `login_password_changed_at`"); - } else { - // The column already exists - echo "Column 'login_folder_id' already exists in the 'logins' table."; - } - - mysqli_query($mysqli, "ALTER TABLE `logins` MODIFY `login_username` VARCHAR(500) DEFAULT NULL"); - - mysqli_query($mysqli, "ALTER TABLE `logins` MODIFY `login_description` VARCHAR(500) DEFAULT NULL"); - - mysqli_query($mysqli, "ALTER TABLE `tickets` MODIFY `ticket_subject` VARCHAR(500) NOT NULL"); - - // Fix some some staggering ticket statuses that were still using a string and not a number - // forum.itflow.org/d/1248-bug-unable-to-update-database - // Update existing tickets to use new values - mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 1 WHERE ticket_status = 'New'"); // New - mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 2 WHERE ticket_status = 'Open'"); // Open - mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 3 WHERE ticket_status = 'On Hold'"); // On Hold - mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 4 WHERE ticket_status = 'Auto Close'"); // Auto Close - mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 5 WHERE ticket_status = 'Closed'"); // Closed - - mysqli_query($mysqli, "ALTER TABLE `tickets` MODIFY `ticket_status` INT(11) NOT NULL"); - - mysqli_query($mysqli, "ALTER TABLE `ticket_templates` MODIFY `ticket_template_subject` VARCHAR(500) DEFAULT NULL"); - - mysqli_query($mysqli, "ALTER TABLE `scheduled_tickets` MODIFY `scheduled_ticket_subject` VARCHAR(500) NOT NULL"); - - mysqli_query($mysqli, "ALTER TABLE `logs` MODIFY `log_description` VARCHAR(1000) NOT NULL"); - - mysqli_query($mysqli, "ALTER TABLE `notifications` MODIFY `notification` VARCHAR(1000) NOT NULL"); - - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.6.0'"); - } - - if (CURRENT_DATABASE_VERSION == '1.6.0') { - - mysqli_query($mysqli, "CREATE TABLE `asset_history` ( - `asset_history_id` INT(11) NOT NULL AUTO_INCREMENT, - `asset_history_status` VARCHAR(200) NOT NULL, - `asset_history_description` VARCHAR(255) NOT NULL, - `asset_history_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - `asset_history_asset_id` INT(11) NOT NULL, - PRIMARY KEY (`asset_history_id`) - )"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.6.1'"); - } - - if (CURRENT_DATABASE_VERSION == '1.6.1') { - - mysqli_query($mysqli, "CREATE TABLE `login_tags` (`login_id` int(11) NOT NULL,`tag_id` int(11) NOT NULL, PRIMARY KEY (`login_id`,`tag_id`))"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.6.2'"); - } - - if (CURRENT_DATABASE_VERSION == '1.6.2') { - - mysqli_query($mysqli, "ALTER TABLE `files` MODIFY `file_description` VARCHAR(250) DEFAULT NULL"); - mysqli_query($mysqli, "ALTER TABLE `files` MODIFY `file_ext` VARCHAR(10) DEFAULT NULL"); - mysqli_query($mysqli, "ALTER TABLE `files` ADD `file_created_by` INT(11) NOT NULL DEFAULT 0 AFTER `file_accessed_at`"); - mysqli_query($mysqli, "ALTER TABLE `files` ADD `file_size` BIGINT UNSIGNED NOT NULL DEFAULT 0 AFTER `file_ext`"); - mysqli_query($mysqli, "ALTER TABLE `files` ADD `file_mime_type` VARCHAR(100) DEFAULT NULL AFTER `file_hash`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.6.3'"); - } - - if (CURRENT_DATABASE_VERSION == '1.6.3') { - - // Find Files and update the Mime Type and File Size - - function scanDirectory($dir, $mysqli) { - $iterator = new RecursiveIteratorIterator( - new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS), - RecursiveIteratorIterator::SELF_FIRST - ); - - foreach ($iterator as $file) { - if ($file->isFile()) { - $file_path = $file->getPathname(); - $file_name = $file->getFilename(); - // Process the file - processFile($file_path, $file_name, $mysqli); - } - } - } - - function processFile($file_path, $file_name, $mysqli) { - // Get the file size - $file_size = filesize($file_path); - // Get the MIME type - $file_mime_type = mime_content_type($file_path); - - // Prepare a statement to check if the file exists in the database - $stmt_select = mysqli_prepare($mysqli, "SELECT file_id FROM files WHERE file_reference_name = ?"); - mysqli_stmt_bind_param($stmt_select, 's', $file_name); - mysqli_stmt_execute($stmt_select); - mysqli_stmt_store_result($stmt_select); - - if (mysqli_stmt_num_rows($stmt_select) > 0) { - // File exists in the database, proceed to update - $stmt_update = mysqli_prepare($mysqli, "UPDATE files SET file_mime_type = ?, file_size = ? WHERE file_reference_name = ?"); - mysqli_stmt_bind_param($stmt_update, 'sis', $file_mime_type, $file_size, $file_name); - - if (mysqli_stmt_execute($stmt_update)) { - echo "Updated: $file_name\n"; - } else { - echo "Error updating $file_name: " . mysqli_stmt_error($stmt_update) . "\n"; - } - mysqli_stmt_close($stmt_update); - } else { - echo "No database entry found for: $file_name\n"; - } - mysqli_stmt_close($stmt_select); - } - - // Define the uploads directory (modify the path if necessary) - $uploads_dir = __DIR__ . '/uploads'; - - // Start scanning from the uploads directory - scanDirectory($uploads_dir, $mysqli); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.6.4'"); - } - - if (CURRENT_DATABASE_VERSION == '1.6.4') { - - mysqli_query($mysqli, "CREATE TABLE `ticket_history` ( - `ticket_history_id` INT(11) NOT NULL AUTO_INCREMENT, - `ticket_history_status` VARCHAR(200) NOT NULL, - `ticket_history_description` VARCHAR(255) NOT NULL, - `ticket_history_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - `ticket_history_ticket_id` INT(11) NOT NULL, - PRIMARY KEY (`ticket_history_id`) - )"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.6.5'"); - } - - if (CURRENT_DATABASE_VERSION == '1.6.5') { - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_quote_notification_email` VARCHAR(200) DEFAULT NULL AFTER `config_quote_from_email`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.6.6'"); - } - - if (CURRENT_DATABASE_VERSION == '1.6.6') { - - mysqli_query($mysqli, "CREATE TABLE `contact_notes` ( - `contact_note_id` INT(11) NOT NULL AUTO_INCREMENT, - `contact_note_type` VARCHAR(200) NOT NULL, - `contact_note` TEXT NULL DEFAULT NULL, - `contact_note_created_by` INT(11) NOT NULL, - `contact_note_created_at` DATETIME NOT NULL DEFAULT current_timestamp(), - `contact_note_updated_at` DATETIME NULL DEFAULT NULL on update CURRENT_TIMESTAMP, - `contact_note_archived_at` DATETIME NULL DEFAULT NULL, - `contact_note_contact_id` INT(11) NOT NULL, - PRIMARY KEY (`contact_note_id`) - )"); - - mysqli_query($mysqli, "CREATE TABLE `client_notes` ( - `client_note_id` INT(11) NOT NULL AUTO_INCREMENT, - `client_note_type` VARCHAR(200) NOT NULL, - `client_note` TEXT NULL DEFAULT NULL, - `client_note_created_by` INT(11) NOT NULL, - `client_note_created_at` DATETIME NOT NULL DEFAULT current_timestamp(), - `client_note_updated_at` DATETIME NULL DEFAULT NULL on update CURRENT_TIMESTAMP, - `client_note_archived_at` DATETIME NULL DEFAULT NULL, - `client_note_client_id` INT(11) NOT NULL, - PRIMARY KEY (`client_note_id`) - )"); - - mysqli_query($mysqli, "CREATE TABLE `asset_notes` ( - `asset_note_id` INT(11) NOT NULL AUTO_INCREMENT, - `asset_note_type` VARCHAR(200) NOT NULL, - `asset_note` TEXT NULL DEFAULT NULL, - `asset_note_created_by` INT(11) NOT NULL, - `asset_note_created_at` DATETIME NOT NULL DEFAULT current_timestamp(), - `asset_note_updated_at` DATETIME NULL DEFAULT NULL on update CURRENT_TIMESTAMP, - `asset_note_archived_at` DATETIME NULL DEFAULT NULL, - `asset_note_asset_id` INT(11) NOT NULL, - PRIMARY KEY (`asset_note_id`) - )"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.6.7'"); - } - - if (CURRENT_DATABASE_VERSION == '1.6.7') { - - mysqli_query($mysqli, "CREATE TABLE `error_logs` ( - `error_log_id` INT(11) NOT NULL AUTO_INCREMENT, - `error_log_type` VARCHAR(200) NOT NULL, - `error_log_details` VARCHAR(1000) NULL DEFAULT NULL, - `error_log_created_at` DATETIME NOT NULL DEFAULT current_timestamp(), - PRIMARY KEY (`error_log_id`) - )"); - - mysqli_query($mysqli, "CREATE TABLE `auth_logs` ( - `auth_log_id` INT(11) NOT NULL AUTO_INCREMENT, - `auth_log_status` TINYINT(1) NOT NULL, - `auth_log_details` VARCHAR(200) NULL DEFAULT NULL, - `auth_log_ip` VARCHAR(200) NULL DEFAULT NULL, - `auth_log_user_agent` VARCHAR(250) NULL DEFAULT NULL, - `auth_log_user_id` INT(11) NOT NULL DEFAULT 0, - `auth_log_created_at` DATETIME NOT NULL DEFAULT current_timestamp(), - PRIMARY KEY (`auth_log_id`) - )"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.6.8'"); - } - - if (CURRENT_DATABASE_VERSION == '1.6.8') { - - // Create New Vendor Templates Table this eventual be used to seperate templates out of the vendors table - mysqli_query($mysqli, "CREATE TABLE `vendor_templates` (`vendor_template_id` int(11) AUTO_INCREMENT PRIMARY KEY, - `vendor_template_name` varchar(200) NOT NULL, - `vendor_template_description` varchar(200) NULL DEFAULT NULL, - `vendor_template_phone` varchar(200) NULL DEFAULT NULL, - `vendor_template_email` varchar(200) NULL DEFAULT NULL, - `vendor_template_website` varchar(200) NULL DEFAULT NULL, - `vendor_template_hours` varchar(200) NULL DEFAULT NULL, - `vendor_template_created_at` datetime DEFAULT CURRENT_TIMESTAMP, - `vendor_template_updated_at` datetime NULL ON UPDATE CURRENT_TIMESTAMP, - `vendor_template_archived_at` datetime NULL DEFAULT NULL - )"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.6.9'"); - } - - if (CURRENT_DATABASE_VERSION == '1.6.9') { - - mysqli_query($mysqli, "ALTER TABLE `files` ADD `file_has_thumbnail` TINYINT(1) NOT NULL DEFAULT 0 AFTER `file_mime_type`"); - mysqli_query($mysqli, "ALTER TABLE `files` ADD `file_has_preview` TINYINT(1) NOT NULL DEFAULT 0 AFTER `file_has_thumbnail`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.7.0'"); - } - - if (CURRENT_DATABASE_VERSION == '1.7.0') { - - mysqli_query($mysqli, "DROP TABLE `vendor_templates`"); - - mysqli_query($mysqli, "CREATE TABLE `vendor_contacts` ( - `vendor_contact_id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, - `vendor_contact_name` VARCHAR(200) NOT NULL, - `vendor_contact_title` VARCHAR(200) DEFAULT NULL, - `vendor_contact_department` VARCHAR(200) DEFAULT NULL, - `vendor_contact_email` VARCHAR(200) DEFAULT NULL, - `vendor_contact_phone` VARCHAR(200) DEFAULT NULL, - `vendor_contact_extension` VARCHAR(200) DEFAULT NULL, - `vendor_contact_mobile` VARCHAR(200) DEFAULT NULL, - `vendor_contact_notes` TEXT DEFAULT NULL, - `vendor_contact_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(), - `vendor_contact_updated_at` DATETIME NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(), - `vendor_contact_archived_at` DATETIME DEFAULT NULL, - `vendor_contact_vendor_id` INT(11) NOT NULL DEFAULT 0 - )"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.7.1'"); - } - - if (CURRENT_DATABASE_VERSION == '1.7.1') { - - mysqli_query($mysqli, "DROP TABLE `error_logs`"); - - mysqli_query($mysqli, "CREATE TABLE `app_logs` ( - `app_log_id` INT(11) NOT NULL AUTO_INCREMENT, - `app_log_category` VARCHAR(200) NULL DEFAULT NULL, - `app_log_type` ENUM('info', 'warning', 'error', 'debug') NOT NULL DEFAULT 'info', - `app_log_details` VARCHAR(1000) NULL DEFAULT NULL, - `app_log_created_at` DATETIME NOT NULL DEFAULT current_timestamp(), - PRIMARY KEY (`app_log_id`) - )"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.7.2'"); - } - - if (CURRENT_DATABASE_VERSION == '1.7.2') { - mysqli_query($mysqli, "ALTER TABLE `locations` ADD `location_fax` VARCHAR(200) DEFAULT NULL AFTER `location_phone`"); - - mysqli_query($mysqli, "DROP TABLE `vendor_contacts`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.7.3'"); - } - - if (CURRENT_DATABASE_VERSION == '1.7.3') { - - // Add Recurring Payments - mysqli_query($mysqli, "CREATE TABLE `recurring_payments` ( - `recurring_payment_id` INT(11) NOT NULL AUTO_INCREMENT, - `recurring_payment_amount` DECIMAL(15,2) NOT NULL, - `recurring_payment_currency_code` VARCHAR(10) NOT NULL, - `recurring_payment_method` VARCHAR(200) NOT NULL, - `recurring_payment_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(), - `recurring_payment_updated_at` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, - `recurring_payment_archived_at` DATETIME DEFAULT NULL, - `recurring_payment_account_id` INT(11) NOT NULL, - `recurring_payment_recurring_expense_id` INT(11) NOT NULL DEFAULT 0, - `recurring_payment_recurring_invoice_id` INT(11) NOT NULL, - PRIMARY KEY (`recurring_payment_id`) - )"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.7.4'"); - } - - if (CURRENT_DATABASE_VERSION == '1.7.4') { - - // Remove Recurring Payment Amount as it will use the Recurring Invoice Amount and is unessessary - mysqli_query($mysqli, "ALTER TABLE `recurring_payments` DROP `recurring_payment_amount`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.7.5'"); - } - - if (CURRENT_DATABASE_VERSION == '1.7.5') { - mysqli_query($mysqli, "CREATE TABLE `client_stripe` (`client_id` INT(11) NOT NULL, `stripe_id` VARCHAR(255) NOT NULL, `stripe_pm` varchar(255) NULL) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci; "); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.7.6'"); - } - - if (CURRENT_DATABASE_VERSION == '1.7.6') { - // Create a field to show connected interface of a foreign asset - mysqli_query($mysqli, "ALTER TABLE `asset_interfaces` ADD `interface_connected_asset_interface` INT(11) NOT NULL DEFAULT 0 AFTER `interface_network_id`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.7.7'"); - } - - if (CURRENT_DATABASE_VERSION == '1.7.7') { - // Domain history - mysqli_query($mysqli, "CREATE TABLE `domain_history` (`domain_history_id` INT(11) NOT NULL AUTO_INCREMENT , `domain_history_column` VARCHAR(200) NOT NULL , `domain_history_old_value` TEXT NOT NULL , `domain_history_new_value` TEXT NOT NULL , `domain_history_domain_id` INT(11) NOT NULL , `domain_history_modified_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP , PRIMARY KEY (`domain_history_id`)) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.7.8'"); - } - - if (CURRENT_DATABASE_VERSION == '1.7.8') { - - // Use a seperate table for Interface connections / links. This will make it easier to manage. - $createInterfaceLinksTable = " - CREATE TABLE IF NOT EXISTS `asset_interface_links` ( - `interface_link_id` INT AUTO_INCREMENT PRIMARY KEY, - `interface_a_id` INT NOT NULL, - `interface_b_id` INT NOT NULL, - `interface_link_type` VARCHAR(100) NULL, - `interface_link_status` VARCHAR(50) NULL, - `interface_link_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - `interface_link_updated_at` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP, - - CONSTRAINT `fk_interface_a` - FOREIGN KEY (`interface_a_id`) - REFERENCES `asset_interfaces` (`interface_id`) - ON DELETE CASCADE - ON UPDATE CASCADE, - - CONSTRAINT `fk_interface_b` - FOREIGN KEY (`interface_b_id`) - REFERENCES `asset_interfaces` (`interface_id`) - ON DELETE CASCADE - ON UPDATE CASCADE - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - "; - mysqli_query($mysqli, $createInterfaceLinksTable) or die(mysqli_error($mysqli)); - - // Drop the old column from asset_interfaces if it exists - $dropConnectedColumn = " - ALTER TABLE `asset_interfaces` - DROP COLUMN IF EXISTS `interface_connected_asset_interface` - "; - mysqli_query($mysqli, $dropConnectedColumn) or die(mysqli_error($mysqli)); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.7.9'"); - } - - if (CURRENT_DATABASE_VERSION == '1.7.9') { - - mysqli_query($mysqli, "ALTER TABLE `settings` DROP `config_cron_key`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.8.0'"); - } - - if (CURRENT_DATABASE_VERSION == '1.8.0') { - - mysqli_query($mysqli, "ALTER TABLE `ticket_statuses` ADD `ticket_status_order` int(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "ALTER TABLE `tickets` ADD `ticket_order` int(11) NOT NULL DEFAULT 0"); - - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_ticket_default_view` tinyint(1) NOT NULL DEFAULT 0"); - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_ticket_ordering` tinyint(1) NOT NULL DEFAULT 0"); - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_ticket_moving_columns` tinyint(1) NOT NULL DEFAULT 1"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.8.1'"); - } - - if (CURRENT_DATABASE_VERSION == '1.8.1') { - mysqli_query($mysqli, "ALTER TABLE `asset_interfaces` CHANGE `interface_port` `interface_description` VARCHAR(200) DEFAULT NULL AFTER `interface_name`"); - - mysqli_query($mysqli, "ALTER TABLE `asset_interfaces` ADD `interface_type` VARCHAR(50) DEFAULT NULL AFTER `interface_description`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.8.2'"); - } - - if (CURRENT_DATABASE_VERSION == '1.8.2') { - mysqli_query($mysqli, "CREATE TABLE `quote_files` ( - `quote_id` INT(11) NOT NULL, - `file_id` INT(11) NOT NULL, - PRIMARY KEY (`quote_id`, `file_id`) - )"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.8.3'"); - } - - if (CURRENT_DATABASE_VERSION == '1.8.3') { - mysqli_query($mysqli, "ALTER TABLE `assets` ADD `asset_purchase_reference` VARCHAR(200) DEFAULT NULL AFTER `asset_status`"); - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.8.4'"); - } - - if (CURRENT_DATABASE_VERSION == '1.8.4') { - mysqli_query($mysqli, "ALTER TABLE `logins` DROP `login_software_id`"); - mysqli_query($mysqli, "ALTER TABLE `logins` DROP `login_vendor_id`"); - mysqli_query($mysqli, "ALTER TABLE `software` DROP `software_login_id`"); - mysqli_query($mysqli, "ALTER TABLE `software` ADD `software_vendor_id` INT(11) DEFAULT 0 AFTER `software_accessed_at`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.8.5'"); - } - - if (CURRENT_DATABASE_VERSION == '1.8.5') { - mysqli_query($mysqli, "ALTER TABLE `software` ADD `software_purchase_reference` VARCHAR(200) DEFAULT NULL AFTER `software_seats`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.8.6'"); - } - - if (CURRENT_DATABASE_VERSION == '1.8.6') { - mysqli_query($mysqli, " - CREATE TABLE `certificate_history` (`certificate_history_id` INT(11) NOT NULL AUTO_INCREMENT, - `certificate_history_column` VARCHAR(200) NOT NULL, - `certificate_history_old_value` TEXT NOT NULL, - `certificate_history_new_value` TEXT NOT NULL, - `certificate_history_certificate_id` INT(11) NOT NULL, - `certificate_history_modified_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`certificate_history_id`)) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci; - "); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.8.7'"); - } - - if (CURRENT_DATABASE_VERSION == '1.8.7') { - mysqli_query($mysqli, "ALTER TABLE `tickets` ADD `ticket_first_response_at` DATETIME NULL DEFAULT NULL AFTER `ticket_archived_at`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.8.8'"); - } - - if (CURRENT_DATABASE_VERSION == '1.8.8') { - mysqli_query($mysqli, "ALTER TABLE `invoices` ADD `invoice_recurring_invoice_id` INT(11) NOT NULL DEFAULT 0 AFTER `invoice_category_id`"); - mysqli_query($mysqli, "ALTER TABLE `invoice_items` ADD `item_product_id` INT(11) NOT NULL DEFAULT 0 AFTER `item_tax_id`"); - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.8.9'"); - } - - if (CURRENT_DATABASE_VERSION == '1.8.9') { - mysqli_query($mysqli, "ALTER TABLE `users` ADD `user_role_id` INT(11) DEFAULT 0 AFTER `user_archived_at`"); - - // Copy user role from user settings table to the users table - mysqli_query($mysqli," - UPDATE `users` - JOIN `user_settings` ON users.user_id = user_settings.user_id - SET users.user_role_id = user_settings.user_role - "); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.0'"); - } - - if (CURRENT_DATABASE_VERSION == '1.9.0') { - mysqli_query($mysqli, "ALTER TABLE `user_settings` DROP `user_role`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.1'"); - } - - if (CURRENT_DATABASE_VERSION == '1.9.1') { - - mysqli_query($mysqli, - "ALTER TABLE `user_roles` - CHANGE COLUMN `user_role_id` `role_id` INT(11) NOT NULL AUTO_INCREMENT, - CHANGE COLUMN `user_role_name` `role_name` VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - CHANGE COLUMN `user_role_description` `role_description` VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - CHANGE COLUMN `user_role_type` `role_type` TINYINT(1) NOT NULL DEFAULT 1, - CHANGE COLUMN `user_role_is_admin` `role_is_admin` TINYINT(1) NOT NULL DEFAULT 0, - CHANGE COLUMN `user_role_created_at` `role_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(), - CHANGE COLUMN `user_role_updated_at` `role_updated_at` DATETIME NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(), - CHANGE COLUMN `user_role_archived_at` `role_archived_at` DATETIME NULL DEFAULT NULL - "); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.2'"); - } - - if (CURRENT_DATABASE_VERSION == '1.9.2') { - - mysqli_query($mysqli, "RENAME TABLE `user_permissions` TO `user_client_permissions`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.3'"); - } - - if (CURRENT_DATABASE_VERSION == '1.9.3') { - - // Now create the table with foreign keys - mysqli_query($mysqli, " - CREATE TABLE `ticket_assets` ( - `ticket_id` INT(11) NOT NULL, - `asset_id` INT(11) NOT NULL, - PRIMARY KEY (`ticket_id`, `asset_id`), - FOREIGN KEY (`asset_id`) REFERENCES `assets`(`asset_id`) ON DELETE CASCADE, - FOREIGN KEY (`ticket_id`) REFERENCES `tickets`(`ticket_id`) ON DELETE CASCADE - ) - "); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.4'"); - } - - if (CURRENT_DATABASE_VERSION == '1.9.4') { - mysqli_query($mysqli, "RENAME TABLE `scheduled_tickets` TO `recurring_tickets`"); - - mysqli_query($mysqli, - "ALTER TABLE `recurring_tickets` - CHANGE COLUMN `scheduled_ticket_id` `recurring_ticket_id` INT(11) NOT NULL AUTO_INCREMENT, - CHANGE COLUMN `scheduled_ticket_category` `recurring_ticket_category` VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - CHANGE COLUMN `scheduled_ticket_subject` `recurring_ticket_subject` VARCHAR(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - CHANGE COLUMN `scheduled_ticket_details` `recurring_ticket_details` LONGTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - CHANGE COLUMN `scheduled_ticket_priority` `recurring_ticket_priority` VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - CHANGE COLUMN `scheduled_ticket_frequency` `recurring_ticket_frequency` VARCHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - CHANGE COLUMN `scheduled_ticket_billable` `recurring_ticket_billable` TINYINT(1) NOT NULL DEFAULT 0, - CHANGE COLUMN `scheduled_ticket_start_date` `recurring_ticket_start_date` DATE NOT NULL, - CHANGE COLUMN `scheduled_ticket_next_run` `recurring_ticket_next_run` DATE NOT NULL, - CHANGE COLUMN `scheduled_ticket_created_at` `recurring_ticket_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(), - CHANGE COLUMN `scheduled_ticket_updated_at` `recurring_ticket_updated_at` DATETIME NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(), - CHANGE COLUMN `scheduled_ticket_created_by` `recurring_ticket_created_by` INT(11) NOT NULL DEFAULT 0, - CHANGE COLUMN `scheduled_ticket_assigned_to` `recurring_ticket_assigned_to` INT(11) NOT NULL DEFAULT 0, - CHANGE COLUMN `scheduled_ticket_client_id` `recurring_ticket_client_id` INT(11) NOT NULL DEFAULT 0, - CHANGE COLUMN `scheduled_ticket_contact_id` `recurring_ticket_contact_id` INT(11) NOT NULL DEFAULT 0, - CHANGE COLUMN `scheduled_ticket_asset_id` `recurring_ticket_asset_id` INT(11) NOT NULL DEFAULT 0 - " - ); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.5'"); - } - - if (CURRENT_DATABASE_VERSION == '1.9.5') { - - // create the table with foreign keys - mysqli_query($mysqli, " - CREATE TABLE `recurring_ticket_assets` ( - `recurring_ticket_id` INT(11) NOT NULL, - `asset_id` INT(11) NOT NULL, - PRIMARY KEY (`recurring_ticket_id`, `asset_id`), - FOREIGN KEY (`asset_id`) REFERENCES `assets`(`asset_id`) ON DELETE CASCADE, - FOREIGN KEY (`recurring_ticket_id`) REFERENCES `recurring_tickets`(`recurring_ticket_id`) ON DELETE CASCADE - ) - "); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.6'"); - } - - if (CURRENT_DATABASE_VERSION == '1.9.6') { - mysqli_query($mysqli, "RENAME TABLE `recurring` TO `recurring_invoices`"); - - mysqli_query($mysqli, " - ALTER TABLE `recurring_invoices` - CHANGE COLUMN `recurring_id` `recurring_invoice_id` INT(11) NOT NULL AUTO_INCREMENT, - CHANGE COLUMN `recurring_prefix` `recurring_invoice_prefix` VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - CHANGE COLUMN `recurring_number` `recurring_invoice_number` INT(11) NOT NULL, - CHANGE COLUMN `recurring_scope` `recurring_invoice_scope` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - CHANGE COLUMN `recurring_frequency` `recurring_invoice_frequency` VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - CHANGE COLUMN `recurring_last_sent` `recurring_invoice_last_sent` DATE NULL DEFAULT NULL, - CHANGE COLUMN `recurring_next_date` `recurring_invoice_next_date` DATE NOT NULL, - CHANGE COLUMN `recurring_status` `recurring_invoice_status` INT(1) NOT NULL, - CHANGE COLUMN `recurring_discount_amount` `recurring_invoice_discount_amount` DECIMAL(15,2) NOT NULL DEFAULT 0.00, - CHANGE COLUMN `recurring_amount` `recurring_invoice_amount` DECIMAL(15,2) NOT NULL DEFAULT 0.00, - CHANGE COLUMN `recurring_currency_code` `recurring_invoice_currency_code` VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - CHANGE COLUMN `recurring_note` `recurring_invoice_note` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - CHANGE COLUMN `recurring_created_at` `recurring_invoice_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(), - CHANGE COLUMN `recurring_updated_at` `recurring_invoice_updated_at` DATETIME NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(), - CHANGE COLUMN `recurring_archived_at` `recurring_invoice_archived_at` DATETIME NULL DEFAULT NULL, - CHANGE COLUMN `recurring_category_id` `recurring_invoice_category_id` INT(11) NOT NULL, - CHANGE COLUMN `recurring_client_id` `recurring_invoice_client_id` INT(11) NOT NULL - "); - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.7'"); - } - - if (CURRENT_DATABASE_VERSION == '1.9.7') { - - mysqli_query($mysqli, " - ALTER TABLE `settings` - CHANGE COLUMN `config_recurring_prefix` `config_recurring_invoice_prefix` VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - CHANGE COLUMN `config_recurring_next_number` `config_recurring_invoice_next_number` INT(11) NOT NULL DEFAULT 1 - "); - - mysqli_query($mysqli, " - ALTER TABLE `history` - CHANGE COLUMN `history_recurring_id` `history_recurring_invoice_id` INT(11) NOT NULL DEFAULT 0 - "); - - mysqli_query($mysqli, " - ALTER TABLE `invoice_items` - CHANGE COLUMN `item_recurring_id` `item_recurring_invoice_id` INT(11) NOT NULL DEFAULT 0 - "); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.8'"); - } - - if (CURRENT_DATABASE_VERSION == '1.9.8') { - // Reference a Recurring Ticket that generated ticket - mysqli_query($mysqli, "ALTER TABLE `tickets` ADD `ticket_recurring_ticket_id` INT(11) DEFAULT 0 AFTER `ticket_project_id`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.9'"); - } - - if (CURRENT_DATABASE_VERSION == '1.9.9') { - mysqli_query($mysqli, "RENAME TABLE `logins` TO `credentials`"); - mysqli_query($mysqli, " - ALTER TABLE `credentials` - CHANGE COLUMN `login_id` `credential_id` INT(11) NOT NULL AUTO_INCREMENT, - CHANGE COLUMN `login_name` `credential_name` VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - CHANGE COLUMN `login_description` `credential_description` VARCHAR(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - CHANGE COLUMN `login_category` `credential_category` VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - CHANGE COLUMN `login_uri` `credential_uri` VARCHAR(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - CHANGE COLUMN `login_uri_2` `credential_uri_2` VARCHAR(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - CHANGE COLUMN `login_username` `credential_username` VARCHAR(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - CHANGE COLUMN `login_password` `credential_password` VARBINARY(200) NULL DEFAULT NULL, - CHANGE COLUMN `login_otp_secret` `credential_otp_secret` VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - CHANGE COLUMN `login_note` `credential_note` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, - CHANGE COLUMN `login_important` `credential_important` TINYINT(1) NOT NULL DEFAULT '0', - CHANGE COLUMN `login_created_at` `credential_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(), - CHANGE COLUMN `login_updated_at` `credential_updated_at` DATETIME NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(), - CHANGE COLUMN `login_archived_at` `credential_archived_at` DATETIME NULL DEFAULT NULL, - CHANGE COLUMN `login_accessed_at` `credential_accessed_at` DATETIME NULL DEFAULT NULL, - CHANGE COLUMN `login_password_changed_at` `credential_password_changed_at` DATETIME NULL DEFAULT CURRENT_TIMESTAMP(), - CHANGE COLUMN `login_folder_id` `credential_folder_id` INT(11) NOT NULL DEFAULT '0', - CHANGE COLUMN `login_contact_id` `credential_contact_id` INT(11) NOT NULL DEFAULT '0', - CHANGE COLUMN `login_asset_id` `credential_asset_id` INT(11) NOT NULL DEFAULT '0', - CHANGE COLUMN `login_client_id` `credential_client_id` INT(11) NOT NULL DEFAULT '0' - "); - - // Rename table contact_logins to contact_credentials - mysqli_query($mysqli, "RENAME TABLE `contact_logins` TO `contact_credentials`"); - - // Alter contact_credentials table and change login_id to credential_id - mysqli_query($mysqli, " - ALTER TABLE `contact_credentials` - CHANGE COLUMN `login_id` `credential_id` INT(11) NOT NULL - "); - - // Clean up orphaned contact_id rows in contact_credentials - mysqli_query($mysqli, " - DELETE FROM `contact_credentials` - WHERE `contact_id` NOT IN (SELECT `contact_id` FROM `contacts`); - "); - - // Clean up orphaned credential_id rows in contact_credentials - mysqli_query($mysqli, " - DELETE FROM `contact_credentials` - WHERE `credential_id` NOT IN (SELECT `credential_id` FROM `credentials`); - "); - - // Add foreign keys to contact_credentials - mysqli_query($mysqli, " - ALTER TABLE `contact_credentials` - ADD FOREIGN KEY (`contact_id`) REFERENCES `contacts`(`contact_id`) ON DELETE CASCADE, - ADD FOREIGN KEY (`credential_id`) REFERENCES `credentials`(`credential_id`) ON DELETE CASCADE - "); - - // Rename table service_logins to service_credentials - mysqli_query($mysqli, "RENAME TABLE `service_logins` TO `service_credentials`"); - - // Alter service_credentials table and change login_id to credential_id - mysqli_query($mysqli, " - ALTER TABLE `service_credentials` - CHANGE COLUMN `login_id` `credential_id` INT(11) NOT NULL - "); - - // Clean up orphaned service_id rows in service_credentials - mysqli_query($mysqli, " - DELETE FROM `service_credentials` - WHERE `service_id` NOT IN (SELECT `service_id` FROM `services`); - "); - - // Clean up orphaned credential_id rows in service_credentials - mysqli_query($mysqli, " - DELETE FROM `service_credentials` - WHERE `credential_id` NOT IN (SELECT `credential_id` FROM `credentials`); - "); - - // Add foreign keys to service_credentials - mysqli_query($mysqli, " - ALTER TABLE `service_credentials` - ADD FOREIGN KEY (`service_id`) REFERENCES `services`(`service_id`) ON DELETE CASCADE, - ADD FOREIGN KEY (`credential_id`) REFERENCES `credentials`(`credential_id`) ON DELETE CASCADE - "); - - // Rename table software_logins to software_credentials - mysqli_query($mysqli, "RENAME TABLE `software_logins` TO `software_credentials`"); - - // Alter software_credentials table and change login_id to credential_id - mysqli_query($mysqli, " - ALTER TABLE `software_credentials` - CHANGE COLUMN `login_id` `credential_id` INT(11) NOT NULL - "); - - // Clean up orphaned software_id rows in software_credentials - mysqli_query($mysqli, " - DELETE FROM `software_credentials` - WHERE `software_id` NOT IN (SELECT `software_id` FROM `software`); - "); - - // Clean up orphaned credential_id rows in software_credentials - mysqli_query($mysqli, " - DELETE FROM `software_credentials` - WHERE `credential_id` NOT IN (SELECT `credential_id` FROM `credentials`); - "); - - // Add foreign keys to software_credentials - mysqli_query($mysqli, " - ALTER TABLE `software_credentials` - ADD FOREIGN KEY (`software_id`) REFERENCES `software`(`software_id`) ON DELETE CASCADE, - ADD FOREIGN KEY (`credential_id`) REFERENCES `credentials`(`credential_id`) ON DELETE CASCADE - "); - - // Rename table vendor_logins to vendor_credentials - mysqli_query($mysqli, "RENAME TABLE `vendor_logins` TO `vendor_credentials`"); - - // Alter vendor_credentials table and change login_id to credential_id - mysqli_query($mysqli, " - ALTER TABLE `vendor_credentials` - CHANGE COLUMN `login_id` `credential_id` INT(11) NOT NULL - "); - - // Clean up orphaned vendor_id rows in vendor_credentials - mysqli_query($mysqli, " - DELETE FROM `vendor_credentials` - WHERE `vendor_id` NOT IN (SELECT `vendor_id` FROM `vendors`); - "); - - // Clean up orphaned credential_id rows in vendor_credentials - mysqli_query($mysqli, " - DELETE FROM `vendor_credentials` - WHERE `credential_id` NOT IN (SELECT `credential_id` FROM `credentials`); - "); - - // Add foreign keys to vendor_credentials - mysqli_query($mysqli, " - ALTER TABLE `vendor_credentials` - ADD FOREIGN KEY (`vendor_id`) REFERENCES `vendors`(`vendor_id`) ON DELETE CASCADE, - ADD FOREIGN KEY (`credential_id`) REFERENCES `credentials`(`credential_id`) ON DELETE CASCADE - "); - - // Rename table login_tags to credential_tags - mysqli_query($mysqli, "RENAME TABLE `login_tags` TO `credential_tags`"); - - // Alter credential_tags table and change login_id to credential_id - mysqli_query($mysqli, " - ALTER TABLE `credential_tags` - CHANGE COLUMN `login_id` `credential_id` INT(11) NOT NULL - "); - - // Clean up orphaned tag_id rows in credential_tags - mysqli_query($mysqli, " - DELETE FROM `credential_tags` - WHERE `tag_id` NOT IN (SELECT `tag_id` FROM `tags`); - "); - - // Clean up orphaned credential_id rows in credential_tags - mysqli_query($mysqli, " - DELETE FROM `credential_tags` - WHERE `credential_id` NOT IN (SELECT `credential_id` FROM `credentials`); - "); - - // Add foreign keys to credential_tags - mysqli_query($mysqli, " - ALTER TABLE `credential_tags` - ADD FOREIGN KEY (`tag_id`) REFERENCES `tags`(`tag_id`) ON DELETE CASCADE, - ADD FOREIGN KEY (`credential_id`) REFERENCES `credentials`(`credential_id`) ON DELETE CASCADE - "); - - // Create asset_credentials table with foreign keys - mysqli_query($mysqli, " - CREATE TABLE `asset_credentials` ( - `credential_id` INT(11) NOT NULL, - `asset_id` INT(11) NOT NULL, - PRIMARY KEY (`credential_id`, `asset_id`), - FOREIGN KEY (`credential_id`) REFERENCES `credentials`(`credential_id`) ON DELETE CASCADE, - FOREIGN KEY (`asset_id`) REFERENCES `assets`(`asset_id`) ON DELETE CASCADE - ) - "); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.0.0'"); - } - - if (CURRENT_DATABASE_VERSION == '2.0.0') { - - //Dropping patch panel as a patch panel can be documented as an asset with interfaces. - mysqli_query($mysqli, "DROP TABLE `patch_panel_ports`"); - mysqli_query($mysqli, "DROP TABLE `patch_panels`"); - - mysqli_query($mysqli, "RENAME TABLE `events` TO `calendar_events`"); - mysqli_query($mysqli, "RENAME TABLE `event_attendees` TO `calendar_event_attendees`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.0.1'"); - } - - if (CURRENT_DATABASE_VERSION == '2.0.1') { - - // Clean up orphaned data before adding foreign keys - - // Clean up orphaned asset_custom_asset_id rows in asset_custom - mysqli_query($mysqli, " - DELETE FROM `asset_custom` - WHERE `asset_custom_asset_id` NOT IN (SELECT `asset_id` FROM `assets`); - "); - - // Add foreign key to asset_custom - mysqli_query($mysqli, " - ALTER TABLE `asset_custom` - ADD FOREIGN KEY (`asset_custom_asset_id`) REFERENCES `assets`(`asset_id`) ON DELETE CASCADE - "); - - // Clean up orphaned asset_id rows in asset_documents - mysqli_query($mysqli, " - DELETE FROM `asset_documents` - WHERE `asset_id` NOT IN (SELECT `asset_id` FROM `assets`); - "); - - // Clean up orphaned document_id rows in asset_documents - mysqli_query($mysqli, " - DELETE FROM `asset_documents` - WHERE `document_id` NOT IN (SELECT `document_id` FROM `documents`); - "); - - // Add foreign keys to asset_documents - mysqli_query($mysqli, " - ALTER TABLE `asset_documents` - ADD FOREIGN KEY (`asset_id`) REFERENCES `assets`(`asset_id`) ON DELETE CASCADE, - ADD FOREIGN KEY (`document_id`) REFERENCES `documents`(`document_id`) ON DELETE CASCADE - "); - - // Clean up orphaned asset_id rows in asset_files - mysqli_query($mysqli, " - DELETE FROM `asset_files` - WHERE `asset_id` NOT IN (SELECT `asset_id` FROM `assets`); - "); - - // Clean up orphaned file_id rows in asset_files - mysqli_query($mysqli, " - DELETE FROM `asset_files` - WHERE `file_id` NOT IN (SELECT `file_id` FROM `files`); - "); - - // Add foreign keys to asset_files - mysqli_query($mysqli, " - ALTER TABLE `asset_files` - ADD FOREIGN KEY (`asset_id`) REFERENCES `assets`(`asset_id`) ON DELETE CASCADE, - ADD FOREIGN KEY (`file_id`) REFERENCES `files`(`file_id`) ON DELETE CASCADE - "); - - // Clean up orphaned asset_history_asset_id rows in asset_history - mysqli_query($mysqli, " - DELETE FROM `asset_history` - WHERE `asset_history_asset_id` NOT IN (SELECT `asset_id` FROM `assets`); - "); - - // Add foreign key to asset_history - mysqli_query($mysqli, " - ALTER TABLE `asset_history` - ADD FOREIGN KEY (`asset_history_asset_id`) REFERENCES `assets`(`asset_id`) ON DELETE CASCADE - "); - - // Clean up orphaned interface_asset_id rows in asset_interfaces - mysqli_query($mysqli, " - DELETE FROM `asset_interfaces` - WHERE `interface_asset_id` NOT IN (SELECT `asset_id` FROM `assets`); - "); - - // Add foreign key to asset_interfaces - mysqli_query($mysqli, " - ALTER TABLE `asset_interfaces` - ADD FOREIGN KEY (`interface_asset_id`) REFERENCES `assets`(`asset_id`) ON DELETE CASCADE - "); - - // Clean up orphaned asset_note_asset_id rows in asset_notes - mysqli_query($mysqli, " - DELETE FROM `asset_notes` - WHERE `asset_note_asset_id` NOT IN (SELECT `asset_id` FROM `assets`); - "); - - // Add foreign key to asset_notes - mysqli_query($mysqli, " - ALTER TABLE `asset_notes` - ADD FOREIGN KEY (`asset_note_asset_id`) REFERENCES `assets`(`asset_id`) ON DELETE CASCADE - "); - - // Clean up orphaned contact_id rows in contact_assets - mysqli_query($mysqli, " - DELETE FROM `contact_assets` - WHERE `contact_id` NOT IN (SELECT `contact_id` FROM `contacts`); - "); - - // Clean up orphaned asset_id rows in contact_assets - mysqli_query($mysqli, " - DELETE FROM `contact_assets` - WHERE `asset_id` NOT IN (SELECT `asset_id` FROM `assets`); - "); - - // Add foreign keys to contact_assets - mysqli_query($mysqli, " - ALTER TABLE `contact_assets` - ADD FOREIGN KEY (`contact_id`) REFERENCES `contacts`(`contact_id`) ON DELETE CASCADE, - ADD FOREIGN KEY (`asset_id`) REFERENCES `assets`(`asset_id`) ON DELETE CASCADE - "); - - // Clean up orphaned service_id rows in service_assets - mysqli_query($mysqli, " - DELETE FROM `service_assets` - WHERE `service_id` NOT IN (SELECT `service_id` FROM `services`); - "); - - // Clean up orphaned asset_id rows in service_assets - mysqli_query($mysqli, " - DELETE FROM `service_assets` - WHERE `asset_id` NOT IN (SELECT `asset_id` FROM `assets`); - "); - - // Add foreign keys to service_assets - mysqli_query($mysqli, " - ALTER TABLE `service_assets` - ADD FOREIGN KEY (`service_id`) REFERENCES `services`(`service_id`) ON DELETE CASCADE, - ADD FOREIGN KEY (`asset_id`) REFERENCES `assets`(`asset_id`) ON DELETE CASCADE - "); - - // Clean up orphaned software_id rows in software_assets - mysqli_query($mysqli, " - DELETE FROM `software_assets` - WHERE `software_id` NOT IN (SELECT `software_id` FROM `software`); - "); - - // Clean up orphaned asset_id rows in software_assets - mysqli_query($mysqli, " - DELETE FROM `software_assets` - WHERE `asset_id` NOT IN (SELECT `asset_id` FROM `assets`); - "); - - // Add foreign keys to software_assets - mysqli_query($mysqli, " - ALTER TABLE `software_assets` - ADD FOREIGN KEY (`software_id`) REFERENCES `software`(`software_id`) ON DELETE CASCADE, - ADD FOREIGN KEY (`asset_id`) REFERENCES `assets`(`asset_id`) ON DELETE CASCADE - "); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.0.2'"); - } - - if (CURRENT_DATABASE_VERSION == '2.0.2') { - - // Clean up orphans - mysqli_query($mysqli, " - DELETE FROM `calendar_event_attendees` - WHERE `attendee_event_id` NOT IN (SELECT `event_id` FROM `calendar_events`); - "); - - mysqli_query($mysqli, " - DELETE FROM `calendar_events` - WHERE `event_calendar_id` NOT IN (SELECT `calendar_id` FROM `calendars`); - "); - - // Add foreign key to calendar_event_attendees - mysqli_query($mysqli, " - ALTER TABLE `calendar_event_attendees` - ADD FOREIGN KEY (`attendee_event_id`) REFERENCES `calendar_events`(`event_id`) ON DELETE CASCADE - "); - - // Add foreign key to calendar_events - mysqli_query($mysqli, " - ALTER TABLE `calendar_events` - ADD FOREIGN KEY (`event_calendar_id`) REFERENCES `calendars`(`calendar_id`) ON DELETE CASCADE - "); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.0.3'"); - } - - if (CURRENT_DATABASE_VERSION == '2.0.3') { - - // Clean up orphaned history - mysqli_query($mysqli, " - DELETE FROM `certificate_history` - WHERE `certificate_history_certificate_id` NOT IN (SELECT `certificate_id` FROM `certificates`); - "); - - // Add foreign key certificate history - mysqli_query($mysqli, " - ALTER TABLE `certificate_history` - ADD FOREIGN KEY (`certificate_history_certificate_id`) REFERENCES `certificates`(`certificate_id`) ON DELETE CASCADE - "); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.0.4'"); - } - - if (CURRENT_DATABASE_VERSION == '2.0.4') { - - // Clean up orphaned history - mysqli_query($mysqli, " - DELETE FROM `client_notes` - WHERE `client_note_client_id` NOT IN (SELECT `client_id` FROM `clients`); - "); - - // Add foreign key - mysqli_query($mysqli, " - ALTER TABLE `client_notes` - ADD FOREIGN KEY (`client_note_client_id`) REFERENCES `clients`(`client_id`) ON DELETE CASCADE - "); - - // Clean up orphaned history - mysqli_query($mysqli, " - DELETE FROM `client_tags` - WHERE `client_id` NOT IN (SELECT `client_id` FROM `clients`); - "); - - // Clean up orphaned history - mysqli_query($mysqli, " - DELETE FROM `client_tags` - WHERE `tag_id` NOT IN (SELECT `tag_id` FROM `tags`); - "); - - // Add foreign key - mysqli_query($mysqli, " - ALTER TABLE `client_tags` - ADD FOREIGN KEY (`client_id`) REFERENCES `clients`(`client_id`) ON DELETE CASCADE, - ADD FOREIGN KEY (`tag_id`) REFERENCES `tags`(`tag_id`) ON DELETE CASCADE - "); - - //Contact Assets - // Clean up orphaned history - mysqli_query($mysqli, " - DELETE FROM `contact_assets` - WHERE `contact_id` NOT IN (SELECT `contact_id` FROM `contacts`); - "); - - mysqli_query($mysqli, " - DELETE FROM `contact_assets` - WHERE `asset_id` NOT IN (SELECT `asset_id` FROM `assets`); - "); - - // Add foreign key - mysqli_query($mysqli, " - ALTER TABLE `contact_assets` - ADD FOREIGN KEY (`contact_id`) REFERENCES `contacts`(`contact_id`) ON DELETE CASCADE, - ADD FOREIGN KEY (`asset_id`) REFERENCES `assets`(`asset_id`) ON DELETE CASCADE - "); - - // Contact Documents - // Clean up orphaned history - mysqli_query($mysqli, " - DELETE FROM `contact_documents` - WHERE `contact_id` NOT IN (SELECT `contact_id` FROM `contacts`); - "); - - mysqli_query($mysqli, " - DELETE FROM `contact_documents` - WHERE `document_id` NOT IN (SELECT `document_id` FROM `documents`); - "); - - // Add foreign key - mysqli_query($mysqli, " - ALTER TABLE `contact_documents` - ADD FOREIGN KEY (`contact_id`) REFERENCES `contacts`(`contact_id`) ON DELETE CASCADE, - ADD FOREIGN KEY (`document_id`) REFERENCES `documents`(`document_id`) ON DELETE CASCADE - "); - - // contact_files - // Clean up orphaned rows - mysqli_query($mysqli, " - DELETE FROM `contact_files` - WHERE `contact_id` NOT IN (SELECT `contact_id` FROM `contacts`); - "); - - mysqli_query($mysqli, " - DELETE FROM `contact_files` - WHERE `file_id` NOT IN (SELECT `file_id` FROM `files`); - "); - - // Add foreign key - mysqli_query($mysqli, " - ALTER TABLE `contact_files` - ADD FOREIGN KEY (`contact_id`) REFERENCES `contacts`(`contact_id`) ON DELETE CASCADE, - ADD FOREIGN KEY (`file_id`) REFERENCES `files`(`file_id`) ON DELETE CASCADE - "); - - // contact_notes - // Clean up orphaned rows - mysqli_query($mysqli, " - DELETE FROM `contact_notes` - WHERE `contact_note_contact_id` NOT IN (SELECT `contact_id` FROM `contacts`); - "); - - // Add foreign key - mysqli_query($mysqli, " - ALTER TABLE `contact_notes` - ADD FOREIGN KEY (`contact_note_contact_id`) REFERENCES `contacts`(`contact_id`) ON DELETE CASCADE - "); - - // contact_tags - // Clean up orphaned rows - mysqli_query($mysqli, " - DELETE FROM `contact_tags` - WHERE `contact_id` NOT IN (SELECT `contact_id` FROM `contacts`); - "); - - mysqli_query($mysqli, " - DELETE FROM `contact_tags` - WHERE `tag_id` NOT IN (SELECT `tag_id` FROM `tags`); - "); - - // Add foreign key - mysqli_query($mysqli, " - ALTER TABLE `contact_tags` - ADD FOREIGN KEY (`contact_id`) REFERENCES `contacts`(`contact_id`) ON DELETE CASCADE, - ADD FOREIGN KEY (`tag_id`) REFERENCES `tags`(`tag_id`) ON DELETE CASCADE - "); - - // document_files - // Clean up orphaned rows - mysqli_query($mysqli, " - DELETE FROM `document_files` - WHERE `document_id` NOT IN (SELECT `document_id` FROM `documents`); - "); - - mysqli_query($mysqli, " - DELETE FROM `document_files` - WHERE `file_id` NOT IN (SELECT `file_id` FROM `files`); - "); - - // Add foreign key - mysqli_query($mysqli, " - ALTER TABLE `document_files` - ADD FOREIGN KEY (`document_id`) REFERENCES `documents`(`document_id`) ON DELETE CASCADE, - ADD FOREIGN KEY (`file_id`) REFERENCES `files`(`file_id`) ON DELETE CASCADE - "); - - // domain_history - // Clean up orphaned rows - mysqli_query($mysqli, " - DELETE FROM `domain_history` - WHERE `domain_history_domain_id` NOT IN (SELECT `domain_id` FROM `domains`); - "); - - // Add foreign key - mysqli_query($mysqli, " - ALTER TABLE `domain_history` - ADD FOREIGN KEY (`domain_history_domain_id`) REFERENCES `domains`(`domain_id`) ON DELETE CASCADE - "); - - // location_tags - // Clean up orphaned rows - mysqli_query($mysqli, " - DELETE FROM `location_tags` - WHERE `location_id` NOT IN (SELECT `location_id` FROM `locations`); - "); - mysqli_query($mysqli, " - DELETE FROM `location_tags` - WHERE `tag_id` NOT IN (SELECT `tag_id` FROM `tags`); - "); - // Add foreign key - mysqli_query($mysqli, " - ALTER TABLE `location_tags` - ADD FOREIGN KEY (`location_id`) REFERENCES `locations`(`location_id`) ON DELETE CASCADE, - ADD FOREIGN KEY (`tag_id`) REFERENCES `tags`(`tag_id`) ON DELETE CASCADE - "); - - // quote_files - // Clean up orphaned rows - mysqli_query($mysqli, " - DELETE FROM `quote_files` - WHERE `quote_id` NOT IN (SELECT `quote_id` FROM `quotes`); - "); - mysqli_query($mysqli, " - DELETE FROM `quote_files` - WHERE `file_id` NOT IN (SELECT `file_id` FROM `files`); - "); - // Add foreign key - mysqli_query($mysqli, " - ALTER TABLE `quote_files` - ADD FOREIGN KEY (`quote_id`) REFERENCES `quotes`(`quote_id`) ON DELETE CASCADE, - ADD FOREIGN KEY (`file_id`) REFERENCES `files`(`file_id`) ON DELETE CASCADE - "); - - // service_certificates - // Clean up orphaned rows - mysqli_query($mysqli, " - DELETE FROM `service_certificates` - WHERE `service_id` NOT IN (SELECT `service_id` FROM `services`); - "); - mysqli_query($mysqli, " - DELETE FROM `service_certificates` - WHERE `certificate_id` NOT IN (SELECT `certificate_id` FROM `certificates`); - "); - // Add foreign key - mysqli_query($mysqli, " - ALTER TABLE `service_certificates` - ADD FOREIGN KEY (`service_id`) REFERENCES `services`(`service_id`) ON DELETE CASCADE, - ADD FOREIGN KEY (`certificate_id`) REFERENCES `certificates`(`certificate_id`) ON DELETE CASCADE - "); - - // service_contacts - // Clean up orphaned rows - mysqli_query($mysqli, " - DELETE FROM `service_contacts` - WHERE `service_id` NOT IN (SELECT `service_id` FROM `services`); - "); - mysqli_query($mysqli, " - DELETE FROM `service_contacts` - WHERE `contact_id` NOT IN (SELECT `contact_id` FROM `contacts`); - "); - // Add foreign key - mysqli_query($mysqli, " - ALTER TABLE `service_contacts` - ADD FOREIGN KEY (`service_id`) REFERENCES `services`(`service_id`) ON DELETE CASCADE, - ADD FOREIGN KEY (`contact_id`) REFERENCES `contacts`(`contact_id`) ON DELETE CASCADE - "); - - // service_documents - // Clean up orphaned rows - mysqli_query($mysqli, " - DELETE FROM `service_documents` - WHERE `service_id` NOT IN (SELECT `service_id` FROM `services`); - "); - mysqli_query($mysqli, " - DELETE FROM `service_documents` - WHERE `document_id` NOT IN (SELECT `document_id` FROM `documents`); - "); - // Add foreign key - mysqli_query($mysqli, " - ALTER TABLE `service_documents` - ADD FOREIGN KEY (`service_id`) REFERENCES `services`(`service_id`) ON DELETE CASCADE, - ADD FOREIGN KEY (`document_id`) REFERENCES `documents`(`document_id`) ON DELETE CASCADE - "); - - // service_domains - // Clean up orphaned rows - mysqli_query($mysqli, " - DELETE FROM `service_domains` - WHERE `service_id` NOT IN (SELECT `service_id` FROM `services`); - "); - mysqli_query($mysqli, " - DELETE FROM `service_domains` - WHERE `domain_id` NOT IN (SELECT `domain_id` FROM `domains`); - "); - // Add foreign key - mysqli_query($mysqli, " - ALTER TABLE `service_domains` - ADD FOREIGN KEY (`service_id`) REFERENCES `services`(`service_id`) ON DELETE CASCADE, - ADD FOREIGN KEY (`domain_id`) REFERENCES `domains`(`domain_id`) ON DELETE CASCADE - "); - - // service_vendors - // Clean up orphaned rows - mysqli_query($mysqli, " - DELETE FROM `service_vendors` - WHERE `service_id` NOT IN (SELECT `service_id` FROM `services`); - "); - mysqli_query($mysqli, " - DELETE FROM `service_vendors` - WHERE `vendor_id` NOT IN (SELECT `vendor_id` FROM `vendors`); - "); - // Add foreign key - mysqli_query($mysqli, " - ALTER TABLE `service_vendors` - ADD FOREIGN KEY (`service_id`) REFERENCES `services`(`service_id`) ON DELETE CASCADE, - ADD FOREIGN KEY (`vendor_id`) REFERENCES `vendors`(`vendor_id`) ON DELETE CASCADE - "); - - // software_contacts - // Clean up orphaned rows - mysqli_query($mysqli, " - DELETE FROM `software_contacts` - WHERE `software_id` NOT IN (SELECT `software_id` FROM `software`); - "); - mysqli_query($mysqli, " - DELETE FROM `software_contacts` - WHERE `contact_id` NOT IN (SELECT `contact_id` FROM `contacts`); - "); - // Add foreign key - mysqli_query($mysqli, " - ALTER TABLE `software_contacts` - ADD FOREIGN KEY (`software_id`) REFERENCES `software`(`software_id`) ON DELETE CASCADE, - ADD FOREIGN KEY (`contact_id`) REFERENCES `contacts`(`contact_id`) ON DELETE CASCADE - "); - - // software_documents - // Clean up orphaned rows - mysqli_query($mysqli, " - DELETE FROM `software_documents` - WHERE `software_id` NOT IN (SELECT `software_id` FROM `software`); - "); - mysqli_query($mysqli, " - DELETE FROM `software_documents` - WHERE `document_id` NOT IN (SELECT `document_id` FROM `documents`); - "); - // Add foreign key - mysqli_query($mysqli, " - ALTER TABLE `software_documents` - ADD FOREIGN KEY (`software_id`) REFERENCES `software`(`software_id`) ON DELETE CASCADE, - ADD FOREIGN KEY (`document_id`) REFERENCES `documents`(`document_id`) ON DELETE CASCADE - "); - - // software_files - // Clean up orphaned rows - mysqli_query($mysqli, " - DELETE FROM `software_files` - WHERE `software_id` NOT IN (SELECT `software_id` FROM `software`); - "); - mysqli_query($mysqli, " - DELETE FROM `software_files` - WHERE `file_id` NOT IN (SELECT `file_id` FROM `files`); - "); - // Add foreign key - mysqli_query($mysqli, " - ALTER TABLE `software_files` - ADD FOREIGN KEY (`software_id`) REFERENCES `software`(`software_id`) ON DELETE CASCADE, - ADD FOREIGN KEY (`file_id`) REFERENCES `files`(`file_id`) ON DELETE CASCADE - "); - - // vendor_documents - // Clean up orphaned rows - mysqli_query($mysqli, " - DELETE FROM `vendor_documents` - WHERE `vendor_id` NOT IN (SELECT `vendor_id` FROM `vendors`); - "); - mysqli_query($mysqli, " - DELETE FROM `vendor_documents` - WHERE `document_id` NOT IN (SELECT `document_id` FROM `documents`); - "); - // Add foreign key - mysqli_query($mysqli, " - ALTER TABLE `vendor_documents` - ADD FOREIGN KEY (`vendor_id`) REFERENCES `vendors`(`vendor_id`) ON DELETE CASCADE, - ADD FOREIGN KEY (`document_id`) REFERENCES `documents`(`document_id`) ON DELETE CASCADE - "); - - // vendor_files - // Clean up orphaned rows - mysqli_query($mysqli, " - DELETE FROM `vendor_files` - WHERE `vendor_id` NOT IN (SELECT `vendor_id` FROM `vendors`); - "); - mysqli_query($mysqli, " - DELETE FROM `vendor_files` - WHERE `file_id` NOT IN (SELECT `file_id` FROM `files`); - "); - // Add foreign key - mysqli_query($mysqli, " - ALTER TABLE `vendor_files` - ADD FOREIGN KEY (`vendor_id`) REFERENCES `vendors`(`vendor_id`) ON DELETE CASCADE, - ADD FOREIGN KEY (`file_id`) REFERENCES `files`(`file_id`) ON DELETE CASCADE - "); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.0.5'"); - } - - if (CURRENT_DATABASE_VERSION == '2.0.5') { - - // CONVERT All tables TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci - - $tables = [ - 'accounts', 'api_keys', 'app_logs', 'asset_credentials', 'asset_custom', 'asset_documents', - 'asset_files', 'asset_history', 'asset_interface_links', 'asset_interfaces', 'asset_notes', 'assets', - 'auth_logs', 'budget', 'calendar_event_attendees', 'calendar_events', 'calendars', 'categories', - 'certificate_history', 'certificates', 'client_notes', 'client_stripe', 'client_tags', 'clients', - 'companies', 'contact_assets', 'contact_credentials', 'contact_documents', 'contact_files', 'contact_notes', - 'contact_tags', 'contacts', 'credential_tags', 'credentials', 'custom_fields', 'custom_links', - 'custom_values', 'document_files', 'documents', 'domain_history', 'domains', 'email_queue', 'expenses', - 'files', 'folders', 'history', 'invoice_items', 'invoices', 'location_tags', 'locations', 'logs', - 'modules', 'networks', 'notifications', 'payments', 'products', 'project_template_ticket_templates', - 'project_templates', 'projects', 'quote_files', 'quotes', 'rack_units', 'racks', 'records', - 'recurring_expenses', 'recurring_invoices', 'recurring_payments', 'recurring_ticket_assets', 'recurring_tickets', - 'remember_tokens', 'revenues', 'service_assets', 'service_certificates', 'service_contacts', 'service_credentials', - 'service_documents', 'service_domains', 'service_vendors', 'services', 'settings', 'shared_items', - 'software', 'software_assets', 'software_contacts', 'software_credentials', 'software_documents', 'software_files', - 'tags', 'task_templates', 'tasks', 'taxes', 'ticket_assets', 'ticket_attachments', 'ticket_history', 'ticket_replies', - 'ticket_statuses', 'ticket_templates', 'ticket_views', 'ticket_watchers', 'tickets', 'transfers', 'trips', - 'user_client_permissions', 'user_role_permissions', 'user_roles', 'user_settings', 'users', 'vendor_credentials', - 'vendor_documents', 'vendor_files', 'vendors' - ]; - - foreach ($tables as $table) { - $sql = "ALTER TABLE `$table` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"; - mysqli_query($mysqli, $sql); - } - - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.0.6'"); - } - - if (CURRENT_DATABASE_VERSION == '2.0.6') { - // Fix service_domains to yse InnoDB instead of MyISAM - mysqli_query($mysqli, "ALTER TABLE service_domains ENGINE = InnoDB;"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.0.7'"); - } - - if (CURRENT_DATABASE_VERSION == '2.0.7') { - - mysqli_query($mysqli, "ALTER TABLE `files` DROP `file_hash`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.0.8'"); - } - - if (CURRENT_DATABASE_VERSION == '2.0.8') { - - mysqli_query($mysqli, "ALTER TABLE `files` DROP `file_has_thumbnail`"); - mysqli_query($mysqli, "ALTER TABLE `files` DROP `file_has_preview`"); - mysqli_query($mysqli, "ALTER TABLE `files` DROP `file_asset_id`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.0.9'"); - } - - if (CURRENT_DATABASE_VERSION == '2.0.9') { - - mysqli_query($mysqli, "ALTER TABLE `contacts` ADD `contact_phone_country_code` VARCHAR(10) DEFAULT 1 AFTER `contact_email`"); - mysqli_query($mysqli, "ALTER TABLE `contacts` ADD `contact_mobile_country_code` VARCHAR(10) DEFAULT 1 AFTER `contact_extension`"); - - mysqli_query($mysqli, "ALTER TABLE `locations` ADD `location_phone_country_code` VARCHAR(10) DEFAULT 1 AFTER `location_zip`"); - mysqli_query($mysqli, "ALTER TABLE `locations` ADD `location_phone_extension` VARCHAR(10) DEFAULT NULL AFTER `location_phone`"); - mysqli_query($mysqli, "ALTER TABLE `locations` ADD `location_fax_country_code` VARCHAR(10) DEFAULT 1 AFTER `location_phone_extension`"); - - mysqli_query($mysqli, "ALTER TABLE `vendors` ADD `vendor_phone_country_code` VARCHAR(10) DEFAULT 1 AFTER `vendor_contact_name`"); - - mysqli_query($mysqli, "ALTER TABLE `companies` ADD `company_phone_country_code` VARCHAR(10) DEFAULT 1 AFTER `company_country`"); - - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.1.0'"); - } - - if (CURRENT_DATABASE_VERSION == '2.1.0') { - mysqli_query($mysqli, "ALTER TABLE `user_settings` ADD `user_config_signature` TEXT DEFAULT NULL AFTER `user_config_calendar_first_day`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.1.1'"); - } - - if (CURRENT_DATABASE_VERSION == '2.1.1') { - mysqli_query($mysqli, "ALTER TABLE `settings` DROP `config_phone_mask`"); - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.1.2'"); - } - - if (CURRENT_DATABASE_VERSION == '2.1.2') { - - // Update country_code to NULL for `contacts` table - mysqli_query($mysqli, "ALTER TABLE `contacts` MODIFY `contact_phone_country_code` VARCHAR(10) DEFAULT NULL"); - mysqli_query($mysqli, "ALTER TABLE `contacts` MODIFY `contact_mobile_country_code` VARCHAR(10) DEFAULT NULL"); - - // Update country_code to NULL for `locations` table - mysqli_query($mysqli, "ALTER TABLE `locations` MODIFY `location_phone_country_code` VARCHAR(10) DEFAULT NULL"); - mysqli_query($mysqli, "ALTER TABLE `locations` MODIFY `location_fax_country_code` VARCHAR(10) DEFAULT NULL"); - - // Update country_code to NULL for `vendors` table - mysqli_query($mysqli, "ALTER TABLE `vendors` MODIFY `vendor_phone_country_code` VARCHAR(10) DEFAULT NULL"); - - // Update country_code to NULL for `companies` table - mysqli_query($mysqli, "ALTER TABLE `companies` MODIFY `company_phone_country_code` VARCHAR(10) DEFAULT NULL"); - - // Set country_code to NULL for `contacts` table - mysqli_query($mysqli, "UPDATE `contacts` SET `contact_phone_country_code` = NULL"); - mysqli_query($mysqli, "UPDATE `contacts` SET `contact_mobile_country_code` = NULL"); - - // Set country_code to NULL for `locations` table - mysqli_query($mysqli, "UPDATE `locations` SET `location_phone_country_code` = NULL"); - mysqli_query($mysqli, "UPDATE `locations` SET `location_fax_country_code` = NULL"); - - // Set country_code to NULL for `vendors` table - mysqli_query($mysqli, "UPDATE `vendors` SET `vendor_phone_country_code` = NULL"); - - // Set country_code to NULL for `companies` table - mysqli_query($mysqli, "UPDATE `companies` SET `company_phone_country_code` = NULL"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.1.3'"); - } - - if (CURRENT_DATABASE_VERSION == '2.1.3') { - mysqli_query($mysqli, "ALTER TABLE `client_stripe` ADD `stripe_pm_details` VARCHAR(200) DEFAULT NULL AFTER `stripe_pm`"); - mysqli_query($mysqli, "ALTER TABLE `client_stripe` ADD `stripe_pm_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER `stripe_pm_details`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.1.4'"); - } - - if (CURRENT_DATABASE_VERSION == '2.1.4') { - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_ticket_timer_autostart` TINYINT(1) NOT NULL DEFAULT '0' AFTER `config_ticket_default_billable`"); - mysqli_query($mysqli, "ALTER TABLE `tickets` ADD `ticket_due_at` DATETIME DEFAULT NULL AFTER `ticket_updated_at`"); - mysqli_query($mysqli, "ALTER TABLE `companies` ADD `company_tax_id` VARCHAR(200) DEFAULT NULL AFTER `company_currency`"); - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_invoice_show_tax_id` TINYINT(1) NOT NULL DEFAULT '0' AFTER `config_invoice_paid_notification_email`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.1.5'"); - } - - if (CURRENT_DATABASE_VERSION == '2.1.5') { - - mysqli_query($mysqli, "CREATE TABLE `document_versions` ( - `document_version_id` INT(11) NOT NULL AUTO_INCREMENT, - `document_version_name` VARCHAR(200) NOT NULL, - `document_version_description` TEXT DEFAULT NULL, - `document_version_content` LONGTEXT NOT NULL, - `document_version_created_by` INT(11) DEFAULT 0, - `document_version_created_at` DATETIME NOT NULL, - `document_version_document_id` INT(11) NOT NULL, - PRIMARY KEY (`document_version_id`) - )"); - - // Delete all Current Document Versions - mysqli_query($mysqli, " - DELETE FROM `documents` - WHERE `document_parent` > 0 AND `document_parent` != `document_id` - "); - - mysqli_query($mysqli, "ALTER TABLE `documents` DROP `document_parent`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.1.6'"); - } - - if (CURRENT_DATABASE_VERSION == '2.1.6') { - mysqli_query($mysqli, "CREATE TABLE `document_templates` ( - `document_template_id` INT(11) NOT NULL AUTO_INCREMENT, - `document_template_name` VARCHAR(200) NOT NULL, - `document_template_description` TEXT DEFAULT NULL, - `document_template_content` LONGTEXT NOT NULL, - `document_template_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - `document_template_updated_at` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP, - `document_template_archived_at` DATETIME NULL DEFAULT NULL, - `document_template_created_by` INT(11) NOT NULL DEFAULT 0, - `document_template_updated_by` INT(11) NOT NULL DEFAULT 0, - PRIMARY KEY (`document_template_id`) - )"); - - // Copy Document Templates over to new document templates table - mysqli_query($mysqli, " - INSERT INTO document_templates ( - document_template_name, - document_template_description, - document_template_content, - document_template_created_at, - document_template_updated_at, - document_template_archived_at, - document_template_created_by, - document_template_updated_by - ) - SELECT - document_name, - document_description, - document_content, - document_created_at, - document_updated_at, - document_archived_at, - document_created_by, - document_updated_by - FROM - documents - WHERE - document_template = 1 - "); - - mysqli_query($mysqli, "DELETE FROM documents WHERE document_template = 1"); - - mysqli_query($mysqli, "ALTER TABLE `documents` DROP `document_template`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.1.7'"); - } - - if (CURRENT_DATABASE_VERSION == '2.1.7') { - mysqli_query($mysqli, "CREATE TABLE `software_templates` ( - `software_template_id` INT(11) NOT NULL AUTO_INCREMENT, - `software_template_name` VARCHAR(200) NOT NULL, - `software_template_description` TEXT DEFAULT NULL, - `software_template_version` VARCHAR(200) DEFAULT NULL, - `software_template_type` VARCHAR(200) NOT NULL, - `software_template_license_type` VARCHAR(200) DEFAULT NULL, - `software_template_notes` TEXT DEFAULT NULL, - `software_template_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - `software_template_updated_at` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP, - `software_template_archived_at` DATETIME NULL DEFAULT NULL, - PRIMARY KEY (`software_template_id`) - )"); - - // Copy software Templates over to new software templates table - mysqli_query($mysqli, " - INSERT INTO software_templates ( - software_template_name, - software_template_description, - software_template_version, - software_template_type, - software_template_license_type, - software_template_notes, - software_template_created_at, - software_template_updated_at, - software_template_archived_at - ) - SELECT - software_name, - software_description, - software_version, - software_type, - software_license_type, - software_notes, - software_created_at, - software_updated_at, - software_archived_at - FROM - software - WHERE - software_template = 1 - "); - - mysqli_query($mysqli, "DELETE FROM software WHERE software_template = 1"); - - mysqli_query($mysqli, "ALTER TABLE `software` DROP `software_template`"); - - mysqli_query($mysqli, "ALTER TABLE `software` DROP `software_template_id`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.1.8'"); - } - - if (CURRENT_DATABASE_VERSION == '2.1.8') { - mysqli_query($mysqli, "CREATE TABLE `vendor_templates` ( - `vendor_template_id` INT(11) NOT NULL AUTO_INCREMENT, - `vendor_template_name` VARCHAR(200) NOT NULL, - `vendor_template_description` VARCHAR(200) DEFAULT NULL, - `vendor_template_contact_name` VARCHAR(200) DEFAULT NULL, - `vendor_template_phone_country_code` VARCHAR(10) DEFAULT NULL, - `vendor_template_phone` VARCHAR(200) DEFAULT NULL, - `vendor_template_extension` VARCHAR(200) DEFAULT NULL, - `vendor_template_email` VARCHAR(200) DEFAULT NULL, - `vendor_template_website` VARCHAR(200) DEFAULT NULL, - `vendor_template_hours` VARCHAR(200) DEFAULT NULL, - `vendor_template_sla` VARCHAR(200) DEFAULT NULL, - `vendor_template_code` VARCHAR(200) DEFAULT NULL, - `vendor_template_account_number` VARCHAR(200) DEFAULT NULL, - `vendor_template_notes` TEXT DEFAULT NULL, - `vendor_template_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - `vendor_template_updated_at` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP, - `vendor_template_archived_at` DATETIME NULL DEFAULT NULL, - PRIMARY KEY (`vendor_template_id`) - )"); - - // Copy Vendor Templates over to new vendor templates table - mysqli_query($mysqli, " - INSERT INTO vendor_templates ( - vendor_template_name, - vendor_template_description, - vendor_template_contact_name, - vendor_template_phone_country_code, - vendor_template_phone, - vendor_template_extension, - vendor_template_email, - vendor_template_website, - vendor_template_hours, - vendor_template_sla, - vendor_template_code, - vendor_template_account_number, - vendor_template_notes, - vendor_template_created_at, - vendor_template_updated_at, - vendor_template_archived_at - ) - SELECT - vendor_name, - vendor_description, - vendor_contact_name, - vendor_phone_country_code, - vendor_phone, - vendor_extension, - vendor_email, - vendor_website, - vendor_hours, - vendor_sla, - vendor_code, - vendor_account_number, - vendor_notes, - vendor_created_at, - vendor_updated_at, - vendor_archived_at - FROM - vendors - WHERE - vendor_template = 1 - "); - - mysqli_query($mysqli, "DELETE FROM vendors WHERE vendor_template = 1"); - - mysqli_query($mysqli, "ALTER TABLE `vendors` DROP `vendor_template`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.1.9'"); - } - - if (CURRENT_DATABASE_VERSION == '2.1.9') { - mysqli_query($mysqli, "ALTER TABLE `companies` MODIFY `company_currency` VARCHAR(200) DEFAULT 'USD'"); - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.2.0'"); - } - - if (CURRENT_DATABASE_VERSION == '2.2.0') { - mysqli_query($mysqli, "ALTER TABLE `tickets` ADD `ticket_quote_id` INT(11) NOT NULL DEFAULT 0 AFTER `ticket_asset_id`"); - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.2.1'"); - } - - if (CURRENT_DATABASE_VERSION == '2.2.1') { - mysqli_query($mysqli, "CREATE TABLE `ai_providers` ( - `ai_provider_id` INT(11) NOT NULL AUTO_INCREMENT, - `ai_provider_name` VARCHAR(200) NOT NULL, - `ai_provider_api_url` VARCHAR(200) NOT NULL, - `ai_provider_api_key` VARCHAR(200) DEFAULT NULL, - `ai_provider_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - `ai_provider_updated_at` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`ai_provider_id`) - )"); - - mysqli_query($mysqli, " - CREATE TABLE `ai_models` ( - `ai_model_id` INT(11) NOT NULL AUTO_INCREMENT, - `ai_model_name` VARCHAR(200) NOT NULL, - `ai_model_prompt` TEXT DEFAULT NULL, - `ai_model_use_case` VARCHAR(200) DEFAULT NULL, - `ai_model_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - `ai_model_updated_at` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP, - `ai_model_ai_provider_id` INT(11) NOT NULL, - PRIMARY KEY (`ai_model_id`), - FOREIGN KEY (`ai_model_ai_provider_id`) - REFERENCES `ai_providers`(`ai_provider_id`) - ON DELETE CASCADE - ) - "); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.2.2'"); - } - - if (CURRENT_DATABASE_VERSION == '2.2.2') { - mysqli_query($mysqli, "CREATE TABLE `payment_methods` ( - `payment_method_id` INT(11) NOT NULL AUTO_INCREMENT, - `payment_method_name` VARCHAR(200) NOT NULL, - `payment_method_description` VARCHAR(250) DEFAULT NULL, - `payment_method_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - `payment_method_updated_at` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`payment_method_id`) - )"); - - mysqli_query($mysqli, "CREATE TABLE `payment_providers` ( - `payment_provider_id` INT(11) NOT NULL AUTO_INCREMENT, - `payment_provider_name` VARCHAR(200) NOT NULL, - `payment_provider_description` VARCHAR(250) DEFAULT NULL, - `payment_provider_public_key` VARCHAR(250) DEFAULT NULL, - `payment_provider_private_key` VARCHAR(250) DEFAULT NULL, - `payment_provider_threshold` DECIMAL(15,2) DEFAULT NULL, - `payment_provider_active` TINYINT(1) NOT NULL DEFAULT 1, - `payment_provider_account` INT(11) NOT NULL, - `payment_provider_expense_vendor` INT(11) NOT NULL DEFAULT 0, - `payment_provider_expense_category` INT(11) NOT NULL DEFAULT 0, - `payment_provider_expense_percentage_fee` DECIMAL(4,4) DEFAULT NULL, - `payment_provider_expense_flat_fee` DECIMAL(15,2) DEFAULT NULL, - `payment_provider_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - `payment_provider_updated_at` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`payment_provider_id`) - )"); - - mysqli_query($mysqli, "CREATE TABLE `client_saved_payment_methods` ( - `saved_payment_id` INT(11) NOT NULL AUTO_INCREMENT, - `saved_payment_provider_method` VARCHAR(200) NOT NULL, - `saved_payment_description` VARCHAR(200) DEFAULT NULL, - `saved_payment_client_id` INT(11) NOT NULL, - `saved_payment_provider_id` INT(11) NOT NULL, - `saved_payment_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - `saved_payment_updated_at` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`saved_payment_id`), - FOREIGN KEY (`saved_payment_client_id`) REFERENCES clients(`client_id`) ON DELETE CASCADE, - FOREIGN KEY (`saved_payment_provider_id`) REFERENCES payment_providers(`payment_provider_id`) ON DELETE CASCADE - )"); - - mysqli_query($mysqli, "CREATE TABLE `client_payment_provider` ( - `client_id` INT(11) NOT NULL, - `payment_provider_id` INT(11) NOT NULL, - `payment_provider_client` VARCHAR(200) NOT NULL, - `client_payment_provider_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`client_id`, `payment_provider_id`), - FOREIGN KEY (`client_id`) REFERENCES clients(`client_id`) ON DELETE CASCADE, - FOREIGN KEY (`payment_provider_id`) REFERENCES payment_providers(`payment_provider_id`) ON DELETE CASCADE - )"); - - mysqli_query($mysqli, "ALTER TABLE `recurring_payments` ADD `recurring_payment_saved_payment_id` INT(11) DEFAULT NULL AFTER `recurring_payment_recurring_invoice_id`"); - - mysqli_query($mysqli, "ALTER TABLE `recurring_payments` ADD CONSTRAINT `fk_recurring_saved_payment` FOREIGN KEY (`recurring_payment_saved_payment_id`) REFERENCES `client_saved_payment_methods`(`saved_payment_id`) ON DELETE CASCADE"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.2.3'"); - } - - if (CURRENT_DATABASE_VERSION == '2.2.3') { - - mysqli_query($mysqli, "CREATE TABLE `credits` ( - `credit_id` INT(11) NOT NULL AUTO_INCREMENT, - `credit_amount` DECIMAL(15,2) NOT NULL, - `credit_reference` VARCHAR(250) DEFAULT NULL, - `credit_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(), - `credit_created_by` INT(11) NOT NULL, - `credit_expire_at` DATE DEFAULT NULL, - `credit_client_id` INT(11) NOT NULL, - PRIMARY KEY (`credit_id`) - )"); - - mysqli_query($mysqli, "ALTER TABLE `invoices` ADD `invoice_credit_amount` DECIMAL(15,2) NOT NULL DEFAULT 0.00 AFTER `invoice_discount_amount`"); - - mysqli_query($mysqli, "CREATE TABLE `discount_codes` ( - `discount_code_id` INT(11) NOT NULL AUTO_INCREMENT, - `discount_code_description` VARCHAR(250) DEFAULT NULL, - `discount_code_amount` DECIMAL(15,2) NOT NULL, - `discount_code` VARCHAR(200) NOT NULL, - `discount_code_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(), - `discount_code_created_by` INT(11) NOT NULL, - `discount_code_updated_at` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP, - `discount_code_archived_at` DATETIME NULL DEFAULT NULL, - `discount_code_expire_at` DATE DEFAULT NULL, - PRIMARY KEY (`discount_code_id`) - )"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.2.4'"); +// Collect and order the migration files by version (glob sorts alphabetically, +// which would put 2.4.10 before 2.4.9 - version_compare gets it right) +$database_update_files = []; +foreach (glob(__DIR__ . "/database_updates/*.php") as $file) { + $version = basename($file, ".php"); + if (preg_match('/^\d+(\.\d+)+$/', $version)) { + $database_update_files[$version] = $file; } - - if (CURRENT_DATABASE_VERSION == '2.2.4') { - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_theme_dark` TINYINT(1) NOT NULL DEFAULT 0 AFTER `config_theme`"); - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.2.5'"); - } - - if (CURRENT_DATABASE_VERSION == '2.2.5') { - mysqli_query($mysqli, "ALTER TABLE `assets` ADD `asset_uri_client` VARCHAR(500) NULL DEFAULT NULL AFTER `asset_uri_2`"); - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.2.6'"); - } - - if (CURRENT_DATABASE_VERSION == '2.2.6') { - mysqli_query($mysqli, "ALTER TABLE `credits` DROP `credit_reference`"); - mysqli_query($mysqli, "ALTER TABLE `credits` ADD `credit_type` ENUM('prepaid', 'manual', 'refund', 'promotion', 'usage') NOT NULL DEFAULT 'manual' AFTER `credit_amount`"); - mysqli_query($mysqli, "ALTER TABLE `credits` ADD `credit_note` TEXT NULL DEFAULT NULL AFTER `credit_type`"); - mysqli_query($mysqli, "ALTER TABLE `credits` ADD `credit_invoice_id` INT(11) NULL DEFAULT NULL AFTER `credit_expire_at`"); - mysqli_query($mysqli, "ALTER TABLE `credits` ADD INDEX (`credit_client_id`)"); - mysqli_query($mysqli, "ALTER TABLE `credits` ADD INDEX (`credit_invoice_id`)"); - mysqli_query($mysqli, "ALTER TABLE `credits` ADD INDEX (`credit_created_at`)"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.2.7'"); - } - - if (CURRENT_DATABASE_VERSION == '2.2.7') { - mysqli_query($mysqli, "ALTER TABLE `user_settings` ADD `user_config_theme_dark` TINYINT(1) NOT NULL DEFAULT 0 AFTER `user_config_signature`"); - mysqli_query($mysqli, "ALTER TABLE `settings` DROP `config_theme_dark`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.2.8'"); - } - - if (CURRENT_DATABASE_VERSION == '2.2.8') { - - mysqli_query($mysqli, "ALTER TABLE `products` ADD `product_type` ENUM('service', 'product') NOT NULL DEFAULT 'service' AFTER `product_name`"); - mysqli_query($mysqli, "ALTER TABLE `products` ADD `product_code` VARCHAR(200) DEFAULT NULL AFTER `product_description`"); - mysqli_query($mysqli, "ALTER TABLE `products` ADD `product_location` VARCHAR(250) DEFAULT NULL AFTER `product_code`"); - - mysqli_query($mysqli, "CREATE TABLE `product_stock` ( - `stock_id` INT(11) NOT NULL AUTO_INCREMENT, - `stock_qty` INT(11) NOT NULL, - `stock_note` TEXT DEFAULT NULL, - `stock_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(), - `stock_expense_id` INT(11) DEFAULT NULL, - `stock_item_id` INT(11) DEFAULT NULL, - `stock_product_id` INT(11) NOT NULL, - PRIMARY KEY (`stock_id`) - )"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.2.9'"); - } - - if (CURRENT_DATABASE_VERSION == '2.2.9') { - // Migrate Stripe Settings over to new Tables - - // Get Current Stripe Settings - $sql_stripe_settings = mysqli_query($mysqli, "SELECT * FROM settings WHERE company_id = 1"); - $row = mysqli_fetch_assoc($sql_stripe_settings); - $config_stripe_enable = intval($row['config_stripe_enable']); - if ($config_stripe_enable === 1) { - $config_stripe_publishable = mysqli_real_escape_string($mysqli, $row['config_stripe_publishable']); - $config_stripe_secret = mysqli_real_escape_string($mysqli, $row['config_stripe_secret']); - $config_stripe_account = intval($row['config_stripe_account']); - $config_stripe_expense_vendor = intval($row['config_stripe_expense_vendor']); - $config_stripe_expense_category = intval($row['config_stripe_expense_category']); - $config_stripe_percentage_fee = floatval($row['config_stripe_percentage_fee']); - $config_stripe_flat_fee = floatval($row['config_stripe_flat_fee']); - - mysqli_query($mysqli,"INSERT INTO payment_providers SET - payment_provider_name = 'Stripe', - payment_provider_public_key = '$config_stripe_publishable', - payment_provider_private_key = '$config_stripe_secret', - payment_provider_account = $config_stripe_account, - payment_provider_expense_vendor = $config_stripe_expense_vendor, - payment_provider_expense_category = $config_stripe_expense_category, - payment_provider_expense_percentage_fee = $config_stripe_percentage_fee, - payment_provider_expense_flat_fee = $config_stripe_flat_fee" - ); - - $provider_id = mysqli_insert_id($mysqli); - - // Migrate Clients and Payment Method over - $sql_stripe_clients = mysqli_query($mysqli, "SELECT * FROM client_stripe WHERE stripe_pm IS NOT NULL AND stripe_pm != ''"); - while ($row = mysqli_fetch_assoc($sql_stripe_clients)) { - $client_id = intval($row['client_id']); - $stripe_id = mysqli_real_escape_string($mysqli, $row['stripe_id']); - $stripe_pm = mysqli_real_escape_string($mysqli, $row['stripe_pm']); - $stripe_pm_details = mysqli_real_escape_string($mysqli, $row['stripe_pm_details'] ?? 'Saved Card'); - - mysqli_query($mysqli,"INSERT INTO client_payment_provider SET - client_id = $client_id, - payment_provider_id = $provider_id, - payment_provider_client = '$stripe_id'" - ); - - mysqli_query($mysqli,"INSERT INTO client_saved_payment_methods SET - saved_payment_provider_method = '$stripe_pm', - saved_payment_description = '$stripe_pm_details', - saved_payment_client_id = $client_id, - saved_payment_provider_id = $provider_id" - ); - } - } - - // Get Stripe provider id - $res = mysqli_query($mysqli, " - SELECT payment_provider_id - FROM payment_providers - WHERE payment_provider_name = 'Stripe' - ORDER BY payment_provider_id DESC - LIMIT 1 - "); - $stripe = mysqli_fetch_assoc($res); - $stripe_provider_id = intval($stripe['payment_provider_id']); - - // Correct mapping: RP -> Recurring Invoice -> Client -> Client's Stripe saved method - mysqli_query($mysqli, " - UPDATE recurring_payments rp - INNER JOIN recurring_invoices ri - ON ri.recurring_invoice_id = rp.recurring_payment_recurring_invoice_id - INNER JOIN client_saved_payment_methods spm - ON spm.saved_payment_client_id = ri.recurring_invoice_client_id - AND spm.saved_payment_provider_id = $stripe_provider_id - SET - rp.recurring_payment_method = 'Credit Card', - rp.recurring_payment_saved_payment_id = spm.saved_payment_id - WHERE rp.recurring_payment_method = 'Stripe' - "); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.3.0'"); - } - - if (CURRENT_DATABASE_VERSION == '2.3.0') { - // Migrate Payment Methods from Categories Table to new payment_methods table - $sql_categories = mysqli_query($mysqli, "SELECT * FROM categories WHERE category_type = 'Payment Method' AND category_name != 'Stripe' AND category_archived_at IS NULL"); - - while ($row = mysqli_fetch_assoc($sql_categories)) { - $category_name = escapeSql($row['category_name']); - - mysqli_query($mysqli,"INSERT INTO payment_methods SET payment_method_name = '$category_name'"); - } - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.3.1'"); - } - - if (CURRENT_DATABASE_VERSION == '2.3.1') { - - // Delete all Recurring Payments that are Stripe - mysqli_query($mysqli, "DELETE FROM recurring_payments WHERE recurring_payment_method = 'Stripe'"); - - // Delete Stripe Specific ITFlow Client Stripe Client Relationship Table - mysqli_query($mysqli, "DROP TABLE client_stripe"); - - // Delete Unused Stripe and AI Settings now in their own tables - mysqli_query($mysqli, "ALTER TABLE `settings` - DROP `config_stripe_enable`, - DROP `config_stripe_publishable`, - DROP `config_stripe_secret`, - DROP `config_stripe_account`, - DROP `config_stripe_expense_vendor`, - DROP `config_stripe_expense_category`, - DROP `config_stripe_percentage_fee`, - DROP `config_stripe_flat_fee`, - DROP `config_ai_enable`, - DROP `config_ai_provider`, - DROP `config_ai_model`, - DROP `config_ai_url`, - DROP `config_ai_api_key` - "); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.3.2'"); - } - - if (CURRENT_DATABASE_VERSION == '2.3.2') { - - mysqli_query($mysqli, "ALTER TABLE settings - ADD `config_imap_provider` ENUM('standard_imap','google_oauth','microsoft_oauth') NULL DEFAULT NULL AFTER `config_mail_from_name`, - ADD `config_mail_oauth_client_id` VARCHAR(255) NULL AFTER `config_imap_provider`, - ADD `config_mail_oauth_client_secret` VARCHAR(255) NULL AFTER `config_mail_oauth_client_id`, - ADD `config_mail_oauth_tenant_id` VARCHAR(255) NULL AFTER `config_mail_oauth_client_secret`, - ADD `config_mail_oauth_refresh_token` TEXT NULL AFTER `config_mail_oauth_tenant_id`, - ADD `config_mail_oauth_access_token` TEXT NULL AFTER `config_mail_oauth_refresh_token`, - ADD `config_mail_oauth_access_token_expires_at` DATETIME NULL AFTER `config_mail_oauth_access_token` - "); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.3.3'"); - } - - if (CURRENT_DATABASE_VERSION == '2.3.3') { - - mysqli_query($mysqli, "ALTER TABLE settings - ADD `config_smtp_provider` ENUM('standard_smtp','google_oauth','microsoft_oauth') NULL DEFAULT NULL AFTER `config_start_page` - "); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.3.4'"); - } - - if (CURRENT_DATABASE_VERSION == '2.3.4') { - - // Add Software Keys - mysqli_query($mysqli, "CREATE TABLE `software_keys` ( - `software_key_id` INT(11) NOT NULL AUTO_INCREMENT, - `software_key` VARCHAR(400) NOT NULL, - `software_key_software_id` INT(11) NOT NULL, - PRIMARY KEY (`software_key_id`), - FOREIGN KEY (`software_key_software_id`) REFERENCES `software`(`software_id`) ON DELETE CASCADE - )"); - - // Software Key Assignments to Contacts - mysqli_query($mysqli, "CREATE TABLE `software_key_contact_assignments` ( - `software_key_id` INT(11) NOT NULL, - `contact_id` INT(11) NOT NULL, - `software_key_assigned_at` DATETIME DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`software_key_id`, `contact_id`), - FOREIGN KEY (`software_key_id`) REFERENCES `software_keys`(`software_key_id`) ON DELETE CASCADE, - FOREIGN KEY (`contact_id`) REFERENCES `contacts`(`contact_id`) ON DELETE CASCADE - )"); - - // Software Key Assignments to Assets - mysqli_query($mysqli, "CREATE TABLE `software_key_asset_assignments` ( - `software_key_id` INT(11) NOT NULL, - `asset_id` INT(11) NOT NULL, - `software_key_assigned_at` DATETIME DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (`software_key_id`, `asset_id`), - FOREIGN KEY (`software_key_id`) REFERENCES `software_keys`(`software_key_id`) ON DELETE CASCADE, - FOREIGN KEY (`asset_id`) REFERENCES `assets`(`asset_id`) ON DELETE CASCADE - )"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.3.5'"); - } - - if (CURRENT_DATABASE_VERSION == '2.3.5') { - mysqli_query($mysqli, "ALTER TABLE `settings` CHANGE `config_smtp_provider` `config_smtp_provider` VARCHAR(200) DEFAULT NULL"); - mysqli_query($mysqli, "ALTER TABLE `settings` CHANGE `config_imap_provider` `config_imap_provider` VARCHAR(200) DEFAULT NULL"); - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.3.6'"); - } - - if (CURRENT_DATABASE_VERSION == '2.3.6') { - // Create New Contract Templates Table - mysqli_query($mysqli, "CREATE TABLE `contract_templates` ( - `contract_template_id` INT(11) AUTO_INCREMENT PRIMARY KEY, - `contract_template_name` VARCHAR(255) NOT NULL, - `contract_template_description` TEXT NULL DEFAULT NULL, - `contract_template_type` VARCHAR(50) NULL DEFAULT NULL, - - `contract_template_sla_low_response_time` INT(11) NULL DEFAULT NULL, - `contract_template_sla_low_resolution_time` INT(11) NULL DEFAULT NULL, - `contract_template_sla_medium_response_time` INT(11) NULL DEFAULT NULL, - `contract_template_sla_medium_resolution_time` INT(11) NULL DEFAULT NULL, - `contract_template_sla_high_response_time` INT(11) NULL DEFAULT NULL, - `contract_template_sla_high_resolution_time` INT(11) NULL DEFAULT NULL, - - `contract_template_rate_standard` DECIMAL(10,2) NULL DEFAULT NULL, - `contract_template_rate_after_hours` DECIMAL(10,2) NULL DEFAULT NULL, - - `contract_template_net_terms` VARCHAR(50) NULL DEFAULT NULL, - `contract_template_support_hours` VARCHAR(100) NULL DEFAULT NULL, - `contract_template_renewal_frequency` VARCHAR(50) NULL DEFAULT NULL, - - `contract_template_details` TEXT NULL DEFAULT NULL, - - `contract_template_created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, - `contract_template_updated_at` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP, - `contract_template_archived_at` DATETIME NULL DEFAULT NULL - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"); - - - // Create New Contracts Table - mysqli_query($mysqli, "CREATE TABLE `contracts` ( - `contract_id` INT(11) AUTO_INCREMENT PRIMARY KEY, - `contract_name` VARCHAR(255) NOT NULL, - `contract_status` VARCHAR(50) NOT NULL, - `contract_type` VARCHAR(50) NOT NULL, - - `contract_sla_low_response_time` INT(11) NULL DEFAULT NULL, - `contract_sla_low_resolution_time` INT(11) NULL DEFAULT NULL, - `contract_sla_medium_response_time` INT(11) NULL DEFAULT NULL, - `contract_sla_medium_resolution_time` INT(11) NULL DEFAULT NULL, - `contract_sla_high_response_time` INT(11) NULL DEFAULT NULL, - `contract_sla_high_resolution_time` INT(11) NULL DEFAULT NULL, - - `contract_details` TEXT NULL DEFAULT NULL, - - `contract_client_id` INT(11) NULL DEFAULT NULL, - `contract_client_name` VARCHAR(255) NULL DEFAULT NULL, - `contract_client_address` TEXT NULL DEFAULT NULL, - `contract_client_email` VARCHAR(255) NULL DEFAULT NULL, - `contract_client_phone` VARCHAR(100) NULL DEFAULT NULL, - - `contract_contact_name` VARCHAR(255) NULL DEFAULT NULL, - `contract_contact_signature` TEXT NULL DEFAULT NULL, - `contract_contact_signature_date` DATETIME NULL DEFAULT NULL, - - `contract_agent_name` VARCHAR(255) NULL DEFAULT NULL, - `contract_agent_signature` TEXT NULL DEFAULT NULL, - `contract_agent_signature_date` DATETIME NULL DEFAULT NULL, - - `contract_rate_standard` DECIMAL(10,2) NULL DEFAULT NULL, - `contract_rate_after_hours` DECIMAL(10,2) NULL DEFAULT NULL, - - `contract_net_terms` VARCHAR(50) NULL DEFAULT NULL, - `contract_support_hours` VARCHAR(100) NULL DEFAULT NULL, - - `contract_start_date` DATE NULL DEFAULT NULL, - `contract_end_date` DATE NULL DEFAULT NULL, - `contract_renewal_frequency` VARCHAR(50) NULL DEFAULT NULL, - - `contract_created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, - `contract_updated_at` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP, - `contract_archived_at` DATETIME NULL DEFAULT NULL, - - FOREIGN KEY (`contract_client_id`) REFERENCES `clients`(`client_id`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.3.7'"); - } - - if (CURRENT_DATABASE_VERSION == '2.3.7') { - - mysqli_query($mysqli, " - CREATE TABLE `asset_tags` ( - `asset_tag_asset_id` INT(11) NOT NULL, - `asset_tag_tag_id` INT(11) NOT NULL, - PRIMARY KEY (`asset_tag_asset_id`, `asset_tag_tag_id`), - CONSTRAINT `fk_asset` - FOREIGN KEY (`asset_tag_asset_id`) - REFERENCES `assets`(`asset_id`) - ON DELETE CASCADE, - CONSTRAINT `fk_tag` - FOREIGN KEY (`asset_tag_tag_id`) - REFERENCES `tags`(`tag_id`) - ON DELETE CASCADE - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - "); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.3.8'"); - } - - if (CURRENT_DATABASE_VERSION == '2.3.8') { - - mysqli_query($mysqli, " - CREATE TABLE `task_approvals` ( - `approval_id` int(11) NOT NULL AUTO_INCREMENT, - `approval_scope` enum('client','internal') NOT NULL, - `approval_type` enum('any','technical','billing','specific') NOT NULL, - `approval_required_user_id` int(11) DEFAULT NULL, - `approval_status` enum('pending','approved','declined') NOT NULL, - `approval_created_by` int(11) NOT NULL, - `approval_approved_by` varchar(255) DEFAULT NULL, - `approval_url_key` varchar(200) NOT NULL, - `approval_task_id` int(11) NOT NULL, - PRIMARY KEY (`approval_id`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - "); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.3.9'"); - } - - if (CURRENT_DATABASE_VERSION == '2.3.9') { - mysqli_query($mysqli, "ALTER TABLE `clients` ADD `client_favorite` TINYINT(1) NOT NULL DEFAULT '0' AFTER `client_notes`"); - - mysqli_query($mysqli, "ALTER TABLE `locations` ADD `location_favorite` TINYINT(1) NOT NULL DEFAULT '0' AFTER `location_notes`"); - - mysqli_query($mysqli, "ALTER TABLE `vendors` ADD `vendor_favorite` TINYINT(1) NOT NULL DEFAULT '0' AFTER `vendor_notes`"); - - mysqli_query($mysqli, "ALTER TABLE `software` ADD `software_favorite` TINYINT(1) NOT NULL DEFAULT '0' AFTER `software_notes`"); - - mysqli_query( - $mysqli, - "ALTER TABLE `credentials` - CHANGE `credential_important` `credential_favorite` - TINYINT(1) NOT NULL DEFAULT 0 - AFTER `credential_note`" - ); - - mysqli_query($mysqli, "ALTER TABLE `assets` DROP `asset_important`"); - mysqli_query($mysqli, "ALTER TABLE `assets` ADD `asset_favorite` TINYINT(1) NOT NULL DEFAULT '0' AFTER `asset_notes`"); - - mysqli_query($mysqli, "ALTER TABLE `documents` DROP `document_important`"); - mysqli_query($mysqli, "ALTER TABLE `documents` ADD `document_favorite` TINYINT(1) NOT NULL DEFAULT '0' AFTER `document_client_visible`"); - - mysqli_query($mysqli, "ALTER TABLE `racks` ADD `rack_favorite` TINYINT(1) NOT NULL DEFAULT '0' AFTER `rack_notes`"); - - mysqli_query($mysqli, "ALTER TABLE `files` DROP `file_important`"); - mysqli_query($mysqli, "ALTER TABLE `files` ADD `file_favorite` TINYINT(1) NOT NULL DEFAULT '0' AFTER `file_mime_type`"); - - mysqli_query($mysqli, "ALTER TABLE `networks` ADD `network_favorite` TINYINT(1) NOT NULL DEFAULT '0' AFTER `network_notes`"); - - mysqli_query($mysqli, "ALTER TABLE `domains` ADD `domain_favorite` TINYINT(1) NOT NULL DEFAULT '0' AFTER `domain_notes`"); - - mysqli_query($mysqli, "ALTER TABLE `certificates` ADD `certificate_favorite` TINYINT(1) NOT NULL DEFAULT '0' AFTER `certificate_notes`"); - - mysqli_query($mysqli, "ALTER TABLE `services` ADD `service_favorite` TINYINT(1) NOT NULL DEFAULT '0' AFTER `service_notes`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.4.0'"); - } - - if (CURRENT_DATABASE_VERSION == '2.4.0') { - - mysqli_query($mysqli, " - CREATE TABLE `quote_items` ( - `item_id` int(11) NOT NULL AUTO_INCREMENT, - `item_name` varchar(200) NOT NULL, - `item_description` text DEFAULT NULL, - `item_quantity` decimal(15,2) NOT NULL DEFAULT 0.00, - `item_price` decimal(15,2) NOT NULL DEFAULT 0.00, - `item_subtotal` decimal(15,2) NOT NULL DEFAULT 0.00, - `item_tax` decimal(15,2) NOT NULL DEFAULT 0.00, - `item_total` decimal(15,2) NOT NULL DEFAULT 0.00, - `item_order` int(11) NOT NULL DEFAULT 0, - `item_created_at` datetime NOT NULL DEFAULT current_timestamp(), - `item_updated_at` datetime DEFAULT NULL ON UPDATE current_timestamp(), - `item_archived_at` datetime DEFAULT NULL, - `item_tax_id` int(11) NOT NULL DEFAULT 0, - `item_product_id` int(11) NOT NULL DEFAULT 0, - `item_quote_id` int(11) NOT NULL, - PRIMARY KEY (`item_id`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - "); - - mysqli_query($mysqli, " - CREATE TABLE `recurring_invoice_items` ( - `item_id` int(11) NOT NULL AUTO_INCREMENT, - `item_name` varchar(200) NOT NULL, - `item_description` text DEFAULT NULL, - `item_quantity` decimal(15,2) NOT NULL DEFAULT 0.00, - `item_price` decimal(15,2) NOT NULL DEFAULT 0.00, - `item_subtotal` decimal(15,2) NOT NULL DEFAULT 0.00, - `item_tax` decimal(15,2) NOT NULL DEFAULT 0.00, - `item_total` decimal(15,2) NOT NULL DEFAULT 0.00, - `item_order` int(11) NOT NULL DEFAULT 0, - `item_created_at` datetime NOT NULL DEFAULT current_timestamp(), - `item_updated_at` datetime DEFAULT NULL ON UPDATE current_timestamp(), - `item_archived_at` datetime DEFAULT NULL, - `item_tax_id` int(11) NOT NULL DEFAULT 0, - `item_product_id` int(11) NOT NULL DEFAULT 0, - `item_recurring_invoice_id` int(11) NOT NULL, - PRIMARY KEY (`item_id`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - "); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.4.1'"); - } - - if (CURRENT_DATABASE_VERSION == '2.4.1') { - - // Migrate Items - mysqli_query($mysqli, " - INSERT INTO `recurring_invoice_items` ( - `item_name`, - `item_description`, - `item_quantity`, - `item_price`, - `item_subtotal`, - `item_tax`, - `item_total`, - `item_order`, - `item_created_at`, - `item_updated_at`, - `item_archived_at`, - `item_tax_id`, - `item_product_id`, - `item_recurring_invoice_id` - ) - SELECT - `item_name`, - `item_description`, - `item_quantity`, - `item_price`, - `item_subtotal`, - `item_tax`, - `item_total`, - `item_order`, - `item_created_at`, - `item_updated_at`, - `item_archived_at`, - `item_tax_id`, - `item_product_id`, - `item_recurring_invoice_id` - FROM `invoice_items` - WHERE `item_recurring_invoice_id` != 0 - "); - - mysqli_query($mysqli, " - INSERT INTO `quote_items` ( - `item_name`, - `item_description`, - `item_quantity`, - `item_price`, - `item_subtotal`, - `item_tax`, - `item_total`, - `item_order`, - `item_created_at`, - `item_updated_at`, - `item_archived_at`, - `item_tax_id`, - `item_product_id`, - `item_quote_id` - ) - SELECT - `item_name`, - `item_description`, - `item_quantity`, - `item_price`, - `item_subtotal`, - `item_tax`, - `item_total`, - `item_order`, - `item_created_at`, - `item_updated_at`, - `item_archived_at`, - `item_tax_id`, - `item_product_id`, - `item_quote_id` - FROM `invoice_items` - WHERE `item_quote_id` != 0 - "); - - mysqli_query($mysqli, " - DELETE FROM `invoice_items` - WHERE `item_recurring_invoice_id` != 0 - "); - - mysqli_query($mysqli, " - DELETE FROM `invoice_items` - WHERE `item_quote_id` != 0 - "); - - mysqli_query($mysqli, " - ALTER TABLE `invoice_items` - DROP COLUMN `item_quote_id`, - DROP COLUMN `item_recurring_invoice_id` - "); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.4.2'"); - - } - - if (CURRENT_DATABASE_VERSION == '2.4.2') { - - mysqli_query($mysqli, "ALTER TABLE `categories` ADD `category_description` VARCHAR(255) DEFAULT NULL AFTER `category_name`"); - mysqli_query($mysqli, "ALTER TABLE `categories` ADD `category_order` INT(11) NOT NULL DEFAULT 0 AFTER `category_icon`"); - - // Create network_interfaces - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Ethernet', category_type = 'network_interface', category_order = 1"); // 1 - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'SFP', category_type = 'network_interface', category_order = 2"); // 2 - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'SFP+', category_type = 'network_interface', category_order = 3"); // 3 - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'QSFP28', category_type = 'network_interface', category_order = 4"); // 4 - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'QSFP-DD', category_type = 'network_interface', category_order = 5"); // 5 - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Coaxial', category_type = 'network_interface', category_order = 6"); // 6 - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Fiber', category_type = 'network_interface', category_order = 7"); // 7 - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'WiFi', category_type = 'network_interface', category_order = 8"); // 8 - - - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.4.3'"); - } - - if (CURRENT_DATABASE_VERSION == '2.4.3') { - // Asset Status - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Ready to Deploy', category_description = 'Asset is configured and ready to be assigned', category_type = 'asset_status', category_order = 1"); // 1 - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Deployed', category_description = 'Asset is actively in use and assigned to a client or location', category_type = 'asset_status', category_order = 2"); // 2 - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Out for Repair', category_description = 'Asset has been sent out for servicing or repair', category_type = 'asset_status', category_order = 3"); // 3 - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Lost', category_description = 'Asset location is unknown and cannot be accounted for', category_type = 'asset_status', category_order = 4"); // 4 - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Stolen', category_description = 'Asset has been reported stolen', category_type = 'asset_status', category_order = 5"); // 5 - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Retired', category_description = 'Asset has been decommissioned and is no longer in service', category_type = 'asset_status', category_order = 6"); // 6 - - // Contact note types - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Call', category_description = 'Phone call with a client or contact', category_icon = 'fa-phone-alt', category_type = 'contact_note_type', category_order = 1"); // 1 - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Email', category_description = 'Email correspondence with a client or contact', category_icon = 'fa-envelope', category_type = 'contact_note_type', category_order = 2"); // 2 - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Meeting', category_description = 'Scheduled meeting with a client or contact', category_icon = 'fa-handshake', category_type = 'contact_note_type', category_order = 3"); // 3 - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'In Person', category_description = 'In person visit or on-site interaction', category_icon = 'fa-people-arrows', category_type = 'contact_note_type', category_order = 4"); // 4 - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Note', category_description = 'General note or internal comment', category_icon = 'fa-sticky-note', category_type = 'contact_note_type', category_order = 5"); // 5 - - // Rack Types - mysqli_query($mysqli, "INSERT INTO categories SET category_name = '2-Post Open Frame', category_description = 'Two-post open frame rack for patch panels and lightweight equipment', category_type = 'rack_type', category_order = 1"); // 1 - mysqli_query($mysqli, "INSERT INTO categories SET category_name = '4-Post Open Frame', category_description = 'Four-post open frame rack for servers and heavier equipment', category_type = 'rack_type', category_order = 2"); // 2 - mysqli_query($mysqli, "INSERT INTO categories SET category_name = '4-Post Enclosed Cabinet', category_description = 'Four-post enclosed cabinet with doors and sides for secure equipment housing', category_type = 'rack_type', category_order = 3"); // 3 - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Wall-Mount Open', category_description = 'Open frame rack mounted directly to a wall for small deployments', category_type = 'rack_type', category_order = 4"); // 4 - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Wall-Mount Enclosed', category_description = 'Enclosed cabinet rack mounted to a wall with a locking door', category_type = 'rack_type', category_order = 5"); // 5 - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Other', category_description = 'Rack type does not fit any standard category', category_type = 'rack_type', category_order = 6"); // 6 - - // Software Types - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Software as a Service (SaaS)', category_description = 'Cloud-hosted software accessed via a web browser or API', category_type = 'software_type', category_order = 1"); // 1 - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Productivity Suite', category_description = 'Bundled office and collaboration tools such as Microsoft 365 or Google Workspace', category_type = 'software_type', category_order = 2"); // 2 - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Web Application', category_description = 'Application hosted on a web server and accessed through a browser', category_type = 'software_type', category_order = 3"); // 3 - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Desktop Application', category_description = 'Application installed and run locally on a workstation or laptop', category_type = 'software_type', category_order = 4"); // 4 - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Mobile Application', category_description = 'Application installed and run on a mobile device or tablet', category_type = 'software_type', category_order = 5"); // 5 - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Security Software', category_description = 'Software providing antivirus, endpoint protection, or security monitoring', category_type = 'software_type', category_order = 6"); // 6 - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'System Software', category_description = 'Low-level software managing hardware resources and system operations', category_type = 'software_type', category_order = 7"); // 7 - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Operating System', category_description = 'Core software managing hardware and providing a platform for applications', category_type = 'software_type', category_order = 8"); // 8 - mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Other', category_description = 'Software type does not fit any standard category', category_type = 'software_type', category_order = 9"); // 9 - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.4.4'"); - - } - - if (CURRENT_DATABASE_VERSION == '2.4.4') { - // Gateway fee expense now uses the actual fee from Stripe's balance transaction - mysqli_query($mysqli, "ALTER TABLE `payment_providers` DROP `payment_provider_expense_percentage_fee`, DROP `payment_provider_expense_flat_fee`"); - - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.4.5'"); - } - - // if (CURRENT_DATABASE_VERSION == '2.4.5') { - // // Insert queries here required to update to DB version 2.4.6 - // mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.4.6'"); - // } - -} else { - // Up-to-date +} +uksort($database_update_files, "version_compare"); + +// Apply everything newer than the current database version, in order +// (CURRENT_DATABASE_VERSION is a constant frozen at page load, so track progress in a variable) +$database_current_version = CURRENT_DATABASE_VERSION; + +foreach ($database_update_files as $version => $file) { + + if (version_compare($version, $database_current_version, "<=")) { + continue; + } + + try { + require $file; + } catch (Throwable $e) { + // Stop here - config_current_database_version still points at the last + // completed migration, so a re-run resumes at this file + $database_updates_error = "$version: " . $e->getMessage(); + error_log("ITFlow database update to version $version failed: " . $e->getMessage()); + break; + } + + // Migration succeeded - bump the database version + mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '" . escapeSql($version) . "'"); + $database_current_version = $version; + $database_updates_applied[] = $version; } diff --git a/admin/database_updates/2.0.0.php b/admin/database_updates/2.0.0.php new file mode 100644 index 000000000..1c571cab6 --- /dev/null +++ b/admin/database_updates/2.0.0.php @@ -0,0 +1,184 @@ + 0 AND `document_parent` != `document_id` + "); + + mysqli_query($mysqli, "ALTER TABLE `documents` DROP `document_parent`"); diff --git a/admin/database_updates/2.1.7.php b/admin/database_updates/2.1.7.php new file mode 100644 index 000000000..9f566d6f4 --- /dev/null +++ b/admin/database_updates/2.1.7.php @@ -0,0 +1,52 @@ + Recurring Invoice -> Client -> Client's Stripe saved method + mysqli_query($mysqli, " + UPDATE recurring_payments rp + INNER JOIN recurring_invoices ri + ON ri.recurring_invoice_id = rp.recurring_payment_recurring_invoice_id + INNER JOIN client_saved_payment_methods spm + ON spm.saved_payment_client_id = ri.recurring_invoice_client_id + AND spm.saved_payment_provider_id = $stripe_provider_id + SET + rp.recurring_payment_method = 'Credit Card', + rp.recurring_payment_saved_payment_id = spm.saved_payment_id + WHERE rp.recurring_payment_method = 'Stripe' + "); diff --git a/admin/database_updates/2.3.1.php b/admin/database_updates/2.3.1.php new file mode 100644 index 000000000..5b0389b5b --- /dev/null +++ b/admin/database_updates/2.3.1.php @@ -0,0 +1,17 @@ +") + ) { + $database_latest_version = $database_file_version; + } +} + +if ($database_latest_version == "0.0.0") { + exit("Error: admin/database_updates/ is missing or empty - the install may be incomplete."); +} + +DEFINE("LATEST_DATABASE_VERSION", $database_latest_version); diff --git a/libs/stripe-php/CHANGELOG.md b/libs/stripe-php/CHANGELOG.md index 381a9365e..81cedcc6c 100644 --- a/libs/stripe-php/CHANGELOG.md +++ b/libs/stripe-php/CHANGELOG.md @@ -1,4 +1,192 @@ # Changelog + +## 21.0.0 - 2026-07-15 +This release **does not** change the pinned API version. It's still `2026-06-24.dahlia`. + +We're releasing it as a major out of an abundance of caution, but it should be functionally a patch release for most users. See below. + +* [#2097](https://github.com/stripe/stripe-php/pull/2097) ⚠️ Correctly type properties on `ErrorObject` + * the properties of `ErrorObject` were typed as `string` when many of them should have been `null|string`. If you (or your typechecker) were treating these as plain strings, you'll need to be more defensive in your code. + * to be clear: no runtime code has changed, we've just made the types more accurate. We didn't want to break any builds in a patch version, so this is released as a major +* [#2098](https://github.com/stripe/stripe-php/pull/2098) Replace source hash with Telemetry UUID +* [#2095](https://github.com/stripe/stripe-php/pull/2095) Remove unused Retry-After header support + +## 20.3.1 - 2026-07-09 +* [#2093](https://github.com/stripe/stripe-php/pull/2093) Add TStripeObject to iterator PHPDoc comments (fixes [#2091](https://github.com/stripe/stripe-php/issues/2091)) + - Fixed: PHPStan no longer infers iterated Collection values as `mixed`; loop variables are now correctly typed as the collection's generic type parameter + +## 20.3.0 - 2026-06-24 +This release changes the pinned API version to 2026-06-24.dahlia. + +* [#2088](https://github.com/stripe/stripe-php/pull/2088) Update generated code + * Add support for `release_details` on `Reserve.Hold` + * Add support for new value `tax_fund` on enum `BalanceTransaction.type` + * Change `Billing.CreditGrant.priority` to be required + * Add support for `buyer_id` on `Charge.payment_method_details.bizum`, `ConfirmationToken.payment_method_preview.bizum`, `ConfirmationToken.payment_method_preview.blik`, `PaymentAttemptRecord.payment_method_details.bizum`, `PaymentMethod.bizum`, `PaymentMethod.blik`, and `PaymentRecord.payment_method_details.bizum` + * Add support for `transaction_link_id` on `Charge.payment_method_details.card` + * Add support for new value `sui` on enums `Charge.payment_method_details.crypto.network`, `PaymentAttemptRecord.payment_method_details.crypto.network`, and `PaymentRecord.payment_method_details.crypto.network` + * Add support for new value `usdsui` on enums `Charge.payment_method_details.crypto.token_currency`, `PaymentAttemptRecord.payment_method_details.crypto.token_currency`, and `PaymentRecord.payment_method_details.crypto.token_currency` + * Add support for `fingerprint` on `Charge.payment_method_details.pix`, `ConfirmationToken.payment_method_preview.pix`, `PaymentMethod.pix`, and `SetupAttempt.payment_method_details.pix` + * Add support for `sunbit` on `Checkout.Session.payment_method_options`, `Checkout\Session.create().$params.payment_method_option`, `PaymentIntent.confirm().$params.payment_method_option`, `PaymentIntent.create().$params.payment_method_option`, `PaymentIntent.payment_method_options`, and `PaymentIntent.update().$params.payment_method_option` + * Add support for `billing_cycle_anchor_config` on `Checkout\Session.create().$params.subscription_datum` + * Add support for `wechat_pay` on `Checkout.Session.payment_method_options` + * Add support for `mastercard_compliance` on `Dispute.evidence.enhanced_evidence`, `Dispute.evidence_details.enhanced_eligibility`, and `Dispute.update().$params.evidence.enhanced_evidence` + * Add support for new value `mastercard_compliance` on enum `Dispute.enhanced_eligibility_types` + * Add support for `status_details` on `FinancialConnections.Account` + * Add support for new value `validated` on enum `Identity.VerificationSession.redaction.status` + * Add support for new value `satispay` on enums `Invoice.payment_settings.payment_method_types` and `Subscription.payment_settings.payment_method_types` + * ⚠️ Remove support for `stored_credential_usage` on `PaymentAttemptRecord.payment_method_details.card` and `PaymentRecord.payment_method_details.card` + * ⚠️ Change `PaymentAttemptRecord.payment_method_details.card.description` and `PaymentRecord.payment_method_details.card.description` to be optional + * ⚠️ Change `PaymentAttemptRecord.payment_method_details.card.iin` and `PaymentRecord.payment_method_details.card.iin` to be optional + * ⚠️ Change `PaymentAttemptRecord.payment_method_details.card.issuer` and `PaymentRecord.payment_method_details.card.issuer` to be optional + * Add support for `setup_future_usage` on `PaymentIntent.confirm().$params.payment_method_option.satispay`, `PaymentIntent.create().$params.payment_method_option.satispay`, `PaymentIntent.payment_method_options.satispay`, and `PaymentIntent.update().$params.payment_method_option.satispay` + * Change `PaymentRecord.report_refund().$params.refunded` to be optional + * Add support for `satispay` on `SetupAttempt.payment_method_details` + * Add support for `custom_fields`, `description`, and `footer` on `Subscription.create().$params.invoice_setting`, `Subscription.invoice_settings`, and `Subscription.update().$params.invoice_setting` + * Add support for `payment_method_options` and `payment_method` on `Topup.create().$params` + * Add support for `mode` on `V2.Commerce.ProductCatalogImport` + * Add support for new value `promotion` on enum `V2.Commerce.ProductCatalogImport.feed_type` + * Add support for `sunbit_payments` on `V2.Core.Account.configuration.merchant.capabilities`, `V2\Core\Account.create().$params.configuration.merchant.capability`, and `V2\Core\Account.update().$params.configuration.merchant.capability` + * Add support for `crypto_money_manager` and `money_manager` on `V2\Core\Account.update().$params.identity.attestation.terms_of_service` + * ⚠️ Remove support for `crypto_storer` and `storer` on `V2\Core\Account.update().$params.identity.attestation.terms_of_service` + * Add support for new value `sunbit_payments` on enum `EventsV2CoreAccountIncludingConfigurationMerchantCapabilityStatusUpdatedEvent.updated_capability` + * Add support for error codes `anomalous_money_movement_request`, `failed_tax_calculation`, `financial_account_balance_does_not_support_currency`, `financial_account_capability_not_enabled`, and `financial_account_capability_restricted` on `Invoice.last_finalization_error`, `PaymentIntent.last_payment_error`, `SetupAttempt.setup_error`, `SetupIntent.last_setup_error`, `StripeError`, and `Terminal.Reader.action.api_error` + +## 20.2.1 - 2026-06-12 +* [#2079](https://github.com/stripe/stripe-php/pull/2079) Add "source" field to user-agent header + +## 20.2.0 - 2026-05-27 +This release changes the pinned API version to 2026-05-27.dahlia. + +* [#2072](https://github.com/stripe/stripe-php/pull/2072) Update generated code + * Add support for new resource `V2.Commerce.ProductCatalogImport` + * Add support for `create` and `retrieve` methods on resource `V2.Commerce.ProductCatalogImport` + * Add support for `bizum_payments` and `scalapay_payments` on `Account.capabilities`, `Account.create().$params.capability`, and `Account.update().$params.capability` + * Add support for `automatic_transfer_rules_by_currency` on `BalanceSettings.payments.payouts` and `BalanceSettings.update().$params.payment.payout` + * Add support for `start_of_day` on `BalanceSettings.payments.settlement_timing` and `BalanceSettings.update().$params.payment.settlement_timing` + * Add support for `description` on `Charge.create().$params.transfer_datum`, `PaymentIntent.create().$params.transfer_datum`, `PaymentIntent.transfer_data`, and `PaymentIntent.update().$params.transfer_datum` + * Add support for `bizum` on `Charge.payment_method_details`, `ConfirmationToken.create().$params.payment_method_datum`, `ConfirmationToken.payment_method_preview`, `PaymentAttemptRecord.payment_method_details`, `PaymentIntent.confirm().$params.payment_method_datum`, `PaymentIntent.confirm().$params.payment_method_option`, `PaymentIntent.create().$params.payment_method_datum`, `PaymentIntent.create().$params.payment_method_option`, `PaymentIntent.payment_method_options`, `PaymentIntent.update().$params.payment_method_datum`, `PaymentIntent.update().$params.payment_method_option`, `PaymentMethod.create().$params`, `PaymentMethodConfiguration.create().$params`, `PaymentMethodConfiguration.update().$params`, `PaymentMethodConfiguration`, `PaymentMethod`, `PaymentRecord.payment_method_details`, `SetupIntent.confirm().$params.payment_method_datum`, `SetupIntent.confirm().$params.payment_method_option`, `SetupIntent.create().$params.payment_method_datum`, `SetupIntent.create().$params.payment_method_option`, `SetupIntent.payment_method_options`, `SetupIntent.update().$params.payment_method_datum`, and `SetupIntent.update().$params.payment_method_option` + * Add support for `scalapay` on `Charge.payment_method_details`, `Checkout.Session.payment_method_options`, `Checkout\Session.create().$params.payment_method_option`, `ConfirmationToken.create().$params.payment_method_datum`, `ConfirmationToken.payment_method_preview`, `PaymentAttemptRecord.payment_method_details`, `PaymentIntent.confirm().$params.payment_method_datum`, `PaymentIntent.confirm().$params.payment_method_option`, `PaymentIntent.create().$params.payment_method_datum`, `PaymentIntent.create().$params.payment_method_option`, `PaymentIntent.payment_method_options`, `PaymentIntent.update().$params.payment_method_datum`, `PaymentIntent.update().$params.payment_method_option`, `PaymentMethod.create().$params`, `PaymentMethodConfiguration.create().$params`, `PaymentMethodConfiguration.update().$params`, `PaymentMethodConfiguration`, `PaymentMethod`, `PaymentRecord.payment_method_details`, `Refund.destination_details`, `SetupIntent.confirm().$params.payment_method_datum`, `SetupIntent.create().$params.payment_method_datum`, and `SetupIntent.update().$params.payment_method_datum` + * Add support for `mandate` on `Charge.payment_method_details.twint`, `PaymentAttemptRecord.payment_method_details.twint`, and `PaymentRecord.payment_method_details.twint` + * Change type of `Checkout\Session.create().$params.payment_method_option.twint.setup_future_usage`, `PaymentIntent.confirm().$params.payment_method_option.twint.setup_future_usage`, `PaymentIntent.create().$params.payment_method_option.twint.setup_future_usage`, and `PaymentIntent.update().$params.payment_method_option.twint.setup_future_usage` from `literal('none')` to `enum('none'|'off_session')` + * ⚠️ Change type of `Checkout.Session.payment_method_options.twint.setup_future_usage` and `PaymentIntent.payment_method_options.twint.setup_future_usage` from `literal('none')` to `enum('none'|'off_session')` + * Add support for new values `bizum` and `scalapay` on enums `ConfirmationToken.payment_method_preview.type` and `PaymentMethod.type` + * Add support for `credited_items` on `InvoiceItem.proration_details` + * Add support for `discountable` on `Invoice.create_preview().$params.schedule_detail.phase.add_invoice_item`, `Subscription.create().$params.add_invoice_item`, `Subscription.update().$params.add_invoice_item`, `SubscriptionSchedule.create().$params.phase.add_invoice_item`, `SubscriptionSchedule.phases[].add_invoice_items[]`, and `SubscriptionSchedule.update().$params.phase.add_invoice_item` + * Add support for `billing_schedules` on `Invoice.create_preview().$params.subscription_detail`, `Subscription.create().$params`, `Subscription.update().$params`, and `Subscription` + * Add support for `amount_paid_off_stripe` on `Invoice` + * Add support for new value `twint` on enums `Invoice.payment_settings.payment_method_types` and `Subscription.payment_settings.payment_method_types` + * Add support for `twint` on `Mandate.payment_method_details` and `SetupAttempt.payment_method_details` + * Add support for `metadata` on `PaymentIntent.create().$params.transfer_datum`, `PaymentIntent.transfer_data`, `PaymentIntent.update().$params.transfer_datum`, and `Subscription.pending_update` + * Add support for `payment_data` on `PaymentIntent.create().$params.transfer_datum`, `PaymentIntent.transfer_data`, and `PaymentIntent.update().$params.transfer_datum` + * Add support for new values `bizum` and `scalapay` on enums `PaymentIntent.excluded_payment_method_types` and `SetupIntent.excluded_payment_method_types` + * Add support for `blik_authorize` on `PaymentIntent.next_action` and `SetupIntent.next_action` + * Add support for `payment_method_options` on `PaymentLink.create().$params`, `PaymentLink.update().$params`, and `PaymentLink` + * Add support for new value `bizum` on enum `PaymentLink.payment_method_types` + * Add support for `active` on `PaymentMethodConfiguration.all().$params` + * Add support for `billed_until` on `SubscriptionItem` + * Add support for `discount` and `discounts` on `Subscription.pending_update` + * Add support for `verifone_m425`, `verifone_p630`, `verifone_ux700`, and `verifone_v660p` on `Terminal.Configuration`, `Terminal\Configuration.create().$params`, and `Terminal\Configuration.update().$params` + * Add support for `api_error` and `print_content` on `Terminal.Reader.action` + * Add support for new value `print_content` on enum `Terminal.Reader.action.type` + * Add support for new values `simulated_verifone_m425`, `simulated_verifone_p630`, `simulated_verifone_ux700`, `simulated_verifone_v660p`, `verifone_m425`, `verifone_p630`, `verifone_ux700`, and `verifone_v660p` on enum `Terminal.Reader.device_type` + * Add support for `customer` on `TestHelpers\TestClock.create().$params` + * Add support for `signer` on `V2.Core.Account.identity.business_details.documents.proof_of_registration`, `V2.Core.Account.identity.business_details.documents.proof_of_ultimate_beneficial_ownership`, `V2\Core\Account.create().$params.identity.business_detail.document.proof_of_registration`, `V2\Core\Account.create().$params.identity.business_detail.document.proof_of_ultimate_beneficial_ownership`, `V2\Core\Account.update().$params.identity.business_detail.document.proof_of_registration`, `V2\Core\Account.update().$params.identity.business_detail.document.proof_of_ultimate_beneficial_ownership`, `V2\Core\AccountToken.create().$params.identity.business_detail.document.proof_of_registration`, and `V2\Core\AccountToken.create().$params.identity.business_detail.document.proof_of_ultimate_beneficial_ownership` + * Add support for `azure_event_grid` on `V2.Core.EventDestination` and `V2\Core\EventDestination.create().$params` + * Add support for new value `no_azure_partner_topic_exists` on enum `V2.Core.EventDestination.status_details.disabled.reason` + * Add support for new value `azure_event_grid` on enum `V2.Core.EventDestination.type` + * Add support for new value `meter_event_value_too_many_digits` on enums `EventsV1BillingMeterErrorReportTriggeredEvent.reason.error_types[].code` and `EventsV1BillingMeterNoMeterFoundEvent.reason.error_types[].code` + * Add support for event notifications `V2CommerceProductCatalogImportsFailedEvent`, `V2CommerceProductCatalogImportsProcessingEvent`, `V2CommerceProductCatalogImportsSucceededEvent`, and `V2CommerceProductCatalogImportsSucceededWithErrorsEvent` with related object `V2.Commerce.ProductCatalogImport` + * Add support for error codes `payment_method_microdeposit_processing_error` and `siret_invalid` on `Invoice.last_finalization_error`, `PaymentIntent.last_payment_error`, `SetupAttempt.setup_error`, `SetupIntent.last_setup_error`, and `StripeError` +* [#2071](https://github.com/stripe/stripe-php/pull/2071) Emit warning when `stripe-notify` header is present in response + +## 20.1.0 - 2026-04-23 +This release changes the pinned API version to 2026-04-22.dahlia. + +* [#2056](https://github.com/stripe/stripe-php/pull/2056) Update generated code + * Add support for `balance_report` and `payout_reconciliation_report` on `AccountSession.components` and `AccountSession.create().$params.component` + * Add support for `app_distribution` and `sunbit_payments` on `Account.capabilities`, `Account.create().$params.capability`, and `Account.update().$params.capability` + * Add support for new values `fee_credit_funding`, `inbound_transfer_reversal`, and `inbound_transfer` on enum `BalanceTransaction.type` + * Add support for `sunbit` on `Charge.payment_method_details`, `ConfirmationToken.create().$params.payment_method_datum`, `ConfirmationToken.payment_method_preview`, `PaymentAttemptRecord.payment_method_details`, `PaymentIntent.confirm().$params.payment_method_datum`, `PaymentIntent.create().$params.payment_method_datum`, `PaymentIntent.update().$params.payment_method_datum`, `PaymentMethod.create().$params`, `PaymentMethodConfiguration.create().$params`, `PaymentMethodConfiguration.update().$params`, `PaymentMethodConfiguration`, `PaymentMethod`, `PaymentRecord.payment_method_details`, `SetupIntent.confirm().$params.payment_method_datum`, `SetupIntent.create().$params.payment_method_datum`, and `SetupIntent.update().$params.payment_method_datum` + * Add support for new values `phantom_cash` and `usdt` on enums `Charge.payment_method_details.crypto.token_currency`, `PaymentAttemptRecord.payment_method_details.crypto.token_currency`, and `PaymentRecord.payment_method_details.crypto.token_currency` + * Add support for `location` and `reader` on `Charge.payment_method_details.klarna`, `PaymentAttemptRecord.payment_method_details.klarna`, and `PaymentRecord.payment_method_details.klarna` + * Add support for `mandate` on `Charge.payment_method_details.pix`, `PaymentAttemptRecord.payment_method_details.pix`, and `PaymentRecord.payment_method_details.pix` + * Add support for `managed_payments` on `Checkout.Session`, `Checkout\Session.create().$params`, `PaymentIntent`, `PaymentLink.create().$params`, `PaymentLink`, `SetupIntent`, and `Subscription` + * Add support for `mandate_options` on `Checkout.Session.payment_method_options.pix`, `Checkout\Session.create().$params.payment_method_option.pix`, `PaymentIntent.confirm().$params.payment_method_option.pix`, `PaymentIntent.create().$params.payment_method_option.pix`, `PaymentIntent.payment_method_options.pix`, and `PaymentIntent.update().$params.payment_method_option.pix` + * Change type of `Checkout\Session.create().$params.payment_method_option.pix.setup_future_usage`, `PaymentIntent.confirm().$params.payment_method_option.pix.setup_future_usage`, `PaymentIntent.create().$params.payment_method_option.pix.setup_future_usage`, and `PaymentIntent.update().$params.payment_method_option.pix.setup_future_usage` from `literal('none')` to `enum('none'|'off_session')` + * Add support for new values `fo_vat`, `gi_tin`, `it_cf`, and `py_ruc` on enums `Checkout.Session.customer_details.tax_ids[].type`, `Invoice.customer_tax_ids[].type`, `Tax.Calculation.customer_details.tax_ids[].type`, `Tax.Transaction.customer_details.tax_ids[].type`, and `TaxId.type` + * ⚠️ Change type of `Checkout.Session.payment_method_options.pix.setup_future_usage` and `PaymentIntent.payment_method_options.pix.setup_future_usage` from `literal('none')` to `enum('none'|'off_session')` + * Add support for new value `sunbit` on enums `ConfirmationToken.payment_method_preview.type` and `PaymentMethod.type` + * Add support for `pix` on `Invoice.create().$params.payment_setting.payment_method_option`, `Invoice.payment_settings.payment_method_options`, `Invoice.update().$params.payment_setting.payment_method_option`, `Mandate.payment_method_details`, `SetupAttempt.payment_method_details`, `SetupIntent.confirm().$params.payment_method_option`, `SetupIntent.create().$params.payment_method_option`, `SetupIntent.payment_method_options`, `SetupIntent.update().$params.payment_method_option`, `Subscription.create().$params.payment_setting.payment_method_option`, `Subscription.payment_settings.payment_method_options`, and `Subscription.update().$params.payment_setting.payment_method_option` + * Add support for `upi` on `Invoice.create().$params.payment_setting.payment_method_option`, `Invoice.payment_settings.payment_method_options`, `Invoice.update().$params.payment_setting.payment_method_option`, `Subscription.create().$params.payment_setting.payment_method_option`, `Subscription.payment_settings.payment_method_options`, and `Subscription.update().$params.payment_setting.payment_method_option` + * Add support for new values `pix` and `upi` on enums `Invoice.payment_settings.payment_method_types` and `Subscription.payment_settings.payment_method_types` + * Add support for `card_presence` on `Issuing.Authorization` + * Add support for `allowed_card_presences` and `blocked_card_presences` on `Issuing.Card.spending_controls`, `Issuing.Cardholder.spending_controls`, `Issuing\Card.create().$params.spending_control`, `Issuing\Card.update().$params.spending_control`, `Issuing\Cardholder.create().$params.spending_control`, and `Issuing\Cardholder.update().$params.spending_control` + * Add support for new value `fulfillment_error` on enum `Issuing.Card.cancellation_reason` + * Add support for new value `fulfillment_error` on enum `Issuing.Card.replacement_reason` + * Add support for `amount` and `currency` on `Mandate.multi_use` + * Add support for `amount_to_confirm` on `PaymentIntent.confirm().$params` + * Add support for new value `sunbit` on enums `PaymentIntent.excluded_payment_method_types` and `SetupIntent.excluded_payment_method_types` + * Add support for `klarna_display_qr_code` on `PaymentIntent.next_action` + * Add support for new value `sunbit` on enum `PaymentLink.payment_method_types` + * Add support for new values `low`, `not_assessed`, and `unknown` on enum `Radar.PaymentEvaluation.signals.fraudulent_payment.risk_level` + * Add support for new value `account` on enum `Radar.ValueList.item_type` + * Add support for `moto` on `SetupAttempt.payment_method_details.card` + * Add support for `pix_display_qr_code` on `SetupIntent.next_action` + * Add support for error codes `action_blocked` and `approval_required` on `Invoice.last_finalization_error`, `PaymentIntent.last_payment_error`, `SetupAttempt.setup_error`, `SetupIntent.last_setup_error`, and `StripeError` +* [#2052](https://github.com/stripe/stripe-php/pull/2052) Fix 2D array parameter encoding + - Fixes an issue encoding two-dimensional array request params where the SDK incorrectly flattens the array. + +## 20.0.0 - 2026-03-25 + +This release changes the pinned API version to `2026-03-25.dahlia` and contains breaking changes (prefixed with ⚠️ below). There's also a [detailed migration guide](https://github.com/stripe/stripe-php/wiki/Migration-guide-for-v20) to simplify your upgrade process. + +Please review details for the breaking changes and alternatives in the [Stripe API changelog](https://docs.stripe.com/changelog/dahlia) before upgrading. + +* ⚠️ **Breaking change:** [#2038](https://github.com/stripe/stripe-php/pull/2038) Drop support for PHP < 7.2. This is also the **last major version to support PHP 7.2 and 7.3**. Please upgrade to 7.4+ before September 2026. See the [versioning policy](https://docs.stripe.com/sdks/versioning?lang=php#stripe-sdk-language-version-support-policy) for more information. +* ⚠️ **Breaking change:** [#2042](https://github.com/stripe/stripe-php/pull/2042) Preserve null values in v2 JSON request bodies + - The SDK now preserves and sends `null` when set in V2 API metadata and params, enabling you to clear metadata entries and some unsettable properties for V2 APIs. + - ⚠️ The `Util::objectsToIds()` method now has a required `$serializeNull` parameter to indicate if null values set in the object should be output in the resulting hash. This is relevant for V2 POST APIs to let callers clear emptyable values. +* [#1917](https://github.com/stripe/stripe-php/pull/1917) Avoid using func_get_args +* [#2011](https://github.com/stripe/stripe-php/pull/2011) Ensure that `previous_attributes` is always an instance of `StripeObject` +* [#2033](https://github.com/stripe/stripe-php/pull/2033) Add runtime support for V2 int64 string-encoded fields + +### ⚠️ Breaking changes due to changes in the Stripe API + +* [#2041](https://github.com/stripe/stripe-php/pull/2041) ⚠️ Throw an error when using the wrong webhook parsing method +* Generated changes from [#2046](https://github.com/stripe/stripe-php/pull/2046), [#2044](https://github.com/stripe/stripe-php/pull/2044), [#2025](https://github.com/stripe/stripe-php/pull/2025) + * Add support for `upi_payments` on `Account.capabilities`, `Account.create().$params.capability`, and `Account.update().$params.capability` + * Add support for `upi` on `Charge.payment_method_details`, `Checkout.Session.payment_method_options`, `Checkout\Session.create().$params.payment_method_option`, `ConfirmationToken.create().$params.payment_method_datum`, `ConfirmationToken.payment_method_preview`, `Mandate.payment_method_details`, `PaymentAttemptRecord.payment_method_details`, `PaymentIntent.confirm().$params.payment_method_datum`, `PaymentIntent.confirm().$params.payment_method_option`, `PaymentIntent.create().$params.payment_method_datum`, `PaymentIntent.create().$params.payment_method_option`, `PaymentIntent.payment_method_options`, `PaymentIntent.update().$params.payment_method_datum`, `PaymentIntent.update().$params.payment_method_option`, `PaymentMethod.create().$params`, `PaymentMethodConfiguration.create().$params`, `PaymentMethodConfiguration.update().$params`, `PaymentMethodConfiguration`, `PaymentMethod`, `PaymentRecord.payment_method_details`, `SetupAttempt.payment_method_details`, `SetupIntent.confirm().$params.payment_method_datum`, `SetupIntent.confirm().$params.payment_method_option`, `SetupIntent.create().$params.payment_method_datum`, `SetupIntent.create().$params.payment_method_option`, `SetupIntent.payment_method_options`, `SetupIntent.update().$params.payment_method_datum`, and `SetupIntent.update().$params.payment_method_option` + * Add support for new value `tempo` on enums `Charge.payment_method_details.crypto.network`, `PaymentAttemptRecord.payment_method_details.crypto.network`, and `PaymentRecord.payment_method_details.crypto.network` + * Add support for `integration_identifier` on `Checkout.Session` and `Checkout\Session.create().$params` + * Add support for `crypto` on `Checkout\Session.create().$params.payment_method_option` + * Add support for `pending_invoice_item_interval` on `Checkout\Session.create().$params.subscription_datum` + * Add support for new values `elements`, `embedded_page`, `form`, and `hosted_page` on enum `Checkout.Session.ui_mode` + * Add support for new value `marine_carbon_removal` on enum `Climate.Supplier.removal_pathway` + * Add support for new value `upi` on enums `ConfirmationToken.payment_method_preview.type` and `PaymentMethod.type` + * Add support for `metadata` on `CreditNote.create().$params.line`, `CreditNote.preview().$params.line`, `CreditNote.preview_lines().$params.line`, and `CreditNoteLineItem` + * Add support for `quantity_decimal` on `Invoice.add_lines().$params.line`, `Invoice.create_preview().$params.invoice_item`, `Invoice.update_lines().$params.line`, `InvoiceItem.create().$params`, `InvoiceItem.update().$params`, `InvoiceItem`, `InvoiceLineItem.update().$params`, and `InvoiceLineItem` + * ⚠️ Add support for `level` on `Issuing\Authorization.create().$params.risk_assessment.card_testing_risk` and `Issuing\Authorization.create().$params.risk_assessment.merchant_dispute_risk` + * ⚠️ Remove support for `risk_level` on `Issuing\Authorization.create().$params.risk_assessment.card_testing_risk` and `Issuing\Authorization.create().$params.risk_assessment.merchant_dispute_risk` + * Add support for `lifecycle_controls` on `Issuing.Card` and `Issuing\Card.create().$params` + * ⚠️ Change type of `Issuing.Token.network_data.visa.card_reference_id` from `string` to `nullable(string)` + * ⚠️ Change type of `PaymentAttemptRecord.payment_method_details.card.brand` and `PaymentRecord.payment_method_details.card.brand` from `enum` to `nullable(enum)` + * ⚠️ Change type of `PaymentAttemptRecord.payment_method_details.card.exp_month` and `PaymentRecord.payment_method_details.card.exp_month` from `longInteger` to `nullable(longInteger)` + * ⚠️ Change type of `PaymentAttemptRecord.payment_method_details.card.exp_year` and `PaymentRecord.payment_method_details.card.exp_year` from `longInteger` to `nullable(longInteger)` + * ⚠️ Change type of `PaymentAttemptRecord.payment_method_details.card.funding` and `PaymentRecord.payment_method_details.card.funding` from `enum('credit'|'debit'|'prepaid'|'unknown')` to `nullable(enum('credit'|'debit'|'prepaid'|'unknown'))` + * ⚠️ Change type of `PaymentAttemptRecord.payment_method_details.card.last4` and `PaymentRecord.payment_method_details.card.last4` from `string` to `nullable(string)` + * ⚠️ Change type of `PaymentAttemptRecord.payment_method_details.card.moto` and `PaymentRecord.payment_method_details.card.moto` from `boolean` to `nullable(boolean)` + * Add support for `cryptogram`, `electronic_commerce_indicator`, `exemption_indicator_applied`, and `exemption_indicator` on `PaymentAttemptRecord.payment_method_details.card.three_d_secure` and `PaymentRecord.payment_method_details.card.three_d_secure` + * Add support for new value `upi` on enums `PaymentIntent.excluded_payment_method_types` and `SetupIntent.excluded_payment_method_types` + * Add support for `upi_handle_redirect_or_display_qr_code` on `PaymentIntent.next_action` and `SetupIntent.next_action` + * Add support for new value `upi` on enum `PaymentLink.payment_method_types` + * Add support for `recommended_action` and `signals` on `Radar.PaymentEvaluation` + * ⚠️ Remove support for `insights` on `Radar.PaymentEvaluation` + * Add support for new value `crypto_fingerprint` on enum `Radar.ValueList.item_type` + * Add support for new value `canceled_by_retention_policy` on enum `Subscription.cancellation_details.reason` + * ⚠️ Change type of `V2.Core.EventDestination.events_from` from `enum('other_accounts'|'self')` to `string` + * Add support for error code `service_period_coupon_with_metered_tiered_item_unsupported` on `Invoice.last_finalization_error`, `PaymentIntent.last_payment_error`, `SetupAttempt.setup_error`, `SetupIntent.last_setup_error`, and `StripeError` + ## 19.4.1 - 2026-03-06 * [#2024](https://github.com/stripe/stripe-php/pull/2024) Add Stripe-Request-Trigger header * [#2022](https://github.com/stripe/stripe-php/pull/2022) Add agent information to UserAgent diff --git a/libs/stripe-php/CODEGEN_VERSION b/libs/stripe-php/CODEGEN_VERSION index 17557a68f..983636f7b 100644 --- a/libs/stripe-php/CODEGEN_VERSION +++ b/libs/stripe-php/CODEGEN_VERSION @@ -1 +1 @@ -e65e48569f6dfad2d5f1b58018017856520c3ae6 \ No newline at end of file +6012b623b1c09ad54d466947da04511a042ee45a \ No newline at end of file diff --git a/libs/stripe-php/OPENAPI_VERSION b/libs/stripe-php/OPENAPI_VERSION index 58dae7935..83c68c9d1 100644 --- a/libs/stripe-php/OPENAPI_VERSION +++ b/libs/stripe-php/OPENAPI_VERSION @@ -1 +1 @@ -v2186 \ No newline at end of file +v2324 \ No newline at end of file diff --git a/libs/stripe-php/README.md b/libs/stripe-php/README.md index b582cab93..bac46c51f 100644 --- a/libs/stripe-php/README.md +++ b/libs/stripe-php/README.md @@ -5,6 +5,9 @@ [![Total Downloads](https://poser.pugx.org/stripe/stripe-php/downloads.svg)](https://packagist.org/packages/stripe/stripe-php) [![License](https://poser.pugx.org/stripe/stripe-php/license.svg)](https://packagist.org/packages/stripe/stripe-php) +> [!TIP] +> Want to chat live with Stripe engineers? Join us on our [Discord server](https://stripe.com/go/discord/php). + The Stripe PHP library provides convenient access to the Stripe API from applications written in the PHP language. It includes a pre-defined set of classes for API resources that initialize themselves dynamically from API @@ -13,9 +16,9 @@ API. ## Requirements -PHP 5.6.0 and later. +PHP 7.2.0 and later. -Note that per our [language version support policy](https://docs.stripe.com/sdks/versioning?lang=php#stripe-sdk-language-version-support-policy), support for PHP 5.6, 7.0, and 7.1 will be removed in the March 2026 major version. +Note that per our [language version support policy](https://docs.stripe.com/sdks/versioning?lang=php#stripe-sdk-language-version-support-policy), support for PHP 7.2 and 7.3 will be removed soon, so upgrade your runtime if you're able to. Additional PHP versions will be dropped in future major versions, so upgrade to supported versions if possible. @@ -45,9 +48,9 @@ require_once '/path/to/stripe-php/init.php'; The bindings require the following extensions in order to work properly: -- [`curl`](https://secure.php.net/manual/en/book.curl.php), although you can use your own non-cURL client if you prefer -- [`json`](https://secure.php.net/manual/en/book.json.php) -- [`mbstring`](https://secure.php.net/manual/en/book.mbstring.php) (Multibyte String) +- [`curl`](https://secure.php.net/manual/en/book.curl.php), although you can use your own non-cURL client if you prefer +- [`json`](https://secure.php.net/manual/en/book.json.php) +- [`mbstring`](https://secure.php.net/manual/en/book.mbstring.php) (Multibyte String) If you use Composer, these dependencies should be handled automatically. If you install manually, you'll want to make sure that these extensions are available. @@ -206,7 +209,7 @@ You can disable this behavior if you prefer: ### How to use undocumented parameters and properties In some cases, you might encounter parameters on an API request or fields on an API response that aren’t available in the SDKs. -This might happen when they’re undocumented or when they’re in preview and you aren’t using a preview SDK. +This might happen when they’re undocumented or when they’re in preview and you aren’t using a preview SDK. See [undocumented params and properties](https://docs.stripe.com/sdks/server-side?lang=php#undocumented-params-and-fields) to send those parameters or access those fields. ### Public Preview SDKs @@ -231,7 +234,7 @@ Stripe::addBetaVersion("feature_beta", "v3"); ### Private Preview SDKs -Stripe has features in the [private preview phase](https://docs.stripe.com/release-phases) that can be accessed via versions of this package that have the `-alpha.X` suffix like `12.2.0-alpha.2`. These are invite-only features. Once invited, you can install the private preview SDKs by following the same instructions as for the [public preview SDKs](https://github.com/stripe/stripe-php?tab=readme-ov-file#public-preview-sdks) above and replacing the term `beta` with `alpha`. +Stripe has features in the [private preview phase](https://docs.stripe.com/release-phases) that can be accessed via versions of this package that have the `-alpha.X` suffix like `12.2.0-alpha.2`. You can install the private preview SDKs by following the same instructions as for the [public preview SDKs](https://github.com/stripe/stripe-php?tab=readme-ov-file#public-preview-sdks) above and replacing the term `beta` with `alpha`. Note that access to specific private preview API features may require separate approval. ### Custom requests @@ -261,6 +264,9 @@ New features and bug fixes are released on the latest major version of the Strip ## Development +> [!WARNING] +> External contributions to this repo from first-time contributors are currently on hiatus. If you'd like to see a change made to the package, please open an issue. + [Contribution guidelines for this project](CONTRIBUTING.md) We use [just](https://github.com/casey/just) for conveniently running development tasks. You can use them directly, or copy the commands out of the `justfile`. To our help docs, run `just`. diff --git a/libs/stripe-php/VERSION b/libs/stripe-php/VERSION index ab73a5501..fb5b51303 100644 --- a/libs/stripe-php/VERSION +++ b/libs/stripe-php/VERSION @@ -1 +1 @@ -19.4.1 +21.0.0 diff --git a/libs/stripe-php/composer.json b/libs/stripe-php/composer.json index 5bf2d54b2..754d5511b 100644 --- a/libs/stripe-php/composer.json +++ b/libs/stripe-php/composer.json @@ -15,20 +15,23 @@ } ], "require": { - "php": ">=5.6.0", + "php": ">=7.2.0", "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*" }, "require-dev": { - "phpunit/phpunit": "^5.7 || ^9.0", + "phpunit/phpunit": "^8.0 || ^9.0", "friendsofphp/php-cs-fixer": "3.94.0", "phpstan/phpstan": "^1.2" }, "autoload": { "psr-4": { "Stripe\\": "lib/" - } + }, + "files": [ + "lib/version_check.php" + ] }, "autoload-dev": { "psr-4": { @@ -42,12 +45,5 @@ "branch-alias": { "dev-master": "2.0-dev" } - }, - "config": { - "audit": { - "ignore": { - "PKSA-z3gr-8qht-p93v": "PHPUnit is only a dev dependency. Temporarily ignore PHPUnit security advisory to ensure continued support for PHP 5.6 in CI." - } - } } } diff --git a/libs/stripe-php/init.php b/libs/stripe-php/init.php index c809874ea..01a3aed96 100644 --- a/libs/stripe-php/init.php +++ b/libs/stripe-php/init.php @@ -1,5 +1,7 @@ Accounts v2 API, in place of /v1/accounts and /v1/customers to represent a user. + * * This is an object representing a Stripe account. You can retrieve it to see * properties on the account like its current requirements or if the account is * enabled to make live charges or receive payouts. @@ -22,7 +24,7 @@ namespace Stripe; * @property string $object String representing the object's type. Objects of the same type share the same value. * @property null|(object{annual_revenue?: null|(object{amount: null|int, currency: null|string, fiscal_year_end: null|string}&StripeObject), estimated_worker_count?: null|int, mcc: null|string, minority_owned_business_designation: null|string[], monthly_estimated_revenue?: (object{amount: int, currency: string}&StripeObject), name: null|string, product_description?: null|string, support_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), support_email: null|string, support_phone: null|string, support_url: null|string, url: null|string}&StripeObject) $business_profile Business information about the account. * @property null|string $business_type The business type. - * @property null|(object{acss_debit_payments?: string, affirm_payments?: string, afterpay_clearpay_payments?: string, alma_payments?: string, amazon_pay_payments?: string, au_becs_debit_payments?: string, bacs_debit_payments?: string, bancontact_payments?: string, bank_transfer_payments?: string, billie_payments?: string, blik_payments?: string, boleto_payments?: string, card_issuing?: string, card_payments?: string, cartes_bancaires_payments?: string, cashapp_payments?: string, crypto_payments?: string, eps_payments?: string, fpx_payments?: string, gb_bank_transfer_payments?: string, giropay_payments?: string, grabpay_payments?: string, ideal_payments?: string, india_international_payments?: string, jcb_payments?: string, jp_bank_transfer_payments?: string, kakao_pay_payments?: string, klarna_payments?: string, konbini_payments?: string, kr_card_payments?: string, legacy_payments?: string, link_payments?: string, mb_way_payments?: string, mobilepay_payments?: string, multibanco_payments?: string, mx_bank_transfer_payments?: string, naver_pay_payments?: string, nz_bank_account_becs_debit_payments?: string, oxxo_payments?: string, p24_payments?: string, pay_by_bank_payments?: string, payco_payments?: string, paynow_payments?: string, payto_payments?: string, pix_payments?: string, promptpay_payments?: string, revolut_pay_payments?: string, samsung_pay_payments?: string, satispay_payments?: string, sepa_bank_transfer_payments?: string, sepa_debit_payments?: string, sofort_payments?: string, swish_payments?: string, tax_reporting_us_1099_k?: string, tax_reporting_us_1099_misc?: string, transfers?: string, treasury?: string, twint_payments?: string, us_bank_account_ach_payments?: string, us_bank_transfer_payments?: string, zip_payments?: string}&StripeObject) $capabilities + * @property null|(object{acss_debit_payments?: string, affirm_payments?: string, afterpay_clearpay_payments?: string, alma_payments?: string, amazon_pay_payments?: string, app_distribution?: string, au_becs_debit_payments?: string, bacs_debit_payments?: string, bancontact_payments?: string, bank_transfer_payments?: string, billie_payments?: string, bizum_payments?: string, blik_payments?: string, boleto_payments?: string, card_issuing?: string, card_payments?: string, cartes_bancaires_payments?: string, cashapp_payments?: string, crypto_payments?: string, eps_payments?: string, fpx_payments?: string, gb_bank_transfer_payments?: string, giropay_payments?: string, grabpay_payments?: string, ideal_payments?: string, india_international_payments?: string, jcb_payments?: string, jp_bank_transfer_payments?: string, kakao_pay_payments?: string, klarna_payments?: string, konbini_payments?: string, kr_card_payments?: string, legacy_payments?: string, link_payments?: string, mb_way_payments?: string, mobilepay_payments?: string, multibanco_payments?: string, mx_bank_transfer_payments?: string, naver_pay_payments?: string, nz_bank_account_becs_debit_payments?: string, oxxo_payments?: string, p24_payments?: string, pay_by_bank_payments?: string, payco_payments?: string, paynow_payments?: string, payto_payments?: string, pix_payments?: string, promptpay_payments?: string, revolut_pay_payments?: string, samsung_pay_payments?: string, satispay_payments?: string, scalapay_payments?: string, sepa_bank_transfer_payments?: string, sepa_debit_payments?: string, sofort_payments?: string, sunbit_payments?: string, swish_payments?: string, tax_reporting_us_1099_k?: string, tax_reporting_us_1099_misc?: string, transfers?: string, treasury?: string, twint_payments?: string, upi_payments?: string, us_bank_account_ach_payments?: string, us_bank_transfer_payments?: string, zip_payments?: string}&StripeObject) $capabilities * @property null|bool $charges_enabled Whether the account can process charges. * @property null|(object{address?: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), address_kana?: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string, town: null|string}&StripeObject), address_kanji?: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string, town: null|string}&StripeObject), directors_provided?: bool, directorship_declaration?: null|(object{date: null|int, ip: null|string, user_agent: null|string}&StripeObject), executives_provided?: bool, export_license_id?: string, export_purpose_code?: string, name?: null|string, name_kana?: null|string, name_kanji?: null|string, owners_provided?: bool, ownership_declaration?: null|(object{date: null|int, ip: null|string, user_agent: null|string}&StripeObject), ownership_exemption_reason?: string, phone?: null|string, registration_date?: (object{day: null|int, month: null|int, year: null|int}&StripeObject), representative_declaration?: null|(object{date: null|int, ip: null|string, user_agent: null|string}&StripeObject), structure?: string, tax_id_provided?: bool, tax_id_registrar?: string, vat_id_provided?: bool, verification?: null|(object{document: (object{back: null|File|string, details: null|string, details_code: null|string, front: null|File|string}&StripeObject)}&StripeObject)}&StripeObject) $company * @property null|(object{fees?: (object{payer: string}&StripeObject), is_controller?: bool, losses?: (object{payments: string}&StripeObject), requirement_collection?: string, stripe_dashboard?: (object{type: string}&StripeObject), type: string}&StripeObject) $controller @@ -71,7 +73,7 @@ class Account extends ApiResource * information during account onboarding. You can prefill any information on the * account. * - * @param null|array{account_token?: string, business_profile?: array{annual_revenue?: array{amount: int, currency: string, fiscal_year_end: string}, estimated_worker_count?: int, mcc?: string, minority_owned_business_designation?: string[], monthly_estimated_revenue?: array{amount: int, currency: string}, name?: string, product_description?: string, support_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, support_email?: string, support_phone?: string, support_url?: null|string, url?: string}, business_type?: string, capabilities?: array{acss_debit_payments?: array{requested?: bool}, affirm_payments?: array{requested?: bool}, afterpay_clearpay_payments?: array{requested?: bool}, alma_payments?: array{requested?: bool}, amazon_pay_payments?: array{requested?: bool}, au_becs_debit_payments?: array{requested?: bool}, bacs_debit_payments?: array{requested?: bool}, bancontact_payments?: array{requested?: bool}, bank_transfer_payments?: array{requested?: bool}, billie_payments?: array{requested?: bool}, blik_payments?: array{requested?: bool}, boleto_payments?: array{requested?: bool}, card_issuing?: array{requested?: bool}, card_payments?: array{requested?: bool}, cartes_bancaires_payments?: array{requested?: bool}, cashapp_payments?: array{requested?: bool}, crypto_payments?: array{requested?: bool}, eps_payments?: array{requested?: bool}, fpx_payments?: array{requested?: bool}, gb_bank_transfer_payments?: array{requested?: bool}, giropay_payments?: array{requested?: bool}, grabpay_payments?: array{requested?: bool}, ideal_payments?: array{requested?: bool}, india_international_payments?: array{requested?: bool}, jcb_payments?: array{requested?: bool}, jp_bank_transfer_payments?: array{requested?: bool}, kakao_pay_payments?: array{requested?: bool}, klarna_payments?: array{requested?: bool}, konbini_payments?: array{requested?: bool}, kr_card_payments?: array{requested?: bool}, legacy_payments?: array{requested?: bool}, link_payments?: array{requested?: bool}, mb_way_payments?: array{requested?: bool}, mobilepay_payments?: array{requested?: bool}, multibanco_payments?: array{requested?: bool}, mx_bank_transfer_payments?: array{requested?: bool}, naver_pay_payments?: array{requested?: bool}, nz_bank_account_becs_debit_payments?: array{requested?: bool}, oxxo_payments?: array{requested?: bool}, p24_payments?: array{requested?: bool}, pay_by_bank_payments?: array{requested?: bool}, payco_payments?: array{requested?: bool}, paynow_payments?: array{requested?: bool}, payto_payments?: array{requested?: bool}, pix_payments?: array{requested?: bool}, promptpay_payments?: array{requested?: bool}, revolut_pay_payments?: array{requested?: bool}, samsung_pay_payments?: array{requested?: bool}, satispay_payments?: array{requested?: bool}, sepa_bank_transfer_payments?: array{requested?: bool}, sepa_debit_payments?: array{requested?: bool}, sofort_payments?: array{requested?: bool}, swish_payments?: array{requested?: bool}, tax_reporting_us_1099_k?: array{requested?: bool}, tax_reporting_us_1099_misc?: array{requested?: bool}, transfers?: array{requested?: bool}, treasury?: array{requested?: bool}, twint_payments?: array{requested?: bool}, us_bank_account_ach_payments?: array{requested?: bool}, us_bank_transfer_payments?: array{requested?: bool}, zip_payments?: array{requested?: bool}}, company?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, directors_provided?: bool, directorship_declaration?: array{date?: int, ip?: string, user_agent?: string}, executives_provided?: bool, export_license_id?: string, export_purpose_code?: string, name?: string, name_kana?: string, name_kanji?: string, owners_provided?: bool, ownership_declaration?: array{date?: int, ip?: string, user_agent?: string}, ownership_exemption_reason?: null|string, phone?: string, registration_date?: null|array{day: int, month: int, year: int}, registration_number?: string, representative_declaration?: array{date?: int, ip?: string, user_agent?: string}, structure?: null|string, tax_id?: string, tax_id_registrar?: string, vat_id?: string, verification?: array{document?: array{back?: string, front?: string}}}, controller?: array{fees?: array{payer?: string}, losses?: array{payments?: string}, requirement_collection?: string, stripe_dashboard?: array{type?: string}}, country?: string, default_currency?: string, documents?: array{bank_account_ownership_verification?: array{files?: string[]}, company_license?: array{files?: string[]}, company_memorandum_of_association?: array{files?: string[]}, company_ministerial_decree?: array{files?: string[]}, company_registration_verification?: array{files?: string[]}, company_tax_id_verification?: array{files?: string[]}, proof_of_address?: array{files?: string[]}, proof_of_registration?: array{files?: string[], signer?: array{person?: string}}, proof_of_ultimate_beneficial_ownership?: array{files?: string[], signer?: array{person?: string}}}, email?: string, expand?: string[], external_account?: array|string, groups?: array{payments_pricing?: null|string}, individual?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, dob?: null|array{day: int, month: int, year: int}, email?: string, first_name?: string, first_name_kana?: string, first_name_kanji?: string, full_name_aliases?: null|string[], gender?: string, id_number?: string, id_number_secondary?: string, last_name?: string, last_name_kana?: string, last_name_kanji?: string, maiden_name?: string, metadata?: null|array, phone?: string, political_exposure?: string, registered_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, relationship?: array{director?: bool, executive?: bool, owner?: bool, percent_ownership?: null|float, title?: string}, ssn_last_4?: string, verification?: array{additional_document?: array{back?: string, front?: string}, document?: array{back?: string, front?: string}}}, metadata?: null|array, settings?: array{bacs_debit_payments?: array{display_name?: string}, branding?: array{icon?: string, logo?: string, primary_color?: string, secondary_color?: string}, card_issuing?: array{tos_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}, card_payments?: array{decline_on?: array{avs_failure?: bool, cvc_failure?: bool}, statement_descriptor_prefix?: string, statement_descriptor_prefix_kana?: null|string, statement_descriptor_prefix_kanji?: null|string}, invoices?: array{hosted_payment_method_save?: string}, payments?: array{statement_descriptor?: string, statement_descriptor_kana?: string, statement_descriptor_kanji?: string}, payouts?: array{debit_negative_balances?: bool, schedule?: array{delay_days?: array|int|string, interval?: string, monthly_anchor?: int, monthly_payout_days?: int[], weekly_anchor?: string, weekly_payout_days?: string[]}, statement_descriptor?: string}, treasury?: array{tos_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}}, tos_acceptance?: array{date?: int, ip?: string, service_agreement?: string, user_agent?: string}, type?: string} $params + * @param null|array{account_token?: string, business_profile?: array{annual_revenue?: array{amount: int, currency: string, fiscal_year_end: string}, estimated_worker_count?: int, mcc?: string, minority_owned_business_designation?: string[], monthly_estimated_revenue?: array{amount: int, currency: string}, name?: string, product_description?: string, support_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, support_email?: string, support_phone?: string, support_url?: null|string, url?: string}, business_type?: string, capabilities?: array{acss_debit_payments?: array{requested?: bool}, affirm_payments?: array{requested?: bool}, afterpay_clearpay_payments?: array{requested?: bool}, alma_payments?: array{requested?: bool}, amazon_pay_payments?: array{requested?: bool}, app_distribution?: array{requested?: bool}, au_becs_debit_payments?: array{requested?: bool}, bacs_debit_payments?: array{requested?: bool}, bancontact_payments?: array{requested?: bool}, bank_transfer_payments?: array{requested?: bool}, billie_payments?: array{requested?: bool}, bizum_payments?: array{requested?: bool}, blik_payments?: array{requested?: bool}, boleto_payments?: array{requested?: bool}, card_issuing?: array{requested?: bool}, card_payments?: array{requested?: bool}, cartes_bancaires_payments?: array{requested?: bool}, cashapp_payments?: array{requested?: bool}, crypto_payments?: array{requested?: bool}, eps_payments?: array{requested?: bool}, fpx_payments?: array{requested?: bool}, gb_bank_transfer_payments?: array{requested?: bool}, giropay_payments?: array{requested?: bool}, grabpay_payments?: array{requested?: bool}, ideal_payments?: array{requested?: bool}, india_international_payments?: array{requested?: bool}, jcb_payments?: array{requested?: bool}, jp_bank_transfer_payments?: array{requested?: bool}, kakao_pay_payments?: array{requested?: bool}, klarna_payments?: array{requested?: bool}, konbini_payments?: array{requested?: bool}, kr_card_payments?: array{requested?: bool}, legacy_payments?: array{requested?: bool}, link_payments?: array{requested?: bool}, mb_way_payments?: array{requested?: bool}, mobilepay_payments?: array{requested?: bool}, multibanco_payments?: array{requested?: bool}, mx_bank_transfer_payments?: array{requested?: bool}, naver_pay_payments?: array{requested?: bool}, nz_bank_account_becs_debit_payments?: array{requested?: bool}, oxxo_payments?: array{requested?: bool}, p24_payments?: array{requested?: bool}, pay_by_bank_payments?: array{requested?: bool}, payco_payments?: array{requested?: bool}, paynow_payments?: array{requested?: bool}, payto_payments?: array{requested?: bool}, pix_payments?: array{requested?: bool}, promptpay_payments?: array{requested?: bool}, revolut_pay_payments?: array{requested?: bool}, samsung_pay_payments?: array{requested?: bool}, satispay_payments?: array{requested?: bool}, scalapay_payments?: array{requested?: bool}, sepa_bank_transfer_payments?: array{requested?: bool}, sepa_debit_payments?: array{requested?: bool}, sofort_payments?: array{requested?: bool}, sunbit_payments?: array{requested?: bool}, swish_payments?: array{requested?: bool}, tax_reporting_us_1099_k?: array{requested?: bool}, tax_reporting_us_1099_misc?: array{requested?: bool}, transfers?: array{requested?: bool}, treasury?: array{requested?: bool}, twint_payments?: array{requested?: bool}, upi_payments?: array{requested?: bool}, us_bank_account_ach_payments?: array{requested?: bool}, us_bank_transfer_payments?: array{requested?: bool}, zip_payments?: array{requested?: bool}}, company?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, directors_provided?: bool, directorship_declaration?: array{date?: int, ip?: string, user_agent?: string}, executives_provided?: bool, export_license_id?: string, export_purpose_code?: string, name?: string, name_kana?: string, name_kanji?: string, owners_provided?: bool, ownership_declaration?: array{date?: int, ip?: string, user_agent?: string}, ownership_exemption_reason?: null|string, phone?: string, registration_date?: null|array{day: int, month: int, year: int}, registration_number?: string, representative_declaration?: array{date?: int, ip?: string, user_agent?: string}, structure?: null|string, tax_id?: string, tax_id_registrar?: string, vat_id?: string, verification?: array{document?: array{back?: string, front?: string}}}, controller?: array{fees?: array{payer?: string}, losses?: array{payments?: string}, requirement_collection?: string, stripe_dashboard?: array{type?: string}}, country?: string, default_currency?: string, documents?: array{bank_account_ownership_verification?: array{files?: string[]}, company_license?: array{files?: string[]}, company_memorandum_of_association?: array{files?: string[]}, company_ministerial_decree?: array{files?: string[]}, company_registration_verification?: array{files?: string[]}, company_tax_id_verification?: array{files?: string[]}, proof_of_address?: array{files?: string[]}, proof_of_registration?: array{files?: string[], signer?: array{person?: string}}, proof_of_ultimate_beneficial_ownership?: array{files?: string[], signer?: array{person?: string}}}, email?: string, expand?: string[], external_account?: array|string, groups?: array{payments_pricing?: null|string}, individual?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, dob?: null|array{day: int, month: int, year: int}, email?: string, first_name?: string, first_name_kana?: string, first_name_kanji?: string, full_name_aliases?: null|string[], gender?: string, id_number?: string, id_number_secondary?: string, last_name?: string, last_name_kana?: string, last_name_kanji?: string, maiden_name?: string, metadata?: null|array, phone?: string, political_exposure?: string, registered_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, relationship?: array{director?: bool, executive?: bool, owner?: bool, percent_ownership?: null|float, title?: string}, ssn_last_4?: string, verification?: array{additional_document?: array{back?: string, front?: string}, document?: array{back?: string, front?: string}}}, metadata?: null|array, settings?: array{bacs_debit_payments?: array{display_name?: string}, branding?: array{icon?: string, logo?: string, primary_color?: string, secondary_color?: string}, card_issuing?: array{tos_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}, card_payments?: array{decline_on?: array{avs_failure?: bool, cvc_failure?: bool}, statement_descriptor_prefix?: string, statement_descriptor_prefix_kana?: null|string, statement_descriptor_prefix_kanji?: null|string}, invoices?: array{hosted_payment_method_save?: string}, payments?: array{statement_descriptor?: string, statement_descriptor_kana?: string, statement_descriptor_kanji?: string}, payouts?: array{debit_negative_balances?: bool, schedule?: array{delay_days?: array|int|string, interval?: string, monthly_anchor?: int, monthly_payout_days?: int[], weekly_anchor?: string, weekly_payout_days?: string[]}, statement_descriptor?: string}, treasury?: array{tos_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}}, tos_acceptance?: array{date?: int, ip?: string, service_agreement?: string, user_agent?: string}, type?: string} $params * @param null|array|string $options * * @return Account the created resource @@ -162,7 +164,7 @@ class Account extends ApiResource * more about updating accounts. * * @param string $id the ID of the resource to update - * @param null|array{account_token?: string, business_profile?: array{annual_revenue?: array{amount: int, currency: string, fiscal_year_end: string}, estimated_worker_count?: int, mcc?: string, minority_owned_business_designation?: string[], monthly_estimated_revenue?: array{amount: int, currency: string}, name?: string, product_description?: string, support_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, support_email?: string, support_phone?: string, support_url?: null|string, url?: string}, business_type?: string, capabilities?: array{acss_debit_payments?: array{requested?: bool}, affirm_payments?: array{requested?: bool}, afterpay_clearpay_payments?: array{requested?: bool}, alma_payments?: array{requested?: bool}, amazon_pay_payments?: array{requested?: bool}, au_becs_debit_payments?: array{requested?: bool}, bacs_debit_payments?: array{requested?: bool}, bancontact_payments?: array{requested?: bool}, bank_transfer_payments?: array{requested?: bool}, billie_payments?: array{requested?: bool}, blik_payments?: array{requested?: bool}, boleto_payments?: array{requested?: bool}, card_issuing?: array{requested?: bool}, card_payments?: array{requested?: bool}, cartes_bancaires_payments?: array{requested?: bool}, cashapp_payments?: array{requested?: bool}, crypto_payments?: array{requested?: bool}, eps_payments?: array{requested?: bool}, fpx_payments?: array{requested?: bool}, gb_bank_transfer_payments?: array{requested?: bool}, giropay_payments?: array{requested?: bool}, grabpay_payments?: array{requested?: bool}, ideal_payments?: array{requested?: bool}, india_international_payments?: array{requested?: bool}, jcb_payments?: array{requested?: bool}, jp_bank_transfer_payments?: array{requested?: bool}, kakao_pay_payments?: array{requested?: bool}, klarna_payments?: array{requested?: bool}, konbini_payments?: array{requested?: bool}, kr_card_payments?: array{requested?: bool}, legacy_payments?: array{requested?: bool}, link_payments?: array{requested?: bool}, mb_way_payments?: array{requested?: bool}, mobilepay_payments?: array{requested?: bool}, multibanco_payments?: array{requested?: bool}, mx_bank_transfer_payments?: array{requested?: bool}, naver_pay_payments?: array{requested?: bool}, nz_bank_account_becs_debit_payments?: array{requested?: bool}, oxxo_payments?: array{requested?: bool}, p24_payments?: array{requested?: bool}, pay_by_bank_payments?: array{requested?: bool}, payco_payments?: array{requested?: bool}, paynow_payments?: array{requested?: bool}, payto_payments?: array{requested?: bool}, pix_payments?: array{requested?: bool}, promptpay_payments?: array{requested?: bool}, revolut_pay_payments?: array{requested?: bool}, samsung_pay_payments?: array{requested?: bool}, satispay_payments?: array{requested?: bool}, sepa_bank_transfer_payments?: array{requested?: bool}, sepa_debit_payments?: array{requested?: bool}, sofort_payments?: array{requested?: bool}, swish_payments?: array{requested?: bool}, tax_reporting_us_1099_k?: array{requested?: bool}, tax_reporting_us_1099_misc?: array{requested?: bool}, transfers?: array{requested?: bool}, treasury?: array{requested?: bool}, twint_payments?: array{requested?: bool}, us_bank_account_ach_payments?: array{requested?: bool}, us_bank_transfer_payments?: array{requested?: bool}, zip_payments?: array{requested?: bool}}, company?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, directors_provided?: bool, directorship_declaration?: array{date?: int, ip?: string, user_agent?: string}, executives_provided?: bool, export_license_id?: string, export_purpose_code?: string, name?: string, name_kana?: string, name_kanji?: string, owners_provided?: bool, ownership_declaration?: array{date?: int, ip?: string, user_agent?: string}, ownership_exemption_reason?: null|string, phone?: string, registration_date?: null|array{day: int, month: int, year: int}, registration_number?: string, representative_declaration?: array{date?: int, ip?: string, user_agent?: string}, structure?: null|string, tax_id?: string, tax_id_registrar?: string, vat_id?: string, verification?: array{document?: array{back?: string, front?: string}}}, default_currency?: string, documents?: array{bank_account_ownership_verification?: array{files?: string[]}, company_license?: array{files?: string[]}, company_memorandum_of_association?: array{files?: string[]}, company_ministerial_decree?: array{files?: string[]}, company_registration_verification?: array{files?: string[]}, company_tax_id_verification?: array{files?: string[]}, proof_of_address?: array{files?: string[]}, proof_of_registration?: array{files?: string[], signer?: array{person?: string}}, proof_of_ultimate_beneficial_ownership?: array{files?: string[], signer?: array{person?: string}}}, email?: string, expand?: string[], external_account?: null|array|string, groups?: array{payments_pricing?: null|string}, individual?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, dob?: null|array{day: int, month: int, year: int}, email?: string, first_name?: string, first_name_kana?: string, first_name_kanji?: string, full_name_aliases?: null|string[], gender?: string, id_number?: string, id_number_secondary?: string, last_name?: string, last_name_kana?: string, last_name_kanji?: string, maiden_name?: string, metadata?: null|array, phone?: string, political_exposure?: string, registered_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, relationship?: array{director?: bool, executive?: bool, owner?: bool, percent_ownership?: null|float, title?: string}, ssn_last_4?: string, verification?: array{additional_document?: array{back?: string, front?: string}, document?: array{back?: string, front?: string}}}, metadata?: null|array, settings?: array{bacs_debit_payments?: array{display_name?: string}, branding?: array{icon?: string, logo?: string, primary_color?: string, secondary_color?: string}, card_issuing?: array{tos_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}, card_payments?: array{decline_on?: array{avs_failure?: bool, cvc_failure?: bool}, statement_descriptor_prefix?: string, statement_descriptor_prefix_kana?: null|string, statement_descriptor_prefix_kanji?: null|string}, invoices?: array{default_account_tax_ids?: null|string[], hosted_payment_method_save?: string}, payments?: array{statement_descriptor?: string, statement_descriptor_kana?: string, statement_descriptor_kanji?: string}, payouts?: array{debit_negative_balances?: bool, schedule?: array{delay_days?: array|int|string, interval?: string, monthly_anchor?: int, monthly_payout_days?: int[], weekly_anchor?: string, weekly_payout_days?: string[]}, statement_descriptor?: string}, treasury?: array{tos_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}}, tos_acceptance?: array{date?: int, ip?: string, service_agreement?: string, user_agent?: string}} $params + * @param null|array{account_token?: string, business_profile?: array{annual_revenue?: array{amount: int, currency: string, fiscal_year_end: string}, estimated_worker_count?: int, mcc?: string, minority_owned_business_designation?: string[], monthly_estimated_revenue?: array{amount: int, currency: string}, name?: string, product_description?: string, support_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, support_email?: string, support_phone?: string, support_url?: null|string, url?: string}, business_type?: string, capabilities?: array{acss_debit_payments?: array{requested?: bool}, affirm_payments?: array{requested?: bool}, afterpay_clearpay_payments?: array{requested?: bool}, alma_payments?: array{requested?: bool}, amazon_pay_payments?: array{requested?: bool}, app_distribution?: array{requested?: bool}, au_becs_debit_payments?: array{requested?: bool}, bacs_debit_payments?: array{requested?: bool}, bancontact_payments?: array{requested?: bool}, bank_transfer_payments?: array{requested?: bool}, billie_payments?: array{requested?: bool}, bizum_payments?: array{requested?: bool}, blik_payments?: array{requested?: bool}, boleto_payments?: array{requested?: bool}, card_issuing?: array{requested?: bool}, card_payments?: array{requested?: bool}, cartes_bancaires_payments?: array{requested?: bool}, cashapp_payments?: array{requested?: bool}, crypto_payments?: array{requested?: bool}, eps_payments?: array{requested?: bool}, fpx_payments?: array{requested?: bool}, gb_bank_transfer_payments?: array{requested?: bool}, giropay_payments?: array{requested?: bool}, grabpay_payments?: array{requested?: bool}, ideal_payments?: array{requested?: bool}, india_international_payments?: array{requested?: bool}, jcb_payments?: array{requested?: bool}, jp_bank_transfer_payments?: array{requested?: bool}, kakao_pay_payments?: array{requested?: bool}, klarna_payments?: array{requested?: bool}, konbini_payments?: array{requested?: bool}, kr_card_payments?: array{requested?: bool}, legacy_payments?: array{requested?: bool}, link_payments?: array{requested?: bool}, mb_way_payments?: array{requested?: bool}, mobilepay_payments?: array{requested?: bool}, multibanco_payments?: array{requested?: bool}, mx_bank_transfer_payments?: array{requested?: bool}, naver_pay_payments?: array{requested?: bool}, nz_bank_account_becs_debit_payments?: array{requested?: bool}, oxxo_payments?: array{requested?: bool}, p24_payments?: array{requested?: bool}, pay_by_bank_payments?: array{requested?: bool}, payco_payments?: array{requested?: bool}, paynow_payments?: array{requested?: bool}, payto_payments?: array{requested?: bool}, pix_payments?: array{requested?: bool}, promptpay_payments?: array{requested?: bool}, revolut_pay_payments?: array{requested?: bool}, samsung_pay_payments?: array{requested?: bool}, satispay_payments?: array{requested?: bool}, scalapay_payments?: array{requested?: bool}, sepa_bank_transfer_payments?: array{requested?: bool}, sepa_debit_payments?: array{requested?: bool}, sofort_payments?: array{requested?: bool}, sunbit_payments?: array{requested?: bool}, swish_payments?: array{requested?: bool}, tax_reporting_us_1099_k?: array{requested?: bool}, tax_reporting_us_1099_misc?: array{requested?: bool}, transfers?: array{requested?: bool}, treasury?: array{requested?: bool}, twint_payments?: array{requested?: bool}, upi_payments?: array{requested?: bool}, us_bank_account_ach_payments?: array{requested?: bool}, us_bank_transfer_payments?: array{requested?: bool}, zip_payments?: array{requested?: bool}}, company?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, directors_provided?: bool, directorship_declaration?: array{date?: int, ip?: string, user_agent?: string}, executives_provided?: bool, export_license_id?: string, export_purpose_code?: string, name?: string, name_kana?: string, name_kanji?: string, owners_provided?: bool, ownership_declaration?: array{date?: int, ip?: string, user_agent?: string}, ownership_exemption_reason?: null|string, phone?: string, registration_date?: null|array{day: int, month: int, year: int}, registration_number?: string, representative_declaration?: array{date?: int, ip?: string, user_agent?: string}, structure?: null|string, tax_id?: string, tax_id_registrar?: string, vat_id?: string, verification?: array{document?: array{back?: string, front?: string}}}, default_currency?: string, documents?: array{bank_account_ownership_verification?: array{files?: string[]}, company_license?: array{files?: string[]}, company_memorandum_of_association?: array{files?: string[]}, company_ministerial_decree?: array{files?: string[]}, company_registration_verification?: array{files?: string[]}, company_tax_id_verification?: array{files?: string[]}, proof_of_address?: array{files?: string[]}, proof_of_registration?: array{files?: string[], signer?: array{person?: string}}, proof_of_ultimate_beneficial_ownership?: array{files?: string[], signer?: array{person?: string}}}, email?: string, expand?: string[], external_account?: null|array|string, groups?: array{payments_pricing?: null|string}, individual?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, dob?: null|array{day: int, month: int, year: int}, email?: string, first_name?: string, first_name_kana?: string, first_name_kanji?: string, full_name_aliases?: null|string[], gender?: string, id_number?: string, id_number_secondary?: string, last_name?: string, last_name_kana?: string, last_name_kanji?: string, maiden_name?: string, metadata?: null|array, phone?: string, political_exposure?: string, registered_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, relationship?: array{director?: bool, executive?: bool, owner?: bool, percent_ownership?: null|float, title?: string}, ssn_last_4?: string, verification?: array{additional_document?: array{back?: string, front?: string}, document?: array{back?: string, front?: string}}}, metadata?: null|array, settings?: array{bacs_debit_payments?: array{display_name?: string}, branding?: array{icon?: string, logo?: string, primary_color?: string, secondary_color?: string}, card_issuing?: array{tos_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}, card_payments?: array{decline_on?: array{avs_failure?: bool, cvc_failure?: bool}, statement_descriptor_prefix?: string, statement_descriptor_prefix_kana?: null|string, statement_descriptor_prefix_kanji?: null|string}, invoices?: array{default_account_tax_ids?: null|string[], hosted_payment_method_save?: string}, payments?: array{statement_descriptor?: string, statement_descriptor_kana?: string, statement_descriptor_kanji?: string}, payouts?: array{debit_negative_balances?: bool, schedule?: array{delay_days?: array|int|string, interval?: string, monthly_anchor?: int, monthly_payout_days?: int[], weekly_anchor?: string, weekly_payout_days?: string[]}, statement_descriptor?: string}, treasury?: array{tos_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}}, tos_acceptance?: array{date?: int, ip?: string, service_agreement?: string, user_agent?: string}} $params * @param null|array|string $opts * * @return Account the updated resource diff --git a/libs/stripe-php/lib/AccountSession.php b/libs/stripe-php/lib/AccountSession.php index 5222c5b6b..45542f03c 100644 --- a/libs/stripe-php/lib/AccountSession.php +++ b/libs/stripe-php/lib/AccountSession.php @@ -16,9 +16,9 @@ namespace Stripe; * @property string $object String representing the object's type. Objects of the same type share the same value. * @property string $account The ID of the account the AccountSession was created for * @property string $client_secret

    The client secret of this AccountSession. Used on the client to set up secure access to the given account.

    The client secret can be used to provide access to account from your frontend. It should not be stored, logged, or exposed to anyone other than the connected account. Make sure that you have TLS enabled on any page that includes the client secret.

    Refer to our docs to setup Connect embedded components and learn about how client_secret should be handled.

    - * @property (object{account_management: (object{enabled: bool, features: (object{disable_stripe_user_authentication: bool, external_account_collection: bool}&StripeObject)}&StripeObject), account_onboarding: (object{enabled: bool, features: (object{disable_stripe_user_authentication: bool, external_account_collection: bool}&StripeObject)}&StripeObject), balances: (object{enabled: bool, features: (object{disable_stripe_user_authentication: bool, edit_payout_schedule: bool, external_account_collection: bool, instant_payouts: bool, standard_payouts: bool}&StripeObject)}&StripeObject), disputes_list: (object{enabled: bool, features: (object{capture_payments: bool, destination_on_behalf_of_charge_management: bool, dispute_management: bool, refund_management: bool}&StripeObject)}&StripeObject), documents: (object{enabled: bool, features: (object{}&StripeObject)}&StripeObject), financial_account: (object{enabled: bool, features: (object{disable_stripe_user_authentication: bool, external_account_collection: bool, send_money: bool, transfer_balance: bool}&StripeObject)}&StripeObject), financial_account_transactions: (object{enabled: bool, features: (object{card_spend_dispute_management: bool}&StripeObject)}&StripeObject), instant_payouts_promotion: (object{enabled: bool, features: (object{disable_stripe_user_authentication: bool, external_account_collection: bool, instant_payouts: bool}&StripeObject)}&StripeObject), issuing_card: (object{enabled: bool, features: (object{card_management: bool, card_spend_dispute_management: bool, cardholder_management: bool, spend_control_management: bool}&StripeObject)}&StripeObject), issuing_cards_list: (object{enabled: bool, features: (object{card_management: bool, card_spend_dispute_management: bool, cardholder_management: bool, disable_stripe_user_authentication: bool, spend_control_management: bool}&StripeObject)}&StripeObject), notification_banner: (object{enabled: bool, features: (object{disable_stripe_user_authentication: bool, external_account_collection: bool}&StripeObject)}&StripeObject), payment_details: (object{enabled: bool, features: (object{capture_payments: bool, destination_on_behalf_of_charge_management: bool, dispute_management: bool, refund_management: bool}&StripeObject)}&StripeObject), payment_disputes: (object{enabled: bool, features: (object{destination_on_behalf_of_charge_management: bool, dispute_management: bool, refund_management: bool}&StripeObject)}&StripeObject), payments: (object{enabled: bool, features: (object{capture_payments: bool, destination_on_behalf_of_charge_management: bool, dispute_management: bool, refund_management: bool}&StripeObject)}&StripeObject), payout_details: (object{enabled: bool, features: (object{}&StripeObject)}&StripeObject), payouts: (object{enabled: bool, features: (object{disable_stripe_user_authentication: bool, edit_payout_schedule: bool, external_account_collection: bool, instant_payouts: bool, standard_payouts: bool}&StripeObject)}&StripeObject), payouts_list: (object{enabled: bool, features: (object{}&StripeObject)}&StripeObject), tax_registrations: (object{enabled: bool, features: (object{}&StripeObject)}&StripeObject), tax_settings: (object{enabled: bool, features: (object{}&StripeObject)}&StripeObject)}&StripeObject) $components + * @property (object{account_management: (object{enabled: bool, features: (object{disable_stripe_user_authentication: bool, external_account_collection: bool}&StripeObject)}&StripeObject), account_onboarding: (object{enabled: bool, features: (object{disable_stripe_user_authentication: bool, external_account_collection: bool}&StripeObject)}&StripeObject), balance_report: (object{enabled: bool, features: (object{}&StripeObject)}&StripeObject), balances: (object{enabled: bool, features: (object{disable_stripe_user_authentication: bool, edit_payout_schedule: bool, external_account_collection: bool, instant_payouts: bool, standard_payouts: bool}&StripeObject)}&StripeObject), disputes_list: (object{enabled: bool, features: (object{capture_payments: bool, destination_on_behalf_of_charge_management: bool, dispute_management: bool, refund_management: bool}&StripeObject)}&StripeObject), documents: (object{enabled: bool, features: (object{}&StripeObject)}&StripeObject), financial_account: (object{enabled: bool, features: (object{disable_stripe_user_authentication: bool, external_account_collection: bool, send_money: bool, transfer_balance: bool}&StripeObject)}&StripeObject), financial_account_transactions: (object{enabled: bool, features: (object{card_spend_dispute_management: bool}&StripeObject)}&StripeObject), instant_payouts_promotion: (object{enabled: bool, features: (object{disable_stripe_user_authentication: bool, external_account_collection: bool, instant_payouts: bool}&StripeObject)}&StripeObject), issuing_card: (object{enabled: bool, features: (object{card_management: bool, card_spend_dispute_management: bool, cardholder_management: bool, spend_control_management: bool}&StripeObject)}&StripeObject), issuing_cards_list: (object{enabled: bool, features: (object{card_management: bool, card_spend_dispute_management: bool, cardholder_management: bool, disable_stripe_user_authentication: bool, spend_control_management: bool}&StripeObject)}&StripeObject), notification_banner: (object{enabled: bool, features: (object{disable_stripe_user_authentication: bool, external_account_collection: bool}&StripeObject)}&StripeObject), payment_details: (object{enabled: bool, features: (object{capture_payments: bool, destination_on_behalf_of_charge_management: bool, dispute_management: bool, refund_management: bool}&StripeObject)}&StripeObject), payment_disputes: (object{enabled: bool, features: (object{destination_on_behalf_of_charge_management: bool, dispute_management: bool, refund_management: bool}&StripeObject)}&StripeObject), payments: (object{enabled: bool, features: (object{capture_payments: bool, destination_on_behalf_of_charge_management: bool, dispute_management: bool, refund_management: bool}&StripeObject)}&StripeObject), payout_details: (object{enabled: bool, features: (object{}&StripeObject)}&StripeObject), payout_reconciliation_report: (object{enabled: bool, features: (object{}&StripeObject)}&StripeObject), payouts: (object{enabled: bool, features: (object{disable_stripe_user_authentication: bool, edit_payout_schedule: bool, external_account_collection: bool, instant_payouts: bool, standard_payouts: bool}&StripeObject)}&StripeObject), payouts_list: (object{enabled: bool, features: (object{}&StripeObject)}&StripeObject), tax_registrations: (object{enabled: bool, features: (object{}&StripeObject)}&StripeObject), tax_settings: (object{enabled: bool, features: (object{}&StripeObject)}&StripeObject)}&StripeObject) $components * @property int $expires_at The timestamp at which this AccountSession will expire. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. */ class AccountSession extends ApiResource { @@ -28,7 +28,7 @@ class AccountSession extends ApiResource * Creates a AccountSession object that includes a single-use token that the * platform can use on their front-end to grant client-side API access. * - * @param null|array{account: string, components: array{account_management?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, external_account_collection?: bool}}, account_onboarding?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, external_account_collection?: bool}}, balances?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, edit_payout_schedule?: bool, external_account_collection?: bool, instant_payouts?: bool, standard_payouts?: bool}}, disputes_list?: array{enabled: bool, features?: array{capture_payments?: bool, destination_on_behalf_of_charge_management?: bool, dispute_management?: bool, refund_management?: bool}}, documents?: array{enabled: bool, features?: array{}}, financial_account?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, external_account_collection?: bool, send_money?: bool, transfer_balance?: bool}}, financial_account_transactions?: array{enabled: bool, features?: array{card_spend_dispute_management?: bool}}, instant_payouts_promotion?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, external_account_collection?: bool, instant_payouts?: bool}}, issuing_card?: array{enabled: bool, features?: array{card_management?: bool, card_spend_dispute_management?: bool, cardholder_management?: bool, spend_control_management?: bool}}, issuing_cards_list?: array{enabled: bool, features?: array{card_management?: bool, card_spend_dispute_management?: bool, cardholder_management?: bool, disable_stripe_user_authentication?: bool, spend_control_management?: bool}}, notification_banner?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, external_account_collection?: bool}}, payment_details?: array{enabled: bool, features?: array{capture_payments?: bool, destination_on_behalf_of_charge_management?: bool, dispute_management?: bool, refund_management?: bool}}, payment_disputes?: array{enabled: bool, features?: array{destination_on_behalf_of_charge_management?: bool, dispute_management?: bool, refund_management?: bool}}, payments?: array{enabled: bool, features?: array{capture_payments?: bool, destination_on_behalf_of_charge_management?: bool, dispute_management?: bool, refund_management?: bool}}, payout_details?: array{enabled: bool, features?: array{}}, payouts?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, edit_payout_schedule?: bool, external_account_collection?: bool, instant_payouts?: bool, standard_payouts?: bool}}, payouts_list?: array{enabled: bool, features?: array{}}, tax_registrations?: array{enabled: bool, features?: array{}}, tax_settings?: array{enabled: bool, features?: array{}}}, expand?: string[]} $params + * @param null|array{account: string, components: array{account_management?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, external_account_collection?: bool}}, account_onboarding?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, external_account_collection?: bool}}, balance_report?: array{enabled: bool, features?: array{}}, balances?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, edit_payout_schedule?: bool, external_account_collection?: bool, instant_payouts?: bool, standard_payouts?: bool}}, disputes_list?: array{enabled: bool, features?: array{capture_payments?: bool, destination_on_behalf_of_charge_management?: bool, dispute_management?: bool, refund_management?: bool}}, documents?: array{enabled: bool, features?: array{}}, financial_account?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, external_account_collection?: bool, send_money?: bool, transfer_balance?: bool}}, financial_account_transactions?: array{enabled: bool, features?: array{card_spend_dispute_management?: bool}}, instant_payouts_promotion?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, external_account_collection?: bool, instant_payouts?: bool}}, issuing_card?: array{enabled: bool, features?: array{card_management?: bool, card_spend_dispute_management?: bool, cardholder_management?: bool, spend_control_management?: bool}}, issuing_cards_list?: array{enabled: bool, features?: array{card_management?: bool, card_spend_dispute_management?: bool, cardholder_management?: bool, disable_stripe_user_authentication?: bool, spend_control_management?: bool}}, notification_banner?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, external_account_collection?: bool}}, payment_details?: array{enabled: bool, features?: array{capture_payments?: bool, destination_on_behalf_of_charge_management?: bool, dispute_management?: bool, refund_management?: bool}}, payment_disputes?: array{enabled: bool, features?: array{destination_on_behalf_of_charge_management?: bool, dispute_management?: bool, refund_management?: bool}}, payments?: array{enabled: bool, features?: array{capture_payments?: bool, destination_on_behalf_of_charge_management?: bool, dispute_management?: bool, refund_management?: bool}}, payout_details?: array{enabled: bool, features?: array{}}, payout_reconciliation_report?: array{enabled: bool, features?: array{}}, payouts?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, edit_payout_schedule?: bool, external_account_collection?: bool, instant_payouts?: bool, standard_payouts?: bool}}, payouts_list?: array{enabled: bool, features?: array{}}, tax_registrations?: array{enabled: bool, features?: array{}}, tax_settings?: array{enabled: bool, features?: array{}}}, expand?: string[]} $params * @param null|array|string $options * * @return AccountSession the created resource diff --git a/libs/stripe-php/lib/ApiRequestor.php b/libs/stripe-php/lib/ApiRequestor.php index 6bf854744..f7d24b91a 100644 --- a/libs/stripe-php/lib/ApiRequestor.php +++ b/libs/stripe-php/lib/ApiRequestor.php @@ -134,6 +134,7 @@ class ApiRequestor $headers = $headers ?: []; list($rbody, $rcode, $rheaders, $myApiKey) = $this->_requestRaw($method, $url, $params, $headers, $apiMode, $usage, $maxNetworkRetries); + $this->_maybeEmitStripeNotice($rheaders); $json = $this->_interpretResponse($rbody, $rcode, $rheaders, $apiMode); $resp = new ApiResponse($rbody, $rcode, $rheaders, $json); @@ -158,6 +159,7 @@ class ApiRequestor $headers = $headers ?: []; list($rbody, $rcode, $rheaders, $myApiKey) = $this->_requestRawStreaming($method, $url, $params, $headers, $apiMode, $usage, $readBodyChunkCallable, $maxNetworkRetries); + $this->_maybeEmitStripeNotice($rheaders); if ($rcode >= 300) { $this->_interpretResponse($rbody, $rcode, $rheaders, $apiMode); } @@ -270,6 +272,16 @@ class ApiRequestor return Exception\IdempotencyException::factory($msg, $rcode, $rbody, $resp, $rheaders, $code); // switchCases: The beginning of the section generated from our OpenAPI spec + case 'rate_limit': + return Exception\RateLimitException::factory( + $msg, + $rcode, + $rbody, + $resp, + $rheaders, + $code + ); + case 'temporary_session_expired': return Exception\TemporarySessionExpiredException::factory( $msg, @@ -385,6 +397,7 @@ class ApiRequestor ['CODEX_CI', 'codex_cli'], ['CURSOR_AGENT', 'cursor'], ['GEMINI_CLI', 'gemini_cli'], + ['OPENCLAW_SHELL', 'openclaw'], ['OPENCODE', 'open_code'], // aiAgents: The end of the section generated from our OpenAPI spec ]; @@ -419,18 +432,26 @@ class ApiRequestor $uaString = "Stripe/{$apiMode} PhpBindings/" . Stripe::VERSION; $langVersion = \PHP_VERSION; - $uname_disabled = self::_isDisabled(\ini_get('disable_functions'), 'php_uname'); - $uname = $uname_disabled ? '(disabled)' : \php_uname(); // Fallback to global configuration to maintain backwards compatibility. $appInfo = $appInfo ?: Stripe::getAppInfo(); + $ua = [ 'bindings_version' => Stripe::VERSION, 'lang' => 'php', 'lang_version' => $langVersion, - 'publisher' => 'stripe', - 'uname' => $uname, ]; + if (Stripe::getEnableTelemetry()) { + $telemetryId = TelemetryId::get(); + if (null !== $telemetryId) { + $ua['telemetry_id'] = $telemetryId; + } + $uname_disabled = self::_isDisabled(\ini_get('disable_functions'), 'php_uname'); + $ua['platform'] = $uname_disabled + ? '(disabled)' + // only get general platform information, e.g. `Darwin 25.3.0 arm64` + : \php_uname('s') . ' ' . \php_uname('r') . ' ' . \php_uname('m'); + } if ($clientInfo) { $ua = \array_merge($clientInfo, $ua); } @@ -543,6 +564,13 @@ class ApiRequestor return [$absUrl, $rawHeaders, $params, $hasFile, $myApiKey]; } + private function _maybeEmitStripeNotice($rheaders) + { + if (isset($rheaders['stripe-notice']) && \is_string($rheaders['stripe-notice'])) { + \trigger_error($rheaders['stripe-notice'], \E_USER_WARNING); + } + } + /** * @param 'delete'|'get'|'post' $method * @param string $url diff --git a/libs/stripe-php/lib/ApplePayDomain.php b/libs/stripe-php/lib/ApplePayDomain.php index 0aa384225..da2c09641 100644 --- a/libs/stripe-php/lib/ApplePayDomain.php +++ b/libs/stripe-php/lib/ApplePayDomain.php @@ -9,7 +9,7 @@ namespace Stripe; * @property string $object String representing the object's type. Objects of the same type share the same value. * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. * @property string $domain_name - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. */ class ApplePayDomain extends ApiResource { diff --git a/libs/stripe-php/lib/ApplicationFee.php b/libs/stripe-php/lib/ApplicationFee.php index 32db79139..ac0241e77 100644 --- a/libs/stripe-php/lib/ApplicationFee.php +++ b/libs/stripe-php/lib/ApplicationFee.php @@ -16,7 +16,7 @@ namespace Stripe; * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. * @property null|(object{charge?: string, payout?: string, type: string}&StripeObject) $fee_source Polymorphic source of the application fee. Includes the ID of the object the application fee was created from. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|Charge|string $originating_transaction ID of the corresponding charge on the platform account, if this fee was the result of a charge using the destination parameter. * @property bool $refunded Whether the fee has been fully refunded. If the fee is only partially refunded, this attribute will still be false. * @property Collection $refunds A list of refunds that have been applied to the fee. diff --git a/libs/stripe-php/lib/Apps/Secret.php b/libs/stripe-php/lib/Apps/Secret.php index 98ace562c..1f746d016 100644 --- a/libs/stripe-php/lib/Apps/Secret.php +++ b/libs/stripe-php/lib/Apps/Secret.php @@ -20,7 +20,7 @@ namespace Stripe\Apps; * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. * @property null|bool $deleted If true, indicates that this secret has been deleted * @property null|int $expires_at The Unix timestamp for the expiry time of the secret, after which the secret deletes. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property string $name A name for the secret that's unique within the scope. * @property null|string $payload The plaintext secret value to be stored. * @property (object{type: string, user?: string}&\Stripe\StripeObject) $scope diff --git a/libs/stripe-php/lib/Balance.php b/libs/stripe-php/lib/Balance.php index ef488325d..3292ffc75 100644 --- a/libs/stripe-php/lib/Balance.php +++ b/libs/stripe-php/lib/Balance.php @@ -17,7 +17,7 @@ namespace Stripe; * @property null|(object{amount: int, currency: string, source_types?: (object{bank_account?: int, card?: int, fpx?: int}&StripeObject)}&StripeObject)[] $connect_reserved Funds held due to negative balances on connected accounts where account.controller.requirement_collection is application, which includes Custom accounts. You can find the connect reserve balance for each currency and payment type in the source_types property. * @property null|(object{amount: int, currency: string, net_available?: (object{amount: int, destination: string, source_types?: (object{bank_account?: int, card?: int, fpx?: int}&StripeObject)}&StripeObject)[], source_types?: (object{bank_account?: int, card?: int, fpx?: int}&StripeObject)}&StripeObject)[] $instant_available Funds that you can pay out using Instant Payouts. * @property null|(object{available: (object{amount: int, currency: string, source_types?: (object{bank_account?: int, card?: int, fpx?: int}&StripeObject)}&StripeObject)[]}&StripeObject) $issuing - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property (object{amount: int, currency: string, source_types?: (object{bank_account?: int, card?: int, fpx?: int}&StripeObject)}&StripeObject)[] $pending Funds that aren't available in the balance yet. You can find the pending balance for each currency and each payment type in the source_types property. * @property null|(object{available: (object{amount: int, currency: string, source_types?: (object{bank_account?: int, card?: int, fpx?: int}&StripeObject)}&StripeObject)[], pending: (object{amount: int, currency: string, source_types?: (object{bank_account?: int, card?: int, fpx?: int}&StripeObject)}&StripeObject)[]}&StripeObject) $refund_and_dispute_prefunding */ diff --git a/libs/stripe-php/lib/BalanceSettings.php b/libs/stripe-php/lib/BalanceSettings.php index 72c07d650..c13d29423 100644 --- a/libs/stripe-php/lib/BalanceSettings.php +++ b/libs/stripe-php/lib/BalanceSettings.php @@ -8,7 +8,7 @@ namespace Stripe; * Options for customizing account balances and payout settings for a Stripe platform’s connected accounts. * * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property (object{debit_negative_balances: null|bool, payouts: null|(object{minimum_balance_by_currency: null|StripeObject, schedule: null|(object{interval: null|string, monthly_payout_days?: int[], weekly_payout_days?: string[]}&StripeObject), statement_descriptor: null|string, status: string}&StripeObject), settlement_timing: (object{delay_days: int, delay_days_override?: int}&StripeObject)}&StripeObject) $payments + * @property (object{debit_negative_balances: null|bool, payouts: null|(object{automatic_transfer_rules_by_currency: null|StripeObject, minimum_balance_by_currency: null|StripeObject, schedule: null|(object{interval: null|string, monthly_payout_days?: int[], weekly_payout_days?: string[]}&StripeObject), statement_descriptor: null|string, status: string}&StripeObject), settlement_timing: (object{delay_days: int, delay_days_override?: int, start_of_day: null|(object{hour: int, minutes: int, timezone: string}&StripeObject)}&StripeObject)}&StripeObject) $payments */ class BalanceSettings extends SingletonApiResource { @@ -40,7 +40,7 @@ class BalanceSettings extends SingletonApiResource * href="/connect/authentication">Making API calls for connected accounts. * * @param string $id the ID of the resource to update - * @param null|array{expand?: string[], payments?: array{debit_negative_balances?: bool, payouts?: array{minimum_balance_by_currency?: null|array, schedule?: array{interval?: string, monthly_payout_days?: int[], weekly_payout_days?: string[]}, statement_descriptor?: string}, settlement_timing?: array{delay_days_override?: null|int}}} $params + * @param null|array{expand?: string[], payments?: array{debit_negative_balances?: bool, payouts?: array{automatic_transfer_rules_by_currency?: null|array, minimum_balance_by_currency?: null|array, schedule?: array{interval?: string, monthly_payout_days?: int[], weekly_payout_days?: string[]}, statement_descriptor?: string}, settlement_timing?: array{delay_days_override?: null|int, start_of_day?: null|array{hour?: int, minutes?: int, timezone?: string}}}} $params * @param null|array|string $opts * * @return BalanceSettings the updated resource diff --git a/libs/stripe-php/lib/BalanceTransaction.php b/libs/stripe-php/lib/BalanceTransaction.php index d7419ed69..4d550c2e2 100644 --- a/libs/stripe-php/lib/BalanceTransaction.php +++ b/libs/stripe-php/lib/BalanceTransaction.php @@ -25,7 +25,7 @@ namespace Stripe; * @property string $reporting_category Learn more about how reporting categories can help you understand balance transactions from an accounting perspective. * @property null|ApplicationFee|ApplicationFeeRefund|Charge|ConnectCollectionTransfer|CustomerCashBalanceTransaction|Dispute|Issuing\Authorization|Issuing\Dispute|Issuing\Transaction|Payout|Refund|ReserveTransaction|string|TaxDeductedAtSource|Topup|Transfer|TransferReversal $source This transaction relates to the Stripe object. * @property string $status The transaction's net funds status in the Stripe balance, which are either available or pending. - * @property string $type Transaction type: adjustment, advance, advance_funding, anticipation_repayment, application_fee, application_fee_refund, charge, climate_order_purchase, climate_order_refund, connect_collection_transfer, contribution, issuing_authorization_hold, issuing_authorization_release, issuing_dispute, issuing_transaction, obligation_outbound, obligation_reversal_inbound, payment, payment_failure_refund, payment_network_reserve_hold, payment_network_reserve_release, payment_refund, payment_reversal, payment_unreconciled, payout, payout_cancel, payout_failure, payout_minimum_balance_hold, payout_minimum_balance_release, refund, refund_failure, reserve_transaction, reserved_funds, reserve_hold, reserve_release, stripe_fee, stripe_fx_fee, stripe_balance_payment_debit, stripe_balance_payment_debit_reversal, tax_fee, topup, topup_reversal, transfer, transfer_cancel, transfer_failure, or transfer_refund. Learn more about balance transaction types and what they represent. To classify transactions for accounting purposes, consider reporting_category instead. + * @property string $type Transaction type: tax_fund, adjustment, advance, advance_funding, anticipation_repayment, application_fee, application_fee_refund, charge, climate_order_purchase, climate_order_refund, connect_collection_transfer, contribution, inbound_transfer, inbound_transfer_reversal, issuing_authorization_hold, issuing_authorization_release, issuing_dispute, issuing_transaction, obligation_outbound, obligation_reversal_inbound, payment, payment_failure_refund, payment_network_reserve_hold, payment_network_reserve_release, payment_refund, payment_reversal, payment_unreconciled, payout, payout_cancel, payout_failure, payout_minimum_balance_hold, payout_minimum_balance_release, refund, refund_failure, reserve_transaction, reserved_funds, reserve_hold, reserve_release, stripe_fee, stripe_fx_fee, stripe_balance_payment_debit, stripe_balance_payment_debit_reversal, tax_fee, topup, topup_reversal, transfer, transfer_cancel, transfer_failure, transfer_refund, or fee_credit_funding. Learn more about balance transaction types and what they represent. To classify transactions for accounting purposes, consider reporting_category instead. */ class BalanceTransaction extends ApiResource { @@ -47,6 +47,9 @@ class BalanceTransaction extends ApiResource const TYPE_CLIMATE_ORDER_REFUND = 'climate_order_refund'; const TYPE_CONNECT_COLLECTION_TRANSFER = 'connect_collection_transfer'; const TYPE_CONTRIBUTION = 'contribution'; + const TYPE_FEE_CREDIT_FUNDING = 'fee_credit_funding'; + const TYPE_INBOUND_TRANSFER = 'inbound_transfer'; + const TYPE_INBOUND_TRANSFER_REVERSAL = 'inbound_transfer_reversal'; const TYPE_ISSUING_AUTHORIZATION_HOLD = 'issuing_authorization_hold'; const TYPE_ISSUING_AUTHORIZATION_RELEASE = 'issuing_authorization_release'; const TYPE_ISSUING_DISPUTE = 'issuing_dispute'; @@ -76,6 +79,7 @@ class BalanceTransaction extends ApiResource const TYPE_STRIPE_FEE = 'stripe_fee'; const TYPE_STRIPE_FX_FEE = 'stripe_fx_fee'; const TYPE_TAX_FEE = 'tax_fee'; + const TYPE_TAX_FUND = 'tax_fund'; const TYPE_TOPUP = 'topup'; const TYPE_TOPUP_REVERSAL = 'topup_reversal'; const TYPE_TRANSFER = 'transfer'; @@ -85,11 +89,11 @@ class BalanceTransaction extends ApiResource /** * Returns a list of transactions that have contributed to the Stripe account - * balance (e.g., charges, transfers, and so forth). The transactions are returned - * in sorted order, with the most recent transactions appearing first. + * balance (for example, charges, transfers, and so on). The transactions return in + * sorted order, with the most recent transactions appearing first. * - * Note that this endpoint was previously called “Balance history” and used the - * path /v1/balance/history. + * The previous name of this endpoint was “Balance history,” and it used the path + * /v1/balance/history. * * @param null|array{created?: array|int, currency?: string, ending_before?: string, expand?: string[], limit?: int, payout?: string, source?: string, starting_after?: string, type?: string} $params * @param null|array|string $opts diff --git a/libs/stripe-php/lib/Billing/Alert.php b/libs/stripe-php/lib/Billing/Alert.php index 49fe58a08..9e54cf3a5 100644 --- a/libs/stripe-php/lib/Billing/Alert.php +++ b/libs/stripe-php/lib/Billing/Alert.php @@ -10,7 +10,7 @@ namespace Stripe\Billing; * @property string $id Unique identifier for the object. * @property string $object String representing the object's type. Objects of the same type share the same value. * @property string $alert_type Defines the type of the alert. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|string $status Status of the alert. This can be active, inactive or archived. * @property string $title Title of the alert. * @property null|(object{filters: null|((object{customer: null|string|\Stripe\Customer, type: string}&\Stripe\StripeObject))[], gte: int, meter: Meter|string, recurrence: string}&\Stripe\StripeObject) $usage_threshold Encapsulates configuration of the alert to monitor usage on a specific Billing Meter. diff --git a/libs/stripe-php/lib/Billing/AlertTriggered.php b/libs/stripe-php/lib/Billing/AlertTriggered.php index 8641dd38d..b73f0b288 100644 --- a/libs/stripe-php/lib/Billing/AlertTriggered.php +++ b/libs/stripe-php/lib/Billing/AlertTriggered.php @@ -9,7 +9,7 @@ namespace Stripe\Billing; * @property Alert $alert A billing alert is a resource that notifies you when a certain usage threshold on a meter is crossed. For example, you might create a billing alert to notify you when a certain user made 100 API requests. * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. * @property string $customer ID of customer for which the alert triggered - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property int $value The value triggering the alert */ class AlertTriggered extends \Stripe\ApiResource diff --git a/libs/stripe-php/lib/Billing/CreditBalanceSummary.php b/libs/stripe-php/lib/Billing/CreditBalanceSummary.php index e767650e3..2801352e0 100644 --- a/libs/stripe-php/lib/Billing/CreditBalanceSummary.php +++ b/libs/stripe-php/lib/Billing/CreditBalanceSummary.php @@ -11,7 +11,7 @@ namespace Stripe\Billing; * @property ((object{available_balance: (object{monetary: null|(object{currency: string, value: int}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), ledger_balance: (object{monetary: null|(object{currency: string, value: int}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject)}&\Stripe\StripeObject))[] $balances The billing credit balances. One entry per credit grant currency. If a customer only has credit grants in a single currency, then this will have a single balance entry. * @property string|\Stripe\Customer $customer The customer the balance is for. * @property null|string $customer_account The account the balance is for. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. */ class CreditBalanceSummary extends \Stripe\SingletonApiResource { diff --git a/libs/stripe-php/lib/Billing/CreditBalanceTransaction.php b/libs/stripe-php/lib/Billing/CreditBalanceTransaction.php index 2d3be6f78..ddb7696f0 100644 --- a/libs/stripe-php/lib/Billing/CreditBalanceTransaction.php +++ b/libs/stripe-php/lib/Billing/CreditBalanceTransaction.php @@ -14,7 +14,7 @@ namespace Stripe\Billing; * @property CreditGrant|string $credit_grant The credit grant associated with this credit balance transaction. * @property null|(object{amount: (object{monetary: null|(object{currency: string, value: int}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), credits_applied: null|(object{invoice: string|\Stripe\Invoice, invoice_line_item: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject) $debit Debit details for this credit balance transaction. Only present if type is debit. * @property int $effective_at The effective time of this credit balance transaction. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|string|\Stripe\TestHelpers\TestClock $test_clock ID of the test clock this credit balance transaction belongs to. * @property null|string $type The type of credit balance transaction (credit or debit). */ diff --git a/libs/stripe-php/lib/Billing/CreditGrant.php b/libs/stripe-php/lib/Billing/CreditGrant.php index 5d1f2add3..881099d81 100644 --- a/libs/stripe-php/lib/Billing/CreditGrant.php +++ b/libs/stripe-php/lib/Billing/CreditGrant.php @@ -19,7 +19,7 @@ namespace Stripe\Billing; * @property null|string $customer_account ID of the account representing the customer receiving the billing credits * @property null|int $effective_at The time when the billing credits become effective-when they're eligible for use. * @property null|int $expires_at The time when the billing credits expire. If not present, the billing credits don't expire. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|string $name A descriptive name shown in dashboard. * @property null|int $priority The priority for applying this credit grant. The highest priority is 0 and the lowest is 100. diff --git a/libs/stripe-php/lib/Billing/Meter.php b/libs/stripe-php/lib/Billing/Meter.php index c54658560..21f30dee3 100644 --- a/libs/stripe-php/lib/Billing/Meter.php +++ b/libs/stripe-php/lib/Billing/Meter.php @@ -17,7 +17,7 @@ namespace Stripe\Billing; * @property string $display_name The meter's name. * @property string $event_name The name of the meter event to record usage for. Corresponds with the event_name field on meter events. * @property null|string $event_time_window The time window which meter events have been pre-aggregated for, if any. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property string $status The meter's status. * @property (object{deactivated_at: null|int}&\Stripe\StripeObject) $status_transitions * @property int $updated Time at which the object was last updated. Measured in seconds since the Unix epoch. diff --git a/libs/stripe-php/lib/Billing/MeterEvent.php b/libs/stripe-php/lib/Billing/MeterEvent.php index 96c19184e..e12a69dc7 100644 --- a/libs/stripe-php/lib/Billing/MeterEvent.php +++ b/libs/stripe-php/lib/Billing/MeterEvent.php @@ -11,7 +11,7 @@ namespace Stripe\Billing; * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. * @property string $event_name The name of the meter event. Corresponds with the event_name field on a meter. * @property string $identifier A unique identifier for the event. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property \Stripe\StripeObject $payload The payload of the event. This contains the fields corresponding to a meter's customer_mapping.event_payload_key (default is stripe_customer_id) and value_settings.event_payload_key (default is value). Read more about the payload. * @property int $timestamp The timestamp passed in when creating the event. Measured in seconds since the Unix epoch. */ diff --git a/libs/stripe-php/lib/Billing/MeterEventAdjustment.php b/libs/stripe-php/lib/Billing/MeterEventAdjustment.php index a6742b467..842ed5974 100644 --- a/libs/stripe-php/lib/Billing/MeterEventAdjustment.php +++ b/libs/stripe-php/lib/Billing/MeterEventAdjustment.php @@ -10,7 +10,7 @@ namespace Stripe\Billing; * @property string $object String representing the object's type. Objects of the same type share the same value. * @property null|(object{identifier: null|string}&\Stripe\StripeObject) $cancel Specifies which event to cancel. * @property string $event_name The name of the meter event. Corresponds with the event_name field on a meter. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property string $status The meter event adjustment's status. * @property string $type Specifies whether to cancel a single event or a range of events for a time period. Time period cancellation is not supported yet. */ diff --git a/libs/stripe-php/lib/Billing/MeterEventSummary.php b/libs/stripe-php/lib/Billing/MeterEventSummary.php index 008525a66..0ab36c90b 100644 --- a/libs/stripe-php/lib/Billing/MeterEventSummary.php +++ b/libs/stripe-php/lib/Billing/MeterEventSummary.php @@ -14,7 +14,7 @@ namespace Stripe\Billing; * @property string $object String representing the object's type. Objects of the same type share the same value. * @property float $aggregated_value Aggregated value of all the events within start_time (inclusive) and end_time (inclusive). The aggregation strategy is defined on meter via default_aggregation. * @property int $end_time End timestamp for this event summary (exclusive). Must be aligned with minute boundaries. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property string $meter The meter associated with this event summary. * @property int $start_time Start timestamp for this event summary (inclusive). Must be aligned with minute boundaries. */ diff --git a/libs/stripe-php/lib/BillingPortal/Configuration.php b/libs/stripe-php/lib/BillingPortal/Configuration.php index 4cc47d335..fb90e4345 100644 --- a/libs/stripe-php/lib/BillingPortal/Configuration.php +++ b/libs/stripe-php/lib/BillingPortal/Configuration.php @@ -16,7 +16,7 @@ namespace Stripe\BillingPortal; * @property null|string $default_return_url The default URL to redirect customers to when they click on the portal's link to return to your website. This can be overriden when creating the session. * @property (object{customer_update: (object{allowed_updates: string[], enabled: bool}&\Stripe\StripeObject), invoice_history: (object{enabled: bool}&\Stripe\StripeObject), payment_method_update: (object{enabled: bool, payment_method_configuration: null|string}&\Stripe\StripeObject), subscription_cancel: (object{cancellation_reason: (object{enabled: bool, options: string[]}&\Stripe\StripeObject), enabled: bool, mode: string, proration_behavior: string}&\Stripe\StripeObject), subscription_update: (object{billing_cycle_anchor: null|string, default_allowed_updates: string[], enabled: bool, products?: null|((object{adjustable_quantity: (object{enabled: bool, maximum: null|int, minimum: int}&\Stripe\StripeObject), prices: string[], product: string}&\Stripe\StripeObject))[], proration_behavior: string, schedule_at_period_end: (object{conditions: (object{type: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), trial_update_behavior: string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $features * @property bool $is_default Whether the configuration is the default. If true, this configuration can be managed in the Dashboard and portal sessions will use this configuration unless it is overriden when creating the session. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property (object{enabled: bool, url: null|string}&\Stripe\StripeObject) $login_page * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|string $name The name of the configuration. diff --git a/libs/stripe-php/lib/BillingPortal/Session.php b/libs/stripe-php/lib/BillingPortal/Session.php index b833a6e2d..8be7a3d62 100644 --- a/libs/stripe-php/lib/BillingPortal/Session.php +++ b/libs/stripe-php/lib/BillingPortal/Session.php @@ -27,7 +27,7 @@ namespace Stripe\BillingPortal; * @property string $customer The ID of the customer for this session. * @property null|string $customer_account The ID of the account for this session. * @property null|(object{after_completion: (object{hosted_confirmation: null|(object{custom_message: null|string}&\Stripe\StripeObject), redirect: null|(object{return_url: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), subscription_cancel: null|(object{retention: null|(object{coupon_offer: null|(object{coupon: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), subscription: string}&\Stripe\StripeObject), subscription_update: null|(object{subscription: string}&\Stripe\StripeObject), subscription_update_confirm: null|(object{discounts: null|((object{coupon: null|string, promotion_code: null|string}&\Stripe\StripeObject))[], items: ((object{id: null|string, price: null|string, quantity?: int}&\Stripe\StripeObject))[], subscription: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject) $flow Information about a specific flow for the customer to go through. See the docs to learn more about using customer portal deep links and flows. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|string $locale The IETF language tag of the locale Customer Portal is displayed in. If blank or auto, the customer’s preferred_locales or browser’s locale is used. * @property null|string $on_behalf_of The account for which the session was created on behalf of. When specified, only subscriptions and invoices with this on_behalf_of account appear in the portal. For more information, see the docs. Use the Accounts API to modify the on_behalf_of account's branding settings, which the portal displays. * @property null|string $return_url The URL to redirect customers to when they click on the portal's link to return to your website. diff --git a/libs/stripe-php/lib/CashBalance.php b/libs/stripe-php/lib/CashBalance.php index fd0cbfe20..a9261494b 100644 --- a/libs/stripe-php/lib/CashBalance.php +++ b/libs/stripe-php/lib/CashBalance.php @@ -11,7 +11,7 @@ namespace Stripe; * @property null|StripeObject $available A hash of all cash balances available to this customer. You cannot delete a customer with any cash balances, even if the balance is 0. Amounts are represented in the smallest currency unit. * @property string $customer The ID of the customer whose cash balance this object represents. * @property null|string $customer_account The ID of an Account representing a customer whose cash balance this object represents. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property (object{reconciliation_mode: string, using_merchant_default: bool}&StripeObject) $settings */ class CashBalance extends ApiResource diff --git a/libs/stripe-php/lib/Charge.php b/libs/stripe-php/lib/Charge.php index 73a865476..02bdd15e0 100644 --- a/libs/stripe-php/lib/Charge.php +++ b/libs/stripe-php/lib/Charge.php @@ -32,14 +32,14 @@ namespace Stripe; * @property null|string $failure_message Message to user further explaining reason for charge failure if available. * @property null|(object{stripe_report?: string, user_report?: string}&StripeObject) $fraud_details Information on fraud assessments for the charge. * @property null|(object{customer_reference?: string, line_items: ((object{discount_amount: null|int, product_code: string, product_description: string, quantity: null|int, tax_amount: null|int, unit_cost: null|int}&StripeObject))[], merchant_reference: string, shipping_address_zip?: string, shipping_amount?: int, shipping_from_zip?: string}&StripeObject) $level3 - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|Account|string $on_behalf_of The account (if any) the charge was made on behalf of without triggering an automatic transfer. See the Connect documentation for details. * @property null|(object{advice_code: null|string, network_advice_code: null|string, network_decline_code: null|string, network_status: null|string, reason: null|string, risk_level?: string, risk_score?: int, rule?: (object{action: string, id: string, predicate: string}&StripeObject)|string, seller_message: null|string, type: string}&StripeObject) $outcome Details about whether the payment was accepted, and why. See understanding declines for details. * @property bool $paid true if the charge succeeded, or was successfully authorized for later capture. * @property null|PaymentIntent|string $payment_intent ID of the PaymentIntent associated with this charge, if one exists. * @property null|string $payment_method ID of the payment method used in this charge. - * @property null|(object{ach_credit_transfer?: (object{account_number: null|string, bank_name: null|string, routing_number: null|string, swift_code: null|string}&StripeObject), ach_debit?: (object{account_holder_type: null|string, bank_name: null|string, country: null|string, fingerprint: null|string, last4: null|string, routing_number: null|string}&StripeObject), acss_debit?: (object{bank_name: null|string, expected_debit_date?: string, fingerprint: null|string, institution_number: null|string, last4: null|string, mandate?: string, transit_number: null|string}&StripeObject), affirm?: (object{location?: string, reader?: string, transaction_id: null|string}&StripeObject), afterpay_clearpay?: (object{order_id: null|string, reference: null|string}&StripeObject), alipay?: (object{buyer_id?: string, fingerprint: null|string, transaction_id: null|string}&StripeObject), alma?: (object{installments?: (object{count: int}&StripeObject), transaction_id: null|string}&StripeObject), amazon_pay?: (object{funding?: (object{card?: (object{brand: null|string, country: null|string, exp_month: null|int, exp_year: null|int, funding: null|string, last4: null|string}&StripeObject), type: null|string}&StripeObject), transaction_id: null|string}&StripeObject), au_becs_debit?: (object{bsb_number: null|string, expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate?: string}&StripeObject), bacs_debit?: (object{expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate: null|string, sort_code: null|string}&StripeObject), bancontact?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, preferred_language: null|string, verified_name: null|string}&StripeObject), billie?: (object{transaction_id: null|string}&StripeObject), blik?: (object{buyer_id: null|string}&StripeObject), boleto?: (object{tax_id: string}&StripeObject), card?: (object{amount_authorized: null|int, authorization_code: null|string, brand: null|string, capture_before?: int, checks: null|(object{address_line1_check: null|string, address_postal_code_check: null|string, cvc_check: null|string}&StripeObject), country: null|string, description?: null|string, exp_month: int, exp_year: int, extended_authorization?: (object{status: string}&StripeObject), fingerprint?: null|string, funding: null|string, iin?: null|string, incremental_authorization?: (object{status: string}&StripeObject), installments: null|(object{plan: null|(object{count: null|int, interval: null|string, type: string}&StripeObject)}&StripeObject), issuer?: null|string, last4: null|string, mandate: null|string, moto?: null|bool, multicapture?: (object{status: string}&StripeObject), network: null|string, network_token?: null|(object{used: bool}&StripeObject), network_transaction_id: null|string, overcapture?: (object{maximum_amount_capturable: int, status: string}&StripeObject), regulated_status: null|string, three_d_secure: null|(object{authentication_flow: null|string, electronic_commerce_indicator: null|string, exemption_indicator: null|string, exemption_indicator_applied?: bool, result: null|string, result_reason: null|string, transaction_id: null|string, version: null|string}&StripeObject), wallet: null|(object{amex_express_checkout?: (object{}&StripeObject), apple_pay?: (object{}&StripeObject), dynamic_last4: null|string, google_pay?: (object{}&StripeObject), link?: (object{}&StripeObject), masterpass?: (object{billing_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, shipping_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject)}&StripeObject), samsung_pay?: (object{}&StripeObject), type: string, visa_checkout?: (object{billing_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, shipping_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject)}&StripeObject)}&StripeObject)}&StripeObject), card_present?: (object{amount_authorized: null|int, brand: null|string, brand_product: null|string, capture_before?: int, cardholder_name: null|string, country: null|string, description?: null|string, emv_auth_data: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, generated_card: null|string, iin?: null|string, incremental_authorization_supported: bool, issuer?: null|string, last4: null|string, location?: string, network: null|string, network_transaction_id: null|string, offline: null|(object{stored_at: null|int, type: null|string}&StripeObject), overcapture_supported: bool, preferred_locales: null|string[], read_method: null|string, reader?: string, receipt: null|(object{account_type?: string, application_cryptogram: null|string, application_preferred_name: null|string, authorization_code: null|string, authorization_response_code: null|string, cardholder_verification_method: null|string, dedicated_file_name: null|string, terminal_verification_results: null|string, transaction_status_information: null|string}&StripeObject), wallet?: (object{type: string}&StripeObject)}&StripeObject), cashapp?: (object{buyer_id: null|string, cashtag: null|string, transaction_id: null|string}&StripeObject), crypto?: (object{buyer_address?: string, network?: string, token_currency?: string, transaction_hash?: string}&StripeObject), customer_balance?: (object{}&StripeObject), eps?: (object{bank: null|string, verified_name: null|string}&StripeObject), fpx?: (object{account_holder_type: null|string, bank: string, transaction_id: null|string}&StripeObject), giropay?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, verified_name: null|string}&StripeObject), grabpay?: (object{transaction_id: null|string}&StripeObject), ideal?: (object{bank: null|string, bic: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, transaction_id: null|string, verified_name: null|string}&StripeObject), interac_present?: (object{brand: null|string, cardholder_name: null|string, country: null|string, description?: null|string, emv_auth_data: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, generated_card: null|string, iin?: null|string, issuer?: null|string, last4: null|string, location?: string, network: null|string, network_transaction_id: null|string, preferred_locales: null|string[], read_method: null|string, reader?: string, receipt: null|(object{account_type?: string, application_cryptogram: null|string, application_preferred_name: null|string, authorization_code: null|string, authorization_response_code: null|string, cardholder_verification_method: null|string, dedicated_file_name: null|string, terminal_verification_results: null|string, transaction_status_information: null|string}&StripeObject)}&StripeObject), kakao_pay?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), klarna?: (object{payer_details: null|(object{address: null|(object{country: null|string}&StripeObject)}&StripeObject), payment_method_category: null|string, preferred_locale: null|string}&StripeObject), konbini?: (object{store: null|(object{chain: null|string}&StripeObject)}&StripeObject), kr_card?: (object{brand: null|string, buyer_id: null|string, last4: null|string, transaction_id: null|string}&StripeObject), link?: (object{country: null|string}&StripeObject), mb_way?: (object{}&StripeObject), mobilepay?: (object{card: null|(object{brand: null|string, country: null|string, exp_month: null|int, exp_year: null|int, last4: null|string}&StripeObject)}&StripeObject), multibanco?: (object{entity: null|string, reference: null|string}&StripeObject), naver_pay?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), nz_bank_account?: (object{account_holder_name: null|string, bank_code: string, bank_name: string, branch_code: string, expected_debit_date?: string, last4: string, suffix: null|string}&StripeObject), oxxo?: (object{number: null|string}&StripeObject), p24?: (object{bank: null|string, reference: null|string, verified_name: null|string}&StripeObject), pay_by_bank?: (object{}&StripeObject), payco?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), paynow?: (object{location?: string, reader?: string, reference: null|string}&StripeObject), paypal?: (object{country: null|string, payer_email: null|string, payer_id: null|string, payer_name: null|string, seller_protection: null|(object{dispute_categories: null|string[], status: string}&StripeObject), transaction_id: null|string}&StripeObject), payto?: (object{bsb_number: null|string, last4: null|string, mandate?: string, pay_id: null|string}&StripeObject), pix?: (object{bank_transaction_id?: null|string}&StripeObject), promptpay?: (object{reference: null|string}&StripeObject), revolut_pay?: (object{funding?: (object{card?: (object{brand: null|string, country: null|string, exp_month: null|int, exp_year: null|int, funding: null|string, last4: null|string}&StripeObject), type: null|string}&StripeObject), transaction_id: null|string}&StripeObject), samsung_pay?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), satispay?: (object{transaction_id: null|string}&StripeObject), sepa_credit_transfer?: (object{bank_name: null|string, bic: null|string, iban: null|string}&StripeObject), sepa_debit?: (object{bank_code: null|string, branch_code: null|string, country: null|string, expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate: null|string}&StripeObject), sofort?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, country: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, preferred_language: null|string, verified_name: null|string}&StripeObject), stripe_account?: (object{}&StripeObject), swish?: (object{fingerprint: null|string, payment_reference: null|string, verified_phone_last4: null|string}&StripeObject), twint?: (object{}&StripeObject), type: string, us_bank_account?: (object{account_holder_type: null|string, account_type: null|string, bank_name: null|string, expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate?: Mandate|string, payment_reference: null|string, routing_number: null|string}&StripeObject), wechat?: (object{}&StripeObject), wechat_pay?: (object{fingerprint: null|string, location?: string, reader?: string, transaction_id: null|string}&StripeObject), zip?: (object{}&StripeObject)}&StripeObject) $payment_method_details Details about the payment method at the time of the transaction. + * @property null|(object{ach_credit_transfer?: (object{account_number: null|string, bank_name: null|string, routing_number: null|string, swift_code: null|string}&StripeObject), ach_debit?: (object{account_holder_type: null|string, bank_name: null|string, country: null|string, fingerprint: null|string, last4: null|string, routing_number: null|string}&StripeObject), acss_debit?: (object{bank_name: null|string, expected_debit_date?: string, fingerprint: null|string, institution_number: null|string, last4: null|string, mandate?: string, transit_number: null|string}&StripeObject), affirm?: (object{location?: string, reader?: string, transaction_id: null|string}&StripeObject), afterpay_clearpay?: (object{order_id: null|string, reference: null|string}&StripeObject), alipay?: (object{buyer_id?: string, fingerprint: null|string, transaction_id: null|string}&StripeObject), alma?: (object{installments?: (object{count: int}&StripeObject), transaction_id: null|string}&StripeObject), amazon_pay?: (object{funding?: (object{card?: (object{brand: null|string, country: null|string, exp_month: null|int, exp_year: null|int, funding: null|string, last4: null|string}&StripeObject), type: null|string}&StripeObject), transaction_id: null|string}&StripeObject), au_becs_debit?: (object{bsb_number: null|string, expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate?: string}&StripeObject), bacs_debit?: (object{expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate: null|string, sort_code: null|string}&StripeObject), bancontact?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, preferred_language: null|string, verified_name: null|string}&StripeObject), billie?: (object{transaction_id: null|string}&StripeObject), bizum?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), blik?: (object{buyer_id: null|string}&StripeObject), boleto?: (object{tax_id: string}&StripeObject), card?: (object{amount_authorized: null|int, authorization_code: null|string, brand: null|string, capture_before?: int, checks: null|(object{address_line1_check: null|string, address_postal_code_check: null|string, cvc_check: null|string}&StripeObject), country: null|string, description?: null|string, exp_month: int, exp_year: int, extended_authorization?: (object{status: string}&StripeObject), fingerprint?: null|string, funding: null|string, iin?: null|string, incremental_authorization?: (object{status: string}&StripeObject), installments: null|(object{plan: null|(object{count: null|int, interval: null|string, type: string}&StripeObject)}&StripeObject), issuer?: null|string, last4: null|string, mandate: null|string, moto?: null|bool, multicapture?: (object{status: string}&StripeObject), network: null|string, network_token?: null|(object{used: bool}&StripeObject), network_transaction_id: null|string, overcapture?: (object{maximum_amount_capturable: int, status: string}&StripeObject), regulated_status: null|string, three_d_secure: null|(object{authentication_flow: null|string, electronic_commerce_indicator: null|string, exemption_indicator: null|string, exemption_indicator_applied?: bool, result: null|string, result_reason: null|string, transaction_id: null|string, version: null|string}&StripeObject), transaction_link_id: null|string, wallet: null|(object{amex_express_checkout?: (object{}&StripeObject), apple_pay?: (object{}&StripeObject), dynamic_last4: null|string, google_pay?: (object{}&StripeObject), link?: (object{}&StripeObject), masterpass?: (object{billing_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, shipping_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject)}&StripeObject), samsung_pay?: (object{}&StripeObject), type: string, visa_checkout?: (object{billing_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, shipping_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject)}&StripeObject)}&StripeObject)}&StripeObject), card_present?: (object{amount_authorized: null|int, brand: null|string, brand_product: null|string, capture_before?: int, cardholder_name: null|string, country: null|string, description?: null|string, emv_auth_data: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, generated_card: null|string, iin?: null|string, incremental_authorization_supported: bool, issuer?: null|string, last4: null|string, location?: string, network: null|string, network_transaction_id: null|string, offline: null|(object{stored_at: null|int, type: null|string}&StripeObject), overcapture_supported: bool, preferred_locales: null|string[], read_method: null|string, reader?: string, receipt: null|(object{account_type?: string, application_cryptogram: null|string, application_preferred_name: null|string, authorization_code: null|string, authorization_response_code: null|string, cardholder_verification_method: null|string, dedicated_file_name: null|string, terminal_verification_results: null|string, transaction_status_information: null|string}&StripeObject), wallet?: (object{type: string}&StripeObject)}&StripeObject), cashapp?: (object{buyer_id: null|string, cashtag: null|string, transaction_id: null|string}&StripeObject), crypto?: (object{buyer_address?: string, network?: string, token_currency?: string, transaction_hash?: string}&StripeObject), customer_balance?: (object{}&StripeObject), eps?: (object{bank: null|string, verified_name: null|string}&StripeObject), fpx?: (object{account_holder_type: null|string, bank: string, transaction_id: null|string}&StripeObject), giropay?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, verified_name: null|string}&StripeObject), grabpay?: (object{transaction_id: null|string}&StripeObject), ideal?: (object{bank: null|string, bic: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, transaction_id: null|string, verified_name: null|string}&StripeObject), interac_present?: (object{brand: null|string, cardholder_name: null|string, country: null|string, description?: null|string, emv_auth_data: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, generated_card: null|string, iin?: null|string, issuer?: null|string, last4: null|string, location?: string, network: null|string, network_transaction_id: null|string, preferred_locales: null|string[], read_method: null|string, reader?: string, receipt: null|(object{account_type?: string, application_cryptogram: null|string, application_preferred_name: null|string, authorization_code: null|string, authorization_response_code: null|string, cardholder_verification_method: null|string, dedicated_file_name: null|string, terminal_verification_results: null|string, transaction_status_information: null|string}&StripeObject)}&StripeObject), kakao_pay?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), klarna?: (object{location?: string, payer_details: null|(object{address: null|(object{country: null|string}&StripeObject)}&StripeObject), payment_method_category: null|string, preferred_locale: null|string, reader?: string}&StripeObject), konbini?: (object{store: null|(object{chain: null|string}&StripeObject)}&StripeObject), kr_card?: (object{brand: null|string, buyer_id: null|string, last4: null|string, transaction_id: null|string}&StripeObject), link?: (object{country: null|string}&StripeObject), mb_way?: (object{}&StripeObject), mobilepay?: (object{card: null|(object{brand: null|string, country: null|string, exp_month: null|int, exp_year: null|int, last4: null|string}&StripeObject)}&StripeObject), multibanco?: (object{entity: null|string, reference: null|string}&StripeObject), naver_pay?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), nz_bank_account?: (object{account_holder_name: null|string, bank_code: string, bank_name: string, branch_code: string, expected_debit_date?: string, last4: string, suffix: null|string}&StripeObject), oxxo?: (object{number: null|string}&StripeObject), p24?: (object{bank: null|string, reference: null|string, verified_name: null|string}&StripeObject), pay_by_bank?: (object{}&StripeObject), payco?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), paynow?: (object{location?: string, reader?: string, reference: null|string}&StripeObject), paypal?: (object{country: null|string, payer_email: null|string, payer_id: null|string, payer_name: null|string, seller_protection: null|(object{dispute_categories: null|string[], status: string}&StripeObject), transaction_id: null|string}&StripeObject), payto?: (object{bsb_number: null|string, last4: null|string, mandate?: string, pay_id: null|string}&StripeObject), pix?: (object{bank_transaction_id?: null|string, fingerprint?: null|string, mandate?: string}&StripeObject), promptpay?: (object{reference: null|string}&StripeObject), revolut_pay?: (object{funding?: (object{card?: (object{brand: null|string, country: null|string, exp_month: null|int, exp_year: null|int, funding: null|string, last4: null|string}&StripeObject), type: null|string}&StripeObject), transaction_id: null|string}&StripeObject), samsung_pay?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), satispay?: (object{transaction_id: null|string}&StripeObject), scalapay?: (object{transaction_id: null|string}&StripeObject), sepa_credit_transfer?: (object{bank_name: null|string, bic: null|string, iban: null|string}&StripeObject), sepa_debit?: (object{bank_code: null|string, branch_code: null|string, country: null|string, expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate: null|string}&StripeObject), sofort?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, country: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, preferred_language: null|string, verified_name: null|string}&StripeObject), stripe_account?: (object{}&StripeObject), sunbit?: (object{transaction_id: null|string}&StripeObject), swish?: (object{fingerprint: null|string, payment_reference: null|string, verified_phone_last4: null|string}&StripeObject), twint?: (object{mandate?: string}&StripeObject), type: string, upi?: (object{vpa: null|string}&StripeObject), us_bank_account?: (object{account_holder_type: null|string, account_type: null|string, bank_name: null|string, expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate?: Mandate|string, payment_reference: null|string, routing_number: null|string}&StripeObject), wechat?: (object{}&StripeObject), wechat_pay?: (object{fingerprint: null|string, location?: string, reader?: string, transaction_id: null|string}&StripeObject), zip?: (object{}&StripeObject)}&StripeObject) $payment_method_details Details about the payment method at the time of the transaction. * @property null|(object{presentment_amount: int, presentment_currency: string}&StripeObject) $presentment_details * @property null|(object{session?: string}&StripeObject) $radar_options Options to configure Radar. See Radar Session for more information. * @property null|string $receipt_email This is the email address that the receipt for this charge was sent to. @@ -75,7 +75,7 @@ class Charge extends ApiResource * payment instead. Confirmation of the PaymentIntent creates the * Charge object used to request payment. * - * @param null|array{amount?: int, application_fee?: int, application_fee_amount?: int, capture?: bool, currency?: string, customer?: string, description?: string, destination?: array{account: string, amount?: int}, expand?: string[], metadata?: null|array, on_behalf_of?: string, radar_options?: array{session?: string}, receipt_email?: string, shipping?: array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name: string, phone?: string, tracking_number?: string}, source?: string, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_data?: array{amount?: int, destination: string}, transfer_group?: string} $params + * @param null|array{amount?: int, application_fee?: int, application_fee_amount?: int, capture?: bool, currency?: string, customer?: string, description?: string, destination?: array{account: string, amount?: int}, expand?: string[], metadata?: null|array, on_behalf_of?: string, radar_options?: array{session?: string}, receipt_email?: string, shipping?: array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name: string, phone?: string, tracking_number?: string}, source?: string, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_data?: array{amount?: int, description?: string, destination: string}, transfer_group?: string} $params * @param null|array|string $options * * @return Charge the created resource diff --git a/libs/stripe-php/lib/Checkout/Session.php b/libs/stripe-php/lib/Checkout/Session.php index 9a405abd1..f5c1f54ea 100644 --- a/libs/stripe-php/lib/Checkout/Session.php +++ b/libs/stripe-php/lib/Checkout/Session.php @@ -32,7 +32,7 @@ namespace Stripe\Checkout; * @property null|(object{background_color: string, border_style: string, button_color: string, display_name: string, font_family: string, icon: null|(object{file?: string, type: string, url?: string}&\Stripe\StripeObject), logo: null|(object{file?: string, type: string, url?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $branding_settings * @property null|string $cancel_url If set, Checkout displays a back button and customers will be directed to this URL if they decide to cancel payment and return to your website. * @property null|string $client_reference_id A unique string to reference the Checkout Session. This can be a customer ID, a cart ID, or similar, and can be used to reconcile the Session with your internal systems. - * @property null|string $client_secret The client secret of your Checkout Session. Applies to Checkout Sessions with ui_mode: embedded or ui_mode: custom. For ui_mode: embedded, the client secret is to be used when initializing Stripe.js embedded checkout. For ui_mode: custom, use the client secret with initCheckout on your front end. + * @property null|string $client_secret The client secret of your Checkout Session. Applies to Checkout Sessions with ui_mode: embedded_page or ui_mode: elements. For ui_mode: embedded_page, the client secret is to be used when initializing Stripe.js embedded checkout. For ui_mode: elements, use the client secret with initCheckout on your front end. * @property null|(object{business_name: null|string, individual_name: null|string, shipping_details: null|(object{address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject), name: string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $collected_information Information about the customer collected within the Checkout Session. * @property null|(object{promotions: null|string, terms_of_service: null|string}&\Stripe\StripeObject) $consent Results of consent_collection for this session. * @property null|(object{payment_method_reuse_agreement: null|(object{position: string}&\Stripe\StripeObject), promotions: null|string, terms_of_service: null|string}&\Stripe\StripeObject) $consent_collection When set, provides configuration for the Checkout Session to gather active consent from customers. @@ -49,11 +49,13 @@ namespace Stripe\Checkout; * @property null|((object{coupon: null|string|\Stripe\Coupon, promotion_code: null|string|\Stripe\PromotionCode}&\Stripe\StripeObject))[] $discounts List of coupons and promotion codes attached to the Checkout Session. * @property null|string[] $excluded_payment_method_types A list of the types of payment methods (e.g., card) that should be excluded from this Checkout Session. This should only be used when payment methods for this Checkout Session are managed through the Stripe Dashboard. * @property int $expires_at The timestamp at which the Checkout Session will expire. + * @property null|string $integration_identifier The integration identifier for this Checkout Session. Multiple Checkout Sessions can have the same integration identifier. * @property null|string|\Stripe\Invoice $invoice ID of the invoice created by the Checkout Session, if it exists. * @property null|(object{enabled: bool, invoice_data: (object{account_tax_ids: null|(string|\Stripe\TaxId)[], custom_fields: null|(object{name: string, value: string}&\Stripe\StripeObject)[], description: null|string, footer: null|string, issuer: null|(object{account?: string|\Stripe\Account, type: string}&\Stripe\StripeObject), metadata: null|\Stripe\StripeObject, rendering_options: null|(object{amount_tax_display: null|string, template: null|string}&\Stripe\StripeObject)}&\Stripe\StripeObject)}&\Stripe\StripeObject) $invoice_creation Details on the state of invoice creation for the Checkout Session. * @property null|\Stripe\Collection<\Stripe\LineItem> $line_items The line items purchased by the customer. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|string $locale The IETF language tag of the locale Checkout is displayed in. If blank or auto, the browser's locale is used. + * @property null|(object{enabled: bool}&\Stripe\StripeObject) $managed_payments Settings for Managed Payments for this Checkout Session and resulting PaymentIntents, Invoices, and Subscriptions. * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property string $mode The mode of the Checkout Session. * @property null|(object{business?: (object{enabled: bool, optional: bool}&\Stripe\StripeObject), individual?: (object{enabled: bool, optional: bool}&\Stripe\StripeObject)}&\Stripe\StripeObject) $name_collection @@ -63,15 +65,15 @@ namespace Stripe\Checkout; * @property null|string|\Stripe\PaymentLink $payment_link The ID of the Payment Link that created this Session. * @property null|string $payment_method_collection Configure whether a Checkout Session should collect a payment method. Defaults to always. * @property null|(object{id: string, parent: null|string}&\Stripe\StripeObject) $payment_method_configuration_details Information about the payment method configuration used for this Checkout session if using dynamic payment methods. - * @property null|(object{acss_debit?: (object{currency?: string, mandate_options?: (object{custom_mandate_url?: string, default_for?: string[], interval_description: null|string, payment_schedule: null|string, transaction_type: null|string}&\Stripe\StripeObject), setup_future_usage?: string, target_date?: string, verification_method?: string}&\Stripe\StripeObject), affirm?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), afterpay_clearpay?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), alipay?: (object{setup_future_usage?: string}&\Stripe\StripeObject), alma?: (object{capture_method?: string}&\Stripe\StripeObject), amazon_pay?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), au_becs_debit?: (object{setup_future_usage?: string, target_date?: string}&\Stripe\StripeObject), bacs_debit?: (object{mandate_options?: (object{reference_prefix?: string}&\Stripe\StripeObject), setup_future_usage?: string, target_date?: string}&\Stripe\StripeObject), bancontact?: (object{setup_future_usage?: string}&\Stripe\StripeObject), billie?: (object{capture_method?: string}&\Stripe\StripeObject), boleto?: (object{expires_after_days: int, setup_future_usage?: string}&\Stripe\StripeObject), card?: (object{capture_method?: string, installments?: (object{enabled?: bool}&\Stripe\StripeObject), request_extended_authorization?: string, request_incremental_authorization?: string, request_multicapture?: string, request_overcapture?: string, request_three_d_secure: string, restrictions?: (object{brands_blocked?: string[]}&\Stripe\StripeObject), setup_future_usage?: string, statement_descriptor_suffix_kana?: string, statement_descriptor_suffix_kanji?: string}&\Stripe\StripeObject), cashapp?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), customer_balance?: (object{bank_transfer?: (object{eu_bank_transfer?: (object{country: string}&\Stripe\StripeObject), requested_address_types?: string[], type: null|string}&\Stripe\StripeObject), funding_type: null|string, setup_future_usage?: string}&\Stripe\StripeObject), eps?: (object{setup_future_usage?: string}&\Stripe\StripeObject), fpx?: (object{setup_future_usage?: string}&\Stripe\StripeObject), giropay?: (object{setup_future_usage?: string}&\Stripe\StripeObject), grabpay?: (object{setup_future_usage?: string}&\Stripe\StripeObject), ideal?: (object{setup_future_usage?: string}&\Stripe\StripeObject), kakao_pay?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), klarna?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), konbini?: (object{expires_after_days: null|int, setup_future_usage?: string}&\Stripe\StripeObject), kr_card?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), link?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), mobilepay?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), multibanco?: (object{setup_future_usage?: string}&\Stripe\StripeObject), naver_pay?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), oxxo?: (object{expires_after_days: int, setup_future_usage?: string}&\Stripe\StripeObject), p24?: (object{setup_future_usage?: string}&\Stripe\StripeObject), payco?: (object{capture_method?: string}&\Stripe\StripeObject), paynow?: (object{setup_future_usage?: string}&\Stripe\StripeObject), paypal?: (object{capture_method?: string, preferred_locale: null|string, reference: null|string, setup_future_usage?: string}&\Stripe\StripeObject), payto?: (object{mandate_options?: (object{amount: null|int, amount_type: null|string, end_date: null|string, payment_schedule: null|string, payments_per_period: null|int, purpose: null|string, start_date: null|string}&\Stripe\StripeObject), setup_future_usage?: string}&\Stripe\StripeObject), pix?: (object{amount_includes_iof?: string, expires_after_seconds: null|int, setup_future_usage?: string}&\Stripe\StripeObject), revolut_pay?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), samsung_pay?: (object{capture_method?: string}&\Stripe\StripeObject), satispay?: (object{capture_method?: string}&\Stripe\StripeObject), sepa_debit?: (object{mandate_options?: (object{reference_prefix?: string}&\Stripe\StripeObject), setup_future_usage?: string, target_date?: string}&\Stripe\StripeObject), sofort?: (object{setup_future_usage?: string}&\Stripe\StripeObject), swish?: (object{reference: null|string}&\Stripe\StripeObject), twint?: (object{setup_future_usage?: string}&\Stripe\StripeObject), us_bank_account?: (object{financial_connections?: (object{filters?: (object{account_subcategories?: string[]}&\Stripe\StripeObject), permissions?: string[], prefetch: null|string[], return_url?: string}&\Stripe\StripeObject), setup_future_usage?: string, target_date?: string, verification_method?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $payment_method_options Payment-method-specific configuration for the PaymentIntent or SetupIntent of this CheckoutSession. + * @property null|(object{acss_debit?: (object{currency?: string, mandate_options?: (object{custom_mandate_url?: string, default_for?: string[], interval_description: null|string, payment_schedule: null|string, transaction_type: null|string}&\Stripe\StripeObject), setup_future_usage?: string, target_date?: string, verification_method?: string}&\Stripe\StripeObject), affirm?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), afterpay_clearpay?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), alipay?: (object{setup_future_usage?: string}&\Stripe\StripeObject), alma?: (object{capture_method?: string}&\Stripe\StripeObject), amazon_pay?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), au_becs_debit?: (object{setup_future_usage?: string, target_date?: string}&\Stripe\StripeObject), bacs_debit?: (object{mandate_options?: (object{reference_prefix?: string}&\Stripe\StripeObject), setup_future_usage?: string, target_date?: string}&\Stripe\StripeObject), bancontact?: (object{setup_future_usage?: string}&\Stripe\StripeObject), billie?: (object{capture_method?: string}&\Stripe\StripeObject), boleto?: (object{expires_after_days: int, setup_future_usage?: string}&\Stripe\StripeObject), card?: (object{capture_method?: string, installments?: (object{enabled?: bool}&\Stripe\StripeObject), request_extended_authorization?: string, request_incremental_authorization?: string, request_multicapture?: string, request_overcapture?: string, request_three_d_secure: string, restrictions?: (object{brands_blocked?: string[]}&\Stripe\StripeObject), setup_future_usage?: string, statement_descriptor_suffix_kana?: string, statement_descriptor_suffix_kanji?: string}&\Stripe\StripeObject), cashapp?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), customer_balance?: (object{bank_transfer?: (object{eu_bank_transfer?: (object{country: string}&\Stripe\StripeObject), requested_address_types?: string[], type: null|string}&\Stripe\StripeObject), funding_type: null|string, setup_future_usage?: string}&\Stripe\StripeObject), eps?: (object{setup_future_usage?: string}&\Stripe\StripeObject), fpx?: (object{setup_future_usage?: string}&\Stripe\StripeObject), giropay?: (object{setup_future_usage?: string}&\Stripe\StripeObject), grabpay?: (object{setup_future_usage?: string}&\Stripe\StripeObject), ideal?: (object{setup_future_usage?: string}&\Stripe\StripeObject), kakao_pay?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), klarna?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), konbini?: (object{expires_after_days: null|int, setup_future_usage?: string}&\Stripe\StripeObject), kr_card?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), link?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), mobilepay?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), multibanco?: (object{setup_future_usage?: string}&\Stripe\StripeObject), naver_pay?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), oxxo?: (object{expires_after_days: int, setup_future_usage?: string}&\Stripe\StripeObject), p24?: (object{setup_future_usage?: string}&\Stripe\StripeObject), payco?: (object{capture_method?: string}&\Stripe\StripeObject), paynow?: (object{setup_future_usage?: string}&\Stripe\StripeObject), paypal?: (object{capture_method?: string, preferred_locale: null|string, reference: null|string, setup_future_usage?: string}&\Stripe\StripeObject), payto?: (object{mandate_options?: (object{amount: null|int, amount_type: null|string, end_date: null|string, payment_schedule: null|string, payments_per_period: null|int, purpose: null|string, start_date: null|string}&\Stripe\StripeObject), setup_future_usage?: string}&\Stripe\StripeObject), pix?: (object{amount_includes_iof?: string, expires_after_seconds: null|int, mandate_options?: (object{amount?: int, amount_includes_iof?: string, amount_type?: string, currency?: string, end_date?: string, payment_schedule?: string, reference?: string, start_date?: string}&\Stripe\StripeObject), setup_future_usage?: string}&\Stripe\StripeObject), revolut_pay?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), samsung_pay?: (object{capture_method?: string}&\Stripe\StripeObject), satispay?: (object{capture_method?: string}&\Stripe\StripeObject), scalapay?: (object{capture_method?: string}&\Stripe\StripeObject), sepa_debit?: (object{mandate_options?: (object{reference_prefix?: string}&\Stripe\StripeObject), setup_future_usage?: string, target_date?: string}&\Stripe\StripeObject), sofort?: (object{setup_future_usage?: string}&\Stripe\StripeObject), sunbit?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), swish?: (object{reference: null|string}&\Stripe\StripeObject), twint?: (object{setup_future_usage?: string}&\Stripe\StripeObject), upi?: (object{mandate_options?: (object{amount: null|int, amount_type: null|string, description: null|string, end_date: null|int}&\Stripe\StripeObject), setup_future_usage?: string}&\Stripe\StripeObject), us_bank_account?: (object{financial_connections?: (object{filters?: (object{account_subcategories?: string[]}&\Stripe\StripeObject), permissions?: string[], prefetch: null|string[], return_url?: string}&\Stripe\StripeObject), setup_future_usage?: string, target_date?: string, verification_method?: string}&\Stripe\StripeObject), wechat_pay?: (object{app_id: null|string, client: null|string, setup_future_usage?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $payment_method_options Payment-method-specific configuration for the PaymentIntent or SetupIntent of this CheckoutSession. * @property string[] $payment_method_types A list of the types of payment methods (e.g. card) this Checkout Session is allowed to accept. * @property string $payment_status The payment status of the Checkout Session, one of paid, unpaid, or no_payment_required. You can use this value to decide when to fulfill your customer's order. * @property null|(object{update_shipping_details: null|string}&\Stripe\StripeObject) $permissions

    This property is used to set up permissions for various actions (e.g., update) on the CheckoutSession object.

    For specific permissions, please refer to their dedicated subsections, such as permissions.update_shipping_details.

    * @property null|(object{enabled: bool}&\Stripe\StripeObject) $phone_number_collection * @property null|(object{presentment_amount: int, presentment_currency: string}&\Stripe\StripeObject) $presentment_details * @property null|string $recovered_from The ID of the original expired Checkout Session that triggered the recovery flow. - * @property null|string $redirect_on_completion This parameter applies to ui_mode: embedded. Learn more about the redirect behavior of embedded sessions. Defaults to always. - * @property null|string $return_url Applies to Checkout Sessions with ui_mode: embedded or ui_mode: custom. The URL to redirect your customer back to after they authenticate or cancel their payment on the payment method's app or site. + * @property null|string $redirect_on_completion This parameter applies to ui_mode: embedded_page. Learn more about the redirect behavior of embedded sessions. Defaults to always. + * @property null|string $return_url Applies to Checkout Sessions with ui_mode: embedded_page or ui_mode: elements. The URL to redirect your customer back to after they authenticate or cancel their payment on the payment method's app or site. * @property null|(object{allow_redisplay_filters: null|string[], payment_method_remove: null|string, payment_method_save: null|string}&\Stripe\StripeObject) $saved_payment_method_options Controls saved payment method settings for the session. Only available in payment and subscription mode. * @property null|string|\Stripe\SetupIntent $setup_intent The ID of the SetupIntent for Checkout Sessions in setup mode. You can't confirm or cancel the SetupIntent for a Checkout Session. To cancel, expire the Checkout Session instead. * @property null|(object{allowed_countries: string[]}&\Stripe\StripeObject) $shipping_address_collection When set, provides configuration for Checkout to collect a shipping address from a customer. @@ -83,8 +85,8 @@ namespace Stripe\Checkout; * @property null|string $success_url The URL the customer will be directed to after the payment or subscription creation is successful. * @property null|(object{enabled: bool, required: string}&\Stripe\StripeObject) $tax_id_collection * @property null|(object{amount_discount: int, amount_shipping: null|int, amount_tax: int, breakdown?: (object{discounts: (object{amount: int, discount: \Stripe\Discount}&\Stripe\StripeObject)[], taxes: ((object{amount: int, rate: \Stripe\TaxRate, taxability_reason: null|string, taxable_amount: null|int}&\Stripe\StripeObject))[]}&\Stripe\StripeObject)}&\Stripe\StripeObject) $total_details Tax and discount details for the computed total amount. - * @property null|string $ui_mode The UI mode of the Session. Defaults to hosted. - * @property null|string $url The URL to the Checkout Session. Applies to Checkout Sessions with ui_mode: hosted. Redirect customers to this URL to take them to Checkout. If you’re using Custom Domains, the URL will use your subdomain. Otherwise, it’ll use checkout.stripe.com. This value is only present when the session is active. + * @property null|string $ui_mode The UI mode of the Session. Defaults to hosted_page. + * @property null|string $url The URL to the Checkout Session. Applies to Checkout Sessions with ui_mode: hosted_page. Redirect customers to this URL to take them to Checkout. If you’re using Custom Domains, the URL will use your subdomain. Otherwise, it’ll use checkout.stripe.com. This value is only present when the session is active. * @property null|(object{link?: (object{display?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $wallet_options Wallet-specific configuration for this Checkout Session. */ class Session extends \Stripe\ApiResource @@ -127,14 +129,15 @@ class Session extends \Stripe\ApiResource const SUBMIT_TYPE_PAY = 'pay'; const SUBMIT_TYPE_SUBSCRIBE = 'subscribe'; - const UI_MODE_CUSTOM = 'custom'; - const UI_MODE_EMBEDDED = 'embedded'; - const UI_MODE_HOSTED = 'hosted'; + const UI_MODE_ELEMENTS = 'elements'; + const UI_MODE_EMBEDDED_PAGE = 'embedded_page'; + const UI_MODE_FORM = 'form'; + const UI_MODE_HOSTED_PAGE = 'hosted_page'; /** * Creates a Checkout Session object. * - * @param null|array{adaptive_pricing?: array{enabled?: bool}, after_expiration?: array{recovery?: array{allow_promotion_codes?: bool, enabled: bool}}, allow_promotion_codes?: bool, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_address_collection?: string, branding_settings?: array{background_color?: null|string, border_style?: null|string, button_color?: null|string, display_name?: string, font_family?: null|string, icon?: array{file?: string, type: string, url?: string}, logo?: array{file?: string, type: string, url?: string}}, cancel_url?: string, client_reference_id?: string, consent_collection?: array{payment_method_reuse_agreement?: array{position: string}, promotions?: string, terms_of_service?: string}, currency?: string, custom_fields?: array{dropdown?: array{default_value?: string, options: array{label: string, value: string}[]}, key: string, label: array{custom: string, type: string}, numeric?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, optional?: bool, text?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, type: string}[], custom_text?: array{after_submit?: null|array{message: string}, shipping_address?: null|array{message: string}, submit?: null|array{message: string}, terms_of_service_acceptance?: null|array{message: string}}, customer?: string, customer_account?: string, customer_creation?: string, customer_email?: string, customer_update?: array{address?: string, name?: string, shipping?: string}, discounts?: array{coupon?: string, promotion_code?: string}[], excluded_payment_method_types?: string[], expand?: string[], expires_at?: int, invoice_creation?: array{enabled: bool, invoice_data?: array{account_tax_ids?: null|string[], custom_fields?: null|array{name: string, value: string}[], description?: string, footer?: string, issuer?: array{account?: string, type: string}, metadata?: array, rendering_options?: null|array{amount_tax_display?: null|string, template?: string}}}, line_items?: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, dynamic_tax_rates?: string[], metadata?: array, price?: string, price_data?: array{currency: string, product?: string, product_data?: array{description?: string, images?: string[], metadata?: array, name: string, tax_code?: string, unit_label?: string}, recurring?: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: string[]}[], locale?: string, metadata?: array, mode?: string, name_collection?: array{business?: array{enabled: bool, optional?: bool}, individual?: array{enabled: bool, optional?: bool}}, optional_items?: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, price: string, quantity: int}[], origin_context?: string, payment_intent_data?: array{application_fee_amount?: int, capture_method?: string, description?: string, metadata?: array, on_behalf_of?: string, receipt_email?: string, setup_future_usage?: string, shipping?: array{address: array{city?: string, country?: string, line1: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name: string, phone?: string, tracking_number?: string}, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_data?: array{amount?: int, destination: string}, transfer_group?: string}, payment_method_collection?: string, payment_method_configuration?: string, payment_method_data?: array{allow_redisplay?: string}, payment_method_options?: array{acss_debit?: array{currency?: string, mandate_options?: array{custom_mandate_url?: null|string, default_for?: string[], interval_description?: string, payment_schedule?: string, transaction_type?: string}, setup_future_usage?: string, target_date?: string, verification_method?: string}, affirm?: array{capture_method?: string, setup_future_usage?: string}, afterpay_clearpay?: array{capture_method?: string, setup_future_usage?: string}, alipay?: array{setup_future_usage?: string}, alma?: array{capture_method?: string}, amazon_pay?: array{capture_method?: string, setup_future_usage?: string}, au_becs_debit?: array{setup_future_usage?: string, target_date?: string}, bacs_debit?: array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: string, target_date?: string}, bancontact?: array{setup_future_usage?: string}, billie?: array{capture_method?: string}, boleto?: array{expires_after_days?: int, setup_future_usage?: string}, card?: array{capture_method?: string, installments?: array{enabled?: bool}, request_extended_authorization?: string, request_incremental_authorization?: string, request_multicapture?: string, request_overcapture?: string, request_three_d_secure?: string, restrictions?: array{brands_blocked?: string[]}, setup_future_usage?: string, statement_descriptor_suffix_kana?: string, statement_descriptor_suffix_kanji?: string}, cashapp?: array{capture_method?: string, setup_future_usage?: string}, customer_balance?: array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, requested_address_types?: string[], type: string}, funding_type?: string, setup_future_usage?: string}, demo_pay?: array{setup_future_usage?: string}, eps?: array{setup_future_usage?: string}, fpx?: array{setup_future_usage?: string}, giropay?: array{setup_future_usage?: string}, grabpay?: array{setup_future_usage?: string}, ideal?: array{setup_future_usage?: string}, kakao_pay?: array{capture_method?: string, setup_future_usage?: string}, klarna?: array{capture_method?: string, setup_future_usage?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing: array{amount: int, date: string}, reference: string}[]}, konbini?: array{expires_after_days?: int, setup_future_usage?: string}, kr_card?: array{capture_method?: string, setup_future_usage?: string}, link?: array{capture_method?: string, setup_future_usage?: string}, mobilepay?: array{capture_method?: string, setup_future_usage?: string}, multibanco?: array{setup_future_usage?: string}, naver_pay?: array{capture_method?: string, setup_future_usage?: string}, oxxo?: array{expires_after_days?: int, setup_future_usage?: string}, p24?: array{setup_future_usage?: string, tos_shown_and_accepted?: bool}, pay_by_bank?: array{}, payco?: array{capture_method?: string}, paynow?: array{setup_future_usage?: string}, paypal?: array{capture_method?: null|string, preferred_locale?: string, reference?: string, risk_correlation_id?: string, setup_future_usage?: null|string}, payto?: array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string, start_date?: null|string}, setup_future_usage?: string}, pix?: array{amount_includes_iof?: string, expires_after_seconds?: int, setup_future_usage?: string}, revolut_pay?: array{capture_method?: string, setup_future_usage?: string}, samsung_pay?: array{capture_method?: string}, satispay?: array{capture_method?: string}, sepa_debit?: array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: string, target_date?: string}, sofort?: array{setup_future_usage?: string}, swish?: array{reference?: string}, twint?: array{setup_future_usage?: string}, us_bank_account?: array{financial_connections?: array{permissions?: string[], prefetch?: string[]}, setup_future_usage?: string, target_date?: string, verification_method?: string}, wechat_pay?: array{app_id?: string, client: string, setup_future_usage?: string}}, payment_method_types?: string[], permissions?: array{update_shipping_details?: string}, phone_number_collection?: array{enabled: bool}, redirect_on_completion?: string, return_url?: string, saved_payment_method_options?: array{allow_redisplay_filters?: string[], payment_method_remove?: string, payment_method_save?: string}, setup_intent_data?: array{description?: string, metadata?: array, on_behalf_of?: string}, shipping_address_collection?: array{allowed_countries: string[]}, shipping_options?: array{shipping_rate?: string, shipping_rate_data?: array{delivery_estimate?: array{maximum?: array{unit: string, value: int}, minimum?: array{unit: string, value: int}}, display_name: string, fixed_amount?: array{amount: int, currency: string, currency_options?: array}, metadata?: array, tax_behavior?: string, tax_code?: string, type?: string}}[], submit_type?: string, subscription_data?: array{application_fee_percent?: float, billing_cycle_anchor?: int, billing_mode?: array{flexible?: array{proration_discounts?: string}, type: string}, default_tax_rates?: string[], description?: string, invoice_settings?: array{issuer?: array{account?: string, type: string}}, metadata?: array, on_behalf_of?: string, proration_behavior?: string, transfer_data?: array{amount_percent?: float, destination: string}, trial_end?: int, trial_period_days?: int, trial_settings?: array{end_behavior: array{missing_payment_method: string}}}, success_url?: string, tax_id_collection?: array{enabled: bool, required?: string}, ui_mode?: string, wallet_options?: array{link?: array{display?: string}}} $params + * @param null|array{adaptive_pricing?: array{enabled?: bool}, after_expiration?: array{recovery?: array{allow_promotion_codes?: bool, enabled: bool}}, allow_promotion_codes?: bool, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_address_collection?: string, branding_settings?: array{background_color?: null|string, border_style?: null|string, button_color?: null|string, display_name?: string, font_family?: null|string, icon?: array{file?: string, type: string, url?: string}, logo?: array{file?: string, type: string, url?: string}}, cancel_url?: string, client_reference_id?: string, consent_collection?: array{payment_method_reuse_agreement?: array{position: string}, promotions?: string, terms_of_service?: string}, currency?: string, custom_fields?: array{dropdown?: array{default_value?: string, options: array{label: string, value: string}[]}, key: string, label: array{custom: string, type: string}, numeric?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, optional?: bool, text?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, type: string}[], custom_text?: array{after_submit?: null|array{message: string}, shipping_address?: null|array{message: string}, submit?: null|array{message: string}, terms_of_service_acceptance?: null|array{message: string}}, customer?: string, customer_account?: string, customer_creation?: string, customer_email?: string, customer_update?: array{address?: string, name?: string, shipping?: string}, discounts?: array{coupon?: string, promotion_code?: string}[], excluded_payment_method_types?: string[], expand?: string[], expires_at?: int, integration_identifier?: string, invoice_creation?: array{enabled: bool, invoice_data?: array{account_tax_ids?: null|string[], custom_fields?: null|array{name: string, value: string}[], description?: string, footer?: string, issuer?: array{account?: string, type: string}, metadata?: array, rendering_options?: null|array{amount_tax_display?: null|string, template?: string}}}, line_items?: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, dynamic_tax_rates?: string[], metadata?: array, price?: string, price_data?: array{currency: string, product?: string, product_data?: array{description?: string, images?: string[], metadata?: array, name: string, tax_code?: string, unit_label?: string}, recurring?: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: string[]}[], locale?: string, managed_payments?: array{enabled?: bool}, metadata?: array, mode?: string, name_collection?: array{business?: array{enabled: bool, optional?: bool}, individual?: array{enabled: bool, optional?: bool}}, optional_items?: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, price: string, quantity: int}[], origin_context?: string, payment_intent_data?: array{application_fee_amount?: int, capture_method?: string, description?: string, metadata?: array, on_behalf_of?: string, receipt_email?: string, setup_future_usage?: string, shipping?: array{address: array{city?: string, country?: string, line1: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name: string, phone?: string, tracking_number?: string}, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_data?: array{amount?: int, destination: string}, transfer_group?: string}, payment_method_collection?: string, payment_method_configuration?: string, payment_method_data?: array{allow_redisplay?: string}, payment_method_options?: array{acss_debit?: array{currency?: string, mandate_options?: array{custom_mandate_url?: null|string, default_for?: string[], interval_description?: string, payment_schedule?: string, transaction_type?: string}, setup_future_usage?: string, target_date?: string, verification_method?: string}, affirm?: array{capture_method?: string, setup_future_usage?: string}, afterpay_clearpay?: array{capture_method?: string, setup_future_usage?: string}, alipay?: array{setup_future_usage?: string}, alma?: array{capture_method?: string}, amazon_pay?: array{capture_method?: string, setup_future_usage?: string}, au_becs_debit?: array{setup_future_usage?: string, target_date?: string}, bacs_debit?: array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: string, target_date?: string}, bancontact?: array{setup_future_usage?: string}, billie?: array{capture_method?: string}, boleto?: array{expires_after_days?: int, setup_future_usage?: string}, card?: array{capture_method?: string, installments?: array{enabled?: bool}, request_extended_authorization?: string, request_incremental_authorization?: string, request_multicapture?: string, request_overcapture?: string, request_three_d_secure?: string, restrictions?: array{brands_blocked?: string[]}, setup_future_usage?: string, statement_descriptor_suffix_kana?: string, statement_descriptor_suffix_kanji?: string}, cashapp?: array{capture_method?: string, setup_future_usage?: string}, crypto?: array{setup_future_usage?: string}, customer_balance?: array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, requested_address_types?: string[], type: string}, funding_type?: string, setup_future_usage?: string}, demo_pay?: array{setup_future_usage?: string}, eps?: array{setup_future_usage?: string}, fpx?: array{setup_future_usage?: string}, giropay?: array{setup_future_usage?: string}, grabpay?: array{setup_future_usage?: string}, ideal?: array{setup_future_usage?: string}, kakao_pay?: array{capture_method?: string, setup_future_usage?: string}, klarna?: array{capture_method?: string, setup_future_usage?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing: array{amount: int, date: string}, reference: string}[]}, konbini?: array{expires_after_days?: int, setup_future_usage?: string}, kr_card?: array{capture_method?: string, setup_future_usage?: string}, link?: array{capture_method?: string, setup_future_usage?: string}, mobilepay?: array{capture_method?: string, setup_future_usage?: string}, multibanco?: array{setup_future_usage?: string}, naver_pay?: array{capture_method?: string, setup_future_usage?: string}, oxxo?: array{expires_after_days?: int, setup_future_usage?: string}, p24?: array{setup_future_usage?: string, tos_shown_and_accepted?: bool}, pay_by_bank?: array{}, payco?: array{capture_method?: string}, paynow?: array{setup_future_usage?: string}, paypal?: array{capture_method?: null|string, preferred_locale?: string, reference?: string, risk_correlation_id?: string, setup_future_usage?: null|string}, payto?: array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string, start_date?: null|string}, setup_future_usage?: string}, pix?: array{amount_includes_iof?: string, expires_after_seconds?: int, mandate_options?: array{amount?: int, amount_includes_iof?: string, amount_type?: string, currency?: string, end_date?: string, payment_schedule?: string, reference?: string, start_date?: string}, setup_future_usage?: string}, revolut_pay?: array{capture_method?: string, setup_future_usage?: string}, samsung_pay?: array{capture_method?: string}, satispay?: array{capture_method?: string}, scalapay?: array{capture_method?: string}, sepa_debit?: array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: string, target_date?: string}, sofort?: array{setup_future_usage?: string}, sunbit?: array{capture_method?: string, setup_future_usage?: string}, swish?: array{reference?: string}, twint?: array{setup_future_usage?: string}, upi?: array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}, setup_future_usage?: null|string}, us_bank_account?: array{financial_connections?: array{permissions?: string[], prefetch?: string[]}, setup_future_usage?: string, target_date?: string, verification_method?: string}, wechat_pay?: array{app_id?: string, client: string, setup_future_usage?: string}}, payment_method_types?: string[], permissions?: array{update_shipping_details?: string}, phone_number_collection?: array{enabled: bool}, redirect_on_completion?: string, return_url?: string, saved_payment_method_options?: array{allow_redisplay_filters?: string[], payment_method_remove?: string, payment_method_save?: string}, setup_intent_data?: array{description?: string, metadata?: array, on_behalf_of?: string}, shipping_address_collection?: array{allowed_countries: string[]}, shipping_options?: array{shipping_rate?: string, shipping_rate_data?: array{delivery_estimate?: array{maximum?: array{unit: string, value: int}, minimum?: array{unit: string, value: int}}, display_name: string, fixed_amount?: array{amount: int, currency: string, currency_options?: array}, metadata?: array, tax_behavior?: string, tax_code?: string, type?: string}}[], submit_type?: string, subscription_data?: array{application_fee_percent?: float, billing_cycle_anchor?: int, billing_cycle_anchor_config?: array{day_of_month: int, hour?: int, minute?: int, month?: int, second?: int}, billing_mode?: array{flexible?: array{proration_discounts?: string}, type: string}, default_tax_rates?: string[], description?: string, invoice_settings?: array{issuer?: array{account?: string, type: string}}, metadata?: array, on_behalf_of?: string, pending_invoice_item_interval?: array{interval: string, interval_count?: int}, proration_behavior?: string, transfer_data?: array{amount_percent?: float, destination: string}, trial_end?: int, trial_period_days?: int, trial_settings?: array{end_behavior: array{missing_payment_method: string}}}, success_url?: string, tax_id_collection?: array{enabled: bool, required?: string}, ui_mode?: string, wallet_options?: array{link?: array{display?: string}}} $params * @param null|array|string $options * * @return Session the created resource diff --git a/libs/stripe-php/lib/Climate/Supplier.php b/libs/stripe-php/lib/Climate/Supplier.php index 020445408..8fe52c2f4 100644 --- a/libs/stripe-php/lib/Climate/Supplier.php +++ b/libs/stripe-php/lib/Climate/Supplier.php @@ -22,6 +22,7 @@ class Supplier extends \Stripe\ApiResource const REMOVAL_PATHWAY_BIOMASS_CARBON_REMOVAL_AND_STORAGE = 'biomass_carbon_removal_and_storage'; const REMOVAL_PATHWAY_DIRECT_AIR_CAPTURE = 'direct_air_capture'; const REMOVAL_PATHWAY_ENHANCED_WEATHERING = 'enhanced_weathering'; + const REMOVAL_PATHWAY_MARINE_CARBON_REMOVAL = 'marine_carbon_removal'; /** * Lists all available Climate supplier objects. diff --git a/libs/stripe-php/lib/Collection.php b/libs/stripe-php/lib/Collection.php index b8c1d4bd3..b17c1b310 100644 --- a/libs/stripe-php/lib/Collection.php +++ b/libs/stripe-php/lib/Collection.php @@ -147,7 +147,7 @@ class Collection extends StripeObject implements \Countable, \IteratorAggregate } /** - * @return \ArrayIterator an iterator that can be used to iterate + * @return \ArrayIterator an iterator that can be used to iterate * across objects in the current page */ #[\ReturnTypeWillChange] @@ -157,7 +157,7 @@ class Collection extends StripeObject implements \Countable, \IteratorAggregate } /** - * @return \ArrayIterator an iterator that can be used to iterate + * @return \ArrayIterator an iterator that can be used to iterate * backwards across objects in the current page */ public function getReverseIterator() diff --git a/libs/stripe-php/lib/ConfirmationToken.php b/libs/stripe-php/lib/ConfirmationToken.php index 94c5f6f38..645b95885 100644 --- a/libs/stripe-php/lib/ConfirmationToken.php +++ b/libs/stripe-php/lib/ConfirmationToken.php @@ -17,11 +17,11 @@ namespace Stripe; * @property string $object String representing the object's type. Objects of the same type share the same value. * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. * @property null|int $expires_at Time at which this ConfirmationToken expires and can no longer be used to confirm a PaymentIntent or SetupIntent. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|(object{customer_acceptance: (object{online: null|(object{ip_address: null|string, user_agent: null|string}&StripeObject), type: string}&StripeObject)}&StripeObject) $mandate_data Data used for generating a Mandate. * @property null|string $payment_intent ID of the PaymentIntent that this ConfirmationToken was used to confirm, or null if this ConfirmationToken has not yet been used. * @property null|(object{card: null|(object{cvc_token: null|string, installments?: (object{plan?: (object{count: null|int, interval: null|string, type: string}&StripeObject)}&StripeObject)}&StripeObject)}&StripeObject) $payment_method_options Payment-method-specific configuration for this ConfirmationToken. - * @property null|(object{acss_debit?: (object{bank_name: null|string, fingerprint: null|string, institution_number: null|string, last4: null|string, transit_number: null|string}&StripeObject), affirm?: (object{}&StripeObject), afterpay_clearpay?: (object{}&StripeObject), alipay?: (object{}&StripeObject), allow_redisplay?: string, alma?: (object{}&StripeObject), amazon_pay?: (object{}&StripeObject), au_becs_debit?: (object{bsb_number: null|string, fingerprint: null|string, last4: null|string}&StripeObject), bacs_debit?: (object{fingerprint: null|string, last4: null|string, sort_code: null|string}&StripeObject), bancontact?: (object{}&StripeObject), billie?: (object{}&StripeObject), billing_details: (object{address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, phone: null|string, tax_id: null|string}&StripeObject), blik?: (object{}&StripeObject), boleto?: (object{tax_id: string}&StripeObject), card?: (object{brand: string, checks: null|(object{address_line1_check: null|string, address_postal_code_check: null|string, cvc_check: null|string}&StripeObject), country: null|string, description?: null|string, display_brand: null|string, exp_month: int, exp_year: int, fingerprint?: null|string, funding: string, generated_from: null|(object{charge: null|string, payment_method_details: null|(object{card_present?: (object{amount_authorized: null|int, brand: null|string, brand_product: null|string, capture_before?: int, cardholder_name: null|string, country: null|string, description?: null|string, emv_auth_data: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, generated_card: null|string, iin?: null|string, incremental_authorization_supported: bool, issuer?: null|string, last4: null|string, location?: string, network: null|string, network_transaction_id: null|string, offline: null|(object{stored_at: null|int, type: null|string}&StripeObject), overcapture_supported: bool, preferred_locales: null|string[], read_method: null|string, reader?: string, receipt: null|(object{account_type?: string, application_cryptogram: null|string, application_preferred_name: null|string, authorization_code: null|string, authorization_response_code: null|string, cardholder_verification_method: null|string, dedicated_file_name: null|string, terminal_verification_results: null|string, transaction_status_information: null|string}&StripeObject), wallet?: (object{type: string}&StripeObject)}&StripeObject), type: string}&StripeObject), setup_attempt: null|SetupAttempt|string}&StripeObject), iin?: null|string, issuer?: null|string, last4: string, networks: null|(object{available: string[], preferred: null|string}&StripeObject), regulated_status: null|string, three_d_secure_usage: null|(object{supported: bool}&StripeObject), wallet: null|(object{amex_express_checkout?: (object{}&StripeObject), apple_pay?: (object{}&StripeObject), dynamic_last4: null|string, google_pay?: (object{}&StripeObject), link?: (object{}&StripeObject), masterpass?: (object{billing_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, shipping_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject)}&StripeObject), samsung_pay?: (object{}&StripeObject), type: string, visa_checkout?: (object{billing_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, shipping_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject)}&StripeObject)}&StripeObject)}&StripeObject), card_present?: (object{brand: null|string, brand_product: null|string, cardholder_name: null|string, country: null|string, description?: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, iin?: null|string, issuer?: null|string, last4: null|string, networks: null|(object{available: string[], preferred: null|string}&StripeObject), offline: null|(object{stored_at: null|int, type: null|string}&StripeObject), preferred_locales: null|string[], read_method: null|string, wallet?: (object{type: string}&StripeObject)}&StripeObject), cashapp?: (object{buyer_id: null|string, cashtag: null|string}&StripeObject), crypto?: (object{}&StripeObject), customer: null|Customer|string, customer_account: null|string, customer_balance?: (object{}&StripeObject), eps?: (object{bank: null|string}&StripeObject), fpx?: (object{account_holder_type: null|string, bank: string}&StripeObject), giropay?: (object{}&StripeObject), grabpay?: (object{}&StripeObject), ideal?: (object{bank: null|string, bic: null|string}&StripeObject), interac_present?: (object{brand: null|string, cardholder_name: null|string, country: null|string, description?: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, iin?: null|string, issuer?: null|string, last4: null|string, networks: null|(object{available: string[], preferred: null|string}&StripeObject), preferred_locales: null|string[], read_method: null|string}&StripeObject), kakao_pay?: (object{}&StripeObject), klarna?: (object{dob?: null|(object{day: null|int, month: null|int, year: null|int}&StripeObject)}&StripeObject), konbini?: (object{}&StripeObject), kr_card?: (object{brand: null|string, last4: null|string}&StripeObject), link?: (object{email: null|string, persistent_token?: string}&StripeObject), mb_way?: (object{}&StripeObject), mobilepay?: (object{}&StripeObject), multibanco?: (object{}&StripeObject), naver_pay?: (object{buyer_id: null|string, funding: string}&StripeObject), nz_bank_account?: (object{account_holder_name: null|string, bank_code: string, bank_name: string, branch_code: string, last4: string, suffix: null|string}&StripeObject), oxxo?: (object{}&StripeObject), p24?: (object{bank: null|string}&StripeObject), pay_by_bank?: (object{}&StripeObject), payco?: (object{}&StripeObject), paynow?: (object{}&StripeObject), paypal?: (object{country: null|string, payer_email: null|string, payer_id: null|string}&StripeObject), payto?: (object{bsb_number: null|string, last4: null|string, pay_id: null|string}&StripeObject), pix?: (object{}&StripeObject), promptpay?: (object{}&StripeObject), revolut_pay?: (object{}&StripeObject), samsung_pay?: (object{}&StripeObject), satispay?: (object{}&StripeObject), sepa_debit?: (object{bank_code: null|string, branch_code: null|string, country: null|string, fingerprint: null|string, generated_from: null|(object{charge: null|Charge|string, setup_attempt: null|SetupAttempt|string}&StripeObject), last4: null|string}&StripeObject), sofort?: (object{country: null|string}&StripeObject), swish?: (object{}&StripeObject), twint?: (object{}&StripeObject), type: string, us_bank_account?: (object{account_holder_type: null|string, account_type: null|string, bank_name: null|string, financial_connections_account: null|string, fingerprint: null|string, last4: null|string, networks: null|(object{preferred: null|string, supported: string[]}&StripeObject), routing_number: null|string, status_details: null|(object{blocked?: (object{network_code: null|string, reason: null|string}&StripeObject)}&StripeObject)}&StripeObject), wechat_pay?: (object{}&StripeObject), zip?: (object{}&StripeObject)}&StripeObject) $payment_method_preview Payment details collected by the Payment Element, used to create a PaymentMethod when a PaymentIntent or SetupIntent is confirmed with this ConfirmationToken. + * @property null|(object{acss_debit?: (object{bank_name: null|string, fingerprint: null|string, institution_number: null|string, last4: null|string, transit_number: null|string}&StripeObject), affirm?: (object{}&StripeObject), afterpay_clearpay?: (object{}&StripeObject), alipay?: (object{}&StripeObject), allow_redisplay?: string, alma?: (object{}&StripeObject), amazon_pay?: (object{}&StripeObject), au_becs_debit?: (object{bsb_number: null|string, fingerprint: null|string, last4: null|string}&StripeObject), bacs_debit?: (object{fingerprint: null|string, last4: null|string, sort_code: null|string}&StripeObject), bancontact?: (object{}&StripeObject), billie?: (object{}&StripeObject), billing_details: (object{address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, phone: null|string, tax_id: null|string}&StripeObject), bizum?: (object{buyer_id?: null|string}&StripeObject), blik?: (object{buyer_id?: null|string}&StripeObject), boleto?: (object{tax_id: string}&StripeObject), card?: (object{brand: string, checks: null|(object{address_line1_check: null|string, address_postal_code_check: null|string, cvc_check: null|string}&StripeObject), country: null|string, description?: null|string, display_brand: null|string, exp_month: int, exp_year: int, fingerprint?: null|string, funding: string, generated_from: null|(object{charge: null|string, payment_method_details: null|(object{card_present?: (object{amount_authorized: null|int, brand: null|string, brand_product: null|string, capture_before?: int, cardholder_name: null|string, country: null|string, description?: null|string, emv_auth_data: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, generated_card: null|string, iin?: null|string, incremental_authorization_supported: bool, issuer?: null|string, last4: null|string, location?: string, network: null|string, network_transaction_id: null|string, offline: null|(object{stored_at: null|int, type: null|string}&StripeObject), overcapture_supported: bool, preferred_locales: null|string[], read_method: null|string, reader?: string, receipt: null|(object{account_type?: string, application_cryptogram: null|string, application_preferred_name: null|string, authorization_code: null|string, authorization_response_code: null|string, cardholder_verification_method: null|string, dedicated_file_name: null|string, terminal_verification_results: null|string, transaction_status_information: null|string}&StripeObject), wallet?: (object{type: string}&StripeObject)}&StripeObject), type: string}&StripeObject), setup_attempt: null|SetupAttempt|string}&StripeObject), iin?: null|string, issuer?: null|string, last4: string, networks: null|(object{available: string[], preferred: null|string}&StripeObject), regulated_status: null|string, three_d_secure_usage: null|(object{supported: bool}&StripeObject), wallet: null|(object{amex_express_checkout?: (object{}&StripeObject), apple_pay?: (object{}&StripeObject), dynamic_last4: null|string, google_pay?: (object{}&StripeObject), link?: (object{}&StripeObject), masterpass?: (object{billing_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, shipping_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject)}&StripeObject), samsung_pay?: (object{}&StripeObject), type: string, visa_checkout?: (object{billing_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, shipping_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject)}&StripeObject)}&StripeObject)}&StripeObject), card_present?: (object{brand: null|string, brand_product: null|string, cardholder_name: null|string, country: null|string, description?: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, iin?: null|string, issuer?: null|string, last4: null|string, networks: null|(object{available: string[], preferred: null|string}&StripeObject), offline: null|(object{stored_at: null|int, type: null|string}&StripeObject), preferred_locales: null|string[], read_method: null|string, wallet?: (object{type: string}&StripeObject)}&StripeObject), cashapp?: (object{buyer_id: null|string, cashtag: null|string}&StripeObject), crypto?: (object{}&StripeObject), customer: null|Customer|string, customer_account: null|string, customer_balance?: (object{}&StripeObject), eps?: (object{bank: null|string}&StripeObject), fpx?: (object{account_holder_type: null|string, bank: string}&StripeObject), giropay?: (object{}&StripeObject), grabpay?: (object{}&StripeObject), ideal?: (object{bank: null|string, bic: null|string}&StripeObject), interac_present?: (object{brand: null|string, cardholder_name: null|string, country: null|string, description?: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, iin?: null|string, issuer?: null|string, last4: null|string, networks: null|(object{available: string[], preferred: null|string}&StripeObject), preferred_locales: null|string[], read_method: null|string}&StripeObject), kakao_pay?: (object{}&StripeObject), klarna?: (object{dob?: null|(object{day: null|int, month: null|int, year: null|int}&StripeObject)}&StripeObject), konbini?: (object{}&StripeObject), kr_card?: (object{brand: null|string, last4: null|string}&StripeObject), link?: (object{email: null|string, persistent_token?: string}&StripeObject), mb_way?: (object{}&StripeObject), mobilepay?: (object{}&StripeObject), multibanco?: (object{}&StripeObject), naver_pay?: (object{buyer_id: null|string, funding: string}&StripeObject), nz_bank_account?: (object{account_holder_name: null|string, bank_code: string, bank_name: string, branch_code: string, last4: string, suffix: null|string}&StripeObject), oxxo?: (object{}&StripeObject), p24?: (object{bank: null|string}&StripeObject), pay_by_bank?: (object{}&StripeObject), payco?: (object{}&StripeObject), paynow?: (object{}&StripeObject), paypal?: (object{country: null|string, payer_email: null|string, payer_id: null|string}&StripeObject), payto?: (object{bsb_number: null|string, last4: null|string, pay_id: null|string}&StripeObject), pix?: (object{fingerprint?: null|string}&StripeObject), promptpay?: (object{}&StripeObject), revolut_pay?: (object{}&StripeObject), samsung_pay?: (object{}&StripeObject), satispay?: (object{}&StripeObject), scalapay?: (object{}&StripeObject), sepa_debit?: (object{bank_code: null|string, branch_code: null|string, country: null|string, fingerprint: null|string, generated_from: null|(object{charge: null|Charge|string, setup_attempt: null|SetupAttempt|string}&StripeObject), last4: null|string}&StripeObject), sofort?: (object{country: null|string}&StripeObject), sunbit?: (object{}&StripeObject), swish?: (object{}&StripeObject), twint?: (object{}&StripeObject), type: string, upi?: (object{vpa: null|string}&StripeObject), us_bank_account?: (object{account_holder_type: null|string, account_type: null|string, bank_name: null|string, financial_connections_account: null|string, fingerprint: null|string, last4: null|string, networks: null|(object{preferred: null|string, supported: string[]}&StripeObject), routing_number: null|string, status_details: null|(object{blocked?: (object{network_code: null|string, reason: null|string}&StripeObject)}&StripeObject)}&StripeObject), wechat_pay?: (object{}&StripeObject), zip?: (object{}&StripeObject)}&StripeObject) $payment_method_preview Payment details collected by the Payment Element, used to create a PaymentMethod when a PaymentIntent or SetupIntent is confirmed with this ConfirmationToken. * @property null|string $return_url Return URL used to confirm the Intent. * @property null|string $setup_future_usage

    Indicates that you intend to make future payments with this ConfirmationToken's payment method.

    The presence of this property will attach the payment method to the PaymentIntent's Customer, if present, after the PaymentIntent is confirmed and any required actions from the user are complete.

    * @property null|string $setup_intent ID of the SetupIntent that this ConfirmationToken was used to confirm, or null if this ConfirmationToken has not yet been used. diff --git a/libs/stripe-php/lib/ConnectCollectionTransfer.php b/libs/stripe-php/lib/ConnectCollectionTransfer.php index 837547a23..15a7d706c 100644 --- a/libs/stripe-php/lib/ConnectCollectionTransfer.php +++ b/libs/stripe-php/lib/ConnectCollectionTransfer.php @@ -10,7 +10,7 @@ namespace Stripe; * @property int $amount Amount transferred, in cents (or local equivalent). * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. * @property Account|string $destination ID of the account that funds are being collected for. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. */ class ConnectCollectionTransfer extends ApiResource { diff --git a/libs/stripe-php/lib/Coupon.php b/libs/stripe-php/lib/Coupon.php index 52051cf68..6071cf69a 100644 --- a/libs/stripe-php/lib/Coupon.php +++ b/libs/stripe-php/lib/Coupon.php @@ -7,7 +7,7 @@ namespace Stripe; /** * A coupon contains information about a percent-off or amount-off discount you * might want to apply to a customer. Coupons may be applied to subscriptions, invoices, - * checkout sessions, quotes, and more. Coupons do not work with conventional one-off charges or payment intents. + * checkout sessions, quotes, and more. Coupons do not work with conventional one-off charges or payment intents. * * @property string $id Unique identifier for the object. * @property string $object String representing the object's type. Objects of the same type share the same value. @@ -18,7 +18,7 @@ namespace Stripe; * @property null|StripeObject $currency_options Coupons defined in each available currency option. Each key must be a three-letter ISO currency code and a supported currency. * @property string $duration One of forever, once, or repeating. Describes how long a customer who applies this coupon will get the discount. * @property null|int $duration_in_months If duration is repeating, the number of months the coupon applies. Null if coupon duration is forever or once. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|int $max_redemptions Maximum number of times this coupon can be redeemed, in total, across all customers, before it is no longer valid. * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|string $name Name of the coupon displayed to customers on for instance invoices or receipts. diff --git a/libs/stripe-php/lib/CreditNote.php b/libs/stripe-php/lib/CreditNote.php index 8606c640b..397477d21 100644 --- a/libs/stripe-php/lib/CreditNote.php +++ b/libs/stripe-php/lib/CreditNote.php @@ -23,7 +23,7 @@ namespace Stripe; * @property null|int $effective_at The date when this credit note is in effect. Same as created unless overwritten. When defined, this value replaces the system-generated 'Date of issue' printed on the credit note PDF. * @property Invoice|string $invoice ID of the invoice. * @property Collection $lines Line items that make up the credit note - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|string $memo Customer-facing text that appears on the credit note PDF. * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property string $number A unique number that identifies this particular credit note and appears on the PDF of the credit note and its associated invoice. @@ -86,7 +86,13 @@ class CreditNote extends ApiResource * post_payment_credit_notes_amount, or both, depending on the * invoice’s amount_remaining at the time of credit note creation. * - * @param null|array{amount?: int, credit_amount?: int, effective_at?: int, email_type?: string, expand?: string[], invoice: string, lines?: (array{amount?: int, description?: string, invoice_line_item?: string, quantity?: int, tax_amounts?: null|array{amount: int, tax_rate: string, taxable_amount: int}[], tax_rates?: null|string[], type: string, unit_amount?: int, unit_amount_decimal?: string})[], memo?: string, metadata?: array, out_of_band_amount?: int, reason?: string, refund_amount?: int, refunds?: array{amount_refunded?: int, payment_record_refund?: array{payment_record: string, refund_group: string}, refund?: string, type?: string}[], shipping_cost?: array{shipping_rate?: string}} $params + * For invoices that also have refunds created through the Refund API, the credit note API subtracts those + * refund amounts from the maximum creditable amount. This prevents the combined + * credit notes and refunds from exceeding the invoice amount. If you use both, + * ensure the combined total does not exceed the invoice’s paid amount. + * + * @param null|array{amount?: int, credit_amount?: int, effective_at?: int, email_type?: string, expand?: string[], invoice: string, lines?: (array{amount?: int, description?: string, invoice_line_item?: string, metadata?: array, quantity?: int, tax_amounts?: null|array{amount: int, tax_rate: string, taxable_amount: int}[], tax_rates?: null|string[], type: string, unit_amount?: int, unit_amount_decimal?: string})[], memo?: string, metadata?: array, out_of_band_amount?: int, reason?: string, refund_amount?: int, refunds?: array{amount_refunded?: int, payment_record_refund?: array{payment_record: string, refund_group: string}, refund?: string, type?: string}[], shipping_cost?: array{shipping_rate?: string}} $params * @param null|array|string $options * * @return CreditNote the created resource diff --git a/libs/stripe-php/lib/CreditNoteLineItem.php b/libs/stripe-php/lib/CreditNoteLineItem.php index 10b2d3d6c..00be8ee6b 100644 --- a/libs/stripe-php/lib/CreditNoteLineItem.php +++ b/libs/stripe-php/lib/CreditNoteLineItem.php @@ -14,7 +14,8 @@ namespace Stripe; * @property int $discount_amount The integer amount in cents (or local equivalent) representing the discount being credited for this line item. * @property ((object{amount: int, discount: Discount|string}&StripeObject))[] $discount_amounts The amount of discount calculated per discount for this line item * @property null|string $invoice_line_item ID of the invoice line item being credited - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. + * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property ((object{amount: int, credit_balance_transaction?: Billing\CreditBalanceTransaction|string, discount?: Discount|string, type: string}&StripeObject))[] $pretax_credit_amounts The pretax credit amounts (ex: discount, credit grants, etc) for this line item. * @property null|int $quantity The number of units of product being credited. * @property TaxRate[] $tax_rates The tax rates which apply to the line item. diff --git a/libs/stripe-php/lib/Customer.php b/libs/stripe-php/lib/Customer.php index 5c95bcd7d..8aa80002b 100644 --- a/libs/stripe-php/lib/Customer.php +++ b/libs/stripe-php/lib/Customer.php @@ -26,7 +26,7 @@ namespace Stripe; * @property null|StripeObject $invoice_credit_balance The current multi-currency balances, if any, that's stored on the customer. If positive in a currency, the customer has a credit to apply to their next invoice denominated in that currency. If negative, the customer has an amount owed that's added to their next invoice denominated in that currency. These balances don't apply to unpaid invoices. They solely track amounts that Stripe hasn't successfully applied to any invoice. Stripe only applies a balance in a specific currency to an invoice after that invoice (which is in the same currency) finalizes. * @property null|string $invoice_prefix The prefix for the customer used to generate unique invoice numbers. * @property null|(object{custom_fields: null|(object{name: string, value: string}&StripeObject)[], default_payment_method: null|PaymentMethod|string, footer: null|string, rendering_options: null|(object{amount_tax_display: null|string, template: null|string}&StripeObject)}&StripeObject) $invoice_settings - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|string $name The customer's full name or business name. * @property null|int $next_invoice_sequence The suffix of the customer's next invoice number (for example, 0001). When the account uses account level sequencing, this parameter is ignored in API requests and the field omitted in API responses. diff --git a/libs/stripe-php/lib/CustomerBalanceTransaction.php b/libs/stripe-php/lib/CustomerBalanceTransaction.php index 667d65071..c5924a460 100644 --- a/libs/stripe-php/lib/CustomerBalanceTransaction.php +++ b/libs/stripe-php/lib/CustomerBalanceTransaction.php @@ -24,7 +24,7 @@ namespace Stripe; * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. * @property int $ending_balance The customer's balance after the transaction was applied. A negative value decreases the amount due on the customer's next invoice. A positive value increases the amount due on the customer's next invoice. * @property null|Invoice|string $invoice The ID of the invoice (if any) related to the transaction. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property string $type Transaction type: adjustment, applied_to_invoice, credit_note, initial, invoice_overpaid, invoice_too_large, invoice_too_small, unspent_receiver_credit, unapplied_from_invoice, checkout_session_subscription_payment, or checkout_session_subscription_payment_canceled. See the Customer Balance page to learn more about transaction types. */ diff --git a/libs/stripe-php/lib/CustomerCashBalanceTransaction.php b/libs/stripe-php/lib/CustomerCashBalanceTransaction.php index 571024261..4241f4a95 100644 --- a/libs/stripe-php/lib/CustomerCashBalanceTransaction.php +++ b/libs/stripe-php/lib/CustomerCashBalanceTransaction.php @@ -20,7 +20,7 @@ namespace Stripe; * @property null|string $customer_account The ID of an Account representing a customer whose available cash balance changed as a result of this transaction. * @property int $ending_balance The total available cash balance for the specified currency after this transaction was applied. Represented in the smallest currency unit. * @property null|(object{bank_transfer: (object{eu_bank_transfer?: (object{bic: null|string, iban_last4: null|string, sender_name: null|string}&StripeObject), gb_bank_transfer?: (object{account_number_last4: null|string, sender_name: null|string, sort_code: null|string}&StripeObject), jp_bank_transfer?: (object{sender_bank: null|string, sender_branch: null|string, sender_name: null|string}&StripeObject), reference: null|string, type: string, us_bank_transfer?: (object{network?: string, sender_name: null|string}&StripeObject)}&StripeObject)}&StripeObject) $funded - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property int $net_amount The amount by which the cash balance changed, represented in the smallest currency unit. A positive value represents funds being added to the cash balance, a negative value represents funds being removed from the cash balance. * @property null|(object{refund: Refund|string}&StripeObject) $refunded_from_payment * @property null|(object{balance_transaction: BalanceTransaction|string}&StripeObject) $transferred_to_balance diff --git a/libs/stripe-php/lib/CustomerSession.php b/libs/stripe-php/lib/CustomerSession.php index 999b91f8d..c37d5f374 100644 --- a/libs/stripe-php/lib/CustomerSession.php +++ b/libs/stripe-php/lib/CustomerSession.php @@ -19,7 +19,7 @@ namespace Stripe; * @property Customer|string $customer The Customer the Customer Session was created for. * @property null|string $customer_account The Account that the Customer Session was created for. * @property int $expires_at The timestamp at which this Customer Session will expire. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. */ class CustomerSession extends ApiResource { diff --git a/libs/stripe-php/lib/Discount.php b/libs/stripe-php/lib/Discount.php index adc689e86..42220dfcf 100644 --- a/libs/stripe-php/lib/Discount.php +++ b/libs/stripe-php/lib/Discount.php @@ -10,9 +10,9 @@ namespace Stripe; * * Related guide: Applying discounts to subscriptions * - * @property string $id The ID of the discount object. Discounts cannot be fetched by ID. Use expand[]=discounts in API calls to expand discount IDs in an array. + * @property string $id The ID of the discount object. Discounts can't be fetched by ID. Use expand[]=discounts in API calls to expand discount IDs in an array. * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property null|string $checkout_session The Checkout session that this coupon is applied to, if it is applied to a particular session in payment mode. Will not be present for subscription mode. + * @property null|string $checkout_session The Checkout session that this coupon is applied to, if it is applied to a particular session in payment mode. Not present for subscription mode. * @property null|Customer|string $customer The ID of the customer associated with this discount. * @property null|string $customer_account The ID of the account representing the customer associated with this discount. * @property null|int $end If the coupon has a duration of repeating, the date that this discount will end. If the coupon has a duration of once or forever, this attribute will be null. diff --git a/libs/stripe-php/lib/Dispute.php b/libs/stripe-php/lib/Dispute.php index d0a3474a4..88edd1dd4 100644 --- a/libs/stripe-php/lib/Dispute.php +++ b/libs/stripe-php/lib/Dispute.php @@ -19,10 +19,10 @@ namespace Stripe; * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. * @property string[] $enhanced_eligibility_types List of eligibility types that are included in enhanced_evidence. - * @property (object{access_activity_log: null|string, billing_address: null|string, cancellation_policy: null|File|string, cancellation_policy_disclosure: null|string, cancellation_rebuttal: null|string, customer_communication: null|File|string, customer_email_address: null|string, customer_name: null|string, customer_purchase_ip: null|string, customer_signature: null|File|string, duplicate_charge_documentation: null|File|string, duplicate_charge_explanation: null|string, duplicate_charge_id: null|string, enhanced_evidence: (object{visa_compelling_evidence_3?: (object{disputed_transaction: null|(object{customer_account_id: null|string, customer_device_fingerprint: null|string, customer_device_id: null|string, customer_email_address: null|string, customer_purchase_ip: null|string, merchandise_or_services: null|string, product_description: null|string, shipping_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject)}&StripeObject), prior_undisputed_transactions: ((object{charge: string, customer_account_id: null|string, customer_device_fingerprint: null|string, customer_device_id: null|string, customer_email_address: null|string, customer_purchase_ip: null|string, product_description: null|string, shipping_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject)}&StripeObject))[]}&StripeObject), visa_compliance?: (object{fee_acknowledged: bool}&StripeObject)}&StripeObject), product_description: null|string, receipt: null|File|string, refund_policy: null|File|string, refund_policy_disclosure: null|string, refund_refusal_explanation: null|string, service_date: null|string, service_documentation: null|File|string, shipping_address: null|string, shipping_carrier: null|string, shipping_date: null|string, shipping_documentation: null|File|string, shipping_tracking_number: null|string, uncategorized_file: null|File|string, uncategorized_text: null|string}&StripeObject) $evidence - * @property (object{due_by: null|int, enhanced_eligibility: (object{visa_compelling_evidence_3?: (object{required_actions: string[], status: string}&StripeObject), visa_compliance?: (object{status: string}&StripeObject)}&StripeObject), has_evidence: bool, past_due: bool, submission_count: int}&StripeObject) $evidence_details + * @property (object{access_activity_log: null|string, billing_address: null|string, cancellation_policy: null|File|string, cancellation_policy_disclosure: null|string, cancellation_rebuttal: null|string, customer_communication: null|File|string, customer_email_address: null|string, customer_name: null|string, customer_purchase_ip: null|string, customer_signature: null|File|string, duplicate_charge_documentation: null|File|string, duplicate_charge_explanation: null|string, duplicate_charge_id: null|string, enhanced_evidence: (object{mastercard_compliance?: (object{fee_acknowledged: bool}&StripeObject), visa_compelling_evidence_3?: (object{disputed_transaction: null|(object{customer_account_id: null|string, customer_device_fingerprint: null|string, customer_device_id: null|string, customer_email_address: null|string, customer_purchase_ip: null|string, merchandise_or_services: null|string, product_description: null|string, shipping_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject)}&StripeObject), prior_undisputed_transactions: ((object{charge: string, customer_account_id: null|string, customer_device_fingerprint: null|string, customer_device_id: null|string, customer_email_address: null|string, customer_purchase_ip: null|string, product_description: null|string, shipping_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject)}&StripeObject))[]}&StripeObject), visa_compliance?: (object{fee_acknowledged: bool}&StripeObject)}&StripeObject), product_description: null|string, receipt: null|File|string, refund_policy: null|File|string, refund_policy_disclosure: null|string, refund_refusal_explanation: null|string, service_date: null|string, service_documentation: null|File|string, shipping_address: null|string, shipping_carrier: null|string, shipping_date: null|string, shipping_documentation: null|File|string, shipping_tracking_number: null|string, uncategorized_file: null|File|string, uncategorized_text: null|string}&StripeObject) $evidence + * @property (object{due_by: null|int, enhanced_eligibility: (object{mastercard_compliance?: (object{status: string}&StripeObject), visa_compelling_evidence_3?: (object{required_actions: string[], status: string}&StripeObject), visa_compliance?: (object{status: string}&StripeObject)}&StripeObject), has_evidence: bool, past_due: bool, submission_count: int}&StripeObject) $evidence_details * @property bool $is_charge_refundable If true, it's still possible to refund the disputed payment. After the payment has been fully refunded, no further funds are withdrawn from your Stripe account as a result of this dispute. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|string $network_reason_code Network-dependent reason code for the dispute. * @property null|PaymentIntent|string $payment_intent ID of the PaymentIntent that's disputed. @@ -108,7 +108,7 @@ class Dispute extends ApiResource * see our guide to dispute types. * * @param string $id the ID of the resource to update - * @param null|array{evidence?: array{access_activity_log?: string, billing_address?: string, cancellation_policy?: string, cancellation_policy_disclosure?: string, cancellation_rebuttal?: string, customer_communication?: string, customer_email_address?: string, customer_name?: string, customer_purchase_ip?: string, customer_signature?: string, duplicate_charge_documentation?: string, duplicate_charge_explanation?: string, duplicate_charge_id?: string, enhanced_evidence?: null|array{visa_compelling_evidence_3?: array{disputed_transaction?: array{customer_account_id?: null|string, customer_device_fingerprint?: null|string, customer_device_id?: null|string, customer_email_address?: null|string, customer_purchase_ip?: null|string, merchandise_or_services?: string, product_description?: null|string, shipping_address?: array{city?: null|string, country?: null|string, line1?: null|string, line2?: null|string, postal_code?: null|string, state?: null|string}}, prior_undisputed_transactions?: (array{charge: string, customer_account_id?: null|string, customer_device_fingerprint?: null|string, customer_device_id?: null|string, customer_email_address?: null|string, customer_purchase_ip?: null|string, product_description?: null|string, shipping_address?: array{city?: null|string, country?: null|string, line1?: null|string, line2?: null|string, postal_code?: null|string, state?: null|string}})[]}, visa_compliance?: array{fee_acknowledged?: bool}}, product_description?: string, receipt?: string, refund_policy?: string, refund_policy_disclosure?: string, refund_refusal_explanation?: string, service_date?: string, service_documentation?: string, shipping_address?: string, shipping_carrier?: string, shipping_date?: string, shipping_documentation?: string, shipping_tracking_number?: string, uncategorized_file?: string, uncategorized_text?: string}, expand?: string[], metadata?: null|array, submit?: bool} $params + * @param null|array{evidence?: array{access_activity_log?: string, billing_address?: string, cancellation_policy?: string, cancellation_policy_disclosure?: string, cancellation_rebuttal?: string, customer_communication?: string, customer_email_address?: string, customer_name?: string, customer_purchase_ip?: string, customer_signature?: string, duplicate_charge_documentation?: string, duplicate_charge_explanation?: string, duplicate_charge_id?: string, enhanced_evidence?: null|array{mastercard_compliance?: array{fee_acknowledged?: bool}, visa_compelling_evidence_3?: array{disputed_transaction?: array{customer_account_id?: null|string, customer_device_fingerprint?: null|string, customer_device_id?: null|string, customer_email_address?: null|string, customer_purchase_ip?: null|string, merchandise_or_services?: string, product_description?: null|string, shipping_address?: array{city?: null|string, country?: null|string, line1?: null|string, line2?: null|string, postal_code?: null|string, state?: null|string}}, prior_undisputed_transactions?: (array{charge: string, customer_account_id?: null|string, customer_device_fingerprint?: null|string, customer_device_id?: null|string, customer_email_address?: null|string, customer_purchase_ip?: null|string, product_description?: null|string, shipping_address?: array{city?: null|string, country?: null|string, line1?: null|string, line2?: null|string, postal_code?: null|string, state?: null|string}})[]}, visa_compliance?: array{fee_acknowledged?: bool}}, product_description?: string, receipt?: string, refund_policy?: string, refund_policy_disclosure?: string, refund_refusal_explanation?: string, service_date?: string, service_documentation?: string, shipping_address?: string, shipping_carrier?: string, shipping_date?: string, shipping_documentation?: string, shipping_tracking_number?: string, uncategorized_file?: string, uncategorized_text?: string}, expand?: string[], metadata?: null|array, submit?: bool} $params * @param null|array|string $opts * * @return Dispute the updated resource diff --git a/libs/stripe-php/lib/Entitlements/ActiveEntitlement.php b/libs/stripe-php/lib/Entitlements/ActiveEntitlement.php index 16bc27b01..5c936f172 100644 --- a/libs/stripe-php/lib/Entitlements/ActiveEntitlement.php +++ b/libs/stripe-php/lib/Entitlements/ActiveEntitlement.php @@ -10,7 +10,7 @@ namespace Stripe\Entitlements; * @property string $id Unique identifier for the object. * @property string $object String representing the object's type. Objects of the same type share the same value. * @property Feature|string $feature The Feature that the customer is entitled to. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property string $lookup_key A unique key you provide as your own system identifier. This may be up to 80 characters. */ class ActiveEntitlement extends \Stripe\ApiResource diff --git a/libs/stripe-php/lib/Entitlements/ActiveEntitlementSummary.php b/libs/stripe-php/lib/Entitlements/ActiveEntitlementSummary.php index cfa368e4c..f5bede7fc 100644 --- a/libs/stripe-php/lib/Entitlements/ActiveEntitlementSummary.php +++ b/libs/stripe-php/lib/Entitlements/ActiveEntitlementSummary.php @@ -10,7 +10,7 @@ namespace Stripe\Entitlements; * @property string $object String representing the object's type. Objects of the same type share the same value. * @property string $customer The customer that is entitled to this feature. * @property \Stripe\Collection $entitlements The list of entitlements this customer has. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. */ class ActiveEntitlementSummary extends \Stripe\ApiResource { diff --git a/libs/stripe-php/lib/Entitlements/Feature.php b/libs/stripe-php/lib/Entitlements/Feature.php index 61b49a26e..a7036c20c 100644 --- a/libs/stripe-php/lib/Entitlements/Feature.php +++ b/libs/stripe-php/lib/Entitlements/Feature.php @@ -11,7 +11,7 @@ namespace Stripe\Entitlements; * @property string $id Unique identifier for the object. * @property string $object String representing the object's type. Objects of the same type share the same value. * @property bool $active Inactive features cannot be attached to new products and will not be returned from the features list endpoint. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property string $lookup_key A unique key you provide as your own system identifier. This may be up to 80 characters. * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property string $name The feature's name, for your own purpose, not meant to be displayable to the customer. diff --git a/libs/stripe-php/lib/EphemeralKey.php b/libs/stripe-php/lib/EphemeralKey.php index cd78fe6fd..b7e97507f 100644 --- a/libs/stripe-php/lib/EphemeralKey.php +++ b/libs/stripe-php/lib/EphemeralKey.php @@ -9,7 +9,7 @@ namespace Stripe; * @property string $object String representing the object's type. Objects of the same type share the same value. * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. * @property int $expires Time at which the key will expire. Measured in seconds since the Unix epoch. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|string $secret The key's secret. You can use this value to make authorized requests to the Stripe API. */ class EphemeralKey extends ApiResource diff --git a/libs/stripe-php/lib/ErrorObject.php b/libs/stripe-php/lib/ErrorObject.php index fd2305f2e..9e5dc59aa 100644 --- a/libs/stripe-php/lib/ErrorObject.php +++ b/libs/stripe-php/lib/ErrorObject.php @@ -5,35 +5,26 @@ namespace Stripe; /** * Class ErrorObject. * - * @property string $charge For card errors, the ID of the failed charge. - * @property string $code For some errors that could be handled - * programmatically, a short string indicating the error code reported. - * @property string $decline_code For card errors resulting from a card issuer - * decline, a short string indicating the card issuer's reason for the - * decline if they provide one. - * @property string $doc_url A URL to more information about the error code - * reported. - * @property string $message A human-readable message providing more details - * about the error. For card errors, these messages can be shown to your - * users. - * @property string $param If the error is parameter-specific, the parameter - * related to the error. For example, you can use this to display a message - * near the correct form field. - * @property PaymentIntent $payment_intent The PaymentIntent object for errors - * returned on a request involving a PaymentIntent. - * @property PaymentMethod $payment_method The PaymentMethod object for errors - * returned on a request involving a PaymentMethod. - * @property string $payment_method_type If the error is specific to the type - * of payment method, the payment method type that had a problem. This - * field is only populated for invoice-related errors. - * @property string $request_log_url A URL to the request log entry in your - * dashboard. - * @property SetupIntent $setup_intent The SetupIntent object for errors - * returned on a request involving a SetupIntent. - * @property StripeObject $source The source object for errors returned on a - * request involving a source. - * @property string $type The type of error returned. One of `api_error`, - * `card_error`, `idempotency_error`, or `invalid_request_error`. + * // errorProperties: The beginning of the section generated from our OpenAPI spec + * + * @property null|string $advice_code For card errors resulting from a card issuer decline, a short string indicating [how to proceed with an error](https://docs.stripe.com/declines#retrying-issuer-declines) if they provide one. + * @property null|string $charge For card errors, the ID of the failed charge. + * @property null|string $code For some errors that could be handled programmatically, a short string indicating the [error code](https://docs.stripe.com/error-codes) reported. + * @property null|string $decline_code For card errors resulting from a card issuer decline, a short string indicating the [card issuer's reason for the decline](https://docs.stripe.com/declines#issuer-declines) if they provide one. + * @property null|string $doc_url A URL to more information about the [error code](https://docs.stripe.com/error-codes) reported. + * @property null|string $message A human-readable message providing more details about the error. For card errors, these messages can be shown to your users. + * @property null|string $network_advice_code For card errors resulting from a card issuer decline, a 2 digit code which indicates the advice given to merchant by the card network on how to proceed with an error. + * @property null|string $network_decline_code For payments declined by the network, an alphanumeric code which indicates the reason the payment failed. + * @property null|string $param If the error is parameter-specific, the parameter related to the error. For example, you can use this to display a message near the correct form field. + * @property null|PaymentIntent $payment_intent The PaymentIntent object for errors returned on a request involving a PaymentIntent. + * @property null|PaymentMethod $payment_method The PaymentMethod object for errors returned on a request involving a PaymentMethod. + * @property null|string $payment_method_type If the error is specific to the type of payment method, the payment method type that had a problem. This field is only populated for invoice-related errors. + * @property null|string $request_log_url A URL to the request log entry in your dashboard. + * @property null|SetupIntent $setup_intent The SetupIntent object for errors returned on a request involving a SetupIntent. + * @property null|PaymentSource $source The PaymentSource object for errors returned on a request involving a PaymentSource. + * @property string $type The type of error returned. One of `api_error`, `card_error`, `idempotency_error`, or `invalid_request_error` + * @property null|string $user_message The user message associated with the error. + * // errorProperties: The end of the section generated from our OpenAPI spec */ class ErrorObject extends StripeObject { @@ -42,7 +33,7 @@ class ErrorObject extends StripeObject * * @see https://stripe.com/docs/error-codes */ - // The beginning of the section generated from our OpenAPI spec + // errorCodes: The beginning of the section generated from our OpenAPI spec const CODE_ACCOUNT_CLOSED = 'account_closed'; const CODE_ACCOUNT_COUNTRY_INVALID_ADDRESS = 'account_country_invalid_address'; const CODE_ACCOUNT_ERROR_COUNTRY_CHANGE_REQUIRES_ADDITIONAL_STEPS = 'account_error_country_change_requires_additional_steps'; @@ -51,11 +42,14 @@ class ErrorObject extends StripeObject const CODE_ACCOUNT_NUMBER_INVALID = 'account_number_invalid'; const CODE_ACCOUNT_TOKEN_REQUIRED_FOR_V2_ACCOUNT = 'account_token_required_for_v2_account'; const CODE_ACSS_DEBIT_SESSION_INCOMPLETE = 'acss_debit_session_incomplete'; + const CODE_ACTION_BLOCKED = 'action_blocked'; const CODE_ALIPAY_UPGRADE_REQUIRED = 'alipay_upgrade_required'; const CODE_AMOUNT_TOO_LARGE = 'amount_too_large'; const CODE_AMOUNT_TOO_SMALL = 'amount_too_small'; + const CODE_ANOMALOUS_MONEY_MOVEMENT_REQUEST = 'anomalous_money_movement_request'; const CODE_API_KEY_EXPIRED = 'api_key_expired'; const CODE_APPLICATION_FEES_NOT_ALLOWED = 'application_fees_not_allowed'; + const CODE_APPROVAL_REQUIRED = 'approval_required'; const CODE_AUTHENTICATION_REQUIRED = 'authentication_required'; const CODE_BALANCE_INSUFFICIENT = 'balance_insufficient'; const CODE_BALANCE_INVALID_PARAMETER = 'balance_invalid_parameter'; @@ -92,6 +86,10 @@ class ErrorObject extends StripeObject const CODE_DEBIT_NOT_AUTHORIZED = 'debit_not_authorized'; const CODE_EMAIL_INVALID = 'email_invalid'; const CODE_EXPIRED_CARD = 'expired_card'; + const CODE_FAILED_TAX_CALCULATION = 'failed_tax_calculation'; + const CODE_FINANCIAL_ACCOUNT_BALANCE_DOES_NOT_SUPPORT_CURRENCY = 'financial_account_balance_does_not_support_currency'; + const CODE_FINANCIAL_ACCOUNT_CAPABILITY_NOT_ENABLED = 'financial_account_capability_not_enabled'; + const CODE_FINANCIAL_ACCOUNT_CAPABILITY_RESTRICTED = 'financial_account_capability_restricted'; const CODE_FINANCIAL_CONNECTIONS_ACCOUNT_INACTIVE = 'financial_connections_account_inactive'; const CODE_FINANCIAL_CONNECTIONS_ACCOUNT_PENDING_ACCOUNT_NUMBERS = 'financial_connections_account_pending_account_numbers'; const CODE_FINANCIAL_CONNECTIONS_ACCOUNT_UNAVAILABLE_ACCOUNT_NUMBERS = 'financial_connections_account_unavailable_account_numbers'; @@ -165,6 +163,7 @@ class ErrorObject extends StripeObject const CODE_PAYMENT_METHOD_INVALID_PARAMETER = 'payment_method_invalid_parameter'; const CODE_PAYMENT_METHOD_INVALID_PARAMETER_TESTMODE = 'payment_method_invalid_parameter_testmode'; const CODE_PAYMENT_METHOD_MICRODEPOSIT_FAILED = 'payment_method_microdeposit_failed'; + const CODE_PAYMENT_METHOD_MICRODEPOSIT_PROCESSING_ERROR = 'payment_method_microdeposit_processing_error'; const CODE_PAYMENT_METHOD_MICRODEPOSIT_VERIFICATION_AMOUNTS_INVALID = 'payment_method_microdeposit_verification_amounts_invalid'; const CODE_PAYMENT_METHOD_MICRODEPOSIT_VERIFICATION_AMOUNTS_MISMATCH = 'payment_method_microdeposit_verification_amounts_mismatch'; const CODE_PAYMENT_METHOD_MICRODEPOSIT_VERIFICATION_ATTEMPTS_EXCEEDED = 'payment_method_microdeposit_verification_attempts_exceeded'; @@ -195,6 +194,7 @@ class ErrorObject extends StripeObject const CODE_ROUTING_NUMBER_INVALID = 'routing_number_invalid'; const CODE_SECRET_KEY_REQUIRED = 'secret_key_required'; const CODE_SEPA_UNSUPPORTED_ACCOUNT = 'sepa_unsupported_account'; + const CODE_SERVICE_PERIOD_COUPON_WITH_METERED_TIERED_ITEM_UNSUPPORTED = 'service_period_coupon_with_metered_tiered_item_unsupported'; const CODE_SETUP_ATTEMPT_FAILED = 'setup_attempt_failed'; const CODE_SETUP_INTENT_AUTHENTICATION_FAILURE = 'setup_intent_authentication_failure'; const CODE_SETUP_INTENT_INVALID_PARAMETER = 'setup_intent_invalid_parameter'; @@ -204,6 +204,7 @@ class ErrorObject extends StripeObject const CODE_SETUP_INTENT_UNEXPECTED_STATE = 'setup_intent_unexpected_state'; const CODE_SHIPPING_ADDRESS_INVALID = 'shipping_address_invalid'; const CODE_SHIPPING_CALCULATION_FAILED = 'shipping_calculation_failed'; + const CODE_SIRET_INVALID = 'siret_invalid'; const CODE_SKU_INACTIVE = 'sku_inactive'; const CODE_STATE_UNSUPPORTED = 'state_unsupported'; const CODE_STATUS_TRANSITION_INVALID = 'status_transition_invalid'; @@ -228,7 +229,7 @@ class ErrorObject extends StripeObject const CODE_TRANSFER_SOURCE_BALANCE_PARAMETERS_MISMATCH = 'transfer_source_balance_parameters_mismatch'; const CODE_TRANSFERS_NOT_ALLOWED = 'transfers_not_allowed'; const CODE_URL_INVALID = 'url_invalid'; - // The end of the section generated from our OpenAPI spec + // errorCodes: The end of the section generated from our OpenAPI spec /** * Refreshes this object using the provided values. @@ -244,17 +245,25 @@ class ErrorObject extends StripeObject // error objects when they have a null value. We manually set default // values here to facilitate generic error handling. $values = \array_merge([ + // errorRefreshFrom: The beginning of the section generated from our OpenAPI spec + 'advice_code' => null, 'charge' => null, 'code' => null, 'decline_code' => null, 'doc_url' => null, 'message' => null, + 'network_advice_code' => null, + 'network_decline_code' => null, 'param' => null, 'payment_intent' => null, 'payment_method' => null, + 'payment_method_type' => null, + 'request_log_url' => null, 'setup_intent' => null, 'source' => null, 'type' => null, + 'user_message' => null, + // errorRefreshFrom: The end of the section generated from our OpenAPI spec ], $values); parent::refreshFrom($values, $opts, $partial); } diff --git a/libs/stripe-php/lib/Event.php b/libs/stripe-php/lib/Event.php index 7a9ebde14..162e7e557 100644 --- a/libs/stripe-php/lib/Event.php +++ b/libs/stripe-php/lib/Event.php @@ -34,7 +34,7 @@ namespace Stripe; * @property null|string $context Authentication context needed to fetch the event or related object. * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. * @property (object{object: StripeObject, previous_attributes?: StripeObject}&StripeObject) $data - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property int $pending_webhooks Number of webhooks that haven't been successfully delivered (for example, to return a 20x response) to the URLs you specify. * @property null|(object{id: null|string, idempotency_key: null|string}&StripeObject) $request Information on the API request that triggers the event. * @property string $type Description of the event (for example, invoice.created or charge.refunded). diff --git a/libs/stripe-php/lib/Events/V2CommerceProductCatalogImportsFailedEvent.php b/libs/stripe-php/lib/Events/V2CommerceProductCatalogImportsFailedEvent.php new file mode 100644 index 000000000..f78a76bc4 --- /dev/null +++ b/libs/stripe-php/lib/Events/V2CommerceProductCatalogImportsFailedEvent.php @@ -0,0 +1,31 @@ +related_object->url); + list($object, $options) = $this->_request('get', $this->related_object->url, [], [ + 'stripe_context' => $this->context, + 'headers' => ['Stripe-Request-Trigger' => 'event=' . $this->id], + ], [], $apiMode); + + return \Stripe\Util\Util::convertToStripeObject($object, $options, $apiMode); + } +} diff --git a/libs/stripe-php/lib/Events/V2CommerceProductCatalogImportsFailedEventNotification.php b/libs/stripe-php/lib/Events/V2CommerceProductCatalogImportsFailedEventNotification.php new file mode 100644 index 000000000..be9a5d601 --- /dev/null +++ b/libs/stripe-php/lib/Events/V2CommerceProductCatalogImportsFailedEventNotification.php @@ -0,0 +1,38 @@ +related_object->url); + list($object, $options) = $this->_request('get', $this->related_object->url, [], [ + 'stripe_context' => $this->context, + 'headers' => ['Stripe-Request-Trigger' => 'event=' . $this->id], + ], [], $apiMode); + + return \Stripe\Util\Util::convertToStripeObject($object, $options, $apiMode); + } +} diff --git a/libs/stripe-php/lib/Events/V2CommerceProductCatalogImportsProcessingEventNotification.php b/libs/stripe-php/lib/Events/V2CommerceProductCatalogImportsProcessingEventNotification.php new file mode 100644 index 000000000..cfc35609c --- /dev/null +++ b/libs/stripe-php/lib/Events/V2CommerceProductCatalogImportsProcessingEventNotification.php @@ -0,0 +1,38 @@ +related_object->url); + list($object, $options) = $this->_request('get', $this->related_object->url, [], [ + 'stripe_context' => $this->context, + 'headers' => ['Stripe-Request-Trigger' => 'event=' . $this->id], + ], [], $apiMode); + + return \Stripe\Util\Util::convertToStripeObject($object, $options, $apiMode); + } +} diff --git a/libs/stripe-php/lib/Events/V2CommerceProductCatalogImportsSucceededEventNotification.php b/libs/stripe-php/lib/Events/V2CommerceProductCatalogImportsSucceededEventNotification.php new file mode 100644 index 000000000..2eb40e987 --- /dev/null +++ b/libs/stripe-php/lib/Events/V2CommerceProductCatalogImportsSucceededEventNotification.php @@ -0,0 +1,38 @@ +related_object->url); + list($object, $options) = $this->_request('get', $this->related_object->url, [], [ + 'stripe_context' => $this->context, + 'headers' => ['Stripe-Request-Trigger' => 'event=' . $this->id], + ], [], $apiMode); + + return \Stripe\Util\Util::convertToStripeObject($object, $options, $apiMode); + } +} diff --git a/libs/stripe-php/lib/Events/V2CommerceProductCatalogImportsSucceededWithErrorsEventNotification.php b/libs/stripe-php/lib/Events/V2CommerceProductCatalogImportsSucceededWithErrorsEventNotification.php new file mode 100644 index 000000000..c246e6d80 --- /dev/null +++ b/libs/stripe-php/lib/Events/V2CommerceProductCatalogImportsSucceededWithErrorsEventNotification.php @@ -0,0 +1,38 @@ +true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|string $url The publicly accessible URL to download the file. */ diff --git a/libs/stripe-php/lib/FinancialConnections/Account.php b/libs/stripe-php/lib/FinancialConnections/Account.php index 2a8fe28e6..88a83f7f0 100644 --- a/libs/stripe-php/lib/FinancialConnections/Account.php +++ b/libs/stripe-php/lib/FinancialConnections/Account.php @@ -18,11 +18,12 @@ namespace Stripe\FinancialConnections; * @property null|string $display_name A human-readable name that has been assigned to this account, either by the account holder or by the institution. * @property string $institution_name The name of the institution that holds this account. * @property null|string $last4 The last 4 digits of the account number. If present, this will be 4 numeric characters. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|AccountOwnership|string $ownership The most recent information about the account's owners. * @property null|(object{last_attempted_at: int, next_refresh_available_at: null|int, status: string}&\Stripe\StripeObject) $ownership_refresh The state of the most recent attempt to refresh the account owners. * @property null|string[] $permissions The list of permissions granted by this account. * @property string $status The status of the link to the account. + * @property null|(object{active?: (object{action: string, cause: string, expected_deactivation_date: int}&\Stripe\StripeObject)}&\Stripe\StripeObject) $status_details * @property string $subcategory

    If category is cash, one of:

    - checking - savings - other

    If category is credit, one of:

    - mortgage - line_of_credit - credit_card - other

    If category is investment or other, this will be other.

    * @property null|string[] $subscriptions The list of data refresh subscriptions requested on this account. * @property string[] $supported_payment_method_types The PaymentMethod type(s) that can be created from this account. diff --git a/libs/stripe-php/lib/FinancialConnections/Session.php b/libs/stripe-php/lib/FinancialConnections/Session.php index db8bc2b28..2bbb6800c 100644 --- a/libs/stripe-php/lib/FinancialConnections/Session.php +++ b/libs/stripe-php/lib/FinancialConnections/Session.php @@ -13,7 +13,7 @@ namespace Stripe\FinancialConnections; * @property \Stripe\Collection $accounts The accounts that were collected as part of this Session. * @property null|string $client_secret A value that will be passed to the client to launch the authentication flow. * @property null|(object{account_subcategories: null|string[], countries: null|string[]}&\Stripe\StripeObject) $filters - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property string[] $permissions Permissions requested for accounts collected during this session. * @property null|string[] $prefetch Data features requested to be retrieved upon account creation. * @property null|string $return_url For webview integrations only. Upon completing OAuth login in the native browser, the user will be redirected to this URL to return to your app. diff --git a/libs/stripe-php/lib/FinancialConnections/Transaction.php b/libs/stripe-php/lib/FinancialConnections/Transaction.php index 68a95262b..d68c2b1c9 100644 --- a/libs/stripe-php/lib/FinancialConnections/Transaction.php +++ b/libs/stripe-php/lib/FinancialConnections/Transaction.php @@ -13,7 +13,7 @@ namespace Stripe\FinancialConnections; * @property int $amount The amount of this transaction, in cents (or local equivalent). * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. * @property string $description The description of this transaction. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property string $status The status of the transaction. * @property (object{posted_at: null|int, void_at: null|int}&\Stripe\StripeObject) $status_transitions * @property int $transacted_at Time at which the transaction was transacted. Measured in seconds since the Unix epoch. diff --git a/libs/stripe-php/lib/Forwarding/Request.php b/libs/stripe-php/lib/Forwarding/Request.php index e6dcc12c2..536707c80 100644 --- a/libs/stripe-php/lib/Forwarding/Request.php +++ b/libs/stripe-php/lib/Forwarding/Request.php @@ -25,7 +25,7 @@ namespace Stripe\Forwarding; * @property string $id Unique identifier for the object. * @property string $object String representing the object's type. Objects of the same type share the same value. * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property string $payment_method The PaymentMethod to insert into the forwarded request. Forwarding previously consumed PaymentMethods is allowed. * @property string[] $replacements The field kinds to be replaced in the forwarded request. diff --git a/libs/stripe-php/lib/FundingInstructions.php b/libs/stripe-php/lib/FundingInstructions.php index 3e8cf3e72..4b2f7dce4 100644 --- a/libs/stripe-php/lib/FundingInstructions.php +++ b/libs/stripe-php/lib/FundingInstructions.php @@ -15,7 +15,7 @@ namespace Stripe; * @property (object{country: string, financial_addresses: ((object{aba?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: string, account_number: string, account_type: string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), bank_name: string, routing_number: string}&StripeObject), iban?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), bic: string, country: string, iban: string}&StripeObject), sort_code?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: string, account_number: string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), sort_code: string}&StripeObject), spei?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), bank_code: string, bank_name: string, clabe: string}&StripeObject), supported_networks?: string[], swift?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: string, account_number: string, account_type: string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), bank_name: string, swift_code: string}&StripeObject), type: string, zengin?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: null|string, account_number: null|string, account_type: null|string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), bank_code: null|string, bank_name: null|string, branch_code: null|string, branch_name: null|string}&StripeObject)}&StripeObject))[], type: string}&StripeObject) $bank_transfer * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. * @property string $funding_type The funding_type of the returned instructions - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. */ class FundingInstructions extends ApiResource { diff --git a/libs/stripe-php/lib/HttpClient/CurlClient.php b/libs/stripe-php/lib/HttpClient/CurlClient.php index c210a32c4..7e0caec7e 100644 --- a/libs/stripe-php/lib/HttpClient/CurlClient.php +++ b/libs/stripe-php/lib/HttpClient/CurlClient.php @@ -202,7 +202,13 @@ class CurlClient implements ClientInterface, StreamingClientInterface */ private function constructUrlAndBody($method, $absUrl, $params, $hasFile, $apiMode) { - $params = Util\Util::objectsToIds($params); + // For V2 POST bodies, preserve null values so they serialize to JSON + // null (the V2 mechanism for clearing fields / metadata keys). + // For all other cases (V1, GET/DELETE query params), strip nulls as + // before — null values become empty strings in query params which + // causes server errors. + $serializeNull = ('post' === $method && 'v2' === $apiMode); + $params = Util\Util::objectsToIds($params, $serializeNull); if ('post' === $method) { $absUrl = Util\Util::utf8($absUrl); if ($hasFile) { @@ -526,7 +532,7 @@ class CurlClient implements ClientInterface, StreamingClientInterface if ($shouldRetry) { ++$numRetries; - $sleepSeconds = $this->sleepTime($numRetries, $lastRHeaders); + $sleepSeconds = $this->sleepTime($numRetries); \usleep((int) ($sleepSeconds * 1000000)); } else { break; @@ -586,7 +592,7 @@ class CurlClient implements ClientInterface, StreamingClientInterface if ($shouldRetry) { ++$numRetries; - $sleepSeconds = $this->sleepTime($numRetries, $rheaders); + $sleepSeconds = $this->sleepTime($numRetries); \usleep((int) ($sleepSeconds * 1000000)); } else { break; @@ -713,11 +719,10 @@ class CurlClient implements ClientInterface, StreamingClientInterface * Provides the number of seconds to wait before retrying a request. * * @param int $numRetries - * @param array|Util\CaseInsensitiveArray $rheaders * * @return int */ - private function sleepTime($numRetries, $rheaders) + private function sleepTime($numRetries) { // Apply exponential backoff with $initialNetworkRetryDelay on the // number of $numRetries so far as inputs. Do not allow the number to exceed @@ -729,18 +734,8 @@ class CurlClient implements ClientInterface, StreamingClientInterface // Apply some jitter by randomizing the value in the range of // ($sleepSeconds / 2) to ($sleepSeconds). - $sleepSeconds *= 0.5 * (1 + $this->randomGenerator->randFloat()); - // But never sleep less than the base sleep seconds. - $sleepSeconds = \max(Stripe::getInitialNetworkRetryDelay(), $sleepSeconds); - - // And never sleep less than the time the API asks us to wait, assuming it's a reasonable ask. - $retryAfter = isset($rheaders['retry-after']) ? (float) ($rheaders['retry-after']) : 0.0; - if (\floor($retryAfter) === $retryAfter && $retryAfter <= Stripe::getMaxRetryAfter()) { - $sleepSeconds = \max($sleepSeconds, $retryAfter); - } - - return $sleepSeconds; + return \max(Stripe::getInitialNetworkRetryDelay(), $sleepSeconds * 0.5 * (1 + $this->randomGenerator->randFloat())); } /** diff --git a/libs/stripe-php/lib/Identity/VerificationReport.php b/libs/stripe-php/lib/Identity/VerificationReport.php index 033b67918..75f589563 100644 --- a/libs/stripe-php/lib/Identity/VerificationReport.php +++ b/libs/stripe-php/lib/Identity/VerificationReport.php @@ -24,7 +24,7 @@ namespace Stripe\Identity; * @property null|(object{address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject), dob?: null|(object{day: null|int, month: null|int, year: null|int}&\Stripe\StripeObject), error: null|(object{code: null|string, reason: null|string}&\Stripe\StripeObject), expiration_date?: null|(object{day: null|int, month: null|int, year: null|int}&\Stripe\StripeObject), files: null|string[], first_name: null|string, issued_date: null|(object{day: null|int, month: null|int, year: null|int}&\Stripe\StripeObject), issuing_country: null|string, last_name: null|string, number?: null|string, sex?: null|string, status: string, type: null|string, unparsed_place_of_birth?: null|string, unparsed_sex?: null|string}&\Stripe\StripeObject) $document Result from a document check * @property null|(object{email: null|string, error: null|(object{code: null|string, reason: null|string}&\Stripe\StripeObject), status: string}&\Stripe\StripeObject) $email Result from a email check * @property null|(object{dob?: null|(object{day: null|int, month: null|int, year: null|int}&\Stripe\StripeObject), error: null|(object{code: null|string, reason: null|string}&\Stripe\StripeObject), first_name: null|string, id_number?: null|string, id_number_type: null|string, last_name: null|string, status: string}&\Stripe\StripeObject) $id_number Result from an id_number check - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|(object{document?: (object{allowed_types?: string[], require_id_number?: bool, require_live_capture?: bool, require_matching_selfie?: bool}&\Stripe\StripeObject), id_number?: (object{}&\Stripe\StripeObject)}&\Stripe\StripeObject) $options * @property null|(object{error: null|(object{code: null|string, reason: null|string}&\Stripe\StripeObject), phone: null|string, status: string}&\Stripe\StripeObject) $phone Result from a phone check * @property null|(object{document: null|string, error: null|(object{code: null|string, reason: null|string}&\Stripe\StripeObject), selfie: null|string, status: string}&\Stripe\StripeObject) $selfie Result from a selfie check diff --git a/libs/stripe-php/lib/Identity/VerificationSession.php b/libs/stripe-php/lib/Identity/VerificationSession.php index 2e68e6743..e4927166e 100644 --- a/libs/stripe-php/lib/Identity/VerificationSession.php +++ b/libs/stripe-php/lib/Identity/VerificationSession.php @@ -24,7 +24,7 @@ namespace Stripe\Identity; * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. * @property null|(object{code: null|string, reason: null|string}&\Stripe\StripeObject) $last_error If present, this property tells you the last error encountered when processing the verification. * @property null|string|VerificationReport $last_verification_report ID of the most recent VerificationReport. Learn more about accessing detailed verification results. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|(object{document?: (object{allowed_types?: string[], require_id_number?: bool, require_live_capture?: bool, require_matching_selfie?: bool}&\Stripe\StripeObject), email?: (object{require_verification?: bool}&\Stripe\StripeObject), id_number?: (object{}&\Stripe\StripeObject), matching?: (object{dob?: string, name?: string}&\Stripe\StripeObject), phone?: (object{require_verification?: bool}&\Stripe\StripeObject)}&\Stripe\StripeObject) $options A set of options for the session’s verification checks. * @property null|(object{email?: string, phone?: string}&\Stripe\StripeObject) $provided_details Details provided about the user being verified. These details may be shown to the user. diff --git a/libs/stripe-php/lib/Invoice.php b/libs/stripe-php/lib/Invoice.php index 7341dd85f..33c11e91a 100644 --- a/libs/stripe-php/lib/Invoice.php +++ b/libs/stripe-php/lib/Invoice.php @@ -46,6 +46,7 @@ namespace Stripe; * @property int $amount_due Final amount due at this time for this invoice. If the invoice's total is smaller than the minimum charge amount, for example, or if there is account credit that can be applied to the invoice, the amount_due may be 0. If there is a positive starting_balance for the invoice (the customer owes money), the amount_due will also take that into account. The charge that gets generated for the invoice will be for the amount specified in amount_due. * @property int $amount_overpaid Amount that was overpaid on the invoice. The amount overpaid is credited to the customer's credit balance. * @property int $amount_paid The amount, in cents (or local equivalent), that was paid. + * @property null|int $amount_paid_off_stripe Amount, in cents (or local equivalent), that was paid on the invoice outside of Stripe. * @property int $amount_remaining The difference between amount_due and amount_paid, in cents (or local equivalent). * @property int $amount_shipping This is the sum of all the shipping amounts. * @property null|Application|string $application ID of the Connect Application that created the invoice. @@ -85,16 +86,16 @@ namespace Stripe; * @property null|(object{advice_code?: string, charge?: string, code?: string, decline_code?: string, doc_url?: string, message?: string, network_advice_code?: string, network_decline_code?: string, param?: string, payment_intent?: PaymentIntent, payment_method?: PaymentMethod, payment_method_type?: string, request_log_url?: string, setup_intent?: SetupIntent, source?: Account|BankAccount|Card|Source, type: string}&StripeObject) $last_finalization_error The error encountered during the previous attempt to finalize the invoice. This field is cleared when the invoice is successfully finalized. * @property null|Invoice|string $latest_revision The ID of the most recent non-draft revision of this invoice * @property Collection $lines The individual line items that make up the invoice. lines is sorted as follows: (1) pending invoice items (including prorations) in reverse chronological order, (2) subscription items in reverse chronological order, and (3) invoice items added after invoice creation in chronological order. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|int $next_payment_attempt The time at which payment will next be attempted. This value will be null for invoices where collection_method=send_invoice. * @property null|string $number A unique, identifying string that appears on emails sent to the customer for this invoice. This starts with the customer's unique invoice_prefix if it is specified. * @property null|Account|string $on_behalf_of The account (if any) for which the funds of the invoice payment are intended. If set, the invoice will be presented with the branding and support information of the specified account. See the Invoices with Connect documentation for details. * @property null|(object{quote_details: null|(object{quote: string}&StripeObject), subscription_details: null|(object{metadata: null|StripeObject, subscription: string|Subscription, subscription_proration_date?: int}&StripeObject), type: string}&StripeObject) $parent The parent that generated this invoice - * @property (object{default_mandate: null|string, payment_method_options: null|(object{acss_debit: null|(object{mandate_options?: (object{transaction_type: null|string}&StripeObject), verification_method?: string}&StripeObject), bancontact: null|(object{preferred_language: string}&StripeObject), card: null|(object{installments?: (object{enabled: null|bool}&StripeObject), request_three_d_secure: null|string}&StripeObject), customer_balance: null|(object{bank_transfer?: (object{eu_bank_transfer?: (object{country: string}&StripeObject), type: null|string}&StripeObject), funding_type: null|string}&StripeObject), konbini: null|(object{}&StripeObject), payto: null|(object{mandate_options?: (object{amount: null|int, amount_type: null|string, purpose: null|string}&StripeObject)}&StripeObject), sepa_debit: null|(object{}&StripeObject), us_bank_account: null|(object{financial_connections?: (object{filters?: (object{account_subcategories?: string[]}&StripeObject), permissions?: string[], prefetch: null|string[]}&StripeObject), verification_method?: string}&StripeObject)}&StripeObject), payment_method_types: null|string[]}&StripeObject) $payment_settings + * @property (object{default_mandate: null|string, payment_method_options: null|(object{acss_debit: null|(object{mandate_options?: (object{transaction_type: null|string}&StripeObject), verification_method?: string}&StripeObject), bancontact: null|(object{preferred_language: string}&StripeObject), card: null|(object{installments?: (object{enabled: null|bool}&StripeObject), request_three_d_secure: null|string}&StripeObject), customer_balance: null|(object{bank_transfer?: (object{eu_bank_transfer?: (object{country: string}&StripeObject), type: null|string}&StripeObject), funding_type: null|string}&StripeObject), konbini: null|(object{}&StripeObject), payto: null|(object{mandate_options?: (object{amount: null|int, amount_type: null|string, purpose: null|string}&StripeObject)}&StripeObject), pix: null|(object{amount_includes_iof: null|string, expires_after_seconds?: int}&StripeObject), sepa_debit: null|(object{}&StripeObject), upi: null|(object{mandate_options?: (object{amount: null|int, amount_type: null|string, description: null|string, end_date: null|int}&StripeObject)}&StripeObject), us_bank_account: null|(object{financial_connections?: (object{filters?: (object{account_subcategories?: string[]}&StripeObject), permissions?: string[], prefetch: null|string[]}&StripeObject), verification_method?: string}&StripeObject)}&StripeObject), payment_method_types: null|string[]}&StripeObject) $payment_settings * @property null|Collection $payments Payments for this invoice. Use invoice payment to get more details. - * @property int $period_end End of the usage period during which invoice items were added to this invoice. This looks back one period for a subscription invoice. Use the line item period to get the service period for each price. - * @property int $period_start Start of the usage period during which invoice items were added to this invoice. This looks back one period for a subscription invoice. Use the line item period to get the service period for each price. + * @property int $period_end The latest timestamp at which invoice items can be associated with this invoice. Use the line item period to get the service period for each price. + * @property int $period_start The earliest timestamp at which invoice items can be associated with this invoice. Use the line item period to get the service period for each price. * @property int $post_payment_credit_notes_amount Total amount of all post-payment credit notes issued for this invoice. * @property int $pre_payment_credit_notes_amount Total amount of all pre-payment credit notes issued for this invoice. * @property null|string $receipt_number This is the transaction number that appears on email receipts sent for this invoice. @@ -148,11 +149,11 @@ class Invoice extends ApiResource /** * This endpoint creates a draft invoice for a given customer. The invoice remains - * a draft until you finalize the invoice, which - * allows you to pay or finalize the invoice, + * which allows you to pay or send the invoice to your customers. * - * @param null|array{account_tax_ids?: null|string[], application_fee_amount?: int, auto_advance?: bool, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, automatically_finalizes_at?: int, collection_method?: string, currency?: string, custom_fields?: null|array{name: string, value: string}[], customer?: string, customer_account?: string, days_until_due?: int, default_payment_method?: string, default_source?: string, default_tax_rates?: string[], description?: string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], due_date?: int, effective_at?: int, expand?: string[], footer?: string, from_invoice?: array{action: string, invoice: string}, issuer?: array{account?: string, type: string}, metadata?: null|array, number?: string, on_behalf_of?: string, payment_settings?: array{default_mandate?: null|string, payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{transaction_type?: string}, verification_method?: string}, bancontact?: null|array{preferred_language?: string}, card?: null|array{installments?: array{enabled?: bool, plan?: null|array{count?: int, interval?: string, type: string}}, request_three_d_secure?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, type?: string}, funding_type?: string}, konbini?: null|array{}, payto?: null|array{mandate_options?: array{amount?: int, purpose?: string}}, sepa_debit?: null|array{}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[]}, verification_method?: string}}, payment_method_types?: null|string[]}, pending_invoice_items_behavior?: string, rendering?: array{amount_tax_display?: null|string, pdf?: array{page_size?: string}, template?: string, template_version?: null|int}, shipping_cost?: array{shipping_rate?: string, shipping_rate_data?: array{delivery_estimate?: array{maximum?: array{unit: string, value: int}, minimum?: array{unit: string, value: int}}, display_name: string, fixed_amount?: array{amount: int, currency: string, currency_options?: array}, metadata?: array, tax_behavior?: string, tax_code?: string, type?: string}}, shipping_details?: array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name: string, phone?: null|string}, statement_descriptor?: string, subscription?: string, transfer_data?: array{amount?: int, destination: string}} $params + * @param null|array{account_tax_ids?: null|string[], application_fee_amount?: int, auto_advance?: bool, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, automatically_finalizes_at?: int, collection_method?: string, currency?: string, custom_fields?: null|array{name: string, value: string}[], customer?: string, customer_account?: string, days_until_due?: int, default_payment_method?: string, default_source?: string, default_tax_rates?: string[], description?: string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], due_date?: int, effective_at?: int, expand?: string[], footer?: string, from_invoice?: array{action: string, invoice: string}, issuer?: array{account?: string, type: string}, metadata?: null|array, number?: string, on_behalf_of?: string, payment_settings?: array{default_mandate?: null|string, payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{transaction_type?: string}, verification_method?: string}, bancontact?: null|array{preferred_language?: string}, card?: null|array{installments?: array{enabled?: bool, plan?: null|array{count?: int, interval?: string, type: string}}, request_three_d_secure?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, type?: string}, funding_type?: string}, konbini?: null|array{}, payto?: null|array{mandate_options?: array{amount?: int, purpose?: string}}, pix?: null|array{amount_includes_iof?: string, expires_after_seconds?: int}, sepa_debit?: null|array{}, upi?: null|array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[]}, verification_method?: string}}, payment_method_types?: null|string[]}, pending_invoice_items_behavior?: string, rendering?: array{amount_tax_display?: null|string, pdf?: array{page_size?: string}, template?: string, template_version?: null|int}, shipping_cost?: array{shipping_rate?: string, shipping_rate_data?: array{delivery_estimate?: array{maximum?: array{unit: string, value: int}, minimum?: array{unit: string, value: int}}, display_name: string, fixed_amount?: array{amount: int, currency: string, currency_options?: array}, metadata?: array, tax_behavior?: string, tax_code?: string, type?: string}}, shipping_details?: array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name: string, phone?: null|string}, statement_descriptor?: string, subscription?: string, transfer_data?: array{amount?: int, destination: string}} $params * @param null|array|string $options * * @return Invoice the created resource @@ -175,7 +176,7 @@ class Invoice extends ApiResource * Permanently deletes a one-off invoice draft. This cannot be undone. Attempts to * delete invoices that are no longer in a draft state will fail; once an invoice * has been finalized or if an invoice is for a subscription, it must be voided. + * href="/api/invoices/void">voided. * * @param null|array $params * @param null|array|string $opts @@ -244,7 +245,7 @@ class Invoice extends ApiResource * invoices, pass auto_advance=false. * * @param string $id the ID of the resource to update - * @param null|array{account_tax_ids?: null|string[], application_fee_amount?: int, auto_advance?: bool, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, automatically_finalizes_at?: int, collection_method?: string, custom_fields?: null|array{name: string, value: string}[], days_until_due?: int, default_payment_method?: string, default_source?: null|string, default_tax_rates?: null|string[], description?: string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], due_date?: int, effective_at?: null|int, expand?: string[], footer?: string, issuer?: array{account?: string, type: string}, metadata?: null|array, number?: null|string, on_behalf_of?: null|string, payment_settings?: array{default_mandate?: null|string, payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{transaction_type?: string}, verification_method?: string}, bancontact?: null|array{preferred_language?: string}, card?: null|array{installments?: array{enabled?: bool, plan?: null|array{count?: int, interval?: string, type: string}}, request_three_d_secure?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, type?: string}, funding_type?: string}, konbini?: null|array{}, payto?: null|array{mandate_options?: array{amount?: int, purpose?: string}}, sepa_debit?: null|array{}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[]}, verification_method?: string}}, payment_method_types?: null|string[]}, rendering?: array{amount_tax_display?: null|string, pdf?: array{page_size?: string}, template?: string, template_version?: null|int}, shipping_cost?: null|array{shipping_rate?: string, shipping_rate_data?: array{delivery_estimate?: array{maximum?: array{unit: string, value: int}, minimum?: array{unit: string, value: int}}, display_name: string, fixed_amount?: array{amount: int, currency: string, currency_options?: array}, metadata?: array, tax_behavior?: string, tax_code?: string, type?: string}}, shipping_details?: null|array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name: string, phone?: null|string}, statement_descriptor?: string, transfer_data?: null|array{amount?: int, destination: string}} $params + * @param null|array{account_tax_ids?: null|string[], application_fee_amount?: int, auto_advance?: bool, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, automatically_finalizes_at?: int, collection_method?: string, custom_fields?: null|array{name: string, value: string}[], days_until_due?: int, default_payment_method?: string, default_source?: null|string, default_tax_rates?: null|string[], description?: string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], due_date?: int, effective_at?: null|int, expand?: string[], footer?: string, issuer?: array{account?: string, type: string}, metadata?: null|array, number?: null|string, on_behalf_of?: null|string, payment_settings?: array{default_mandate?: null|string, payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{transaction_type?: string}, verification_method?: string}, bancontact?: null|array{preferred_language?: string}, card?: null|array{installments?: array{enabled?: bool, plan?: null|array{count?: int, interval?: string, type: string}}, request_three_d_secure?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, type?: string}, funding_type?: string}, konbini?: null|array{}, payto?: null|array{mandate_options?: array{amount?: int, purpose?: string}}, pix?: null|array{amount_includes_iof?: string, expires_after_seconds?: int}, sepa_debit?: null|array{}, upi?: null|array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[]}, verification_method?: string}}, payment_method_types?: null|string[]}, rendering?: array{amount_tax_display?: null|string, pdf?: array{page_size?: string}, template?: string, template_version?: null|int}, shipping_cost?: null|array{shipping_rate?: string, shipping_rate_data?: array{delivery_estimate?: array{maximum?: array{unit: string, value: int}, minimum?: array{unit: string, value: int}}, display_name: string, fixed_amount?: array{amount: int, currency: string, currency_options?: array}, metadata?: array, tax_behavior?: string, tax_code?: string, type?: string}}, shipping_details?: null|array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name: string, phone?: null|string}, statement_descriptor?: string, transfer_data?: null|array{amount?: int, destination: string}} $params * @param null|array|string $opts * * @return Invoice the updated resource diff --git a/libs/stripe-php/lib/InvoiceItem.php b/libs/stripe-php/lib/InvoiceItem.php index 48c18be9e..740e36b07 100644 --- a/libs/stripe-php/lib/InvoiceItem.php +++ b/libs/stripe-php/lib/InvoiceItem.php @@ -25,15 +25,16 @@ namespace Stripe; * @property bool $discountable If true, discounts will apply to this invoice item. Always false for prorations. * @property null|(Discount|string)[] $discounts The discounts which apply to the invoice item. Item discounts are applied before invoice discounts. Use expand[]=discounts to expand each discount. * @property null|Invoice|string $invoice The ID of the invoice this invoice item belongs to. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|int $net_amount The amount after discounts, but before credits and taxes. This field is null for discountable=true items. * @property null|(object{subscription_details: null|(object{subscription: string, subscription_item?: string}&StripeObject), type: string}&StripeObject) $parent The parent that generated this invoice item. * @property (object{end: int, start: int}&StripeObject) $period * @property null|(object{price_details?: (object{price: Price|string, product: string}&StripeObject), type: string, unit_amount_decimal: null|string}&StripeObject) $pricing The pricing information of the invoice item. * @property bool $proration Whether the invoice item was created automatically as a proration adjustment when the customer switched plans. - * @property null|(object{discount_amounts: ((object{amount: int, discount: Discount|string}&StripeObject))[]}&StripeObject) $proration_details - * @property int $quantity Quantity of units for the invoice item. If the invoice item is a proration, the quantity of the subscription that the proration was computed for. + * @property null|(object{credited_items: null|(object{invoice_item?: string, invoice_line_item_details?: (object{invoice: string, invoice_line_items: string[]}&StripeObject), type: string}&StripeObject), discount_amounts: ((object{amount: int, discount: Discount|string}&StripeObject))[]}&StripeObject) $proration_details + * @property int $quantity Quantity of units for the invoice item in integer format, with any decimal precision truncated. For the item's full-precision decimal quantity, use quantity_decimal. This field will be deprecated in favor of quantity_decimal in a future version. If the invoice item is a proration, the quantity of the subscription that the proration was computed for. + * @property string $quantity_decimal Non-negative decimal with at most 12 decimal places. The quantity of units for the invoice item. * @property null|TaxRate[] $tax_rates The tax rates which apply to the invoice item. When set, the default_tax_rates on the invoice do not apply to this invoice item. * @property null|string|TestHelpers\TestClock $test_clock ID of the test clock this invoice item belongs to. */ @@ -48,7 +49,7 @@ class InvoiceItem extends ApiResource * no invoice is specified, the item will be on the next invoice created for the * customer specified. * - * @param null|array{amount?: int, currency?: string, customer?: string, customer_account?: string, description?: string, discountable?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], invoice?: string, metadata?: null|array, period?: array{end: int, start: int}, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, pricing?: array{price?: string}, quantity?: int, subscription?: string, tax_behavior?: string, tax_code?: null|string, tax_rates?: string[], unit_amount_decimal?: string} $params + * @param null|array{amount?: int, currency?: string, customer?: string, customer_account?: string, description?: string, discountable?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], invoice?: string, metadata?: null|array, period?: array{end: int, start: int}, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, pricing?: array{price?: string}, quantity?: int, quantity_decimal?: string, subscription?: string, tax_behavior?: string, tax_code?: null|string, tax_rates?: string[], unit_amount_decimal?: string} $params * @param null|array|string $options * * @return InvoiceItem the created resource @@ -133,7 +134,7 @@ class InvoiceItem extends ApiResource * closed. * * @param string $id the ID of the resource to update - * @param null|array{amount?: int, description?: string, discountable?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], metadata?: null|array, period?: array{end: int, start: int}, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, pricing?: array{price?: string}, quantity?: int, tax_behavior?: string, tax_code?: null|string, tax_rates?: null|string[], unit_amount_decimal?: string} $params + * @param null|array{amount?: int, description?: string, discountable?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], metadata?: null|array, period?: array{end: int, start: int}, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, pricing?: array{price?: string}, quantity?: int, quantity_decimal?: string, tax_behavior?: string, tax_code?: null|string, tax_rates?: null|string[], unit_amount_decimal?: string} $params * @param null|array|string $opts * * @return InvoiceItem the updated resource diff --git a/libs/stripe-php/lib/InvoiceLineItem.php b/libs/stripe-php/lib/InvoiceLineItem.php index 3b8ca0513..d20e92eeb 100644 --- a/libs/stripe-php/lib/InvoiceLineItem.php +++ b/libs/stripe-php/lib/InvoiceLineItem.php @@ -18,13 +18,14 @@ namespace Stripe; * @property bool $discountable If true, discounts will apply to this line item. Always false for prorations. * @property (Discount|string)[] $discounts The discounts applied to the invoice line item. Line item discounts are applied before invoice discounts. Use expand[]=discounts to expand each discount. * @property null|string $invoice The ID of the invoice that contains this line item. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Note that for line items with type=subscription, metadata reflects the current metadata from the subscription associated with the line item, unless the invoice line was directly updated with different metadata after creation. * @property null|(object{invoice_item_details: null|(object{invoice_item: string, proration: bool, proration_details: null|(object{credited_items: null|(object{invoice: string, invoice_line_items: string[]}&StripeObject)}&StripeObject), subscription: null|string}&StripeObject), subscription_item_details: null|(object{invoice_item: null|string, proration: bool, proration_details: null|(object{credited_items: null|(object{invoice: string, invoice_line_items: string[]}&StripeObject)}&StripeObject), subscription: null|string, subscription_item: string}&StripeObject), type: string}&StripeObject) $parent The parent that generated this line item. * @property (object{end: int, start: int}&StripeObject) $period * @property null|((object{amount: int, credit_balance_transaction?: null|Billing\CreditBalanceTransaction|string, discount?: Discount|string, type: string}&StripeObject))[] $pretax_credit_amounts Contains pretax credit amounts (ex: discount, credit grants, etc) that apply to this line item. * @property null|(object{price_details?: (object{price: Price|string, product: string}&StripeObject), type: string, unit_amount_decimal: null|string}&StripeObject) $pricing The pricing information of the line item. - * @property null|int $quantity The quantity of the subscription, if the line item is a subscription or a proration. + * @property null|int $quantity Quantity of units for the invoice line item in integer format, with any decimal precision truncated. For the line item's full-precision decimal quantity, use quantity_decimal. This field will be deprecated in favor of quantity_decimal in a future version. If the line item is a proration or subscription, the quantity of the subscription that the proration was computed for. + * @property null|string $quantity_decimal Non-negative decimal with at most 12 decimal places. The quantity of units for the line item. * @property null|string|Subscription $subscription * @property int $subtotal The subtotal of the line item, in cents (or local equivalent), before any discounts or taxes. * @property null|((object{amount: int, tax_behavior: string, tax_rate_details: null|(object{tax_rate: string}&StripeObject), taxability_reason: string, taxable_amount: null|int, type: string}&StripeObject))[] $taxes The tax information of the line item. @@ -44,7 +45,7 @@ class InvoiceLineItem extends ApiResource * before the invoice is finalized. * * @param string $id the ID of the resource to update - * @param null|array{amount?: int, description?: string, discountable?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], metadata?: null|array, period?: array{end: int, start: int}, price_data?: array{currency: string, product?: string, product_data?: array{description?: string, images?: string[], metadata?: array, name: string, tax_code?: string, unit_label?: string}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, pricing?: array{price?: string}, quantity?: int, tax_amounts?: null|array{amount: int, tax_rate_data: array{country?: string, description?: string, display_name: string, inclusive: bool, jurisdiction?: string, jurisdiction_level?: string, percentage: float, state?: string, tax_type?: string}, taxability_reason?: string, taxable_amount: int}[], tax_rates?: null|string[]} $params + * @param null|array{amount?: int, description?: string, discountable?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], metadata?: null|array, period?: array{end: int, start: int}, price_data?: array{currency: string, product?: string, product_data?: array{description?: string, images?: string[], metadata?: array, name: string, tax_code?: string, unit_label?: string}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, pricing?: array{price?: string}, quantity?: int, quantity_decimal?: string, tax_amounts?: null|array{amount: int, tax_rate_data: array{country?: string, description?: string, display_name: string, inclusive: bool, jurisdiction?: string, jurisdiction_level?: string, percentage: float, state?: string, tax_type?: string}, taxability_reason?: string, taxable_amount: int}[], tax_rates?: null|string[]} $params * @param null|array|string $opts * * @return InvoiceLineItem the updated resource diff --git a/libs/stripe-php/lib/InvoicePayment.php b/libs/stripe-php/lib/InvoicePayment.php index b90fe85b0..1561d62d5 100644 --- a/libs/stripe-php/lib/InvoicePayment.php +++ b/libs/stripe-php/lib/InvoicePayment.php @@ -22,7 +22,7 @@ namespace Stripe; * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. * @property Invoice|string $invoice The invoice that was paid. * @property bool $is_default Stripe automatically creates a default InvoicePayment when the invoice is finalized, and keeps it synchronized with the invoice’s amount_remaining. The PaymentIntent associated with the default payment can’t be edited or canceled directly. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property (object{charge?: Charge|string, payment_intent?: PaymentIntent|string, payment_record?: PaymentRecord|string, type: string}&StripeObject) $payment * @property string $status The status of the payment, one of open, paid, or canceled. * @property (object{canceled_at: null|int, paid_at: null|int}&StripeObject) $status_transitions diff --git a/libs/stripe-php/lib/InvoiceRenderingTemplate.php b/libs/stripe-php/lib/InvoiceRenderingTemplate.php index 268d8159c..e6ec7027f 100644 --- a/libs/stripe-php/lib/InvoiceRenderingTemplate.php +++ b/libs/stripe-php/lib/InvoiceRenderingTemplate.php @@ -11,7 +11,7 @@ namespace Stripe; * @property string $id Unique identifier for the object. * @property string $object String representing the object's type. Objects of the same type share the same value. * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|string $nickname A brief description of the template, hidden from customers * @property string $status The status of the template, one of active or archived. diff --git a/libs/stripe-php/lib/Issuing/Authorization.php b/libs/stripe-php/lib/Issuing/Authorization.php index a828674ed..d2f2d2986 100644 --- a/libs/stripe-php/lib/Issuing/Authorization.php +++ b/libs/stripe-php/lib/Issuing/Authorization.php @@ -19,13 +19,14 @@ namespace Stripe\Issuing; * @property string $authorization_method How the card details were provided. * @property \Stripe\BalanceTransaction[] $balance_transactions List of balance transactions associated with this authorization. * @property Card $card You can create physical or virtual cards that are issued to cardholders. + * @property null|string $card_presence Whether the card was present at the point of sale for the authorization. * @property null|Cardholder|string $cardholder The cardholder to whom this authorization belongs. * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. * @property string $currency The currency of the cardholder. This currency can be different from the currency presented at authorization and the merchant_currency field on this authorization. Three-letter ISO currency code, in lowercase. Must be a supported currency. * @property null|(object{cardholder_prompt_data: null|(object{alphanumeric_id: null|string, driver_id: null|string, odometer: null|int, unspecified_id: null|string, user_id: null|string, vehicle_number: null|string}&\Stripe\StripeObject), purchase_type: null|string, reported_breakdown: null|(object{fuel: null|(object{gross_amount_decimal: null|string}&\Stripe\StripeObject), non_fuel: null|(object{gross_amount_decimal: null|string}&\Stripe\StripeObject), tax: null|(object{local_amount_decimal: null|string, national_amount_decimal: null|string}&\Stripe\StripeObject)}&\Stripe\StripeObject), service_type: null|string}&\Stripe\StripeObject) $fleet Fleet-specific information for authorizations using Fleet cards. * @property null|((object{channel: string, status: string, undeliverable_reason: null|string}&\Stripe\StripeObject))[] $fraud_challenges Fraud challenges sent to the cardholder, if this authorization was declined for fraud risk reasons. * @property null|(object{industry_product_code: null|string, quantity_decimal: null|string, type: null|string, unit: null|string, unit_cost_decimal: null|string}&\Stripe\StripeObject) $fuel Information about fuel that was purchased with this transaction. Typically this information is received from the merchant after the authorization has been approved and the fuel dispensed. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property int $merchant_amount The total amount that was authorized or rejected. This amount is in the merchant_currency and in the smallest currency unit. merchant_amount should be the same as amount, unless merchant_currency and currency are different. * @property string $merchant_currency The local currency that was presented to the cardholder for the authorization. This currency can be different from the cardholder currency and the currency field on this authorization. Three-letter ISO currency code, in lowercase. Must be a supported currency. * @property (object{category: string, category_code: string, city: null|string, country: null|string, name: null|string, network_id: string, postal_code: null|string, state: null|string, tax_id: null|string, terminal_id: null|string, url: null|string}&\Stripe\StripeObject) $merchant_data @@ -53,6 +54,9 @@ class Authorization extends \Stripe\ApiResource const AUTHORIZATION_METHOD_ONLINE = 'online'; const AUTHORIZATION_METHOD_SWIPE = 'swipe'; + const CARD_PRESENCE_NOT_PRESENT = 'not_present'; + const CARD_PRESENCE_PRESENT = 'present'; + const STATUS_CLOSED = 'closed'; const STATUS_EXPIRED = 'expired'; const STATUS_PENDING = 'pending'; diff --git a/libs/stripe-php/lib/Issuing/Card.php b/libs/stripe-php/lib/Issuing/Card.php index 8d0f4b612..724ea533d 100644 --- a/libs/stripe-php/lib/Issuing/Card.php +++ b/libs/stripe-php/lib/Issuing/Card.php @@ -20,7 +20,8 @@ namespace Stripe\Issuing; * @property null|string $financial_account The financial account this card is attached to. * @property string $last4 The last 4 digits of the card number. * @property null|(object{started_at: null|int, type: null|string}&\Stripe\StripeObject) $latest_fraud_warning Stripe’s assessment of whether this card’s details have been compromised. If this property isn't null, cancel and reissue the card to prevent fraudulent activity risk. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|(object{cancel_after: (object{payment_count: int}&\Stripe\StripeObject)}&\Stripe\StripeObject) $lifecycle_controls Rules that control the lifecycle of this card, such as automatic cancellation. Refer to our documentation for more details. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|string $number The full unredacted card number. For security reasons, this is only available for virtual cards, and will be omitted unless you explicitly request it with the expand parameter. Additionally, it's only available via the "Retrieve a card" endpoint, not via "List all cards" or any other endpoint. * @property null|PersonalizationDesign|string $personalization_design The personalization design object belonging to this card. @@ -29,7 +30,7 @@ namespace Stripe\Issuing; * @property null|string $replacement_reason The reason why the previous card needed to be replaced. * @property null|string $second_line Text separate from cardholder name, printed on the card. * @property null|(object{address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject), address_validation: null|(object{mode: string, normalized_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject), result: null|string}&\Stripe\StripeObject), carrier: null|string, customs: null|(object{eori_number: null|string}&\Stripe\StripeObject), eta: null|int, name: string, phone_number: null|string, require_signature: null|bool, service: string, status: null|string, tracking_number: null|string, tracking_url: null|string, type: string}&\Stripe\StripeObject) $shipping Where and how the card will be shipped. - * @property (object{allowed_categories: null|string[], allowed_merchant_countries: null|string[], blocked_categories: null|string[], blocked_merchant_countries: null|string[], spending_limits: null|((object{amount: int, categories: null|string[], interval: string}&\Stripe\StripeObject))[], spending_limits_currency: null|string}&\Stripe\StripeObject) $spending_controls + * @property (object{allowed_card_presences: null|string[], allowed_categories: null|string[], allowed_merchant_countries: null|string[], blocked_card_presences: null|string[], blocked_categories: null|string[], blocked_merchant_countries: null|string[], spending_limits: null|((object{amount: int, categories: null|string[], interval: string}&\Stripe\StripeObject))[], spending_limits_currency: null|string}&\Stripe\StripeObject) $spending_controls * @property string $status Whether authorizations can be approved on this card. May be blocked from activating cards depending on past-due Cardholder requirements. Defaults to inactive. * @property string $type The type of the card. * @property null|(object{apple_pay: (object{eligible: bool, ineligible_reason: null|string}&\Stripe\StripeObject), google_pay: (object{eligible: bool, ineligible_reason: null|string}&\Stripe\StripeObject), primary_account_identifier: null|string}&\Stripe\StripeObject) $wallets Information relating to digital wallets (like Apple Pay and Google Pay). @@ -41,11 +42,13 @@ class Card extends \Stripe\ApiResource use \Stripe\ApiOperations\Update; const CANCELLATION_REASON_DESIGN_REJECTED = 'design_rejected'; + const CANCELLATION_REASON_FULFILLMENT_ERROR = 'fulfillment_error'; const CANCELLATION_REASON_LOST = 'lost'; const CANCELLATION_REASON_STOLEN = 'stolen'; const REPLACEMENT_REASON_DAMAGED = 'damaged'; const REPLACEMENT_REASON_EXPIRED = 'expired'; + const REPLACEMENT_REASON_FULFILLMENT_ERROR = 'fulfillment_error'; const REPLACEMENT_REASON_LOST = 'lost'; const REPLACEMENT_REASON_STOLEN = 'stolen'; @@ -59,7 +62,7 @@ class Card extends \Stripe\ApiResource /** * Creates an Issuing Card object. * - * @param null|array{cardholder?: string, currency: string, exp_month?: int, exp_year?: int, expand?: string[], financial_account?: string, metadata?: array, personalization_design?: string, pin?: array{encrypted_number?: string}, replacement_for?: string, replacement_reason?: string, second_line?: null|string, shipping?: array{address: array{city: string, country: string, line1: string, line2?: string, postal_code: string, state?: string}, address_validation?: array{mode: string}, customs?: array{eori_number?: string}, name: string, phone_number?: string, require_signature?: bool, service?: string, type?: string}, spending_controls?: array{allowed_categories?: string[], allowed_merchant_countries?: string[], blocked_categories?: string[], blocked_merchant_countries?: string[], spending_limits?: array{amount: int, categories?: string[], interval: string}[]}, status?: string, type: string} $params + * @param null|array{cardholder?: string, currency: string, exp_month?: int, exp_year?: int, expand?: string[], financial_account?: string, lifecycle_controls?: array{cancel_after: array{payment_count: int}}, metadata?: array, personalization_design?: string, pin?: array{encrypted_number?: string}, replacement_for?: string, replacement_reason?: string, second_line?: null|string, shipping?: array{address: array{city: string, country: string, line1: string, line2?: string, postal_code: string, state?: string}, address_validation?: array{mode: string}, customs?: array{eori_number?: string}, name: string, phone_number?: string, require_signature?: bool, service?: string, type?: string}, spending_controls?: array{allowed_card_presences?: string[], allowed_categories?: string[], allowed_merchant_countries?: string[], blocked_card_presences?: string[], blocked_categories?: string[], blocked_merchant_countries?: string[], spending_limits?: array{amount: int, categories?: string[], interval: string}[]}, status?: string, type: string} $params * @param null|array|string $options * * @return Card the created resource @@ -121,7 +124,7 @@ class Card extends \Stripe\ApiResource * the parameters passed. Any parameters not provided will be left unchanged. * * @param string $id the ID of the resource to update - * @param null|array{cancellation_reason?: string, expand?: string[], metadata?: null|array, personalization_design?: string, pin?: array{encrypted_number?: string}, shipping?: array{address: array{city: string, country: string, line1: string, line2?: string, postal_code: string, state?: string}, address_validation?: array{mode: string}, customs?: array{eori_number?: string}, name: string, phone_number?: string, require_signature?: bool, service?: string, type?: string}, spending_controls?: array{allowed_categories?: string[], allowed_merchant_countries?: string[], blocked_categories?: string[], blocked_merchant_countries?: string[], spending_limits?: array{amount: int, categories?: string[], interval: string}[]}, status?: string} $params + * @param null|array{cancellation_reason?: string, expand?: string[], metadata?: null|array, personalization_design?: string, pin?: array{encrypted_number?: string}, shipping?: array{address: array{city: string, country: string, line1: string, line2?: string, postal_code: string, state?: string}, address_validation?: array{mode: string}, customs?: array{eori_number?: string}, name: string, phone_number?: string, require_signature?: bool, service?: string, type?: string}, spending_controls?: array{allowed_card_presences?: string[], allowed_categories?: string[], allowed_merchant_countries?: string[], blocked_card_presences?: string[], blocked_categories?: string[], blocked_merchant_countries?: string[], spending_limits?: array{amount: int, categories?: string[], interval: string}[]}, status?: string} $params * @param null|array|string $opts * * @return Card the updated resource diff --git a/libs/stripe-php/lib/Issuing/Cardholder.php b/libs/stripe-php/lib/Issuing/Cardholder.php index 3389086a6..536cd071f 100644 --- a/libs/stripe-php/lib/Issuing/Cardholder.php +++ b/libs/stripe-php/lib/Issuing/Cardholder.php @@ -16,13 +16,13 @@ namespace Stripe\Issuing; * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. * @property null|string $email The cardholder's email address. * @property null|(object{card_issuing?: null|(object{user_terms_acceptance: null|(object{date: null|int, ip: null|string, user_agent: null|string}&\Stripe\StripeObject)}&\Stripe\StripeObject), dob: null|(object{day: null|int, month: null|int, year: null|int}&\Stripe\StripeObject), first_name: null|string, last_name: null|string, verification: null|(object{document: null|(object{back: null|string|\Stripe\File, front: null|string|\Stripe\File}&\Stripe\StripeObject)}&\Stripe\StripeObject)}&\Stripe\StripeObject) $individual Additional information about an individual cardholder. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property string $name The cardholder's name. This will be printed on cards issued to them. * @property null|string $phone_number The cardholder's phone number. This is required for all cardholders who will be creating EU cards. See the 3D Secure documentation for more details. - * @property null|string[] $preferred_locales The cardholder’s preferred locales (languages), ordered by preference. Locales can be de, en, es, fr, or it. This changes the language of the 3D Secure flow and one-time password messages sent to the cardholder. + * @property null|string[] $preferred_locales The cardholder’s preferred locales (languages), ordered by preference. Locales can be da, de, en, es, fr, it, pl, or sv. This changes the language of the 3D Secure flow and one-time password messages sent to the cardholder. * @property (object{disabled_reason: null|string, past_due: null|string[]}&\Stripe\StripeObject) $requirements - * @property null|(object{allowed_categories: null|string[], allowed_merchant_countries: null|string[], blocked_categories: null|string[], blocked_merchant_countries: null|string[], spending_limits: null|((object{amount: int, categories: null|string[], interval: string}&\Stripe\StripeObject))[], spending_limits_currency: null|string}&\Stripe\StripeObject) $spending_controls Rules that control spending across this cardholder's cards. Refer to our documentation for more details. + * @property null|(object{allowed_card_presences: null|string[], allowed_categories: null|string[], allowed_merchant_countries: null|string[], blocked_card_presences: null|string[], blocked_categories: null|string[], blocked_merchant_countries: null|string[], spending_limits: null|((object{amount: int, categories: null|string[], interval: string}&\Stripe\StripeObject))[], spending_limits_currency: null|string}&\Stripe\StripeObject) $spending_controls Rules that control spending across this cardholder's cards. Refer to our documentation for more details. * @property string $status Specifies whether to permit authorizations on this cardholder's cards. * @property string $type One of individual or company. See Choose a cardholder type for more details. */ @@ -42,7 +42,7 @@ class Cardholder extends \Stripe\ApiResource /** * Creates a new Issuing Cardholder object that can be issued cards. * - * @param null|array{billing: array{address: array{city: string, country: string, line1: string, line2?: string, postal_code: string, state?: string}}, company?: array{tax_id?: string}, email?: string, expand?: string[], individual?: array{card_issuing?: array{user_terms_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}, dob?: array{day: int, month: int, year: int}, first_name?: string, last_name?: string, verification?: array{document?: array{back?: string, front?: string}}}, metadata?: array, name: string, phone_number?: string, preferred_locales?: string[], spending_controls?: array{allowed_categories?: string[], allowed_merchant_countries?: string[], blocked_categories?: string[], blocked_merchant_countries?: string[], spending_limits?: array{amount: int, categories?: string[], interval: string}[], spending_limits_currency?: string}, status?: string, type?: string} $params + * @param null|array{billing: array{address: array{city: string, country: string, line1: string, line2?: string, postal_code: string, state?: string}}, company?: array{tax_id?: string}, email?: string, expand?: string[], individual?: array{card_issuing?: array{user_terms_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}, dob?: array{day: int, month: int, year: int}, first_name?: string, last_name?: string, verification?: array{document?: array{back?: string, front?: string}}}, metadata?: array, name: string, phone_number?: string, preferred_locales?: string[], spending_controls?: array{allowed_card_presences?: string[], allowed_categories?: string[], allowed_merchant_countries?: string[], blocked_card_presences?: string[], blocked_categories?: string[], blocked_merchant_countries?: string[], spending_limits?: array{amount: int, categories?: string[], interval: string}[], spending_limits_currency?: string}, status?: string, type?: string} $params * @param null|array|string $options * * @return Cardholder the created resource @@ -105,7 +105,7 @@ class Cardholder extends \Stripe\ApiResource * unchanged. * * @param string $id the ID of the resource to update - * @param null|array{billing?: array{address: array{city: string, country: string, line1: string, line2?: string, postal_code: string, state?: string}}, company?: array{tax_id?: string}, email?: string, expand?: string[], individual?: array{card_issuing?: array{user_terms_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}, dob?: array{day: int, month: int, year: int}, first_name?: string, last_name?: string, verification?: array{document?: array{back?: string, front?: string}}}, metadata?: array, phone_number?: string, preferred_locales?: string[], spending_controls?: array{allowed_categories?: string[], allowed_merchant_countries?: string[], blocked_categories?: string[], blocked_merchant_countries?: string[], spending_limits?: array{amount: int, categories?: string[], interval: string}[], spending_limits_currency?: string}, status?: string} $params + * @param null|array{billing?: array{address: array{city: string, country: string, line1: string, line2?: string, postal_code: string, state?: string}}, company?: array{tax_id?: string}, email?: string, expand?: string[], individual?: array{card_issuing?: array{user_terms_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}, dob?: array{day: int, month: int, year: int}, first_name?: string, last_name?: string, verification?: array{document?: array{back?: string, front?: string}}}, metadata?: array, phone_number?: string, preferred_locales?: string[], spending_controls?: array{allowed_card_presences?: string[], allowed_categories?: string[], allowed_merchant_countries?: string[], blocked_card_presences?: string[], blocked_categories?: string[], blocked_merchant_countries?: string[], spending_limits?: array{amount: int, categories?: string[], interval: string}[], spending_limits_currency?: string}, status?: string} $params * @param null|array|string $opts * * @return Cardholder the updated resource diff --git a/libs/stripe-php/lib/Issuing/Dispute.php b/libs/stripe-php/lib/Issuing/Dispute.php index d05d7d09c..fc1d2de88 100644 --- a/libs/stripe-php/lib/Issuing/Dispute.php +++ b/libs/stripe-php/lib/Issuing/Dispute.php @@ -16,12 +16,12 @@ namespace Stripe\Issuing; * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. * @property string $currency The currency the transaction was made in. * @property (object{canceled?: (object{additional_documentation: null|string|\Stripe\File, canceled_at: null|int, cancellation_policy_provided: null|bool, cancellation_reason: null|string, expected_at: null|int, explanation: null|string, product_description: null|string, product_type: null|string, return_status: null|string, returned_at: null|int}&\Stripe\StripeObject), duplicate?: (object{additional_documentation: null|string|\Stripe\File, card_statement: null|string|\Stripe\File, cash_receipt: null|string|\Stripe\File, check_image: null|string|\Stripe\File, explanation: null|string, original_transaction: null|string}&\Stripe\StripeObject), fraudulent?: (object{additional_documentation: null|string|\Stripe\File, explanation: null|string}&\Stripe\StripeObject), merchandise_not_as_described?: (object{additional_documentation: null|string|\Stripe\File, explanation: null|string, received_at: null|int, return_description: null|string, return_status: null|string, returned_at: null|int}&\Stripe\StripeObject), no_valid_authorization?: (object{additional_documentation: null|string|\Stripe\File, explanation: null|string}&\Stripe\StripeObject), not_received?: (object{additional_documentation: null|string|\Stripe\File, expected_at: null|int, explanation: null|string, product_description: null|string, product_type: null|string}&\Stripe\StripeObject), other?: (object{additional_documentation: null|string|\Stripe\File, explanation: null|string, product_description: null|string, product_type: null|string}&\Stripe\StripeObject), reason: string, service_not_as_described?: (object{additional_documentation: null|string|\Stripe\File, canceled_at: null|int, cancellation_reason: null|string, explanation: null|string, received_at: null|int}&\Stripe\StripeObject)}&\Stripe\StripeObject) $evidence - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|string $loss_reason The enum that describes the dispute loss outcome. If the dispute is not lost, this field will be absent. New enum values may be added in the future, so be sure to handle unknown values. * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property string $status Current status of the dispute. * @property string|Transaction $transaction The transaction being disputed. - * @property null|(object{debit_reversal: null|string, received_debit: string}&\Stripe\StripeObject) $treasury Treasury details related to this dispute if it was created on a [FinancialAccount](/docs/api/treasury/financial_accounts + * @property null|(object{debit_reversal: null|string, received_debit: string}&\Stripe\StripeObject) $treasury Treasury details related to this dispute if it was created on a FinancialAccount */ class Dispute extends \Stripe\ApiResource { diff --git a/libs/stripe-php/lib/Issuing/PersonalizationDesign.php b/libs/stripe-php/lib/Issuing/PersonalizationDesign.php index 3cca57c29..4dc9a8331 100644 --- a/libs/stripe-php/lib/Issuing/PersonalizationDesign.php +++ b/libs/stripe-php/lib/Issuing/PersonalizationDesign.php @@ -9,10 +9,10 @@ namespace Stripe\Issuing; * * @property string $id Unique identifier for the object. * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property null|string|\Stripe\File $card_logo The file for the card logo to use with physical bundles that support card logos. Must have a purpose value of issuing_logo. + * @property null|string|\Stripe\File $card_logo The file for the card logo to use with physical bundles that support card logos. Must have a purpose value of issuing_logo. Image must be in PNG format with dimensions of 1000px by 200px. It must be a binary (black and white) image containing a black logo on a white background. We don't accept grayscale. * @property null|(object{footer_body: null|string, footer_title: null|string, header_body: null|string, header_title: null|string}&\Stripe\StripeObject) $carrier_text Hash containing carrier text, for use with physical bundles that support carrier text. * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|string $lookup_key A lookup key used to retrieve personalization designs dynamically from a static string. This may be up to 200 characters. * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|string $name Friendly display name. diff --git a/libs/stripe-php/lib/Issuing/PhysicalBundle.php b/libs/stripe-php/lib/Issuing/PhysicalBundle.php index 6e130c709..1e0a49de6 100644 --- a/libs/stripe-php/lib/Issuing/PhysicalBundle.php +++ b/libs/stripe-php/lib/Issuing/PhysicalBundle.php @@ -10,7 +10,7 @@ namespace Stripe\Issuing; * @property string $id Unique identifier for the object. * @property string $object String representing the object's type. Objects of the same type share the same value. * @property (object{card_logo: string, carrier_text: string, second_line: string}&\Stripe\StripeObject) $features - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property string $name Friendly display name. * @property string $status Whether this physical bundle can be used to create cards. * @property string $type Whether this physical bundle is a standard Stripe offering or custom-made for you. diff --git a/libs/stripe-php/lib/Issuing/Token.php b/libs/stripe-php/lib/Issuing/Token.php index 9ea27d761..990d58855 100644 --- a/libs/stripe-php/lib/Issuing/Token.php +++ b/libs/stripe-php/lib/Issuing/Token.php @@ -13,9 +13,9 @@ namespace Stripe\Issuing; * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. * @property null|string $device_fingerprint The hashed ID derived from the device ID from the card network associated with the token. * @property null|string $last4 The last four digits of the token. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property string $network The token service provider / card network associated with the token. - * @property null|(object{device?: (object{device_fingerprint?: string, ip_address?: string, location?: string, name?: string, phone_number?: string, type?: string}&\Stripe\StripeObject), mastercard?: (object{card_reference_id?: string, token_reference_id: string, token_requestor_id: string, token_requestor_name?: string}&\Stripe\StripeObject), type: string, visa?: (object{card_reference_id: string, token_reference_id: string, token_requestor_id: string, token_risk_score?: string}&\Stripe\StripeObject), wallet_provider?: (object{account_id?: string, account_trust_score?: int, card_number_source?: string, cardholder_address?: (object{line1: string, postal_code: string}&\Stripe\StripeObject), cardholder_name?: string, device_trust_score?: int, hashed_account_email_address?: string, reason_codes?: string[], suggested_decision?: string, suggested_decision_version?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $network_data + * @property null|(object{device?: (object{device_fingerprint?: string, ip_address?: string, location?: string, name?: string, phone_number?: string, type?: string}&\Stripe\StripeObject), mastercard?: (object{card_reference_id?: string, token_reference_id: string, token_requestor_id: string, token_requestor_name?: string}&\Stripe\StripeObject), type: string, visa?: (object{card_reference_id: null|string, token_reference_id: string, token_requestor_id: string, token_risk_score?: string}&\Stripe\StripeObject), wallet_provider?: (object{account_id?: string, account_trust_score?: int, card_number_source?: string, cardholder_address?: (object{line1: string, postal_code: string}&\Stripe\StripeObject), cardholder_name?: string, device_trust_score?: int, hashed_account_email_address?: string, reason_codes?: string[], suggested_decision?: string, suggested_decision_version?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $network_data * @property int $network_updated_at Time at which the token was last updated by the card network. Measured in seconds since the Unix epoch. * @property string $status The usage state of the token. * @property null|string $wallet_provider The digital wallet for this token, if one was used. diff --git a/libs/stripe-php/lib/Issuing/Transaction.php b/libs/stripe-php/lib/Issuing/Transaction.php index 578b95cf9..5fbb85c32 100644 --- a/libs/stripe-php/lib/Issuing/Transaction.php +++ b/libs/stripe-php/lib/Issuing/Transaction.php @@ -22,7 +22,7 @@ namespace Stripe\Issuing; * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. * @property null|Dispute|string $dispute If you've disputed the transaction, the ID of the dispute. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property int $merchant_amount The amount that the merchant will receive, denominated in merchant_currency and in the smallest currency unit. It will be different from amount if the merchant is taking payment in a different currency. * @property string $merchant_currency The currency with which the merchant is taking payment. * @property (object{category: string, category_code: string, city: null|string, country: null|string, name: null|string, network_id: string, postal_code: null|string, state: null|string, tax_id: null|string, terminal_id: null|string, url: null|string}&\Stripe\StripeObject) $merchant_data diff --git a/libs/stripe-php/lib/Mandate.php b/libs/stripe-php/lib/Mandate.php index 353158294..1490a9596 100644 --- a/libs/stripe-php/lib/Mandate.php +++ b/libs/stripe-php/lib/Mandate.php @@ -10,11 +10,11 @@ namespace Stripe; * @property string $id Unique identifier for the object. * @property string $object String representing the object's type. Objects of the same type share the same value. * @property (object{accepted_at: null|int, offline?: (object{}&StripeObject), online?: (object{ip_address: null|string, user_agent: null|string}&StripeObject), type: string}&StripeObject) $customer_acceptance - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. - * @property null|(object{}&StripeObject) $multi_use + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. + * @property null|(object{amount?: int, currency?: string}&StripeObject) $multi_use * @property null|string $on_behalf_of The account (if any) that the mandate is intended for. * @property PaymentMethod|string $payment_method ID of the payment method associated with this mandate. - * @property (object{acss_debit?: (object{default_for?: string[], interval_description: null|string, payment_schedule: string, transaction_type: string}&StripeObject), amazon_pay?: (object{}&StripeObject), au_becs_debit?: (object{url: string}&StripeObject), bacs_debit?: (object{display_name: null|string, network_status: string, reference: string, revocation_reason: null|string, service_user_number: null|string, url: string}&StripeObject), card?: (object{}&StripeObject), cashapp?: (object{}&StripeObject), kakao_pay?: (object{}&StripeObject), klarna?: (object{}&StripeObject), kr_card?: (object{}&StripeObject), link?: (object{}&StripeObject), naver_pay?: (object{}&StripeObject), nz_bank_account?: (object{}&StripeObject), paypal?: (object{billing_agreement_id: null|string, payer_id: null|string}&StripeObject), payto?: (object{amount: null|int, amount_type: string, end_date: null|string, payment_schedule: string, payments_per_period: null|int, purpose: null|string, start_date: null|string}&StripeObject), revolut_pay?: (object{}&StripeObject), sepa_debit?: (object{reference: string, url: string}&StripeObject), type: string, us_bank_account?: (object{collection_method?: string}&StripeObject)}&StripeObject) $payment_method_details + * @property (object{acss_debit?: (object{default_for?: string[], interval_description: null|string, payment_schedule: string, transaction_type: string}&StripeObject), amazon_pay?: (object{}&StripeObject), au_becs_debit?: (object{url: string}&StripeObject), bacs_debit?: (object{display_name: null|string, network_status: string, reference: string, revocation_reason: null|string, service_user_number: null|string, url: string}&StripeObject), card?: (object{}&StripeObject), cashapp?: (object{}&StripeObject), kakao_pay?: (object{}&StripeObject), klarna?: (object{}&StripeObject), kr_card?: (object{}&StripeObject), link?: (object{}&StripeObject), naver_pay?: (object{}&StripeObject), nz_bank_account?: (object{}&StripeObject), paypal?: (object{billing_agreement_id: null|string, payer_id: null|string}&StripeObject), payto?: (object{amount: null|int, amount_type: string, end_date: null|string, payment_schedule: string, payments_per_period: null|int, purpose: null|string, start_date: null|string}&StripeObject), pix?: (object{amount_includes_iof?: string, amount_type?: string, end_date?: string, payment_schedule?: string, reference?: string, start_date?: string}&StripeObject), revolut_pay?: (object{}&StripeObject), sepa_debit?: (object{reference: string, url: string}&StripeObject), twint?: (object{}&StripeObject), type: string, upi?: (object{amount: null|int, amount_type: null|string, description: null|string, end_date: null|int}&StripeObject), us_bank_account?: (object{collection_method?: string}&StripeObject)}&StripeObject) $payment_method_details * @property null|(object{amount: int, currency: string}&StripeObject) $single_use * @property string $status The mandate status indicates whether or not you can use it to initiate a payment. * @property string $type The type of the mandate. diff --git a/libs/stripe-php/lib/PaymentAttemptRecord.php b/libs/stripe-php/lib/PaymentAttemptRecord.php index 4002bc96a..03554ad28 100644 --- a/libs/stripe-php/lib/PaymentAttemptRecord.php +++ b/libs/stripe-php/lib/PaymentAttemptRecord.php @@ -24,9 +24,9 @@ namespace Stripe; * @property null|(object{customer: null|string, email: null|string, name: null|string, phone: null|string}&StripeObject) $customer_details Customer information for this payment. * @property null|string $customer_presence Indicates whether the customer was present in your checkout flow during this payment. * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|(object{ach_credit_transfer?: (object{account_number: null|string, bank_name: null|string, routing_number: null|string, swift_code: null|string}&StripeObject), ach_debit?: (object{account_holder_type: null|string, bank_name: null|string, country: null|string, fingerprint: null|string, last4: null|string, routing_number: null|string}&StripeObject), acss_debit?: (object{bank_name: null|string, expected_debit_date?: string, fingerprint: null|string, institution_number: null|string, last4: null|string, mandate?: string, transit_number: null|string}&StripeObject), affirm?: (object{location?: string, reader?: string, transaction_id: null|string}&StripeObject), afterpay_clearpay?: (object{order_id: null|string, reference: null|string}&StripeObject), alipay?: (object{buyer_id?: string, fingerprint: null|string, transaction_id: null|string}&StripeObject), alma?: (object{installments?: (object{count: int}&StripeObject), transaction_id: null|string}&StripeObject), amazon_pay?: (object{funding?: (object{card?: (object{brand: null|string, country: null|string, exp_month: null|int, exp_year: null|int, funding: null|string, last4: null|string}&StripeObject), type: null|string}&StripeObject), transaction_id: null|string}&StripeObject), au_becs_debit?: (object{bsb_number: null|string, expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate?: string}&StripeObject), bacs_debit?: (object{expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate: null|string, sort_code: null|string}&StripeObject), bancontact?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, preferred_language: null|string, verified_name: null|string}&StripeObject), billie?: (object{transaction_id: null|string}&StripeObject), billing_details: null|(object{address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, phone: null|string}&StripeObject), blik?: (object{buyer_id: null|string}&StripeObject), boleto?: (object{tax_id: null|string}&StripeObject), card?: (object{authorization_code: null|string, brand: string, capture_before?: int, checks: null|(object{address_line1_check: null|string, address_postal_code_check: null|string, cvc_check: null|string}&StripeObject), country: null|string, description: null|string, exp_month: int, exp_year: int, fingerprint?: null|string, funding: string, iin: null|string, installments: null|(object{plan: null|(object{count: null|int, interval: null|string, type: string}&StripeObject)}&StripeObject), issuer: null|string, last4: string, moto?: bool, network: null|string, network_advice_code: null|string, network_decline_code: null|string, network_token?: null|(object{used: bool}&StripeObject), network_transaction_id: null|string, stored_credential_usage: null|string, three_d_secure: null|(object{authentication_flow: null|string, result: null|string, result_reason: null|string, version: null|string}&StripeObject), wallet: null|(object{apple_pay?: (object{type: string}&StripeObject), dynamic_last4?: string, google_pay?: (object{}&StripeObject), type: string}&StripeObject)}&StripeObject), card_present?: (object{amount_authorized: null|int, brand: null|string, brand_product: null|string, capture_before?: int, cardholder_name: null|string, country: null|string, description?: null|string, emv_auth_data: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, generated_card: null|string, iin?: null|string, incremental_authorization_supported: bool, issuer?: null|string, last4: null|string, location?: string, network: null|string, network_transaction_id: null|string, offline: null|(object{stored_at: null|int, type: null|string}&StripeObject), overcapture_supported: bool, preferred_locales: null|string[], read_method: null|string, reader?: string, receipt: null|(object{account_type?: string, application_cryptogram: null|string, application_preferred_name: null|string, authorization_code: null|string, authorization_response_code: null|string, cardholder_verification_method: null|string, dedicated_file_name: null|string, terminal_verification_results: null|string, transaction_status_information: null|string}&StripeObject), wallet?: (object{type: string}&StripeObject)}&StripeObject), cashapp?: (object{buyer_id: null|string, cashtag: null|string, transaction_id: null|string}&StripeObject), crypto?: (object{buyer_address?: string, network?: string, token_currency?: string, transaction_hash?: string}&StripeObject), custom?: (object{display_name: string, type: null|string}&StripeObject), customer_balance?: (object{}&StripeObject), eps?: (object{bank: null|string, verified_name: null|string}&StripeObject), fpx?: (object{account_holder_type: null|string, bank: string, transaction_id: null|string}&StripeObject), giropay?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, verified_name: null|string}&StripeObject), grabpay?: (object{transaction_id: null|string}&StripeObject), ideal?: (object{bank: null|string, bic: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, transaction_id: null|string, verified_name: null|string}&StripeObject), interac_present?: (object{brand: null|string, cardholder_name: null|string, country: null|string, description?: null|string, emv_auth_data: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, generated_card: null|string, iin?: null|string, issuer?: null|string, last4: null|string, location?: string, network: null|string, network_transaction_id: null|string, preferred_locales: null|string[], read_method: null|string, reader?: string, receipt: null|(object{account_type?: string, application_cryptogram: null|string, application_preferred_name: null|string, authorization_code: null|string, authorization_response_code: null|string, cardholder_verification_method: null|string, dedicated_file_name: null|string, terminal_verification_results: null|string, transaction_status_information: null|string}&StripeObject)}&StripeObject), kakao_pay?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), klarna?: (object{payer_details: null|(object{address: null|(object{country: null|string}&StripeObject)}&StripeObject), payment_method_category: null|string, preferred_locale: null|string}&StripeObject), konbini?: (object{store: null|(object{chain: null|string}&StripeObject)}&StripeObject), kr_card?: (object{brand: null|string, buyer_id: null|string, last4: null|string, transaction_id: null|string}&StripeObject), link?: (object{country: null|string}&StripeObject), mb_way?: (object{}&StripeObject), mobilepay?: (object{card: null|(object{brand: null|string, country: null|string, exp_month: null|int, exp_year: null|int, last4: null|string}&StripeObject)}&StripeObject), multibanco?: (object{entity: null|string, reference: null|string}&StripeObject), naver_pay?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), nz_bank_account?: (object{account_holder_name: null|string, bank_code: string, bank_name: string, branch_code: string, expected_debit_date?: string, last4: string, suffix: null|string}&StripeObject), oxxo?: (object{number: null|string}&StripeObject), p24?: (object{bank: null|string, reference: null|string, verified_name: null|string}&StripeObject), pay_by_bank?: (object{}&StripeObject), payco?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), payment_method: null|string, paynow?: (object{location?: string, reader?: string, reference: null|string}&StripeObject), paypal?: (object{country: null|string, payer_email: null|string, payer_id: null|string, payer_name: null|string, seller_protection: null|(object{dispute_categories: null|string[], status: string}&StripeObject), transaction_id: null|string}&StripeObject), payto?: (object{bsb_number: null|string, last4: null|string, mandate?: string, pay_id: null|string}&StripeObject), pix?: (object{bank_transaction_id?: null|string}&StripeObject), promptpay?: (object{reference: null|string}&StripeObject), revolut_pay?: (object{funding?: (object{card?: (object{brand: null|string, country: null|string, exp_month: null|int, exp_year: null|int, funding: null|string, last4: null|string}&StripeObject), type: null|string}&StripeObject), transaction_id: null|string}&StripeObject), samsung_pay?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), satispay?: (object{transaction_id: null|string}&StripeObject), sepa_credit_transfer?: (object{bank_name: null|string, bic: null|string, iban: null|string}&StripeObject), sepa_debit?: (object{bank_code: null|string, branch_code: null|string, country: null|string, expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate: null|string}&StripeObject), sofort?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, country: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, preferred_language: null|string, verified_name: null|string}&StripeObject), stripe_account?: (object{}&StripeObject), swish?: (object{fingerprint: null|string, payment_reference: null|string, verified_phone_last4: null|string}&StripeObject), twint?: (object{}&StripeObject), type: string, us_bank_account?: (object{account_holder_type: null|string, account_type: null|string, bank_name: null|string, expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate?: Mandate|string, payment_reference: null|string, routing_number: null|string}&StripeObject), wechat?: (object{}&StripeObject), wechat_pay?: (object{fingerprint: null|string, location?: string, reader?: string, transaction_id: null|string}&StripeObject), zip?: (object{}&StripeObject)}&StripeObject) $payment_method_details Information about the Payment Method debited for this payment. + * @property null|(object{ach_credit_transfer?: (object{account_number: null|string, bank_name: null|string, routing_number: null|string, swift_code: null|string}&StripeObject), ach_debit?: (object{account_holder_type: null|string, bank_name: null|string, country: null|string, fingerprint: null|string, last4: null|string, routing_number: null|string}&StripeObject), acss_debit?: (object{bank_name: null|string, expected_debit_date?: string, fingerprint: null|string, institution_number: null|string, last4: null|string, mandate?: string, transit_number: null|string}&StripeObject), affirm?: (object{location?: string, reader?: string, transaction_id: null|string}&StripeObject), afterpay_clearpay?: (object{order_id: null|string, reference: null|string}&StripeObject), alipay?: (object{buyer_id?: string, fingerprint: null|string, transaction_id: null|string}&StripeObject), alma?: (object{installments?: (object{count: int}&StripeObject), transaction_id: null|string}&StripeObject), amazon_pay?: (object{funding?: (object{card?: (object{brand: null|string, country: null|string, exp_month: null|int, exp_year: null|int, funding: null|string, last4: null|string}&StripeObject), type: null|string}&StripeObject), transaction_id: null|string}&StripeObject), au_becs_debit?: (object{bsb_number: null|string, expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate?: string}&StripeObject), bacs_debit?: (object{expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate: null|string, sort_code: null|string}&StripeObject), bancontact?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, preferred_language: null|string, verified_name: null|string}&StripeObject), billie?: (object{transaction_id: null|string}&StripeObject), billing_details: null|(object{address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, phone: null|string}&StripeObject), bizum?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), blik?: (object{buyer_id: null|string}&StripeObject), boleto?: (object{tax_id: null|string}&StripeObject), card?: (object{authorization_code: null|string, brand: null|string, capture_before?: int, checks: null|(object{address_line1_check: null|string, address_postal_code_check: null|string, cvc_check: null|string}&StripeObject), country: null|string, description?: null|string, exp_month: null|int, exp_year: null|int, fingerprint?: null|string, funding: null|string, iin?: null|string, installments: null|(object{plan: null|(object{count: null|int, interval: null|string, type: string}&StripeObject)}&StripeObject), issuer?: null|string, last4: null|string, moto?: null|bool, network: null|string, network_advice_code: null|string, network_decline_code: null|string, network_token?: null|(object{used: bool}&StripeObject), network_transaction_id: null|string, three_d_secure: null|(object{authentication_flow: null|string, cryptogram: null|string, electronic_commerce_indicator: null|string, exemption_indicator: null|string, exemption_indicator_applied: null|bool, result: null|string, result_reason: null|string, version: null|string}&StripeObject), wallet: null|(object{apple_pay?: (object{type: string}&StripeObject), dynamic_last4?: string, google_pay?: (object{}&StripeObject), type: string}&StripeObject)}&StripeObject), card_present?: (object{amount_authorized: null|int, brand: null|string, brand_product: null|string, capture_before?: int, cardholder_name: null|string, country: null|string, description?: null|string, emv_auth_data: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, generated_card: null|string, iin?: null|string, incremental_authorization_supported: bool, issuer?: null|string, last4: null|string, location?: string, network: null|string, network_transaction_id: null|string, offline: null|(object{stored_at: null|int, type: null|string}&StripeObject), overcapture_supported: bool, preferred_locales: null|string[], read_method: null|string, reader?: string, receipt: null|(object{account_type?: string, application_cryptogram: null|string, application_preferred_name: null|string, authorization_code: null|string, authorization_response_code: null|string, cardholder_verification_method: null|string, dedicated_file_name: null|string, terminal_verification_results: null|string, transaction_status_information: null|string}&StripeObject), wallet?: (object{type: string}&StripeObject)}&StripeObject), cashapp?: (object{buyer_id: null|string, cashtag: null|string, transaction_id: null|string}&StripeObject), crypto?: (object{buyer_address?: string, network?: string, token_currency?: string, transaction_hash?: string}&StripeObject), custom?: (object{display_name: string, type: null|string}&StripeObject), customer_balance?: (object{}&StripeObject), eps?: (object{bank: null|string, verified_name: null|string}&StripeObject), fpx?: (object{account_holder_type: null|string, bank: string, transaction_id: null|string}&StripeObject), giropay?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, verified_name: null|string}&StripeObject), grabpay?: (object{transaction_id: null|string}&StripeObject), ideal?: (object{bank: null|string, bic: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, transaction_id: null|string, verified_name: null|string}&StripeObject), interac_present?: (object{brand: null|string, cardholder_name: null|string, country: null|string, description?: null|string, emv_auth_data: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, generated_card: null|string, iin?: null|string, issuer?: null|string, last4: null|string, location?: string, network: null|string, network_transaction_id: null|string, preferred_locales: null|string[], read_method: null|string, reader?: string, receipt: null|(object{account_type?: string, application_cryptogram: null|string, application_preferred_name: null|string, authorization_code: null|string, authorization_response_code: null|string, cardholder_verification_method: null|string, dedicated_file_name: null|string, terminal_verification_results: null|string, transaction_status_information: null|string}&StripeObject)}&StripeObject), kakao_pay?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), klarna?: (object{location?: string, payer_details: null|(object{address: null|(object{country: null|string}&StripeObject)}&StripeObject), payment_method_category: null|string, preferred_locale: null|string, reader?: string}&StripeObject), konbini?: (object{store: null|(object{chain: null|string}&StripeObject)}&StripeObject), kr_card?: (object{brand: null|string, buyer_id: null|string, last4: null|string, transaction_id: null|string}&StripeObject), link?: (object{country: null|string}&StripeObject), mb_way?: (object{}&StripeObject), mobilepay?: (object{card: null|(object{brand: null|string, country: null|string, exp_month: null|int, exp_year: null|int, last4: null|string}&StripeObject)}&StripeObject), multibanco?: (object{entity: null|string, reference: null|string}&StripeObject), naver_pay?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), nz_bank_account?: (object{account_holder_name: null|string, bank_code: string, bank_name: string, branch_code: string, expected_debit_date?: string, last4: string, suffix: null|string}&StripeObject), oxxo?: (object{number: null|string}&StripeObject), p24?: (object{bank: null|string, reference: null|string, verified_name: null|string}&StripeObject), pay_by_bank?: (object{}&StripeObject), payco?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), payment_method: null|string, paynow?: (object{location?: string, reader?: string, reference: null|string}&StripeObject), paypal?: (object{country: null|string, payer_email: null|string, payer_id: null|string, payer_name: null|string, seller_protection: null|(object{dispute_categories: null|string[], status: string}&StripeObject), transaction_id: null|string}&StripeObject), payto?: (object{bsb_number: null|string, last4: null|string, mandate?: string, pay_id: null|string}&StripeObject), pix?: (object{bank_transaction_id?: null|string, mandate?: string}&StripeObject), promptpay?: (object{reference: null|string}&StripeObject), revolut_pay?: (object{funding?: (object{card?: (object{brand: null|string, country: null|string, exp_month: null|int, exp_year: null|int, funding: null|string, last4: null|string}&StripeObject), type: null|string}&StripeObject), transaction_id: null|string}&StripeObject), samsung_pay?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), satispay?: (object{transaction_id: null|string}&StripeObject), scalapay?: (object{transaction_id: null|string}&StripeObject), sepa_credit_transfer?: (object{bank_name: null|string, bic: null|string, iban: null|string}&StripeObject), sepa_debit?: (object{bank_code: null|string, branch_code: null|string, country: null|string, expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate: null|string}&StripeObject), sofort?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, country: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, preferred_language: null|string, verified_name: null|string}&StripeObject), stripe_account?: (object{}&StripeObject), sunbit?: (object{transaction_id: null|string}&StripeObject), swish?: (object{fingerprint: null|string, payment_reference: null|string, verified_phone_last4: null|string}&StripeObject), twint?: (object{mandate?: string}&StripeObject), type: string, upi?: (object{vpa: null|string}&StripeObject), us_bank_account?: (object{account_holder_type: null|string, account_type: null|string, bank_name: null|string, expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate?: Mandate|string, payment_reference: null|string, routing_number: null|string}&StripeObject), wechat?: (object{}&StripeObject), wechat_pay?: (object{fingerprint: null|string, location?: string, reader?: string, transaction_id: null|string}&StripeObject), zip?: (object{}&StripeObject)}&StripeObject) $payment_method_details Information about the Payment Method debited for this payment. * @property null|string $payment_record ID of the Payment Record this Payment Attempt Record belongs to. * @property (object{custom?: (object{payment_reference: null|string}&StripeObject), type: string}&StripeObject) $processor_details Processor information associated with this payment. * @property string $reported_by Indicates who reported the payment. diff --git a/libs/stripe-php/lib/PaymentIntent.php b/libs/stripe-php/lib/PaymentIntent.php index 5aba14e75..2efd65f56 100644 --- a/libs/stripe-php/lib/PaymentIntent.php +++ b/libs/stripe-php/lib/PaymentIntent.php @@ -40,14 +40,15 @@ namespace Stripe; * @property null|(object{inputs?: (object{tax?: (object{calculation: string}&StripeObject)}&StripeObject)}&StripeObject) $hooks * @property null|(object{advice_code?: string, charge?: string, code?: string, decline_code?: string, doc_url?: string, message?: string, network_advice_code?: string, network_decline_code?: string, param?: string, payment_intent?: PaymentIntent, payment_method?: PaymentMethod, payment_method_type?: string, request_log_url?: string, setup_intent?: SetupIntent, source?: Account|BankAccount|Card|Source, type: string}&StripeObject) $last_payment_error The payment error encountered in the previous PaymentIntent confirmation. It will be cleared if the PaymentIntent is later updated for any reason. * @property null|Charge|string $latest_charge ID of the latest Charge object created by this PaymentIntent. This property is null until PaymentIntent confirmation is attempted. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. + * @property null|(object{enabled: bool}&StripeObject) $managed_payments Settings for Managed Payments. * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Learn more about storing information in metadata. - * @property null|(object{alipay_handle_redirect?: (object{native_data: null|string, native_url: null|string, return_url: null|string, url: null|string}&StripeObject), boleto_display_details?: (object{expires_at: null|int, hosted_voucher_url: null|string, number: null|string, pdf: null|string}&StripeObject), card_await_notification?: (object{charge_attempt_at: null|int, customer_approval_required: null|bool}&StripeObject), cashapp_handle_redirect_or_display_qr_code?: (object{hosted_instructions_url: string, mobile_auth_url: string, qr_code: (object{expires_at: int, image_url_png: string, image_url_svg: string}&StripeObject)}&StripeObject), display_bank_transfer_instructions?: (object{amount_remaining: null|int, currency: null|string, financial_addresses?: ((object{aba?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: string, account_number: string, account_type: string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), bank_name: string, routing_number: string}&StripeObject), iban?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), bic: string, country: string, iban: string}&StripeObject), sort_code?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: string, account_number: string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), sort_code: string}&StripeObject), spei?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), bank_code: string, bank_name: string, clabe: string}&StripeObject), supported_networks?: string[], swift?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: string, account_number: string, account_type: string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), bank_name: string, swift_code: string}&StripeObject), type: string, zengin?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: null|string, account_number: null|string, account_type: null|string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), bank_code: null|string, bank_name: null|string, branch_code: null|string, branch_name: null|string}&StripeObject)}&StripeObject))[], hosted_instructions_url: null|string, reference: null|string, type: string}&StripeObject), konbini_display_details?: (object{expires_at: int, hosted_voucher_url: null|string, stores: (object{familymart: null|(object{confirmation_number?: string, payment_code: string}&StripeObject), lawson: null|(object{confirmation_number?: string, payment_code: string}&StripeObject), ministop: null|(object{confirmation_number?: string, payment_code: string}&StripeObject), seicomart: null|(object{confirmation_number?: string, payment_code: string}&StripeObject)}&StripeObject)}&StripeObject), multibanco_display_details?: (object{entity: null|string, expires_at: null|int, hosted_voucher_url: null|string, reference: null|string}&StripeObject), oxxo_display_details?: (object{expires_after: null|int, hosted_voucher_url: null|string, number: null|string}&StripeObject), paynow_display_qr_code?: (object{data: string, hosted_instructions_url: null|string, image_url_png: string, image_url_svg: string}&StripeObject), pix_display_qr_code?: (object{data?: string, expires_at?: int, hosted_instructions_url?: string, image_url_png?: string, image_url_svg?: string}&StripeObject), promptpay_display_qr_code?: (object{data: string, hosted_instructions_url: string, image_url_png: string, image_url_svg: string}&StripeObject), redirect_to_url?: (object{return_url: null|string, url: null|string}&StripeObject), swish_handle_redirect_or_display_qr_code?: (object{hosted_instructions_url: string, mobile_auth_url: string, qr_code: (object{data: string, image_url_png: string, image_url_svg: string}&StripeObject)}&StripeObject), type: string, use_stripe_sdk?: StripeObject, verify_with_microdeposits?: (object{arrival_date: int, hosted_verification_url: string, microdeposit_type: null|string}&StripeObject), wechat_pay_display_qr_code?: (object{data: string, hosted_instructions_url: string, image_data_url: string, image_url_png: string, image_url_svg: string}&StripeObject), wechat_pay_redirect_to_android_app?: (object{app_id: string, nonce_str: string, package: string, partner_id: string, prepay_id: string, sign: string, timestamp: string}&StripeObject), wechat_pay_redirect_to_ios_app?: (object{native_url: string}&StripeObject)}&StripeObject) $next_action If present, this property tells you what actions you need to take in order for your customer to fulfill a payment using the provided source. + * @property null|(object{alipay_handle_redirect?: (object{native_data: null|string, native_url: null|string, return_url: null|string, url: null|string}&StripeObject), blik_authorize?: (object{}&StripeObject), boleto_display_details?: (object{expires_at: null|int, hosted_voucher_url: null|string, number: null|string, pdf: null|string}&StripeObject), card_await_notification?: (object{charge_attempt_at: null|int, customer_approval_required: null|bool}&StripeObject), cashapp_handle_redirect_or_display_qr_code?: (object{hosted_instructions_url: string, mobile_auth_url: string, qr_code: (object{expires_at: int, image_url_png: string, image_url_svg: string}&StripeObject)}&StripeObject), display_bank_transfer_instructions?: (object{amount_remaining: null|int, currency: null|string, financial_addresses?: ((object{aba?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: string, account_number: string, account_type: string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), bank_name: string, routing_number: string}&StripeObject), iban?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), bic: string, country: string, iban: string}&StripeObject), sort_code?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: string, account_number: string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), sort_code: string}&StripeObject), spei?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), bank_code: string, bank_name: string, clabe: string}&StripeObject), supported_networks?: string[], swift?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: string, account_number: string, account_type: string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), bank_name: string, swift_code: string}&StripeObject), type: string, zengin?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: null|string, account_number: null|string, account_type: null|string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), bank_code: null|string, bank_name: null|string, branch_code: null|string, branch_name: null|string}&StripeObject)}&StripeObject))[], hosted_instructions_url: null|string, reference: null|string, type: string}&StripeObject), klarna_display_qr_code?: (object{data: string, expires_at: null|int, image_url_png: string, image_url_svg: string}&StripeObject), konbini_display_details?: (object{expires_at: int, hosted_voucher_url: null|string, stores: (object{familymart: null|(object{confirmation_number?: string, payment_code: string}&StripeObject), lawson: null|(object{confirmation_number?: string, payment_code: string}&StripeObject), ministop: null|(object{confirmation_number?: string, payment_code: string}&StripeObject), seicomart: null|(object{confirmation_number?: string, payment_code: string}&StripeObject)}&StripeObject)}&StripeObject), multibanco_display_details?: (object{entity: null|string, expires_at: null|int, hosted_voucher_url: null|string, reference: null|string}&StripeObject), oxxo_display_details?: (object{expires_after: null|int, hosted_voucher_url: null|string, number: null|string}&StripeObject), paynow_display_qr_code?: (object{data: string, hosted_instructions_url: null|string, image_url_png: string, image_url_svg: string}&StripeObject), pix_display_qr_code?: (object{data?: string, expires_at?: int, hosted_instructions_url?: string, image_url_png?: string, image_url_svg?: string}&StripeObject), promptpay_display_qr_code?: (object{data: string, hosted_instructions_url: string, image_url_png: string, image_url_svg: string}&StripeObject), redirect_to_url?: (object{return_url: null|string, url: null|string}&StripeObject), swish_handle_redirect_or_display_qr_code?: (object{hosted_instructions_url: string, mobile_auth_url: string, qr_code: (object{data: string, image_url_png: string, image_url_svg: string}&StripeObject)}&StripeObject), type: string, upi_handle_redirect_or_display_qr_code?: (object{hosted_instructions_url: string, qr_code: (object{expires_at: int, image_url_png: string, image_url_svg: string}&StripeObject)}&StripeObject), use_stripe_sdk?: StripeObject, verify_with_microdeposits?: (object{arrival_date: int, hosted_verification_url: string, microdeposit_type: null|string}&StripeObject), wechat_pay_display_qr_code?: (object{data: string, hosted_instructions_url: string, image_data_url: string, image_url_png: string, image_url_svg: string}&StripeObject), wechat_pay_redirect_to_android_app?: (object{app_id: string, nonce_str: string, package: string, partner_id: string, prepay_id: string, sign: string, timestamp: string}&StripeObject), wechat_pay_redirect_to_ios_app?: (object{native_url: string}&StripeObject)}&StripeObject) $next_action If present, this property tells you what actions you need to take in order for your customer to fulfill a payment using the provided source. * @property null|Account|string $on_behalf_of You can specify the settlement merchant as the connected account using the on_behalf_of attribute on the charge. See the PaymentIntents use case for connected accounts for details. * @property null|(object{customer_reference: null|string, order_reference: null|string}&StripeObject) $payment_details * @property null|PaymentMethod|string $payment_method ID of the payment method used in this PaymentIntent. * @property null|(object{id: string, parent: null|string}&StripeObject) $payment_method_configuration_details Information about the payment method configuration used for this PaymentIntent. - * @property null|(object{acss_debit?: (object{mandate_options?: (object{custom_mandate_url?: string, interval_description: null|string, payment_schedule: null|string, transaction_type: null|string}&StripeObject), setup_future_usage?: string, target_date?: string, verification_method?: string}&StripeObject), affirm?: (object{capture_method?: string, preferred_locale?: string, setup_future_usage?: string}&StripeObject), afterpay_clearpay?: (object{capture_method?: string, reference: null|string, setup_future_usage?: string}&StripeObject), alipay?: (object{setup_future_usage?: string}&StripeObject), alma?: (object{capture_method?: string}&StripeObject), amazon_pay?: (object{capture_method?: string, setup_future_usage?: string}&StripeObject), au_becs_debit?: (object{setup_future_usage?: string, target_date?: string}&StripeObject), bacs_debit?: (object{mandate_options?: (object{reference_prefix?: string}&StripeObject), setup_future_usage?: string, target_date?: string}&StripeObject), bancontact?: (object{preferred_language: string, setup_future_usage?: string}&StripeObject), billie?: (object{capture_method?: string}&StripeObject), blik?: (object{setup_future_usage?: string}&StripeObject), boleto?: (object{expires_after_days: int, setup_future_usage?: string}&StripeObject), card?: (object{capture_method?: string, installments: null|(object{available_plans: null|((object{count: null|int, interval: null|string, type: string}&StripeObject))[], enabled: bool, plan: null|(object{count: null|int, interval: null|string, type: string}&StripeObject)}&StripeObject), mandate_options: null|(object{amount: int, amount_type: string, description: null|string, end_date: null|int, interval: string, interval_count: null|int, reference: string, start_date: int, supported_types: null|string[]}&StripeObject), network: null|string, request_extended_authorization?: string, request_incremental_authorization?: string, request_multicapture?: string, request_overcapture?: string, request_three_d_secure: null|string, require_cvc_recollection?: bool, setup_future_usage?: string, statement_descriptor_suffix_kana?: string, statement_descriptor_suffix_kanji?: string}&StripeObject), card_present?: (object{capture_method?: string, request_extended_authorization: null|bool, request_incremental_authorization_support: null|bool, routing?: (object{requested_priority: null|string}&StripeObject)}&StripeObject), cashapp?: (object{capture_method?: string, setup_future_usage?: string}&StripeObject), crypto?: (object{setup_future_usage?: string}&StripeObject), customer_balance?: (object{bank_transfer?: (object{eu_bank_transfer?: (object{country: string}&StripeObject), requested_address_types?: string[], type: null|string}&StripeObject), funding_type: null|string, setup_future_usage?: string}&StripeObject), eps?: (object{setup_future_usage?: string}&StripeObject), fpx?: (object{setup_future_usage?: string}&StripeObject), giropay?: (object{setup_future_usage?: string}&StripeObject), grabpay?: (object{setup_future_usage?: string}&StripeObject), ideal?: (object{setup_future_usage?: string}&StripeObject), interac_present?: (object{}&StripeObject), kakao_pay?: (object{capture_method?: string, setup_future_usage?: string}&StripeObject), klarna?: (object{capture_method?: string, preferred_locale: null|string, setup_future_usage?: string}&StripeObject), konbini?: (object{confirmation_number: null|string, expires_after_days: null|int, expires_at: null|int, product_description: null|string, setup_future_usage?: string}&StripeObject), kr_card?: (object{capture_method?: string, setup_future_usage?: string}&StripeObject), link?: (object{capture_method?: string, persistent_token: null|string, setup_future_usage?: string}&StripeObject), mb_way?: (object{setup_future_usage?: string}&StripeObject), mobilepay?: (object{capture_method?: string, setup_future_usage?: string}&StripeObject), multibanco?: (object{setup_future_usage?: string}&StripeObject), naver_pay?: (object{capture_method?: string, setup_future_usage?: string}&StripeObject), nz_bank_account?: (object{setup_future_usage?: string, target_date?: string}&StripeObject), oxxo?: (object{expires_after_days: int, setup_future_usage?: string}&StripeObject), p24?: (object{setup_future_usage?: string}&StripeObject), pay_by_bank?: (object{}&StripeObject), payco?: (object{capture_method?: string}&StripeObject), paynow?: (object{setup_future_usage?: string}&StripeObject), paypal?: (object{capture_method?: string, preferred_locale: null|string, reference: null|string, setup_future_usage?: string}&StripeObject), payto?: (object{mandate_options?: (object{amount: null|int, amount_type: null|string, end_date: null|string, payment_schedule: null|string, payments_per_period: null|int, purpose: null|string}&StripeObject), setup_future_usage?: string}&StripeObject), pix?: (object{amount_includes_iof?: string, expires_after_seconds: null|int, expires_at: null|int, setup_future_usage?: string}&StripeObject), promptpay?: (object{setup_future_usage?: string}&StripeObject), revolut_pay?: (object{capture_method?: string, setup_future_usage?: string}&StripeObject), samsung_pay?: (object{capture_method?: string}&StripeObject), satispay?: (object{capture_method?: string}&StripeObject), sepa_debit?: (object{mandate_options?: (object{reference_prefix?: string}&StripeObject), setup_future_usage?: string, target_date?: string}&StripeObject), sofort?: (object{preferred_language: null|string, setup_future_usage?: string}&StripeObject), swish?: (object{reference: null|string, setup_future_usage?: string}&StripeObject), twint?: (object{setup_future_usage?: string}&StripeObject), us_bank_account?: (object{financial_connections?: (object{filters?: (object{account_subcategories?: string[]}&StripeObject), permissions?: string[], prefetch: null|string[], return_url?: string}&StripeObject), mandate_options?: (object{collection_method?: string}&StripeObject), setup_future_usage?: string, target_date?: string, transaction_purpose?: string, verification_method?: string, preferred_settlement_speed?: string}&StripeObject), wechat_pay?: (object{app_id: null|string, client: null|string, setup_future_usage?: string}&StripeObject), zip?: (object{setup_future_usage?: string}&StripeObject)}&StripeObject) $payment_method_options Payment-method-specific configuration for this PaymentIntent. + * @property null|(object{acss_debit?: (object{mandate_options?: (object{custom_mandate_url?: string, interval_description: null|string, payment_schedule: null|string, transaction_type: null|string}&StripeObject), setup_future_usage?: string, target_date?: string, verification_method?: string}&StripeObject), affirm?: (object{capture_method?: string, preferred_locale?: string, setup_future_usage?: string}&StripeObject), afterpay_clearpay?: (object{capture_method?: string, reference: null|string, setup_future_usage?: string}&StripeObject), alipay?: (object{setup_future_usage?: string}&StripeObject), alma?: (object{capture_method?: string}&StripeObject), amazon_pay?: (object{capture_method?: string, setup_future_usage?: string}&StripeObject), au_becs_debit?: (object{setup_future_usage?: string, target_date?: string}&StripeObject), bacs_debit?: (object{mandate_options?: (object{reference_prefix?: string}&StripeObject), setup_future_usage?: string, target_date?: string}&StripeObject), bancontact?: (object{preferred_language: string, setup_future_usage?: string}&StripeObject), billie?: (object{capture_method?: string}&StripeObject), bizum?: (object{}&StripeObject), blik?: (object{setup_future_usage?: string}&StripeObject), boleto?: (object{expires_after_days: int, setup_future_usage?: string}&StripeObject), card?: (object{capture_method?: string, installments: null|(object{available_plans: null|((object{count: null|int, interval: null|string, type: string}&StripeObject))[], enabled: bool, plan: null|(object{count: null|int, interval: null|string, type: string}&StripeObject)}&StripeObject), mandate_options: null|(object{amount: int, amount_type: string, description: null|string, end_date: null|int, interval: string, interval_count: null|int, reference: string, start_date: int, supported_types: null|string[]}&StripeObject), network: null|string, request_extended_authorization?: string, request_incremental_authorization?: string, request_multicapture?: string, request_overcapture?: string, request_three_d_secure: null|string, require_cvc_recollection?: bool, setup_future_usage?: string, statement_descriptor_suffix_kana?: string, statement_descriptor_suffix_kanji?: string}&StripeObject), card_present?: (object{capture_method?: string, request_extended_authorization: null|bool, request_incremental_authorization_support: null|bool, routing?: (object{requested_priority: null|string}&StripeObject)}&StripeObject), cashapp?: (object{capture_method?: string, setup_future_usage?: string}&StripeObject), crypto?: (object{setup_future_usage?: string}&StripeObject), customer_balance?: (object{bank_transfer?: (object{eu_bank_transfer?: (object{country: string}&StripeObject), requested_address_types?: string[], type: null|string}&StripeObject), funding_type: null|string, setup_future_usage?: string}&StripeObject), eps?: (object{setup_future_usage?: string}&StripeObject), fpx?: (object{setup_future_usage?: string}&StripeObject), giropay?: (object{setup_future_usage?: string}&StripeObject), grabpay?: (object{setup_future_usage?: string}&StripeObject), ideal?: (object{setup_future_usage?: string}&StripeObject), interac_present?: (object{}&StripeObject), kakao_pay?: (object{capture_method?: string, setup_future_usage?: string}&StripeObject), klarna?: (object{capture_method?: string, preferred_locale: null|string, setup_future_usage?: string}&StripeObject), konbini?: (object{confirmation_number: null|string, expires_after_days: null|int, expires_at: null|int, product_description: null|string, setup_future_usage?: string}&StripeObject), kr_card?: (object{capture_method?: string, setup_future_usage?: string}&StripeObject), link?: (object{capture_method?: string, persistent_token: null|string, setup_future_usage?: string}&StripeObject), mb_way?: (object{setup_future_usage?: string}&StripeObject), mobilepay?: (object{capture_method?: string, setup_future_usage?: string}&StripeObject), multibanco?: (object{setup_future_usage?: string}&StripeObject), naver_pay?: (object{capture_method?: string, setup_future_usage?: string}&StripeObject), nz_bank_account?: (object{setup_future_usage?: string, target_date?: string}&StripeObject), oxxo?: (object{expires_after_days: int, setup_future_usage?: string}&StripeObject), p24?: (object{setup_future_usage?: string}&StripeObject), pay_by_bank?: (object{}&StripeObject), payco?: (object{capture_method?: string}&StripeObject), paynow?: (object{setup_future_usage?: string}&StripeObject), paypal?: (object{capture_method?: string, preferred_locale: null|string, reference: null|string, setup_future_usage?: string}&StripeObject), payto?: (object{mandate_options?: (object{amount: null|int, amount_type: null|string, end_date: null|string, payment_schedule: null|string, payments_per_period: null|int, purpose: null|string}&StripeObject), setup_future_usage?: string}&StripeObject), pix?: (object{amount_includes_iof?: string, expires_after_seconds: null|int, expires_at: null|int, mandate_options?: (object{amount?: int, amount_includes_iof?: string, amount_type?: string, currency?: string, end_date?: string, payment_schedule?: string, reference?: string, start_date?: string}&StripeObject), setup_future_usage?: string}&StripeObject), promptpay?: (object{setup_future_usage?: string}&StripeObject), revolut_pay?: (object{capture_method?: string, setup_future_usage?: string}&StripeObject), samsung_pay?: (object{capture_method?: string}&StripeObject), satispay?: (object{capture_method?: string, setup_future_usage?: string}&StripeObject), scalapay?: (object{capture_method?: string}&StripeObject), sepa_debit?: (object{mandate_options?: (object{reference_prefix?: string}&StripeObject), setup_future_usage?: string, target_date?: string}&StripeObject), sofort?: (object{preferred_language: null|string, setup_future_usage?: string}&StripeObject), sunbit?: (object{capture_method?: string, setup_future_usage?: string}&StripeObject), swish?: (object{reference: null|string, setup_future_usage?: string}&StripeObject), twint?: (object{setup_future_usage?: string}&StripeObject), upi?: (object{setup_future_usage?: string}&StripeObject), us_bank_account?: (object{financial_connections?: (object{filters?: (object{account_subcategories?: string[]}&StripeObject), permissions?: string[], prefetch: null|string[], return_url?: string}&StripeObject), mandate_options?: (object{collection_method?: string}&StripeObject), setup_future_usage?: string, target_date?: string, transaction_purpose?: string, verification_method?: string}&StripeObject), wechat_pay?: (object{app_id: null|string, client: null|string, setup_future_usage?: string}&StripeObject), zip?: (object{setup_future_usage?: string}&StripeObject)}&StripeObject) $payment_method_options Payment-method-specific configuration for this PaymentIntent. * @property string[] $payment_method_types The list of payment method types (e.g. card) that this PaymentIntent is allowed to use. A comprehensive list of valid payment method types can be found here. * @property null|(object{presentment_amount: int, presentment_currency: string}&StripeObject) $presentment_details * @property null|(object{card?: (object{customer_notification?: (object{approval_requested: null|bool, completes_at: null|int}&StripeObject)}&StripeObject), type: string}&StripeObject) $processing If present, this property tells you about the processing state of the payment. @@ -59,7 +60,7 @@ namespace Stripe; * @property null|string $statement_descriptor

    Text that appears on the customer's statement as the statement descriptor for a non-card charge. This value overrides the account's default statement descriptor. For information about requirements, including the 22-character limit, see the Statement Descriptor docs.

    Setting this value for a card charge returns an error. For card charges, set the statement_descriptor_suffix instead.

    * @property null|string $statement_descriptor_suffix Provides information about a card charge. Concatenated to the account's statement descriptor prefix to form the complete statement descriptor that appears on the customer's statement. * @property string $status Status of this PaymentIntent, one of requires_payment_method, requires_confirmation, requires_action, processing, requires_capture, canceled, or succeeded. Read more about each PaymentIntent status. - * @property null|(object{amount?: int, destination: Account|string}&StripeObject) $transfer_data The data that automatically creates a Transfer after the payment finalizes. Learn more about the use case for connected accounts. + * @property null|(object{amount?: int, description?: string, destination: Account|string, metadata?: StripeObject, payment_data?: (object{description?: string, metadata?: StripeObject}&StripeObject)}&StripeObject) $transfer_data The data that automatically creates a Transfer after the payment finalizes. Learn more about the use case for connected accounts. * @property null|string $transfer_group A string that identifies the resulting payment as part of a group. Learn more about the use case for connected accounts. */ class PaymentIntent extends ApiResource @@ -109,7 +110,7 @@ class PaymentIntent extends ApiResource * parameters available in the confirm * API when you supply confirm=true. * - * @param null|array{amount: int, amount_details?: array{discount_amount?: null|int, enforce_arithmetic_validation?: bool, line_items?: null|array{discount_amount?: int, payment_method_options?: array{card?: array{commodity_code?: string}, card_present?: array{commodity_code?: string}, klarna?: array{image_url?: string, product_url?: string, reference?: string, subscription_reference?: string}, paypal?: array{category?: string, description?: string, sold_by?: string}}, product_code?: string, product_name: string, quantity: int, tax?: array{total_tax_amount: int}, unit_cost: int, unit_of_measure?: string}[], shipping?: null|array{amount?: null|int, from_postal_code?: null|string, to_postal_code?: null|string}, tax?: null|array{total_tax_amount: int}}, application_fee_amount?: int, automatic_payment_methods?: array{allow_redirects?: string, enabled: bool}, capture_method?: string, confirm?: bool, confirmation_method?: string, confirmation_token?: string, currency: string, customer?: string, customer_account?: string, description?: string, error_on_requires_action?: bool, excluded_payment_method_types?: string[], expand?: string[], hooks?: array{inputs?: array{tax?: array{calculation: null|string}}}, mandate?: string, mandate_data?: null|array{customer_acceptance: array{accepted_at?: int, offline?: array{}, online?: array{ip_address: string, user_agent: string}, type: string}}, metadata?: array, off_session?: array|bool|string, on_behalf_of?: string, payment_details?: array{customer_reference?: null|string, order_reference?: null|string}, payment_method?: string, payment_method_configuration?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, swish?: array{}, twint?: array{}, type: string, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{custom_mandate_url?: null|string, interval_description?: string, payment_schedule?: string, transaction_type?: string}, setup_future_usage?: null|string, target_date?: string, verification_method?: string}, affirm?: null|array{capture_method?: null|string, preferred_locale?: string, setup_future_usage?: string}, afterpay_clearpay?: null|array{capture_method?: null|string, reference?: string, setup_future_usage?: string}, alipay?: null|array{setup_future_usage?: null|string}, alma?: null|array{capture_method?: null|string}, amazon_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, au_becs_debit?: null|array{setup_future_usage?: null|string, target_date?: string}, bacs_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, bancontact?: null|array{preferred_language?: string, setup_future_usage?: null|string}, billie?: null|array{capture_method?: null|string}, blik?: null|array{code?: string, setup_future_usage?: null|string}, boleto?: null|array{expires_after_days?: int, setup_future_usage?: null|string}, card?: null|array{capture_method?: null|string, cvc_token?: string, installments?: array{enabled?: bool, plan?: null|array{count?: int, interval?: string, type: string}}, mandate_options?: array{amount: int, amount_type: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_extended_authorization?: string, request_incremental_authorization?: string, request_multicapture?: string, request_overcapture?: string, request_three_d_secure?: string, require_cvc_recollection?: bool, setup_future_usage?: null|string, statement_descriptor_suffix_kana?: null|string, statement_descriptor_suffix_kanji?: null|string, three_d_secure?: array{ares_trans_status?: string, cryptogram: string, electronic_commerce_indicator?: string, exemption_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id: string, version: string}}, card_present?: null|array{capture_method?: string, request_extended_authorization?: bool, request_incremental_authorization_support?: bool, routing?: array{requested_priority?: string}}, cashapp?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, crypto?: null|array{setup_future_usage?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, requested_address_types?: string[], type: string}, funding_type?: string, setup_future_usage?: string}, eps?: null|array{setup_future_usage?: string}, fpx?: null|array{setup_future_usage?: string}, giropay?: null|array{setup_future_usage?: string}, grabpay?: null|array{setup_future_usage?: string}, ideal?: null|array{setup_future_usage?: null|string}, interac_present?: null|array{}, kakao_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, klarna?: null|array{capture_method?: null|string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, setup_future_usage?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing?: array{amount: int, date: string}, reference: string}[]}, konbini?: null|array{confirmation_number?: null|string, expires_after_days?: null|int, expires_at?: null|int, product_description?: null|string, setup_future_usage?: string}, kr_card?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, link?: null|array{capture_method?: null|string, persistent_token?: string, setup_future_usage?: null|string}, mb_way?: null|array{setup_future_usage?: string}, mobilepay?: null|array{capture_method?: null|string, setup_future_usage?: string}, multibanco?: null|array{setup_future_usage?: string}, naver_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, nz_bank_account?: null|array{setup_future_usage?: null|string, target_date?: string}, oxxo?: null|array{expires_after_days?: int, setup_future_usage?: string}, p24?: null|array{setup_future_usage?: string, tos_shown_and_accepted?: bool}, pay_by_bank?: null|array{}, payco?: null|array{capture_method?: null|string}, paynow?: null|array{setup_future_usage?: string}, paypal?: null|array{capture_method?: null|string, preferred_locale?: string, reference?: string, risk_correlation_id?: string, setup_future_usage?: null|string}, payto?: null|array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string}, setup_future_usage?: null|string}, pix?: null|array{amount_includes_iof?: string, expires_after_seconds?: int, expires_at?: int, setup_future_usage?: string}, promptpay?: null|array{setup_future_usage?: string}, revolut_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, samsung_pay?: null|array{capture_method?: null|string}, satispay?: null|array{capture_method?: null|string}, sepa_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, sofort?: null|array{preferred_language?: null|string, setup_future_usage?: null|string}, swish?: null|array{reference?: null|string, setup_future_usage?: string}, twint?: null|array{setup_future_usage?: string}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, setup_future_usage?: null|string, target_date?: string, transaction_purpose?: null|string, verification_method?: string, preferred_settlement_speed?: null|string}, wechat_pay?: null|array{app_id?: string, client?: string, setup_future_usage?: string}, zip?: null|array{setup_future_usage?: string}}, payment_method_types?: string[], radar_options?: array{session?: string}, receipt_email?: string, return_url?: string, setup_future_usage?: string, shipping?: array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name: string, phone?: string, tracking_number?: string}, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_data?: array{amount?: int, destination: string}, transfer_group?: string, use_stripe_sdk?: bool} $params + * @param null|array{amount: int, amount_details?: array{discount_amount?: null|int, enforce_arithmetic_validation?: bool, line_items?: null|array{discount_amount?: int, payment_method_options?: array{card?: array{commodity_code?: string}, card_present?: array{commodity_code?: string}, klarna?: array{image_url?: string, product_url?: string, reference?: string, subscription_reference?: string}, paypal?: array{category?: string, description?: string, sold_by?: string}}, product_code?: string, product_name: string, quantity: int, tax?: array{total_tax_amount: int}, unit_cost: int, unit_of_measure?: string}[], shipping?: null|array{amount?: null|int, from_postal_code?: null|string, to_postal_code?: null|string}, tax?: null|array{total_tax_amount: int}}, application_fee_amount?: int, automatic_payment_methods?: array{allow_redirects?: string, enabled: bool}, capture_method?: string, confirm?: bool, confirmation_method?: string, confirmation_token?: string, currency: string, customer?: string, customer_account?: string, description?: string, error_on_requires_action?: bool, excluded_payment_method_types?: string[], expand?: string[], hooks?: array{inputs?: array{tax?: array{calculation: null|string}}}, mandate?: string, mandate_data?: null|array{customer_acceptance: array{accepted_at?: int, offline?: array{}, online?: array{ip_address: string, user_agent: string}, type: string}}, metadata?: array, off_session?: array|bool|string, on_behalf_of?: string, payment_details?: array{customer_reference?: null|string, order_reference?: null|string}, payment_method?: string, payment_method_configuration?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, bizum?: array{}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, scalapay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, sunbit?: array{}, swish?: array{}, twint?: array{}, type: string, upi?: array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}}, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{custom_mandate_url?: null|string, interval_description?: string, payment_schedule?: string, transaction_type?: string}, setup_future_usage?: null|string, target_date?: string, verification_method?: string}, affirm?: null|array{capture_method?: null|string, preferred_locale?: string, setup_future_usage?: string}, afterpay_clearpay?: null|array{capture_method?: null|string, reference?: string, setup_future_usage?: string}, alipay?: null|array{setup_future_usage?: null|string}, alma?: null|array{capture_method?: null|string}, amazon_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, au_becs_debit?: null|array{setup_future_usage?: null|string, target_date?: string}, bacs_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, bancontact?: null|array{preferred_language?: string, setup_future_usage?: null|string}, billie?: null|array{capture_method?: null|string}, bizum?: null|array{}, blik?: null|array{code?: string, setup_future_usage?: null|string}, boleto?: null|array{expires_after_days?: int, setup_future_usage?: null|string}, card?: null|array{capture_method?: null|string, cvc_token?: string, installments?: array{enabled?: bool, plan?: null|array{count?: int, interval?: string, type: string}}, mandate_options?: array{amount: int, amount_type: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_extended_authorization?: string, request_incremental_authorization?: string, request_multicapture?: string, request_overcapture?: string, request_three_d_secure?: string, require_cvc_recollection?: bool, setup_future_usage?: null|string, statement_descriptor_suffix_kana?: null|string, statement_descriptor_suffix_kanji?: null|string, three_d_secure?: array{ares_trans_status?: string, cryptogram: string, electronic_commerce_indicator?: string, exemption_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id: string, version: string}}, card_present?: null|array{capture_method?: string, request_extended_authorization?: bool, request_incremental_authorization_support?: bool, routing?: array{requested_priority?: string}}, cashapp?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, crypto?: null|array{setup_future_usage?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, requested_address_types?: string[], type: string}, funding_type?: string, setup_future_usage?: string}, eps?: null|array{setup_future_usage?: string}, fpx?: null|array{setup_future_usage?: string}, giropay?: null|array{setup_future_usage?: string}, grabpay?: null|array{setup_future_usage?: string}, ideal?: null|array{setup_future_usage?: null|string}, interac_present?: null|array{}, kakao_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, klarna?: null|array{capture_method?: null|string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, setup_future_usage?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing?: array{amount: int, date: string}, reference: string}[]}, konbini?: null|array{confirmation_number?: null|string, expires_after_days?: null|int, expires_at?: null|int, product_description?: null|string, setup_future_usage?: string}, kr_card?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, link?: null|array{capture_method?: null|string, persistent_token?: string, setup_future_usage?: null|string}, mb_way?: null|array{setup_future_usage?: string}, mobilepay?: null|array{capture_method?: null|string, setup_future_usage?: string}, multibanco?: null|array{setup_future_usage?: string}, naver_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, nz_bank_account?: null|array{setup_future_usage?: null|string, target_date?: string}, oxxo?: null|array{expires_after_days?: int, setup_future_usage?: string}, p24?: null|array{setup_future_usage?: string, tos_shown_and_accepted?: bool}, pay_by_bank?: null|array{}, payco?: null|array{capture_method?: null|string}, paynow?: null|array{setup_future_usage?: string}, paypal?: null|array{capture_method?: null|string, preferred_locale?: string, reference?: string, risk_correlation_id?: string, setup_future_usage?: null|string}, payto?: null|array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string}, setup_future_usage?: null|string}, pix?: null|array{amount_includes_iof?: string, expires_after_seconds?: int, expires_at?: int, mandate_options?: array{amount?: int, amount_includes_iof?: string, amount_type?: string, currency?: string, end_date?: string, payment_schedule?: string, reference?: string, start_date?: string}, setup_future_usage?: string}, promptpay?: null|array{setup_future_usage?: string}, revolut_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, samsung_pay?: null|array{capture_method?: null|string}, satispay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, scalapay?: null|array{capture_method?: null|string}, sepa_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, sofort?: null|array{preferred_language?: null|string, setup_future_usage?: null|string}, sunbit?: null|array{capture_method?: null|string, setup_future_usage?: string}, swish?: null|array{reference?: null|string, setup_future_usage?: string}, twint?: null|array{setup_future_usage?: string}, upi?: null|array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}, setup_future_usage?: null|string}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, setup_future_usage?: null|string, target_date?: string, transaction_purpose?: null|string, verification_method?: string}, wechat_pay?: null|array{app_id?: string, client?: string, setup_future_usage?: string}, zip?: null|array{setup_future_usage?: string}}, payment_method_types?: string[], radar_options?: array{session?: string}, receipt_email?: string, return_url?: string, setup_future_usage?: string, shipping?: array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name: string, phone?: string, tracking_number?: string}, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_data?: array{amount?: int, description?: string, destination: string, metadata?: null|array, payment_data?: array{description?: string, metadata?: null|array}}, transfer_group?: string, use_stripe_sdk?: bool} $params * @param null|array|string $options * * @return PaymentIntent the created resource @@ -181,7 +182,7 @@ class PaymentIntent extends ApiResource * href="/docs/api/payment_intents/confirm">confirm API instead. * * @param string $id the ID of the resource to update - * @param null|array{amount?: int, amount_details?: null|array{discount_amount?: null|int, enforce_arithmetic_validation?: bool, line_items?: null|array{discount_amount?: int, payment_method_options?: array{card?: array{commodity_code?: string}, card_present?: array{commodity_code?: string}, klarna?: array{image_url?: string, product_url?: string, reference?: string, subscription_reference?: string}, paypal?: array{category?: string, description?: string, sold_by?: string}}, product_code?: string, product_name: string, quantity: int, tax?: array{total_tax_amount: int}, unit_cost: int, unit_of_measure?: string}[], shipping?: null|array{amount?: null|int, from_postal_code?: null|string, to_postal_code?: null|string}, tax?: null|array{total_tax_amount: int}}, application_fee_amount?: null|int, capture_method?: string, currency?: string, customer?: string, customer_account?: string, description?: string, excluded_payment_method_types?: null|string[], expand?: string[], hooks?: array{inputs?: array{tax?: array{calculation: null|string}}}, metadata?: null|array, payment_details?: null|array{customer_reference?: null|string, order_reference?: null|string}, payment_method?: string, payment_method_configuration?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, swish?: array{}, twint?: array{}, type: string, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{custom_mandate_url?: null|string, interval_description?: string, payment_schedule?: string, transaction_type?: string}, setup_future_usage?: null|string, target_date?: string, verification_method?: string}, affirm?: null|array{capture_method?: null|string, preferred_locale?: string, setup_future_usage?: string}, afterpay_clearpay?: null|array{capture_method?: null|string, reference?: string, setup_future_usage?: string}, alipay?: null|array{setup_future_usage?: null|string}, alma?: null|array{capture_method?: null|string}, amazon_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, au_becs_debit?: null|array{setup_future_usage?: null|string, target_date?: string}, bacs_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, bancontact?: null|array{preferred_language?: string, setup_future_usage?: null|string}, billie?: null|array{capture_method?: null|string}, blik?: null|array{code?: string, setup_future_usage?: null|string}, boleto?: null|array{expires_after_days?: int, setup_future_usage?: null|string}, card?: null|array{capture_method?: null|string, cvc_token?: string, installments?: array{enabled?: bool, plan?: null|array{count?: int, interval?: string, type: string}}, mandate_options?: array{amount: int, amount_type: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_extended_authorization?: string, request_incremental_authorization?: string, request_multicapture?: string, request_overcapture?: string, request_three_d_secure?: string, require_cvc_recollection?: bool, setup_future_usage?: null|string, statement_descriptor_suffix_kana?: null|string, statement_descriptor_suffix_kanji?: null|string, three_d_secure?: array{ares_trans_status?: string, cryptogram: string, electronic_commerce_indicator?: string, exemption_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id: string, version: string}}, card_present?: null|array{capture_method?: string, request_extended_authorization?: bool, request_incremental_authorization_support?: bool, routing?: array{requested_priority?: string}}, cashapp?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, crypto?: null|array{setup_future_usage?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, requested_address_types?: string[], type: string}, funding_type?: string, setup_future_usage?: string}, eps?: null|array{setup_future_usage?: string}, fpx?: null|array{setup_future_usage?: string}, giropay?: null|array{setup_future_usage?: string}, grabpay?: null|array{setup_future_usage?: string}, ideal?: null|array{setup_future_usage?: null|string}, interac_present?: null|array{}, kakao_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, klarna?: null|array{capture_method?: null|string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, setup_future_usage?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing?: array{amount: int, date: string}, reference: string}[]}, konbini?: null|array{confirmation_number?: null|string, expires_after_days?: null|int, expires_at?: null|int, product_description?: null|string, setup_future_usage?: string}, kr_card?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, link?: null|array{capture_method?: null|string, persistent_token?: string, setup_future_usage?: null|string}, mb_way?: null|array{setup_future_usage?: string}, mobilepay?: null|array{capture_method?: null|string, setup_future_usage?: string}, multibanco?: null|array{setup_future_usage?: string}, naver_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, nz_bank_account?: null|array{setup_future_usage?: null|string, target_date?: string}, oxxo?: null|array{expires_after_days?: int, setup_future_usage?: string}, p24?: null|array{setup_future_usage?: string, tos_shown_and_accepted?: bool}, pay_by_bank?: null|array{}, payco?: null|array{capture_method?: null|string}, paynow?: null|array{setup_future_usage?: string}, paypal?: null|array{capture_method?: null|string, preferred_locale?: string, reference?: string, risk_correlation_id?: string, setup_future_usage?: null|string}, payto?: null|array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string}, setup_future_usage?: null|string}, pix?: null|array{amount_includes_iof?: string, expires_after_seconds?: int, expires_at?: int, setup_future_usage?: string}, promptpay?: null|array{setup_future_usage?: string}, revolut_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, samsung_pay?: null|array{capture_method?: null|string}, satispay?: null|array{capture_method?: null|string}, sepa_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, sofort?: null|array{preferred_language?: null|string, setup_future_usage?: null|string}, swish?: null|array{reference?: null|string, setup_future_usage?: string}, twint?: null|array{setup_future_usage?: string}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, setup_future_usage?: null|string, target_date?: string, transaction_purpose?: null|string, verification_method?: string, preferred_settlement_speed?: null|string}, wechat_pay?: null|array{app_id?: string, client?: string, setup_future_usage?: string}, zip?: null|array{setup_future_usage?: string}}, payment_method_types?: string[], receipt_email?: null|string, setup_future_usage?: null|string, shipping?: null|array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name: string, phone?: string, tracking_number?: string}, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_data?: array{amount?: int}, transfer_group?: string} $params + * @param null|array{amount?: int, amount_details?: null|array{discount_amount?: null|int, enforce_arithmetic_validation?: bool, line_items?: null|array{discount_amount?: int, payment_method_options?: array{card?: array{commodity_code?: string}, card_present?: array{commodity_code?: string}, klarna?: array{image_url?: string, product_url?: string, reference?: string, subscription_reference?: string}, paypal?: array{category?: string, description?: string, sold_by?: string}}, product_code?: string, product_name: string, quantity: int, tax?: array{total_tax_amount: int}, unit_cost: int, unit_of_measure?: string}[], shipping?: null|array{amount?: null|int, from_postal_code?: null|string, to_postal_code?: null|string}, tax?: null|array{total_tax_amount: int}}, application_fee_amount?: null|int, capture_method?: string, currency?: string, customer?: string, customer_account?: string, description?: string, excluded_payment_method_types?: null|string[], expand?: string[], hooks?: array{inputs?: array{tax?: array{calculation: null|string}}}, metadata?: null|array, payment_details?: null|array{customer_reference?: null|string, order_reference?: null|string}, payment_method?: string, payment_method_configuration?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, bizum?: array{}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, scalapay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, sunbit?: array{}, swish?: array{}, twint?: array{}, type: string, upi?: array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}}, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{custom_mandate_url?: null|string, interval_description?: string, payment_schedule?: string, transaction_type?: string}, setup_future_usage?: null|string, target_date?: string, verification_method?: string}, affirm?: null|array{capture_method?: null|string, preferred_locale?: string, setup_future_usage?: string}, afterpay_clearpay?: null|array{capture_method?: null|string, reference?: string, setup_future_usage?: string}, alipay?: null|array{setup_future_usage?: null|string}, alma?: null|array{capture_method?: null|string}, amazon_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, au_becs_debit?: null|array{setup_future_usage?: null|string, target_date?: string}, bacs_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, bancontact?: null|array{preferred_language?: string, setup_future_usage?: null|string}, billie?: null|array{capture_method?: null|string}, bizum?: null|array{}, blik?: null|array{code?: string, setup_future_usage?: null|string}, boleto?: null|array{expires_after_days?: int, setup_future_usage?: null|string}, card?: null|array{capture_method?: null|string, cvc_token?: string, installments?: array{enabled?: bool, plan?: null|array{count?: int, interval?: string, type: string}}, mandate_options?: array{amount: int, amount_type: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_extended_authorization?: string, request_incremental_authorization?: string, request_multicapture?: string, request_overcapture?: string, request_three_d_secure?: string, require_cvc_recollection?: bool, setup_future_usage?: null|string, statement_descriptor_suffix_kana?: null|string, statement_descriptor_suffix_kanji?: null|string, three_d_secure?: array{ares_trans_status?: string, cryptogram: string, electronic_commerce_indicator?: string, exemption_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id: string, version: string}}, card_present?: null|array{capture_method?: string, request_extended_authorization?: bool, request_incremental_authorization_support?: bool, routing?: array{requested_priority?: string}}, cashapp?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, crypto?: null|array{setup_future_usage?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, requested_address_types?: string[], type: string}, funding_type?: string, setup_future_usage?: string}, eps?: null|array{setup_future_usage?: string}, fpx?: null|array{setup_future_usage?: string}, giropay?: null|array{setup_future_usage?: string}, grabpay?: null|array{setup_future_usage?: string}, ideal?: null|array{setup_future_usage?: null|string}, interac_present?: null|array{}, kakao_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, klarna?: null|array{capture_method?: null|string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, setup_future_usage?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing?: array{amount: int, date: string}, reference: string}[]}, konbini?: null|array{confirmation_number?: null|string, expires_after_days?: null|int, expires_at?: null|int, product_description?: null|string, setup_future_usage?: string}, kr_card?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, link?: null|array{capture_method?: null|string, persistent_token?: string, setup_future_usage?: null|string}, mb_way?: null|array{setup_future_usage?: string}, mobilepay?: null|array{capture_method?: null|string, setup_future_usage?: string}, multibanco?: null|array{setup_future_usage?: string}, naver_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, nz_bank_account?: null|array{setup_future_usage?: null|string, target_date?: string}, oxxo?: null|array{expires_after_days?: int, setup_future_usage?: string}, p24?: null|array{setup_future_usage?: string, tos_shown_and_accepted?: bool}, pay_by_bank?: null|array{}, payco?: null|array{capture_method?: null|string}, paynow?: null|array{setup_future_usage?: string}, paypal?: null|array{capture_method?: null|string, preferred_locale?: string, reference?: string, risk_correlation_id?: string, setup_future_usage?: null|string}, payto?: null|array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string}, setup_future_usage?: null|string}, pix?: null|array{amount_includes_iof?: string, expires_after_seconds?: int, expires_at?: int, mandate_options?: array{amount?: int, amount_includes_iof?: string, amount_type?: string, currency?: string, end_date?: string, payment_schedule?: string, reference?: string, start_date?: string}, setup_future_usage?: string}, promptpay?: null|array{setup_future_usage?: string}, revolut_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, samsung_pay?: null|array{capture_method?: null|string}, satispay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, scalapay?: null|array{capture_method?: null|string}, sepa_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, sofort?: null|array{preferred_language?: null|string, setup_future_usage?: null|string}, sunbit?: null|array{capture_method?: null|string, setup_future_usage?: string}, swish?: null|array{reference?: null|string, setup_future_usage?: string}, twint?: null|array{setup_future_usage?: string}, upi?: null|array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}, setup_future_usage?: null|string}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, setup_future_usage?: null|string, target_date?: string, transaction_purpose?: null|string, verification_method?: string}, wechat_pay?: null|array{app_id?: string, client?: string, setup_future_usage?: string}, zip?: null|array{setup_future_usage?: string}}, payment_method_types?: string[], receipt_email?: null|string, setup_future_usage?: null|string, shipping?: null|array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name: string, phone?: string, tracking_number?: string}, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_data?: array{amount?: int, description?: string, metadata?: null|array, payment_data?: array{description?: string, metadata?: null|array}}, transfer_group?: string} $params * @param null|array|string $opts * * @return PaymentIntent the updated resource diff --git a/libs/stripe-php/lib/PaymentLink.php b/libs/stripe-php/lib/PaymentLink.php index 955214416..ee470d675 100644 --- a/libs/stripe-php/lib/PaymentLink.php +++ b/libs/stripe-php/lib/PaymentLink.php @@ -29,13 +29,15 @@ namespace Stripe; * @property null|string $inactive_message The custom message to be displayed to a customer when a payment link is no longer active. * @property null|(object{enabled: bool, invoice_data: null|(object{account_tax_ids: null|(string|TaxId)[], custom_fields: null|(object{name: string, value: string}&StripeObject)[], description: null|string, footer: null|string, issuer: null|(object{account?: Account|string, type: string}&StripeObject), metadata: null|StripeObject, rendering_options: null|(object{amount_tax_display: null|string, template: null|string}&StripeObject)}&StripeObject)}&StripeObject) $invoice_creation Configuration for creating invoice for payment mode payment links. * @property null|Collection $line_items The line items representing what is being sold. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. + * @property null|(object{enabled: bool}&StripeObject) $managed_payments Settings for Managed Payments for this Payment Link and resulting CheckoutSessions, PaymentIntents, Invoices, and Subscriptions. * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|(object{business?: (object{enabled: bool, optional: bool}&StripeObject), individual?: (object{enabled: bool, optional: bool}&StripeObject)}&StripeObject) $name_collection * @property null|Account|string $on_behalf_of The account on behalf of which to charge. See the Connect documentation for details. * @property null|((object{adjustable_quantity: null|(object{enabled: bool, maximum: null|int, minimum: null|int}&StripeObject), price: string, quantity: int}&StripeObject))[] $optional_items The optional items presented to the customer at checkout. * @property null|(object{capture_method: null|string, description: null|string, metadata: StripeObject, setup_future_usage: null|string, statement_descriptor: null|string, statement_descriptor_suffix: null|string, transfer_group: null|string}&StripeObject) $payment_intent_data Indicates the parameters to be passed to PaymentIntent creation during checkout. * @property string $payment_method_collection Configuration for collecting a payment method during checkout. Defaults to always. + * @property null|(object{card: null|(object{restrictions: null|(object{brands_blocked: string[]}&StripeObject)}&StripeObject)}&StripeObject) $payment_method_options Payment-method-specific configuration. * @property null|string[] $payment_method_types The list of payment method types that customers can use. When null, Stripe will dynamically show relevant payment methods you've enabled in your payment method settings. * @property (object{enabled: bool}&StripeObject) $phone_number_collection * @property null|(object{completed_sessions: (object{count: int, limit: int}&StripeObject)}&StripeObject) $restrictions Settings that restrict the usage of a payment link. @@ -71,7 +73,7 @@ class PaymentLink extends ApiResource /** * Creates a payment link. * - * @param null|array{after_completion?: array{hosted_confirmation?: array{custom_message?: string}, redirect?: array{url: string}, type: string}, allow_promotion_codes?: bool, application_fee_amount?: int, application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_address_collection?: string, consent_collection?: array{payment_method_reuse_agreement?: array{position: string}, promotions?: string, terms_of_service?: string}, currency?: string, custom_fields?: array{dropdown?: array{default_value?: string, options: array{label: string, value: string}[]}, key: string, label: array{custom: string, type: string}, numeric?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, optional?: bool, text?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, type: string}[], custom_text?: array{after_submit?: null|array{message: string}, shipping_address?: null|array{message: string}, submit?: null|array{message: string}, terms_of_service_acceptance?: null|array{message: string}}, customer_creation?: string, expand?: string[], inactive_message?: string, invoice_creation?: array{enabled: bool, invoice_data?: array{account_tax_ids?: null|string[], custom_fields?: null|array{name: string, value: string}[], description?: string, footer?: string, issuer?: array{account?: string, type: string}, metadata?: null|array, rendering_options?: null|array{amount_tax_display?: null|string, template?: string}}}, line_items: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, price?: string, price_data?: array{currency: string, product?: string, product_data?: array{description?: string, images?: string[], metadata?: array, name: string, tax_code?: string, unit_label?: string}, recurring?: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity: int}[], metadata?: array, name_collection?: array{business?: array{enabled: bool, optional?: bool}, individual?: array{enabled: bool, optional?: bool}}, on_behalf_of?: string, optional_items?: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, price: string, quantity: int}[], payment_intent_data?: array{capture_method?: string, description?: string, metadata?: array, setup_future_usage?: string, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_group?: string}, payment_method_collection?: string, payment_method_types?: string[], phone_number_collection?: array{enabled: bool}, restrictions?: array{completed_sessions: array{limit: int}}, shipping_address_collection?: array{allowed_countries: string[]}, shipping_options?: array{shipping_rate?: string}[], submit_type?: string, subscription_data?: array{description?: string, invoice_settings?: array{issuer?: array{account?: string, type: string}}, metadata?: array, trial_period_days?: int, trial_settings?: array{end_behavior: array{missing_payment_method: string}}}, tax_id_collection?: array{enabled: bool, required?: string}, transfer_data?: array{amount?: int, destination: string}} $params + * @param null|array{after_completion?: array{hosted_confirmation?: array{custom_message?: string}, redirect?: array{url: string}, type: string}, allow_promotion_codes?: bool, application_fee_amount?: int, application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_address_collection?: string, consent_collection?: array{payment_method_reuse_agreement?: array{position: string}, promotions?: string, terms_of_service?: string}, currency?: string, custom_fields?: array{dropdown?: array{default_value?: string, options: array{label: string, value: string}[]}, key: string, label: array{custom: string, type: string}, numeric?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, optional?: bool, text?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, type: string}[], custom_text?: array{after_submit?: null|array{message: string}, shipping_address?: null|array{message: string}, submit?: null|array{message: string}, terms_of_service_acceptance?: null|array{message: string}}, customer_creation?: string, expand?: string[], inactive_message?: string, invoice_creation?: array{enabled: bool, invoice_data?: array{account_tax_ids?: null|string[], custom_fields?: null|array{name: string, value: string}[], description?: string, footer?: string, issuer?: array{account?: string, type: string}, metadata?: null|array, rendering_options?: null|array{amount_tax_display?: null|string, template?: string}}}, line_items: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, price?: string, price_data?: array{currency: string, product?: string, product_data?: array{description?: string, images?: string[], metadata?: array, name: string, tax_code?: string, unit_label?: string}, recurring?: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity: int}[], managed_payments?: array{enabled?: bool}, metadata?: array, name_collection?: array{business?: array{enabled: bool, optional?: bool}, individual?: array{enabled: bool, optional?: bool}}, on_behalf_of?: string, optional_items?: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, price: string, quantity: int}[], payment_intent_data?: array{capture_method?: string, description?: string, metadata?: array, setup_future_usage?: string, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_group?: string}, payment_method_collection?: string, payment_method_options?: array{card?: array{restrictions?: array{brands_blocked?: string[]}}}, payment_method_types?: string[], phone_number_collection?: array{enabled: bool}, restrictions?: array{completed_sessions: array{limit: int}}, shipping_address_collection?: array{allowed_countries: string[]}, shipping_options?: array{shipping_rate?: string}[], submit_type?: string, subscription_data?: array{description?: string, invoice_settings?: array{issuer?: array{account?: string, type: string}}, metadata?: array, trial_period_days?: int, trial_settings?: array{end_behavior: array{missing_payment_method: string}}}, tax_id_collection?: array{enabled: bool, required?: string}, transfer_data?: array{amount?: int, destination: string}} $params * @param null|array|string $options * * @return PaymentLink the created resource @@ -130,7 +132,7 @@ class PaymentLink extends ApiResource * Updates a payment link. * * @param string $id the ID of the resource to update - * @param null|array{active?: bool, after_completion?: array{hosted_confirmation?: array{custom_message?: string}, redirect?: array{url: string}, type: string}, allow_promotion_codes?: bool, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_address_collection?: string, custom_fields?: null|array{dropdown?: array{default_value?: string, options: array{label: string, value: string}[]}, key: string, label: array{custom: string, type: string}, numeric?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, optional?: bool, text?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, type: string}[], custom_text?: array{after_submit?: null|array{message: string}, shipping_address?: null|array{message: string}, submit?: null|array{message: string}, terms_of_service_acceptance?: null|array{message: string}}, customer_creation?: string, expand?: string[], inactive_message?: null|string, invoice_creation?: array{enabled: bool, invoice_data?: array{account_tax_ids?: null|string[], custom_fields?: null|array{name: string, value: string}[], description?: string, footer?: string, issuer?: array{account?: string, type: string}, metadata?: null|array, rendering_options?: null|array{amount_tax_display?: null|string, template?: string}}}, line_items?: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, id: string, quantity?: int}[], metadata?: array, name_collection?: null|array{business?: array{enabled: bool, optional?: bool}, individual?: array{enabled: bool, optional?: bool}}, optional_items?: null|array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, price: string, quantity: int}[], payment_intent_data?: array{description?: null|string, metadata?: null|array, statement_descriptor?: null|string, statement_descriptor_suffix?: null|string, transfer_group?: null|string}, payment_method_collection?: string, payment_method_types?: null|string[], phone_number_collection?: array{enabled: bool}, restrictions?: null|array{completed_sessions: array{limit: int}}, shipping_address_collection?: null|array{allowed_countries: string[]}, submit_type?: string, subscription_data?: array{invoice_settings?: array{issuer?: array{account?: string, type: string}}, metadata?: null|array, trial_period_days?: null|int, trial_settings?: null|array{end_behavior: array{missing_payment_method: string}}}, tax_id_collection?: array{enabled: bool, required?: string}} $params + * @param null|array{active?: bool, after_completion?: array{hosted_confirmation?: array{custom_message?: string}, redirect?: array{url: string}, type: string}, allow_promotion_codes?: bool, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_address_collection?: string, custom_fields?: null|array{dropdown?: array{default_value?: string, options: array{label: string, value: string}[]}, key: string, label: array{custom: string, type: string}, numeric?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, optional?: bool, text?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, type: string}[], custom_text?: array{after_submit?: null|array{message: string}, shipping_address?: null|array{message: string}, submit?: null|array{message: string}, terms_of_service_acceptance?: null|array{message: string}}, customer_creation?: string, expand?: string[], inactive_message?: null|string, invoice_creation?: array{enabled: bool, invoice_data?: array{account_tax_ids?: null|string[], custom_fields?: null|array{name: string, value: string}[], description?: string, footer?: string, issuer?: array{account?: string, type: string}, metadata?: null|array, rendering_options?: null|array{amount_tax_display?: null|string, template?: string}}}, line_items?: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, id: string, quantity?: int}[], metadata?: array, name_collection?: null|array{business?: array{enabled: bool, optional?: bool}, individual?: array{enabled: bool, optional?: bool}}, optional_items?: null|array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, price: string, quantity: int}[], payment_intent_data?: array{description?: null|string, metadata?: null|array, statement_descriptor?: null|string, statement_descriptor_suffix?: null|string, transfer_group?: null|string}, payment_method_collection?: string, payment_method_options?: null|array{card?: null|array{restrictions?: null|array{brands_blocked?: null|string[]}}}, payment_method_types?: null|string[], phone_number_collection?: array{enabled: bool}, restrictions?: null|array{completed_sessions: array{limit: int}}, shipping_address_collection?: null|array{allowed_countries: string[]}, submit_type?: string, subscription_data?: array{invoice_settings?: array{issuer?: array{account?: string, type: string}}, metadata?: null|array, trial_period_days?: null|int, trial_settings?: null|array{end_behavior: array{missing_payment_method: string}}}, tax_id_collection?: array{enabled: bool, required?: string}} $params * @param null|array|string $opts * * @return PaymentLink the updated resource diff --git a/libs/stripe-php/lib/PaymentMethod.php b/libs/stripe-php/lib/PaymentMethod.php index f994852a2..e74acaf95 100644 --- a/libs/stripe-php/lib/PaymentMethod.php +++ b/libs/stripe-php/lib/PaymentMethod.php @@ -25,7 +25,8 @@ namespace Stripe; * @property null|(object{}&StripeObject) $bancontact * @property null|(object{}&StripeObject) $billie * @property (object{address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, phone: null|string, tax_id: null|string}&StripeObject) $billing_details - * @property null|(object{}&StripeObject) $blik + * @property null|(object{buyer_id?: null|string}&StripeObject) $bizum + * @property null|(object{buyer_id?: null|string}&StripeObject) $blik * @property null|(object{tax_id: string}&StripeObject) $boleto * @property null|(object{brand: string, checks: null|(object{address_line1_check: null|string, address_postal_code_check: null|string, cvc_check: null|string}&StripeObject), country: null|string, description?: null|string, display_brand: null|string, exp_month: int, exp_year: int, fingerprint?: null|string, funding: string, generated_from: null|(object{charge: null|string, payment_method_details: null|(object{card_present?: (object{amount_authorized: null|int, brand: null|string, brand_product: null|string, capture_before?: int, cardholder_name: null|string, country: null|string, description?: null|string, emv_auth_data: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, generated_card: null|string, iin?: null|string, incremental_authorization_supported: bool, issuer?: null|string, last4: null|string, location?: string, network: null|string, network_transaction_id: null|string, offline: null|(object{stored_at: null|int, type: null|string}&StripeObject), overcapture_supported: bool, preferred_locales: null|string[], read_method: null|string, reader?: string, receipt: null|(object{account_type?: string, application_cryptogram: null|string, application_preferred_name: null|string, authorization_code: null|string, authorization_response_code: null|string, cardholder_verification_method: null|string, dedicated_file_name: null|string, terminal_verification_results: null|string, transaction_status_information: null|string}&StripeObject), wallet?: (object{type: string}&StripeObject)}&StripeObject), type: string}&StripeObject), setup_attempt: null|SetupAttempt|string}&StripeObject), iin?: null|string, issuer?: null|string, last4: string, networks: null|(object{available: string[], preferred: null|string}&StripeObject), regulated_status: null|string, three_d_secure_usage: null|(object{supported: bool}&StripeObject), wallet: null|(object{amex_express_checkout?: (object{}&StripeObject), apple_pay?: (object{}&StripeObject), dynamic_last4: null|string, google_pay?: (object{}&StripeObject), link?: (object{}&StripeObject), masterpass?: (object{billing_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, shipping_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject)}&StripeObject), samsung_pay?: (object{}&StripeObject), type: string, visa_checkout?: (object{billing_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, shipping_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject)}&StripeObject)}&StripeObject)}&StripeObject) $card * @property null|(object{brand: null|string, brand_product: null|string, cardholder_name: null|string, country: null|string, description?: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, iin?: null|string, issuer?: null|string, last4: null|string, networks: null|(object{available: string[], preferred: null|string}&StripeObject), offline: null|(object{stored_at: null|int, type: null|string}&StripeObject), preferred_locales: null|string[], read_method: null|string, wallet?: (object{type: string}&StripeObject)}&StripeObject) $card_present @@ -47,7 +48,7 @@ namespace Stripe; * @property null|(object{}&StripeObject) $konbini * @property null|(object{brand: null|string, last4: null|string}&StripeObject) $kr_card * @property null|(object{email: null|string, persistent_token?: string}&StripeObject) $link - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|(object{}&StripeObject) $mb_way * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|(object{}&StripeObject) $mobilepay @@ -61,17 +62,20 @@ namespace Stripe; * @property null|(object{}&StripeObject) $paynow * @property null|(object{country: null|string, payer_email: null|string, payer_id: null|string}&StripeObject) $paypal * @property null|(object{bsb_number: null|string, last4: null|string, pay_id: null|string}&StripeObject) $payto - * @property null|(object{}&StripeObject) $pix + * @property null|(object{fingerprint?: null|string}&StripeObject) $pix * @property null|(object{}&StripeObject) $promptpay * @property null|(object{session?: string}&StripeObject) $radar_options Options to configure Radar. See Radar Session for more information. * @property null|(object{}&StripeObject) $revolut_pay * @property null|(object{}&StripeObject) $samsung_pay * @property null|(object{}&StripeObject) $satispay + * @property null|(object{}&StripeObject) $scalapay * @property null|(object{bank_code: null|string, branch_code: null|string, country: null|string, fingerprint: null|string, generated_from: null|(object{charge: null|Charge|string, setup_attempt: null|SetupAttempt|string}&StripeObject), last4: null|string}&StripeObject) $sepa_debit * @property null|(object{country: null|string}&StripeObject) $sofort + * @property null|(object{}&StripeObject) $sunbit * @property null|(object{}&StripeObject) $swish * @property null|(object{}&StripeObject) $twint * @property string $type The type of the PaymentMethod. An additional hash is included on the PaymentMethod with a name matching this value. It contains additional information specific to the PaymentMethod type. + * @property null|(object{vpa: null|string}&StripeObject) $upi * @property null|(object{account_holder_type: null|string, account_type: null|string, bank_name: null|string, financial_connections_account: null|string, fingerprint: null|string, last4: null|string, networks: null|(object{preferred: null|string, supported: string[]}&StripeObject), routing_number: null|string, status_details: null|(object{blocked?: (object{network_code: null|string, reason: null|string}&StripeObject)}&StripeObject)}&StripeObject) $us_bank_account * @property null|(object{}&StripeObject) $wechat_pay * @property null|(object{}&StripeObject) $zip @@ -96,6 +100,7 @@ class PaymentMethod extends ApiResource const TYPE_BACS_DEBIT = 'bacs_debit'; const TYPE_BANCONTACT = 'bancontact'; const TYPE_BILLIE = 'billie'; + const TYPE_BIZUM = 'bizum'; const TYPE_BLIK = 'blik'; const TYPE_BOLETO = 'boleto'; const TYPE_CARD = 'card'; @@ -132,10 +137,13 @@ class PaymentMethod extends ApiResource const TYPE_REVOLUT_PAY = 'revolut_pay'; const TYPE_SAMSUNG_PAY = 'samsung_pay'; const TYPE_SATISPAY = 'satispay'; + const TYPE_SCALAPAY = 'scalapay'; const TYPE_SEPA_DEBIT = 'sepa_debit'; const TYPE_SOFORT = 'sofort'; + const TYPE_SUNBIT = 'sunbit'; const TYPE_SWISH = 'swish'; const TYPE_TWINT = 'twint'; + const TYPE_UPI = 'upi'; const TYPE_US_BANK_ACCOUNT = 'us_bank_account'; const TYPE_WECHAT_PAY = 'wechat_pay'; const TYPE_ZIP = 'zip'; @@ -151,7 +159,7 @@ class PaymentMethod extends ApiResource * href="/docs/payments/save-and-reuse">SetupIntent API to collect payment * method details ahead of a future payment. * - * @param null|array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, blik?: array{}, boleto?: array{tax_id: string}, card?: array{cvc?: string, exp_month?: int, exp_year?: int, networks?: array{preferred?: string}, number?: string, token?: string}, cashapp?: array{}, crypto?: array{}, custom?: array{type: string}, customer?: string, customer_balance?: array{}, eps?: array{bank?: string}, expand?: string[], fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, payment_method?: string, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, swish?: array{}, twint?: array{}, type?: string, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}} $params + * @param null|array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, bizum?: array{}, blik?: array{}, boleto?: array{tax_id: string}, card?: array{cvc?: string, exp_month?: int, exp_year?: int, networks?: array{preferred?: string}, number?: string, token?: string}, cashapp?: array{}, crypto?: array{}, custom?: array{type: string}, customer?: string, customer_balance?: array{}, eps?: array{bank?: string}, expand?: string[], fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, payment_method?: string, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, scalapay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, sunbit?: array{}, swish?: array{}, twint?: array{}, type?: string, upi?: array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}}, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}} $params * @param null|array|string $options * * @return PaymentMethod the created resource diff --git a/libs/stripe-php/lib/PaymentMethodConfiguration.php b/libs/stripe-php/lib/PaymentMethodConfiguration.php index 6bdcfb317..8fc52271e 100644 --- a/libs/stripe-php/lib/PaymentMethodConfiguration.php +++ b/libs/stripe-php/lib/PaymentMethodConfiguration.php @@ -35,6 +35,7 @@ namespace Stripe; * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $bacs_debit * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $bancontact * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $billie + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $bizum * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $blik * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $boleto * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $card @@ -55,7 +56,7 @@ namespace Stripe; * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $konbini * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $kr_card * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $link - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $mb_way * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $mobilepay * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $multibanco @@ -75,10 +76,13 @@ namespace Stripe; * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $revolut_pay * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $samsung_pay * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $satispay + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $scalapay * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $sepa_debit * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $sofort + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $sunbit * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $swish * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $twint + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $upi * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $us_bank_account * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $wechat_pay * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $zip @@ -92,7 +96,7 @@ class PaymentMethodConfiguration extends ApiResource /** * Creates a payment method configuration. * - * @param null|array{acss_debit?: array{display_preference?: array{preference?: string}}, affirm?: array{display_preference?: array{preference?: string}}, afterpay_clearpay?: array{display_preference?: array{preference?: string}}, alipay?: array{display_preference?: array{preference?: string}}, alma?: array{display_preference?: array{preference?: string}}, amazon_pay?: array{display_preference?: array{preference?: string}}, apple_pay?: array{display_preference?: array{preference?: string}}, apple_pay_later?: array{display_preference?: array{preference?: string}}, au_becs_debit?: array{display_preference?: array{preference?: string}}, bacs_debit?: array{display_preference?: array{preference?: string}}, bancontact?: array{display_preference?: array{preference?: string}}, billie?: array{display_preference?: array{preference?: string}}, blik?: array{display_preference?: array{preference?: string}}, boleto?: array{display_preference?: array{preference?: string}}, card?: array{display_preference?: array{preference?: string}}, cartes_bancaires?: array{display_preference?: array{preference?: string}}, cashapp?: array{display_preference?: array{preference?: string}}, crypto?: array{display_preference?: array{preference?: string}}, customer_balance?: array{display_preference?: array{preference?: string}}, eps?: array{display_preference?: array{preference?: string}}, expand?: string[], fpx?: array{display_preference?: array{preference?: string}}, fr_meal_voucher_conecs?: array{display_preference?: array{preference?: string}}, giropay?: array{display_preference?: array{preference?: string}}, google_pay?: array{display_preference?: array{preference?: string}}, grabpay?: array{display_preference?: array{preference?: string}}, ideal?: array{display_preference?: array{preference?: string}}, jcb?: array{display_preference?: array{preference?: string}}, kakao_pay?: array{display_preference?: array{preference?: string}}, klarna?: array{display_preference?: array{preference?: string}}, konbini?: array{display_preference?: array{preference?: string}}, kr_card?: array{display_preference?: array{preference?: string}}, link?: array{display_preference?: array{preference?: string}}, mb_way?: array{display_preference?: array{preference?: string}}, mobilepay?: array{display_preference?: array{preference?: string}}, multibanco?: array{display_preference?: array{preference?: string}}, name?: string, naver_pay?: array{display_preference?: array{preference?: string}}, nz_bank_account?: array{display_preference?: array{preference?: string}}, oxxo?: array{display_preference?: array{preference?: string}}, p24?: array{display_preference?: array{preference?: string}}, parent?: string, pay_by_bank?: array{display_preference?: array{preference?: string}}, payco?: array{display_preference?: array{preference?: string}}, paynow?: array{display_preference?: array{preference?: string}}, paypal?: array{display_preference?: array{preference?: string}}, payto?: array{display_preference?: array{preference?: string}}, pix?: array{display_preference?: array{preference?: string}}, promptpay?: array{display_preference?: array{preference?: string}}, revolut_pay?: array{display_preference?: array{preference?: string}}, samsung_pay?: array{display_preference?: array{preference?: string}}, satispay?: array{display_preference?: array{preference?: string}}, sepa_debit?: array{display_preference?: array{preference?: string}}, sofort?: array{display_preference?: array{preference?: string}}, swish?: array{display_preference?: array{preference?: string}}, twint?: array{display_preference?: array{preference?: string}}, us_bank_account?: array{display_preference?: array{preference?: string}}, wechat_pay?: array{display_preference?: array{preference?: string}}, zip?: array{display_preference?: array{preference?: string}}} $params + * @param null|array{acss_debit?: array{display_preference?: array{preference?: string}}, affirm?: array{display_preference?: array{preference?: string}}, afterpay_clearpay?: array{display_preference?: array{preference?: string}}, alipay?: array{display_preference?: array{preference?: string}}, alma?: array{display_preference?: array{preference?: string}}, amazon_pay?: array{display_preference?: array{preference?: string}}, apple_pay?: array{display_preference?: array{preference?: string}}, apple_pay_later?: array{display_preference?: array{preference?: string}}, au_becs_debit?: array{display_preference?: array{preference?: string}}, bacs_debit?: array{display_preference?: array{preference?: string}}, bancontact?: array{display_preference?: array{preference?: string}}, billie?: array{display_preference?: array{preference?: string}}, bizum?: array{display_preference?: array{preference?: string}}, blik?: array{display_preference?: array{preference?: string}}, boleto?: array{display_preference?: array{preference?: string}}, card?: array{display_preference?: array{preference?: string}}, cartes_bancaires?: array{display_preference?: array{preference?: string}}, cashapp?: array{display_preference?: array{preference?: string}}, crypto?: array{display_preference?: array{preference?: string}}, customer_balance?: array{display_preference?: array{preference?: string}}, eps?: array{display_preference?: array{preference?: string}}, expand?: string[], fpx?: array{display_preference?: array{preference?: string}}, fr_meal_voucher_conecs?: array{display_preference?: array{preference?: string}}, giropay?: array{display_preference?: array{preference?: string}}, google_pay?: array{display_preference?: array{preference?: string}}, grabpay?: array{display_preference?: array{preference?: string}}, ideal?: array{display_preference?: array{preference?: string}}, jcb?: array{display_preference?: array{preference?: string}}, kakao_pay?: array{display_preference?: array{preference?: string}}, klarna?: array{display_preference?: array{preference?: string}}, konbini?: array{display_preference?: array{preference?: string}}, kr_card?: array{display_preference?: array{preference?: string}}, link?: array{display_preference?: array{preference?: string}}, mb_way?: array{display_preference?: array{preference?: string}}, mobilepay?: array{display_preference?: array{preference?: string}}, multibanco?: array{display_preference?: array{preference?: string}}, name?: string, naver_pay?: array{display_preference?: array{preference?: string}}, nz_bank_account?: array{display_preference?: array{preference?: string}}, oxxo?: array{display_preference?: array{preference?: string}}, p24?: array{display_preference?: array{preference?: string}}, parent?: string, pay_by_bank?: array{display_preference?: array{preference?: string}}, payco?: array{display_preference?: array{preference?: string}}, paynow?: array{display_preference?: array{preference?: string}}, paypal?: array{display_preference?: array{preference?: string}}, payto?: array{display_preference?: array{preference?: string}}, pix?: array{display_preference?: array{preference?: string}}, promptpay?: array{display_preference?: array{preference?: string}}, revolut_pay?: array{display_preference?: array{preference?: string}}, samsung_pay?: array{display_preference?: array{preference?: string}}, satispay?: array{display_preference?: array{preference?: string}}, scalapay?: array{display_preference?: array{preference?: string}}, sepa_debit?: array{display_preference?: array{preference?: string}}, sofort?: array{display_preference?: array{preference?: string}}, sunbit?: array{display_preference?: array{preference?: string}}, swish?: array{display_preference?: array{preference?: string}}, twint?: array{display_preference?: array{preference?: string}}, upi?: array{display_preference?: array{preference?: string}}, us_bank_account?: array{display_preference?: array{preference?: string}}, wechat_pay?: array{display_preference?: array{preference?: string}}, zip?: array{display_preference?: array{preference?: string}}} $params * @param null|array|string $options * * @return PaymentMethodConfiguration the created resource @@ -114,7 +118,7 @@ class PaymentMethodConfiguration extends ApiResource /** * List payment method configurations. * - * @param null|array{application?: null|string, ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|array{active?: bool, application?: null|string, ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params * @param null|array|string $opts * * @return Collection of ApiResources @@ -151,7 +155,7 @@ class PaymentMethodConfiguration extends ApiResource * Update payment method configuration. * * @param string $id the ID of the resource to update - * @param null|array{acss_debit?: array{display_preference?: array{preference?: string}}, active?: bool, affirm?: array{display_preference?: array{preference?: string}}, afterpay_clearpay?: array{display_preference?: array{preference?: string}}, alipay?: array{display_preference?: array{preference?: string}}, alma?: array{display_preference?: array{preference?: string}}, amazon_pay?: array{display_preference?: array{preference?: string}}, apple_pay?: array{display_preference?: array{preference?: string}}, apple_pay_later?: array{display_preference?: array{preference?: string}}, au_becs_debit?: array{display_preference?: array{preference?: string}}, bacs_debit?: array{display_preference?: array{preference?: string}}, bancontact?: array{display_preference?: array{preference?: string}}, billie?: array{display_preference?: array{preference?: string}}, blik?: array{display_preference?: array{preference?: string}}, boleto?: array{display_preference?: array{preference?: string}}, card?: array{display_preference?: array{preference?: string}}, cartes_bancaires?: array{display_preference?: array{preference?: string}}, cashapp?: array{display_preference?: array{preference?: string}}, crypto?: array{display_preference?: array{preference?: string}}, customer_balance?: array{display_preference?: array{preference?: string}}, eps?: array{display_preference?: array{preference?: string}}, expand?: string[], fpx?: array{display_preference?: array{preference?: string}}, fr_meal_voucher_conecs?: array{display_preference?: array{preference?: string}}, giropay?: array{display_preference?: array{preference?: string}}, google_pay?: array{display_preference?: array{preference?: string}}, grabpay?: array{display_preference?: array{preference?: string}}, ideal?: array{display_preference?: array{preference?: string}}, jcb?: array{display_preference?: array{preference?: string}}, kakao_pay?: array{display_preference?: array{preference?: string}}, klarna?: array{display_preference?: array{preference?: string}}, konbini?: array{display_preference?: array{preference?: string}}, kr_card?: array{display_preference?: array{preference?: string}}, link?: array{display_preference?: array{preference?: string}}, mb_way?: array{display_preference?: array{preference?: string}}, mobilepay?: array{display_preference?: array{preference?: string}}, multibanco?: array{display_preference?: array{preference?: string}}, name?: string, naver_pay?: array{display_preference?: array{preference?: string}}, nz_bank_account?: array{display_preference?: array{preference?: string}}, oxxo?: array{display_preference?: array{preference?: string}}, p24?: array{display_preference?: array{preference?: string}}, pay_by_bank?: array{display_preference?: array{preference?: string}}, payco?: array{display_preference?: array{preference?: string}}, paynow?: array{display_preference?: array{preference?: string}}, paypal?: array{display_preference?: array{preference?: string}}, payto?: array{display_preference?: array{preference?: string}}, pix?: array{display_preference?: array{preference?: string}}, promptpay?: array{display_preference?: array{preference?: string}}, revolut_pay?: array{display_preference?: array{preference?: string}}, samsung_pay?: array{display_preference?: array{preference?: string}}, satispay?: array{display_preference?: array{preference?: string}}, sepa_debit?: array{display_preference?: array{preference?: string}}, sofort?: array{display_preference?: array{preference?: string}}, swish?: array{display_preference?: array{preference?: string}}, twint?: array{display_preference?: array{preference?: string}}, us_bank_account?: array{display_preference?: array{preference?: string}}, wechat_pay?: array{display_preference?: array{preference?: string}}, zip?: array{display_preference?: array{preference?: string}}} $params + * @param null|array{acss_debit?: array{display_preference?: array{preference?: string}}, active?: bool, affirm?: array{display_preference?: array{preference?: string}}, afterpay_clearpay?: array{display_preference?: array{preference?: string}}, alipay?: array{display_preference?: array{preference?: string}}, alma?: array{display_preference?: array{preference?: string}}, amazon_pay?: array{display_preference?: array{preference?: string}}, apple_pay?: array{display_preference?: array{preference?: string}}, apple_pay_later?: array{display_preference?: array{preference?: string}}, au_becs_debit?: array{display_preference?: array{preference?: string}}, bacs_debit?: array{display_preference?: array{preference?: string}}, bancontact?: array{display_preference?: array{preference?: string}}, billie?: array{display_preference?: array{preference?: string}}, bizum?: array{display_preference?: array{preference?: string}}, blik?: array{display_preference?: array{preference?: string}}, boleto?: array{display_preference?: array{preference?: string}}, card?: array{display_preference?: array{preference?: string}}, cartes_bancaires?: array{display_preference?: array{preference?: string}}, cashapp?: array{display_preference?: array{preference?: string}}, crypto?: array{display_preference?: array{preference?: string}}, customer_balance?: array{display_preference?: array{preference?: string}}, eps?: array{display_preference?: array{preference?: string}}, expand?: string[], fpx?: array{display_preference?: array{preference?: string}}, fr_meal_voucher_conecs?: array{display_preference?: array{preference?: string}}, giropay?: array{display_preference?: array{preference?: string}}, google_pay?: array{display_preference?: array{preference?: string}}, grabpay?: array{display_preference?: array{preference?: string}}, ideal?: array{display_preference?: array{preference?: string}}, jcb?: array{display_preference?: array{preference?: string}}, kakao_pay?: array{display_preference?: array{preference?: string}}, klarna?: array{display_preference?: array{preference?: string}}, konbini?: array{display_preference?: array{preference?: string}}, kr_card?: array{display_preference?: array{preference?: string}}, link?: array{display_preference?: array{preference?: string}}, mb_way?: array{display_preference?: array{preference?: string}}, mobilepay?: array{display_preference?: array{preference?: string}}, multibanco?: array{display_preference?: array{preference?: string}}, name?: string, naver_pay?: array{display_preference?: array{preference?: string}}, nz_bank_account?: array{display_preference?: array{preference?: string}}, oxxo?: array{display_preference?: array{preference?: string}}, p24?: array{display_preference?: array{preference?: string}}, pay_by_bank?: array{display_preference?: array{preference?: string}}, payco?: array{display_preference?: array{preference?: string}}, paynow?: array{display_preference?: array{preference?: string}}, paypal?: array{display_preference?: array{preference?: string}}, payto?: array{display_preference?: array{preference?: string}}, pix?: array{display_preference?: array{preference?: string}}, promptpay?: array{display_preference?: array{preference?: string}}, revolut_pay?: array{display_preference?: array{preference?: string}}, samsung_pay?: array{display_preference?: array{preference?: string}}, satispay?: array{display_preference?: array{preference?: string}}, scalapay?: array{display_preference?: array{preference?: string}}, sepa_debit?: array{display_preference?: array{preference?: string}}, sofort?: array{display_preference?: array{preference?: string}}, sunbit?: array{display_preference?: array{preference?: string}}, swish?: array{display_preference?: array{preference?: string}}, twint?: array{display_preference?: array{preference?: string}}, upi?: array{display_preference?: array{preference?: string}}, us_bank_account?: array{display_preference?: array{preference?: string}}, wechat_pay?: array{display_preference?: array{preference?: string}}, zip?: array{display_preference?: array{preference?: string}}} $params * @param null|array|string $opts * * @return PaymentMethodConfiguration the updated resource diff --git a/libs/stripe-php/lib/PaymentMethodDomain.php b/libs/stripe-php/lib/PaymentMethodDomain.php index 328db8e91..932024d02 100644 --- a/libs/stripe-php/lib/PaymentMethodDomain.php +++ b/libs/stripe-php/lib/PaymentMethodDomain.php @@ -20,7 +20,7 @@ namespace Stripe; * @property (object{status: string, status_details?: (object{error_message: string}&StripeObject)}&StripeObject) $google_pay Indicates the status of a specific payment method on a payment method domain. * @property (object{status: string, status_details?: (object{error_message: string}&StripeObject)}&StripeObject) $klarna Indicates the status of a specific payment method on a payment method domain. * @property (object{status: string, status_details?: (object{error_message: string}&StripeObject)}&StripeObject) $link Indicates the status of a specific payment method on a payment method domain. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property (object{status: string, status_details?: (object{error_message: string}&StripeObject)}&StripeObject) $paypal Indicates the status of a specific payment method on a payment method domain. */ class PaymentMethodDomain extends ApiResource diff --git a/libs/stripe-php/lib/PaymentRecord.php b/libs/stripe-php/lib/PaymentRecord.php index 64dced481..ddf76e24c 100644 --- a/libs/stripe-php/lib/PaymentRecord.php +++ b/libs/stripe-php/lib/PaymentRecord.php @@ -25,9 +25,9 @@ namespace Stripe; * @property null|string $customer_presence Indicates whether the customer was present in your checkout flow during this payment. * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. * @property null|string $latest_payment_attempt_record ID of the latest Payment Attempt Record attached to this Payment Record. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|(object{ach_credit_transfer?: (object{account_number: null|string, bank_name: null|string, routing_number: null|string, swift_code: null|string}&StripeObject), ach_debit?: (object{account_holder_type: null|string, bank_name: null|string, country: null|string, fingerprint: null|string, last4: null|string, routing_number: null|string}&StripeObject), acss_debit?: (object{bank_name: null|string, expected_debit_date?: string, fingerprint: null|string, institution_number: null|string, last4: null|string, mandate?: string, transit_number: null|string}&StripeObject), affirm?: (object{location?: string, reader?: string, transaction_id: null|string}&StripeObject), afterpay_clearpay?: (object{order_id: null|string, reference: null|string}&StripeObject), alipay?: (object{buyer_id?: string, fingerprint: null|string, transaction_id: null|string}&StripeObject), alma?: (object{installments?: (object{count: int}&StripeObject), transaction_id: null|string}&StripeObject), amazon_pay?: (object{funding?: (object{card?: (object{brand: null|string, country: null|string, exp_month: null|int, exp_year: null|int, funding: null|string, last4: null|string}&StripeObject), type: null|string}&StripeObject), transaction_id: null|string}&StripeObject), au_becs_debit?: (object{bsb_number: null|string, expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate?: string}&StripeObject), bacs_debit?: (object{expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate: null|string, sort_code: null|string}&StripeObject), bancontact?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, preferred_language: null|string, verified_name: null|string}&StripeObject), billie?: (object{transaction_id: null|string}&StripeObject), billing_details: null|(object{address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, phone: null|string}&StripeObject), blik?: (object{buyer_id: null|string}&StripeObject), boleto?: (object{tax_id: null|string}&StripeObject), card?: (object{authorization_code: null|string, brand: string, capture_before?: int, checks: null|(object{address_line1_check: null|string, address_postal_code_check: null|string, cvc_check: null|string}&StripeObject), country: null|string, description: null|string, exp_month: int, exp_year: int, fingerprint?: null|string, funding: string, iin: null|string, installments: null|(object{plan: null|(object{count: null|int, interval: null|string, type: string}&StripeObject)}&StripeObject), issuer: null|string, last4: string, moto?: bool, network: null|string, network_advice_code: null|string, network_decline_code: null|string, network_token?: null|(object{used: bool}&StripeObject), network_transaction_id: null|string, stored_credential_usage: null|string, three_d_secure: null|(object{authentication_flow: null|string, result: null|string, result_reason: null|string, version: null|string}&StripeObject), wallet: null|(object{apple_pay?: (object{type: string}&StripeObject), dynamic_last4?: string, google_pay?: (object{}&StripeObject), type: string}&StripeObject)}&StripeObject), card_present?: (object{amount_authorized: null|int, brand: null|string, brand_product: null|string, capture_before?: int, cardholder_name: null|string, country: null|string, description?: null|string, emv_auth_data: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, generated_card: null|string, iin?: null|string, incremental_authorization_supported: bool, issuer?: null|string, last4: null|string, location?: string, network: null|string, network_transaction_id: null|string, offline: null|(object{stored_at: null|int, type: null|string}&StripeObject), overcapture_supported: bool, preferred_locales: null|string[], read_method: null|string, reader?: string, receipt: null|(object{account_type?: string, application_cryptogram: null|string, application_preferred_name: null|string, authorization_code: null|string, authorization_response_code: null|string, cardholder_verification_method: null|string, dedicated_file_name: null|string, terminal_verification_results: null|string, transaction_status_information: null|string}&StripeObject), wallet?: (object{type: string}&StripeObject)}&StripeObject), cashapp?: (object{buyer_id: null|string, cashtag: null|string, transaction_id: null|string}&StripeObject), crypto?: (object{buyer_address?: string, network?: string, token_currency?: string, transaction_hash?: string}&StripeObject), custom?: (object{display_name: string, type: null|string}&StripeObject), customer_balance?: (object{}&StripeObject), eps?: (object{bank: null|string, verified_name: null|string}&StripeObject), fpx?: (object{account_holder_type: null|string, bank: string, transaction_id: null|string}&StripeObject), giropay?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, verified_name: null|string}&StripeObject), grabpay?: (object{transaction_id: null|string}&StripeObject), ideal?: (object{bank: null|string, bic: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, transaction_id: null|string, verified_name: null|string}&StripeObject), interac_present?: (object{brand: null|string, cardholder_name: null|string, country: null|string, description?: null|string, emv_auth_data: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, generated_card: null|string, iin?: null|string, issuer?: null|string, last4: null|string, location?: string, network: null|string, network_transaction_id: null|string, preferred_locales: null|string[], read_method: null|string, reader?: string, receipt: null|(object{account_type?: string, application_cryptogram: null|string, application_preferred_name: null|string, authorization_code: null|string, authorization_response_code: null|string, cardholder_verification_method: null|string, dedicated_file_name: null|string, terminal_verification_results: null|string, transaction_status_information: null|string}&StripeObject)}&StripeObject), kakao_pay?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), klarna?: (object{payer_details: null|(object{address: null|(object{country: null|string}&StripeObject)}&StripeObject), payment_method_category: null|string, preferred_locale: null|string}&StripeObject), konbini?: (object{store: null|(object{chain: null|string}&StripeObject)}&StripeObject), kr_card?: (object{brand: null|string, buyer_id: null|string, last4: null|string, transaction_id: null|string}&StripeObject), link?: (object{country: null|string}&StripeObject), mb_way?: (object{}&StripeObject), mobilepay?: (object{card: null|(object{brand: null|string, country: null|string, exp_month: null|int, exp_year: null|int, last4: null|string}&StripeObject)}&StripeObject), multibanco?: (object{entity: null|string, reference: null|string}&StripeObject), naver_pay?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), nz_bank_account?: (object{account_holder_name: null|string, bank_code: string, bank_name: string, branch_code: string, expected_debit_date?: string, last4: string, suffix: null|string}&StripeObject), oxxo?: (object{number: null|string}&StripeObject), p24?: (object{bank: null|string, reference: null|string, verified_name: null|string}&StripeObject), pay_by_bank?: (object{}&StripeObject), payco?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), payment_method: null|string, paynow?: (object{location?: string, reader?: string, reference: null|string}&StripeObject), paypal?: (object{country: null|string, payer_email: null|string, payer_id: null|string, payer_name: null|string, seller_protection: null|(object{dispute_categories: null|string[], status: string}&StripeObject), transaction_id: null|string}&StripeObject), payto?: (object{bsb_number: null|string, last4: null|string, mandate?: string, pay_id: null|string}&StripeObject), pix?: (object{bank_transaction_id?: null|string}&StripeObject), promptpay?: (object{reference: null|string}&StripeObject), revolut_pay?: (object{funding?: (object{card?: (object{brand: null|string, country: null|string, exp_month: null|int, exp_year: null|int, funding: null|string, last4: null|string}&StripeObject), type: null|string}&StripeObject), transaction_id: null|string}&StripeObject), samsung_pay?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), satispay?: (object{transaction_id: null|string}&StripeObject), sepa_credit_transfer?: (object{bank_name: null|string, bic: null|string, iban: null|string}&StripeObject), sepa_debit?: (object{bank_code: null|string, branch_code: null|string, country: null|string, expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate: null|string}&StripeObject), sofort?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, country: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, preferred_language: null|string, verified_name: null|string}&StripeObject), stripe_account?: (object{}&StripeObject), swish?: (object{fingerprint: null|string, payment_reference: null|string, verified_phone_last4: null|string}&StripeObject), twint?: (object{}&StripeObject), type: string, us_bank_account?: (object{account_holder_type: null|string, account_type: null|string, bank_name: null|string, expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate?: Mandate|string, payment_reference: null|string, routing_number: null|string}&StripeObject), wechat?: (object{}&StripeObject), wechat_pay?: (object{fingerprint: null|string, location?: string, reader?: string, transaction_id: null|string}&StripeObject), zip?: (object{}&StripeObject)}&StripeObject) $payment_method_details Information about the Payment Method debited for this payment. + * @property null|(object{ach_credit_transfer?: (object{account_number: null|string, bank_name: null|string, routing_number: null|string, swift_code: null|string}&StripeObject), ach_debit?: (object{account_holder_type: null|string, bank_name: null|string, country: null|string, fingerprint: null|string, last4: null|string, routing_number: null|string}&StripeObject), acss_debit?: (object{bank_name: null|string, expected_debit_date?: string, fingerprint: null|string, institution_number: null|string, last4: null|string, mandate?: string, transit_number: null|string}&StripeObject), affirm?: (object{location?: string, reader?: string, transaction_id: null|string}&StripeObject), afterpay_clearpay?: (object{order_id: null|string, reference: null|string}&StripeObject), alipay?: (object{buyer_id?: string, fingerprint: null|string, transaction_id: null|string}&StripeObject), alma?: (object{installments?: (object{count: int}&StripeObject), transaction_id: null|string}&StripeObject), amazon_pay?: (object{funding?: (object{card?: (object{brand: null|string, country: null|string, exp_month: null|int, exp_year: null|int, funding: null|string, last4: null|string}&StripeObject), type: null|string}&StripeObject), transaction_id: null|string}&StripeObject), au_becs_debit?: (object{bsb_number: null|string, expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate?: string}&StripeObject), bacs_debit?: (object{expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate: null|string, sort_code: null|string}&StripeObject), bancontact?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, preferred_language: null|string, verified_name: null|string}&StripeObject), billie?: (object{transaction_id: null|string}&StripeObject), billing_details: null|(object{address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, phone: null|string}&StripeObject), bizum?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), blik?: (object{buyer_id: null|string}&StripeObject), boleto?: (object{tax_id: null|string}&StripeObject), card?: (object{authorization_code: null|string, brand: null|string, capture_before?: int, checks: null|(object{address_line1_check: null|string, address_postal_code_check: null|string, cvc_check: null|string}&StripeObject), country: null|string, description?: null|string, exp_month: null|int, exp_year: null|int, fingerprint?: null|string, funding: null|string, iin?: null|string, installments: null|(object{plan: null|(object{count: null|int, interval: null|string, type: string}&StripeObject)}&StripeObject), issuer?: null|string, last4: null|string, moto?: null|bool, network: null|string, network_advice_code: null|string, network_decline_code: null|string, network_token?: null|(object{used: bool}&StripeObject), network_transaction_id: null|string, three_d_secure: null|(object{authentication_flow: null|string, cryptogram: null|string, electronic_commerce_indicator: null|string, exemption_indicator: null|string, exemption_indicator_applied: null|bool, result: null|string, result_reason: null|string, version: null|string}&StripeObject), wallet: null|(object{apple_pay?: (object{type: string}&StripeObject), dynamic_last4?: string, google_pay?: (object{}&StripeObject), type: string}&StripeObject)}&StripeObject), card_present?: (object{amount_authorized: null|int, brand: null|string, brand_product: null|string, capture_before?: int, cardholder_name: null|string, country: null|string, description?: null|string, emv_auth_data: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, generated_card: null|string, iin?: null|string, incremental_authorization_supported: bool, issuer?: null|string, last4: null|string, location?: string, network: null|string, network_transaction_id: null|string, offline: null|(object{stored_at: null|int, type: null|string}&StripeObject), overcapture_supported: bool, preferred_locales: null|string[], read_method: null|string, reader?: string, receipt: null|(object{account_type?: string, application_cryptogram: null|string, application_preferred_name: null|string, authorization_code: null|string, authorization_response_code: null|string, cardholder_verification_method: null|string, dedicated_file_name: null|string, terminal_verification_results: null|string, transaction_status_information: null|string}&StripeObject), wallet?: (object{type: string}&StripeObject)}&StripeObject), cashapp?: (object{buyer_id: null|string, cashtag: null|string, transaction_id: null|string}&StripeObject), crypto?: (object{buyer_address?: string, network?: string, token_currency?: string, transaction_hash?: string}&StripeObject), custom?: (object{display_name: string, type: null|string}&StripeObject), customer_balance?: (object{}&StripeObject), eps?: (object{bank: null|string, verified_name: null|string}&StripeObject), fpx?: (object{account_holder_type: null|string, bank: string, transaction_id: null|string}&StripeObject), giropay?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, verified_name: null|string}&StripeObject), grabpay?: (object{transaction_id: null|string}&StripeObject), ideal?: (object{bank: null|string, bic: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, transaction_id: null|string, verified_name: null|string}&StripeObject), interac_present?: (object{brand: null|string, cardholder_name: null|string, country: null|string, description?: null|string, emv_auth_data: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, generated_card: null|string, iin?: null|string, issuer?: null|string, last4: null|string, location?: string, network: null|string, network_transaction_id: null|string, preferred_locales: null|string[], read_method: null|string, reader?: string, receipt: null|(object{account_type?: string, application_cryptogram: null|string, application_preferred_name: null|string, authorization_code: null|string, authorization_response_code: null|string, cardholder_verification_method: null|string, dedicated_file_name: null|string, terminal_verification_results: null|string, transaction_status_information: null|string}&StripeObject)}&StripeObject), kakao_pay?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), klarna?: (object{location?: string, payer_details: null|(object{address: null|(object{country: null|string}&StripeObject)}&StripeObject), payment_method_category: null|string, preferred_locale: null|string, reader?: string}&StripeObject), konbini?: (object{store: null|(object{chain: null|string}&StripeObject)}&StripeObject), kr_card?: (object{brand: null|string, buyer_id: null|string, last4: null|string, transaction_id: null|string}&StripeObject), link?: (object{country: null|string}&StripeObject), mb_way?: (object{}&StripeObject), mobilepay?: (object{card: null|(object{brand: null|string, country: null|string, exp_month: null|int, exp_year: null|int, last4: null|string}&StripeObject)}&StripeObject), multibanco?: (object{entity: null|string, reference: null|string}&StripeObject), naver_pay?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), nz_bank_account?: (object{account_holder_name: null|string, bank_code: string, bank_name: string, branch_code: string, expected_debit_date?: string, last4: string, suffix: null|string}&StripeObject), oxxo?: (object{number: null|string}&StripeObject), p24?: (object{bank: null|string, reference: null|string, verified_name: null|string}&StripeObject), pay_by_bank?: (object{}&StripeObject), payco?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), payment_method: null|string, paynow?: (object{location?: string, reader?: string, reference: null|string}&StripeObject), paypal?: (object{country: null|string, payer_email: null|string, payer_id: null|string, payer_name: null|string, seller_protection: null|(object{dispute_categories: null|string[], status: string}&StripeObject), transaction_id: null|string}&StripeObject), payto?: (object{bsb_number: null|string, last4: null|string, mandate?: string, pay_id: null|string}&StripeObject), pix?: (object{bank_transaction_id?: null|string, mandate?: string}&StripeObject), promptpay?: (object{reference: null|string}&StripeObject), revolut_pay?: (object{funding?: (object{card?: (object{brand: null|string, country: null|string, exp_month: null|int, exp_year: null|int, funding: null|string, last4: null|string}&StripeObject), type: null|string}&StripeObject), transaction_id: null|string}&StripeObject), samsung_pay?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), satispay?: (object{transaction_id: null|string}&StripeObject), scalapay?: (object{transaction_id: null|string}&StripeObject), sepa_credit_transfer?: (object{bank_name: null|string, bic: null|string, iban: null|string}&StripeObject), sepa_debit?: (object{bank_code: null|string, branch_code: null|string, country: null|string, expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate: null|string}&StripeObject), sofort?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, country: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, preferred_language: null|string, verified_name: null|string}&StripeObject), stripe_account?: (object{}&StripeObject), sunbit?: (object{transaction_id: null|string}&StripeObject), swish?: (object{fingerprint: null|string, payment_reference: null|string, verified_phone_last4: null|string}&StripeObject), twint?: (object{mandate?: string}&StripeObject), type: string, upi?: (object{vpa: null|string}&StripeObject), us_bank_account?: (object{account_holder_type: null|string, account_type: null|string, bank_name: null|string, expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate?: Mandate|string, payment_reference: null|string, routing_number: null|string}&StripeObject), wechat?: (object{}&StripeObject), wechat_pay?: (object{fingerprint: null|string, location?: string, reader?: string, transaction_id: null|string}&StripeObject), zip?: (object{}&StripeObject)}&StripeObject) $payment_method_details Information about the Payment Method debited for this payment. * @property (object{custom?: (object{payment_reference: null|string}&StripeObject), type: string}&StripeObject) $processor_details Processor information associated with this payment. * @property string $reported_by Indicates who reported the payment. * @property null|(object{address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), name: null|string, phone: null|string}&StripeObject) $shipping_details Shipping information for this payment. diff --git a/libs/stripe-php/lib/Payout.php b/libs/stripe-php/lib/Payout.php index c9c12a1a4..3a4aeed7e 100644 --- a/libs/stripe-php/lib/Payout.php +++ b/libs/stripe-php/lib/Payout.php @@ -29,7 +29,7 @@ namespace Stripe; * @property null|BalanceTransaction|string $failure_balance_transaction If the payout fails or cancels, this is the ID of the balance transaction that reverses the initial balance transaction and returns the funds from the failed payout back in your balance. * @property null|string $failure_code Error code that provides a reason for a payout failure, if available. View our list of failure codes. * @property null|string $failure_message Message that provides the reason for a payout failure, if available. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property string $method The method used to send this payout, which can be standard or instant. instant is supported for payouts to debit cards and bank accounts in certain countries. Learn more about bank support for Instant Payouts. * @property null|Payout|string $original_payout If the payout reverses another, this is the ID of the original payout. @@ -74,8 +74,8 @@ class Payout extends ApiResource * * If you create a manual payout on a Stripe account that uses multiple payment * source types, you need to specify the source type balance that the payout draws - * from. The balance object details available and - * pending amounts by source type. + * from. The balance object details available + * and pending amounts by source type. * * @param null|array{amount: int, currency: string, description?: string, destination?: string, expand?: string[], metadata?: array, method?: string, payout_method?: string, source_type?: string, statement_descriptor?: string} $params * @param null|array|string $options diff --git a/libs/stripe-php/lib/Plan.php b/libs/stripe-php/lib/Plan.php index 5b211c26b..636c4ecc6 100644 --- a/libs/stripe-php/lib/Plan.php +++ b/libs/stripe-php/lib/Plan.php @@ -24,7 +24,7 @@ namespace Stripe; * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. * @property string $interval The frequency at which a subscription is billed. One of day, week, month or year. * @property int $interval_count The number of intervals (specified in the interval attribute) between subscription billings. For example, interval=month and interval_count=3 bills every 3 months. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|string $meter The meter tracking the usage of a metered price * @property null|string $nickname A brief description of the plan, hidden from customers. diff --git a/libs/stripe-php/lib/Price.php b/libs/stripe-php/lib/Price.php index 17fd2848a..a2ae6b090 100644 --- a/libs/stripe-php/lib/Price.php +++ b/libs/stripe-php/lib/Price.php @@ -20,7 +20,7 @@ namespace Stripe; * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. * @property null|StripeObject $currency_options Prices defined in each available currency option. Each key must be a three-letter ISO currency code and a supported currency. * @property null|(object{maximum: null|int, minimum: null|int, preset: null|int}&StripeObject) $custom_unit_amount When set, provides configuration for the amount to be adjusted by the customer during Checkout Sessions and Payment Links. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|string $lookup_key A lookup key used to retrieve prices dynamically from a static string. This may be up to 200 characters. * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|string $nickname A brief description of the price, hidden from customers. diff --git a/libs/stripe-php/lib/Product.php b/libs/stripe-php/lib/Product.php index e73af652e..9f5423dfd 100644 --- a/libs/stripe-php/lib/Product.php +++ b/libs/stripe-php/lib/Product.php @@ -21,7 +21,7 @@ namespace Stripe; * @property null|Price|string $default_price The ID of the Price object that is the default price for this product. * @property null|string $description The product's description, meant to be displayable to the customer. Use this field to optionally store a long form explanation of the product being sold for your own rendering purposes. * @property string[] $images A list of up to 8 URLs of images for this product, meant to be displayable to the customer. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property (object{name?: string}&StripeObject)[] $marketing_features A list of up to 15 marketing features for this product. These are displayed in pricing tables. * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property string $name The product's name, meant to be displayable to the customer. diff --git a/libs/stripe-php/lib/ProductFeature.php b/libs/stripe-php/lib/ProductFeature.php index a5aac7569..b12923908 100644 --- a/libs/stripe-php/lib/ProductFeature.php +++ b/libs/stripe-php/lib/ProductFeature.php @@ -11,7 +11,7 @@ namespace Stripe; * @property string $id Unique identifier for the object. * @property string $object String representing the object's type. Objects of the same type share the same value. * @property Entitlements\Feature $entitlement_feature A feature represents a monetizable ability or functionality in your system. Features can be assigned to products, and when those products are purchased, Stripe will create an entitlement to the feature for the purchasing customer. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. */ class ProductFeature extends ApiResource { diff --git a/libs/stripe-php/lib/PromotionCode.php b/libs/stripe-php/lib/PromotionCode.php index 260427dca..8c1762762 100644 --- a/libs/stripe-php/lib/PromotionCode.php +++ b/libs/stripe-php/lib/PromotionCode.php @@ -19,7 +19,7 @@ namespace Stripe; * @property null|Customer|string $customer The customer who can use this promotion code. * @property null|string $customer_account The account representing the customer who can use this promotion code. * @property null|int $expires_at Date at which the promotion code can no longer be redeemed. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|int $max_redemptions Maximum number of times this promotion code can be redeemed. * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property (object{coupon: null|Coupon|string, type: string}&StripeObject) $promotion diff --git a/libs/stripe-php/lib/Quote.php b/libs/stripe-php/lib/Quote.php index ec6080426..ed945d15b 100644 --- a/libs/stripe-php/lib/Quote.php +++ b/libs/stripe-php/lib/Quote.php @@ -32,7 +32,7 @@ namespace Stripe; * @property null|Invoice|string $invoice The invoice that was created from this quote. * @property (object{days_until_due: null|int, issuer: (object{account?: Account|string, type: string}&StripeObject)}&StripeObject) $invoice_settings * @property null|Collection $line_items A list of items the customer is being quoted for. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|string $number A unique number that identifies this particular quote. This number is assigned once the quote is finalized. * @property null|Account|string $on_behalf_of The account on behalf of which to charge. See the Connect documentation for details. diff --git a/libs/stripe-php/lib/Radar/EarlyFraudWarning.php b/libs/stripe-php/lib/Radar/EarlyFraudWarning.php index f85b3babc..cdd1775c0 100644 --- a/libs/stripe-php/lib/Radar/EarlyFraudWarning.php +++ b/libs/stripe-php/lib/Radar/EarlyFraudWarning.php @@ -16,7 +16,7 @@ namespace Stripe\Radar; * @property string|\Stripe\Charge $charge ID of the charge this early fraud warning is for, optionally expanded. * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. * @property string $fraud_type The type of fraud labelled by the issuer. One of card_never_received, fraudulent_card_application, made_with_counterfeit_card, made_with_lost_card, made_with_stolen_card, misc, unauthorized_use_of_card. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|string|\Stripe\PaymentIntent $payment_intent ID of the Payment Intent this early fraud warning is for, optionally expanded. */ class EarlyFraudWarning extends \Stripe\ApiResource diff --git a/libs/stripe-php/lib/Radar/PaymentEvaluation.php b/libs/stripe-php/lib/Radar/PaymentEvaluation.php index c41103203..96c24db83 100644 --- a/libs/stripe-php/lib/Radar/PaymentEvaluation.php +++ b/libs/stripe-php/lib/Radar/PaymentEvaluation.php @@ -13,16 +13,20 @@ namespace Stripe\Radar; * @property int $created_at Time at which the object was created. Measured in seconds since the Unix epoch. * @property null|(object{customer: null|string, customer_account: null|string, email: null|string, name: null|string, phone: null|string}&\Stripe\StripeObject) $customer_details Customer details attached to this payment evaluation. * @property null|((object{dispute_opened?: (object{amount: int, currency: string, reason: string}&\Stripe\StripeObject), early_fraud_warning_received?: (object{fraud_type: string}&\Stripe\StripeObject), occurred_at: int, refunded?: (object{amount: int, currency: string, reason: string}&\Stripe\StripeObject), type: string, user_intervention_raised?: (object{custom?: (object{type: string}&\Stripe\StripeObject), key: string, type: string}&\Stripe\StripeObject), user_intervention_resolved?: (object{key: string, outcome: null|string}&\Stripe\StripeObject)}&\Stripe\StripeObject))[] $events Event information associated with the payment evaluation, such as refunds, dispute, early fraud warnings, or user interventions. - * @property (object{evaluated_at: int, fraudulent_dispute: (object{recommended_action: string, risk_score: int}&\Stripe\StripeObject)}&\Stripe\StripeObject) $insights Collection of scores and insights for this payment evaluation. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|(object{merchant_blocked?: (object{reason: string}&\Stripe\StripeObject), payment_intent_id?: string, rejected?: (object{card?: (object{address_line1_check: string, address_postal_code_check: string, cvc_check: string, reason: string}&\Stripe\StripeObject)}&\Stripe\StripeObject), succeeded?: (object{card?: (object{address_line1_check: string, address_postal_code_check: string, cvc_check: string}&\Stripe\StripeObject)}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject) $outcome Indicates the final outcome for the payment evaluation. * @property null|(object{amount: int, currency: string, description: null|string, money_movement_details: null|(object{card: null|(object{customer_presence: null|string, payment_type: null|string}&\Stripe\StripeObject), money_movement_type: string}&\Stripe\StripeObject), payment_method_details: null|(object{billing_details: null|(object{address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject), email: null|string, name: null|string, phone: null|string}&\Stripe\StripeObject), payment_method: string|\Stripe\PaymentMethod}&\Stripe\StripeObject), shipping_details: null|(object{address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject), name: null|string, phone: null|string}&\Stripe\StripeObject), statement_descriptor: null|string}&\Stripe\StripeObject) $payment_details Payment details attached to this payment evaluation. + * @property string $recommended_action Recommended action based on the score of the fraudulent_payment signal. Possible values are block, continue and request_three_d_secure. + * @property (object{fraudulent_payment: (object{evaluated_at: int, risk_level: string, score: float}&\Stripe\StripeObject)}&\Stripe\StripeObject) $signals Collection of signals for this payment evaluation. */ class PaymentEvaluation extends \Stripe\ApiResource { const OBJECT_NAME = 'radar.payment_evaluation'; + const RECOMMENDED_ACTION_BLOCK = 'block'; + const RECOMMENDED_ACTION_CONTINUE = 'continue'; + /** * Request a Radar API fraud risk score from Stripe for a payment before sending it * for external processor authorization. diff --git a/libs/stripe-php/lib/Radar/ValueList.php b/libs/stripe-php/lib/Radar/ValueList.php index 25f0f1c9d..aa26ddcab 100644 --- a/libs/stripe-php/lib/Radar/ValueList.php +++ b/libs/stripe-php/lib/Radar/ValueList.php @@ -14,9 +14,9 @@ namespace Stripe\Radar; * @property string $alias The name of the value list for use in rules. * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. * @property string $created_by The name or email address of the user who created this value list. - * @property string $item_type The type of items in the value list. One of card_fingerprint, card_bin, email, ip_address, country, string, case_sensitive_string, customer_id, sepa_debit_fingerprint, or us_bank_account_fingerprint. + * @property string $item_type The type of items in the value list. One of card_fingerprint, card_bin, crypto_fingerprint, email, ip_address, country, string, case_sensitive_string, customer_id, account, sepa_debit_fingerprint, or us_bank_account_fingerprint. * @property \Stripe\Collection $list_items List of items contained within this value list. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property string $name The name of the value list. */ @@ -26,10 +26,12 @@ class ValueList extends \Stripe\ApiResource use \Stripe\ApiOperations\Update; + const ITEM_TYPE_ACCOUNT = 'account'; const ITEM_TYPE_CARD_BIN = 'card_bin'; const ITEM_TYPE_CARD_FINGERPRINT = 'card_fingerprint'; const ITEM_TYPE_CASE_SENSITIVE_STRING = 'case_sensitive_string'; const ITEM_TYPE_COUNTRY = 'country'; + const ITEM_TYPE_CRYPTO_FINGERPRINT = 'crypto_fingerprint'; const ITEM_TYPE_CUSTOMER_ID = 'customer_id'; const ITEM_TYPE_EMAIL = 'email'; const ITEM_TYPE_IP_ADDRESS = 'ip_address'; diff --git a/libs/stripe-php/lib/Radar/ValueListItem.php b/libs/stripe-php/lib/Radar/ValueListItem.php index 34e64da3b..59f0e0ad1 100644 --- a/libs/stripe-php/lib/Radar/ValueListItem.php +++ b/libs/stripe-php/lib/Radar/ValueListItem.php @@ -13,7 +13,7 @@ namespace Stripe\Radar; * @property string $object String representing the object's type. Objects of the same type share the same value. * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. * @property string $created_by The name or email address of the user who added this item to the value list. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property string $value The value of the item. * @property string $value_list The identifier of the value list this item belongs to. */ diff --git a/libs/stripe-php/lib/Refund.php b/libs/stripe-php/lib/Refund.php index 462dd47a9..83a4377e5 100644 --- a/libs/stripe-php/lib/Refund.php +++ b/libs/stripe-php/lib/Refund.php @@ -19,7 +19,7 @@ namespace Stripe; * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. * @property null|string $description An arbitrary string attached to the object. You can use this for displaying to users (available on non-card refunds only). - * @property null|(object{affirm?: (object{}&StripeObject), afterpay_clearpay?: (object{}&StripeObject), alipay?: (object{}&StripeObject), alma?: (object{}&StripeObject), amazon_pay?: (object{}&StripeObject), au_bank_transfer?: (object{}&StripeObject), blik?: (object{network_decline_code: null|string, reference: null|string, reference_status: null|string}&StripeObject), br_bank_transfer?: (object{reference: null|string, reference_status: null|string}&StripeObject), card?: (object{reference?: string, reference_status?: string, reference_type?: string, type: string}&StripeObject), cashapp?: (object{}&StripeObject), crypto?: (object{reference: null|string}&StripeObject), customer_cash_balance?: (object{}&StripeObject), eps?: (object{}&StripeObject), eu_bank_transfer?: (object{reference: null|string, reference_status: null|string}&StripeObject), gb_bank_transfer?: (object{reference: null|string, reference_status: null|string}&StripeObject), giropay?: (object{}&StripeObject), grabpay?: (object{}&StripeObject), jp_bank_transfer?: (object{reference: null|string, reference_status: null|string}&StripeObject), klarna?: (object{}&StripeObject), mb_way?: (object{reference: null|string, reference_status: null|string}&StripeObject), multibanco?: (object{reference: null|string, reference_status: null|string}&StripeObject), mx_bank_transfer?: (object{reference: null|string, reference_status: null|string}&StripeObject), nz_bank_transfer?: (object{}&StripeObject), p24?: (object{reference: null|string, reference_status: null|string}&StripeObject), paynow?: (object{}&StripeObject), paypal?: (object{network_decline_code: null|string}&StripeObject), pix?: (object{}&StripeObject), revolut?: (object{}&StripeObject), sofort?: (object{}&StripeObject), swish?: (object{network_decline_code: null|string, reference: null|string, reference_status: null|string}&StripeObject), th_bank_transfer?: (object{reference: null|string, reference_status: null|string}&StripeObject), twint?: (object{}&StripeObject), type: string, us_bank_transfer?: (object{reference: null|string, reference_status: null|string}&StripeObject), wechat_pay?: (object{}&StripeObject), zip?: (object{}&StripeObject)}&StripeObject) $destination_details + * @property null|(object{affirm?: (object{}&StripeObject), afterpay_clearpay?: (object{}&StripeObject), alipay?: (object{}&StripeObject), alma?: (object{}&StripeObject), amazon_pay?: (object{}&StripeObject), au_bank_transfer?: (object{}&StripeObject), blik?: (object{network_decline_code: null|string, reference: null|string, reference_status: null|string}&StripeObject), br_bank_transfer?: (object{reference: null|string, reference_status: null|string}&StripeObject), card?: (object{reference?: string, reference_status?: string, reference_type?: string, type: string}&StripeObject), cashapp?: (object{}&StripeObject), crypto?: (object{reference: null|string}&StripeObject), customer_cash_balance?: (object{}&StripeObject), eps?: (object{}&StripeObject), eu_bank_transfer?: (object{reference: null|string, reference_status: null|string}&StripeObject), gb_bank_transfer?: (object{reference: null|string, reference_status: null|string}&StripeObject), giropay?: (object{}&StripeObject), grabpay?: (object{}&StripeObject), jp_bank_transfer?: (object{reference: null|string, reference_status: null|string}&StripeObject), klarna?: (object{}&StripeObject), mb_way?: (object{reference: null|string, reference_status: null|string}&StripeObject), multibanco?: (object{reference: null|string, reference_status: null|string}&StripeObject), mx_bank_transfer?: (object{reference: null|string, reference_status: null|string}&StripeObject), nz_bank_transfer?: (object{}&StripeObject), p24?: (object{reference: null|string, reference_status: null|string}&StripeObject), paynow?: (object{}&StripeObject), paypal?: (object{network_decline_code: null|string}&StripeObject), pix?: (object{}&StripeObject), revolut?: (object{}&StripeObject), scalapay?: (object{}&StripeObject), sofort?: (object{}&StripeObject), swish?: (object{network_decline_code: null|string, reference: null|string, reference_status: null|string}&StripeObject), th_bank_transfer?: (object{reference: null|string, reference_status: null|string}&StripeObject), twint?: (object{}&StripeObject), type: string, us_bank_transfer?: (object{reference: null|string, reference_status: null|string}&StripeObject), wechat_pay?: (object{}&StripeObject), zip?: (object{}&StripeObject)}&StripeObject) $destination_details * @property null|BalanceTransaction|string $failure_balance_transaction After the refund fails, this balance transaction describes the adjustment made on your account balance that reverses the initial balance transaction. * @property null|string $failure_reason Provides the reason for the refund failure. Possible values are: lost_or_stolen_card, expired_or_canceled_card, charge_for_pending_refund_disputed, insufficient_funds, declined, merchant_request, or unknown. * @property null|string $instructions_email For payment methods without native refund support (for example, Konbini, PromptPay), provide an email address for the customer to receive refund instructions. diff --git a/libs/stripe-php/lib/Reporting/ReportType.php b/libs/stripe-php/lib/Reporting/ReportType.php index a3cef8919..b36cfeeb2 100644 --- a/libs/stripe-php/lib/Reporting/ReportType.php +++ b/libs/stripe-php/lib/Reporting/ReportType.php @@ -19,7 +19,7 @@ namespace Stripe\Reporting; * @property int $data_available_end Most recent time for which this Report Type is available. Measured in seconds since the Unix epoch. * @property int $data_available_start Earliest time for which this Report Type is available. Measured in seconds since the Unix epoch. * @property null|string[] $default_columns List of column names that are included by default when this Report Type gets run. (If the Report Type doesn't support the columns parameter, this will be null.) - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property string $name Human-readable name of the Report Type * @property int $updated When this Report Type was latest updated. Measured in seconds since the Unix epoch. * @property int $version Version of the Report Type. Different versions report with the same ID will have the same purpose, but may take different run parameters or have different result schemas. diff --git a/libs/stripe-php/lib/Reserve/Hold.php b/libs/stripe-php/lib/Reserve/Hold.php index 6e4bdb973..ad7e6ee63 100644 --- a/libs/stripe-php/lib/Reserve/Hold.php +++ b/libs/stripe-php/lib/Reserve/Hold.php @@ -15,9 +15,10 @@ namespace Stripe\Reserve; * @property string $created_by Indicates which party created this ReserveHold. * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. * @property null|bool $is_releasable Whether there are any funds available to release on this ReserveHold. Note that if the ReserveHold is in the process of being released, this could be false, even though the funds haven't been fully released yet. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property string $reason The reason for the ReserveHold. + * @property null|(object{amount: int, reserve_release: string}&\Stripe\StripeObject)[] $release_details List of ReserveReleases and the amounts released from this ReserveHold. * @property (object{release_after: null|int, scheduled_release: null|int}&\Stripe\StripeObject) $release_schedule * @property null|Plan|string $reserve_plan The ReservePlan which produced this ReserveHold (i.e., resplan_123) * @property null|string|\Stripe\Charge $source_charge The Charge which funded this ReserveHold (e.g., ch_123) diff --git a/libs/stripe-php/lib/Reserve/Plan.php b/libs/stripe-php/lib/Reserve/Plan.php index 034dd10d7..76e64630c 100644 --- a/libs/stripe-php/lib/Reserve/Plan.php +++ b/libs/stripe-php/lib/Reserve/Plan.php @@ -14,7 +14,7 @@ namespace Stripe\Reserve; * @property null|string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. An unset currency indicates that the plan applies to all currencies. * @property null|int $disabled_at Time at which the ReservePlan was disabled. * @property null|(object{release_after: int, scheduled_release: int}&\Stripe\StripeObject) $fixed_release - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property int $percent The percent of each Charge to reserve. * @property null|(object{days_after_charge: int, expires_on: null|int}&\Stripe\StripeObject) $rolling_release diff --git a/libs/stripe-php/lib/Reserve/Release.php b/libs/stripe-php/lib/Reserve/Release.php index e9bc2d16a..73825fbdd 100644 --- a/libs/stripe-php/lib/Reserve/Release.php +++ b/libs/stripe-php/lib/Reserve/Release.php @@ -13,7 +13,7 @@ namespace Stripe\Reserve; * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. * @property string $created_by Indicates which party created this ReserveRelease. * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property string $reason The reason for the ReserveRelease, indicating why the funds were released. * @property int $released_at The release timestamp of the funds. diff --git a/libs/stripe-php/lib/Review.php b/libs/stripe-php/lib/Review.php index fd29bad9a..c98321a51 100644 --- a/libs/stripe-php/lib/Review.php +++ b/libs/stripe-php/lib/Review.php @@ -18,7 +18,7 @@ namespace Stripe; * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. * @property null|string $ip_address The IP address where the payment originated. * @property null|(object{city: null|string, country: null|string, latitude: null|float, longitude: null|float, region: null|string}&StripeObject) $ip_address_location Information related to the location of the payment. Note that this information is an approximation and attempts to locate the nearest population center - it should not be used to determine a specific address. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property bool $open If true, the review needs action. * @property string $opened_reason The reason the review was opened. One of rule or manual. * @property null|PaymentIntent|string $payment_intent The PaymentIntent ID associated with this review, if one exists. diff --git a/libs/stripe-php/lib/Service/AbstractService.php b/libs/stripe-php/lib/Service/AbstractService.php index 23132a37a..fdafae752 100644 --- a/libs/stripe-php/lib/Service/AbstractService.php +++ b/libs/stripe-php/lib/Service/AbstractService.php @@ -49,18 +49,25 @@ abstract class AbstractService } /** - * Translate null values to empty strings. For service methods, - * we interpret null as a request to unset the field, which - * corresponds to sending an empty string for the field to the - * API. + * Translate null values to empty strings for v1 API requests. + * For v1, we interpret null as a request to unset the field, + * which corresponds to sending an empty string in the + * form-encoded body. + * + * For v2, null values are preserved as-is so they serialize + * to JSON null, which is the v2 mechanism for clearing fields. * * @param null|array $params + * @param 'v1'|'v2' $apiMode */ - private static function formatParams($params) + private static function formatParams($params, $apiMode) { if (null === $params) { return null; } + if ('v2' === $apiMode) { + return $params; + } \array_walk_recursive($params, static function (&$value, $key) { if (null === $value) { $value = ''; @@ -70,24 +77,44 @@ abstract class AbstractService return $params; } - protected function request($method, $path, $params, $opts) + protected function request($method, $path, $params, $opts, $schemas = null) { - return $this->getClient()->request($method, $path, self::formatParams($params), $opts); + $apiMode = \Stripe\Util\Util::getApiMode($path); + $params = self::formatParams($params, $apiMode); + if (null !== $schemas && isset($schemas['request_schema'])) { + $params = \Stripe\Util\Int64::coerceRequestParams($params, $schemas['request_schema']); + } + + return $this->getClient()->request($method, $path, $params, $opts); } protected function requestStream($method, $path, $readBodyChunkCallable, $params, $opts) { - return $this->getStreamingClient()->requestStream($method, $path, $readBodyChunkCallable, self::formatParams($params), $opts); + $apiMode = \Stripe\Util\Util::getApiMode($path); + + return $this->getStreamingClient()->requestStream($method, $path, $readBodyChunkCallable, self::formatParams($params, $apiMode), $opts); } - protected function requestCollection($method, $path, $params, $opts) + protected function requestCollection($method, $path, $params, $opts, $schemas = null) { - return $this->getClient()->requestCollection($method, $path, self::formatParams($params), $opts); + $apiMode = \Stripe\Util\Util::getApiMode($path); + $params = self::formatParams($params, $apiMode); + if (null !== $schemas && isset($schemas['request_schema'])) { + $params = \Stripe\Util\Int64::coerceRequestParams($params, $schemas['request_schema']); + } + + return $this->getClient()->requestCollection($method, $path, $params, $opts); } - protected function requestSearchResult($method, $path, $params, $opts) + protected function requestSearchResult($method, $path, $params, $opts, $schemas = null) { - return $this->getClient()->requestSearchResult($method, $path, self::formatParams($params), $opts); + $apiMode = \Stripe\Util\Util::getApiMode($path); + $params = self::formatParams($params, $apiMode); + if (null !== $schemas && isset($schemas['request_schema'])) { + $params = \Stripe\Util\Int64::coerceRequestParams($params, $schemas['request_schema']); + } + + return $this->getClient()->requestSearchResult($method, $path, $params, $opts); } protected function buildPath($basePath, ...$ids) diff --git a/libs/stripe-php/lib/Service/AccountService.php b/libs/stripe-php/lib/Service/AccountService.php index b69760dd8..176ca719c 100644 --- a/libs/stripe-php/lib/Service/AccountService.php +++ b/libs/stripe-php/lib/Service/AccountService.php @@ -91,7 +91,7 @@ class AccountService extends AbstractService * information during account onboarding. You can prefill any information on the * account. * - * @param null|array{account_token?: string, business_profile?: array{annual_revenue?: array{amount: int, currency: string, fiscal_year_end: string}, estimated_worker_count?: int, mcc?: string, minority_owned_business_designation?: string[], monthly_estimated_revenue?: array{amount: int, currency: string}, name?: string, product_description?: string, support_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, support_email?: string, support_phone?: string, support_url?: null|string, url?: string}, business_type?: string, capabilities?: array{acss_debit_payments?: array{requested?: bool}, affirm_payments?: array{requested?: bool}, afterpay_clearpay_payments?: array{requested?: bool}, alma_payments?: array{requested?: bool}, amazon_pay_payments?: array{requested?: bool}, au_becs_debit_payments?: array{requested?: bool}, bacs_debit_payments?: array{requested?: bool}, bancontact_payments?: array{requested?: bool}, bank_transfer_payments?: array{requested?: bool}, billie_payments?: array{requested?: bool}, blik_payments?: array{requested?: bool}, boleto_payments?: array{requested?: bool}, card_issuing?: array{requested?: bool}, card_payments?: array{requested?: bool}, cartes_bancaires_payments?: array{requested?: bool}, cashapp_payments?: array{requested?: bool}, crypto_payments?: array{requested?: bool}, eps_payments?: array{requested?: bool}, fpx_payments?: array{requested?: bool}, gb_bank_transfer_payments?: array{requested?: bool}, giropay_payments?: array{requested?: bool}, grabpay_payments?: array{requested?: bool}, ideal_payments?: array{requested?: bool}, india_international_payments?: array{requested?: bool}, jcb_payments?: array{requested?: bool}, jp_bank_transfer_payments?: array{requested?: bool}, kakao_pay_payments?: array{requested?: bool}, klarna_payments?: array{requested?: bool}, konbini_payments?: array{requested?: bool}, kr_card_payments?: array{requested?: bool}, legacy_payments?: array{requested?: bool}, link_payments?: array{requested?: bool}, mb_way_payments?: array{requested?: bool}, mobilepay_payments?: array{requested?: bool}, multibanco_payments?: array{requested?: bool}, mx_bank_transfer_payments?: array{requested?: bool}, naver_pay_payments?: array{requested?: bool}, nz_bank_account_becs_debit_payments?: array{requested?: bool}, oxxo_payments?: array{requested?: bool}, p24_payments?: array{requested?: bool}, pay_by_bank_payments?: array{requested?: bool}, payco_payments?: array{requested?: bool}, paynow_payments?: array{requested?: bool}, payto_payments?: array{requested?: bool}, pix_payments?: array{requested?: bool}, promptpay_payments?: array{requested?: bool}, revolut_pay_payments?: array{requested?: bool}, samsung_pay_payments?: array{requested?: bool}, satispay_payments?: array{requested?: bool}, sepa_bank_transfer_payments?: array{requested?: bool}, sepa_debit_payments?: array{requested?: bool}, sofort_payments?: array{requested?: bool}, swish_payments?: array{requested?: bool}, tax_reporting_us_1099_k?: array{requested?: bool}, tax_reporting_us_1099_misc?: array{requested?: bool}, transfers?: array{requested?: bool}, treasury?: array{requested?: bool}, twint_payments?: array{requested?: bool}, us_bank_account_ach_payments?: array{requested?: bool}, us_bank_transfer_payments?: array{requested?: bool}, zip_payments?: array{requested?: bool}}, company?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, directors_provided?: bool, directorship_declaration?: array{date?: int, ip?: string, user_agent?: string}, executives_provided?: bool, export_license_id?: string, export_purpose_code?: string, name?: string, name_kana?: string, name_kanji?: string, owners_provided?: bool, ownership_declaration?: array{date?: int, ip?: string, user_agent?: string}, ownership_exemption_reason?: null|string, phone?: string, registration_date?: null|array{day: int, month: int, year: int}, registration_number?: string, representative_declaration?: array{date?: int, ip?: string, user_agent?: string}, structure?: null|string, tax_id?: string, tax_id_registrar?: string, vat_id?: string, verification?: array{document?: array{back?: string, front?: string}}}, controller?: array{fees?: array{payer?: string}, losses?: array{payments?: string}, requirement_collection?: string, stripe_dashboard?: array{type?: string}}, country?: string, default_currency?: string, documents?: array{bank_account_ownership_verification?: array{files?: string[]}, company_license?: array{files?: string[]}, company_memorandum_of_association?: array{files?: string[]}, company_ministerial_decree?: array{files?: string[]}, company_registration_verification?: array{files?: string[]}, company_tax_id_verification?: array{files?: string[]}, proof_of_address?: array{files?: string[]}, proof_of_registration?: array{files?: string[], signer?: array{person?: string}}, proof_of_ultimate_beneficial_ownership?: array{files?: string[], signer?: array{person?: string}}}, email?: string, expand?: string[], external_account?: array|string, groups?: array{payments_pricing?: null|string}, individual?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, dob?: null|array{day: int, month: int, year: int}, email?: string, first_name?: string, first_name_kana?: string, first_name_kanji?: string, full_name_aliases?: null|string[], gender?: string, id_number?: string, id_number_secondary?: string, last_name?: string, last_name_kana?: string, last_name_kanji?: string, maiden_name?: string, metadata?: null|array, phone?: string, political_exposure?: string, registered_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, relationship?: array{director?: bool, executive?: bool, owner?: bool, percent_ownership?: null|float, title?: string}, ssn_last_4?: string, verification?: array{additional_document?: array{back?: string, front?: string}, document?: array{back?: string, front?: string}}}, metadata?: null|array, settings?: array{bacs_debit_payments?: array{display_name?: string}, branding?: array{icon?: string, logo?: string, primary_color?: string, secondary_color?: string}, card_issuing?: array{tos_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}, card_payments?: array{decline_on?: array{avs_failure?: bool, cvc_failure?: bool}, statement_descriptor_prefix?: string, statement_descriptor_prefix_kana?: null|string, statement_descriptor_prefix_kanji?: null|string}, invoices?: array{hosted_payment_method_save?: string}, payments?: array{statement_descriptor?: string, statement_descriptor_kana?: string, statement_descriptor_kanji?: string}, payouts?: array{debit_negative_balances?: bool, schedule?: array{delay_days?: array|int|string, interval?: string, monthly_anchor?: int, monthly_payout_days?: int[], weekly_anchor?: string, weekly_payout_days?: string[]}, statement_descriptor?: string}, treasury?: array{tos_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}}, tos_acceptance?: array{date?: int, ip?: string, service_agreement?: string, user_agent?: string}, type?: string} $params + * @param null|array{account_token?: string, business_profile?: array{annual_revenue?: array{amount: int, currency: string, fiscal_year_end: string}, estimated_worker_count?: int, mcc?: string, minority_owned_business_designation?: string[], monthly_estimated_revenue?: array{amount: int, currency: string}, name?: string, product_description?: string, support_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, support_email?: string, support_phone?: string, support_url?: null|string, url?: string}, business_type?: string, capabilities?: array{acss_debit_payments?: array{requested?: bool}, affirm_payments?: array{requested?: bool}, afterpay_clearpay_payments?: array{requested?: bool}, alma_payments?: array{requested?: bool}, amazon_pay_payments?: array{requested?: bool}, app_distribution?: array{requested?: bool}, au_becs_debit_payments?: array{requested?: bool}, bacs_debit_payments?: array{requested?: bool}, bancontact_payments?: array{requested?: bool}, bank_transfer_payments?: array{requested?: bool}, billie_payments?: array{requested?: bool}, bizum_payments?: array{requested?: bool}, blik_payments?: array{requested?: bool}, boleto_payments?: array{requested?: bool}, card_issuing?: array{requested?: bool}, card_payments?: array{requested?: bool}, cartes_bancaires_payments?: array{requested?: bool}, cashapp_payments?: array{requested?: bool}, crypto_payments?: array{requested?: bool}, eps_payments?: array{requested?: bool}, fpx_payments?: array{requested?: bool}, gb_bank_transfer_payments?: array{requested?: bool}, giropay_payments?: array{requested?: bool}, grabpay_payments?: array{requested?: bool}, ideal_payments?: array{requested?: bool}, india_international_payments?: array{requested?: bool}, jcb_payments?: array{requested?: bool}, jp_bank_transfer_payments?: array{requested?: bool}, kakao_pay_payments?: array{requested?: bool}, klarna_payments?: array{requested?: bool}, konbini_payments?: array{requested?: bool}, kr_card_payments?: array{requested?: bool}, legacy_payments?: array{requested?: bool}, link_payments?: array{requested?: bool}, mb_way_payments?: array{requested?: bool}, mobilepay_payments?: array{requested?: bool}, multibanco_payments?: array{requested?: bool}, mx_bank_transfer_payments?: array{requested?: bool}, naver_pay_payments?: array{requested?: bool}, nz_bank_account_becs_debit_payments?: array{requested?: bool}, oxxo_payments?: array{requested?: bool}, p24_payments?: array{requested?: bool}, pay_by_bank_payments?: array{requested?: bool}, payco_payments?: array{requested?: bool}, paynow_payments?: array{requested?: bool}, payto_payments?: array{requested?: bool}, pix_payments?: array{requested?: bool}, promptpay_payments?: array{requested?: bool}, revolut_pay_payments?: array{requested?: bool}, samsung_pay_payments?: array{requested?: bool}, satispay_payments?: array{requested?: bool}, scalapay_payments?: array{requested?: bool}, sepa_bank_transfer_payments?: array{requested?: bool}, sepa_debit_payments?: array{requested?: bool}, sofort_payments?: array{requested?: bool}, sunbit_payments?: array{requested?: bool}, swish_payments?: array{requested?: bool}, tax_reporting_us_1099_k?: array{requested?: bool}, tax_reporting_us_1099_misc?: array{requested?: bool}, transfers?: array{requested?: bool}, treasury?: array{requested?: bool}, twint_payments?: array{requested?: bool}, upi_payments?: array{requested?: bool}, us_bank_account_ach_payments?: array{requested?: bool}, us_bank_transfer_payments?: array{requested?: bool}, zip_payments?: array{requested?: bool}}, company?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, directors_provided?: bool, directorship_declaration?: array{date?: int, ip?: string, user_agent?: string}, executives_provided?: bool, export_license_id?: string, export_purpose_code?: string, name?: string, name_kana?: string, name_kanji?: string, owners_provided?: bool, ownership_declaration?: array{date?: int, ip?: string, user_agent?: string}, ownership_exemption_reason?: null|string, phone?: string, registration_date?: null|array{day: int, month: int, year: int}, registration_number?: string, representative_declaration?: array{date?: int, ip?: string, user_agent?: string}, structure?: null|string, tax_id?: string, tax_id_registrar?: string, vat_id?: string, verification?: array{document?: array{back?: string, front?: string}}}, controller?: array{fees?: array{payer?: string}, losses?: array{payments?: string}, requirement_collection?: string, stripe_dashboard?: array{type?: string}}, country?: string, default_currency?: string, documents?: array{bank_account_ownership_verification?: array{files?: string[]}, company_license?: array{files?: string[]}, company_memorandum_of_association?: array{files?: string[]}, company_ministerial_decree?: array{files?: string[]}, company_registration_verification?: array{files?: string[]}, company_tax_id_verification?: array{files?: string[]}, proof_of_address?: array{files?: string[]}, proof_of_registration?: array{files?: string[], signer?: array{person?: string}}, proof_of_ultimate_beneficial_ownership?: array{files?: string[], signer?: array{person?: string}}}, email?: string, expand?: string[], external_account?: array|string, groups?: array{payments_pricing?: null|string}, individual?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, dob?: null|array{day: int, month: int, year: int}, email?: string, first_name?: string, first_name_kana?: string, first_name_kanji?: string, full_name_aliases?: null|string[], gender?: string, id_number?: string, id_number_secondary?: string, last_name?: string, last_name_kana?: string, last_name_kanji?: string, maiden_name?: string, metadata?: null|array, phone?: string, political_exposure?: string, registered_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, relationship?: array{director?: bool, executive?: bool, owner?: bool, percent_ownership?: null|float, title?: string}, ssn_last_4?: string, verification?: array{additional_document?: array{back?: string, front?: string}, document?: array{back?: string, front?: string}}}, metadata?: null|array, settings?: array{bacs_debit_payments?: array{display_name?: string}, branding?: array{icon?: string, logo?: string, primary_color?: string, secondary_color?: string}, card_issuing?: array{tos_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}, card_payments?: array{decline_on?: array{avs_failure?: bool, cvc_failure?: bool}, statement_descriptor_prefix?: string, statement_descriptor_prefix_kana?: null|string, statement_descriptor_prefix_kanji?: null|string}, invoices?: array{hosted_payment_method_save?: string}, payments?: array{statement_descriptor?: string, statement_descriptor_kana?: string, statement_descriptor_kanji?: string}, payouts?: array{debit_negative_balances?: bool, schedule?: array{delay_days?: array|int|string, interval?: string, monthly_anchor?: int, monthly_payout_days?: int[], weekly_anchor?: string, weekly_payout_days?: string[]}, statement_descriptor?: string}, treasury?: array{tos_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}}, tos_acceptance?: array{date?: int, ip?: string, service_agreement?: string, user_agent?: string}, type?: string} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\Account @@ -315,7 +315,7 @@ class AccountService extends AbstractService * more about updating accounts. * * @param string $id - * @param null|array{account_token?: string, business_profile?: array{annual_revenue?: array{amount: int, currency: string, fiscal_year_end: string}, estimated_worker_count?: int, mcc?: string, minority_owned_business_designation?: string[], monthly_estimated_revenue?: array{amount: int, currency: string}, name?: string, product_description?: string, support_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, support_email?: string, support_phone?: string, support_url?: null|string, url?: string}, business_type?: string, capabilities?: array{acss_debit_payments?: array{requested?: bool}, affirm_payments?: array{requested?: bool}, afterpay_clearpay_payments?: array{requested?: bool}, alma_payments?: array{requested?: bool}, amazon_pay_payments?: array{requested?: bool}, au_becs_debit_payments?: array{requested?: bool}, bacs_debit_payments?: array{requested?: bool}, bancontact_payments?: array{requested?: bool}, bank_transfer_payments?: array{requested?: bool}, billie_payments?: array{requested?: bool}, blik_payments?: array{requested?: bool}, boleto_payments?: array{requested?: bool}, card_issuing?: array{requested?: bool}, card_payments?: array{requested?: bool}, cartes_bancaires_payments?: array{requested?: bool}, cashapp_payments?: array{requested?: bool}, crypto_payments?: array{requested?: bool}, eps_payments?: array{requested?: bool}, fpx_payments?: array{requested?: bool}, gb_bank_transfer_payments?: array{requested?: bool}, giropay_payments?: array{requested?: bool}, grabpay_payments?: array{requested?: bool}, ideal_payments?: array{requested?: bool}, india_international_payments?: array{requested?: bool}, jcb_payments?: array{requested?: bool}, jp_bank_transfer_payments?: array{requested?: bool}, kakao_pay_payments?: array{requested?: bool}, klarna_payments?: array{requested?: bool}, konbini_payments?: array{requested?: bool}, kr_card_payments?: array{requested?: bool}, legacy_payments?: array{requested?: bool}, link_payments?: array{requested?: bool}, mb_way_payments?: array{requested?: bool}, mobilepay_payments?: array{requested?: bool}, multibanco_payments?: array{requested?: bool}, mx_bank_transfer_payments?: array{requested?: bool}, naver_pay_payments?: array{requested?: bool}, nz_bank_account_becs_debit_payments?: array{requested?: bool}, oxxo_payments?: array{requested?: bool}, p24_payments?: array{requested?: bool}, pay_by_bank_payments?: array{requested?: bool}, payco_payments?: array{requested?: bool}, paynow_payments?: array{requested?: bool}, payto_payments?: array{requested?: bool}, pix_payments?: array{requested?: bool}, promptpay_payments?: array{requested?: bool}, revolut_pay_payments?: array{requested?: bool}, samsung_pay_payments?: array{requested?: bool}, satispay_payments?: array{requested?: bool}, sepa_bank_transfer_payments?: array{requested?: bool}, sepa_debit_payments?: array{requested?: bool}, sofort_payments?: array{requested?: bool}, swish_payments?: array{requested?: bool}, tax_reporting_us_1099_k?: array{requested?: bool}, tax_reporting_us_1099_misc?: array{requested?: bool}, transfers?: array{requested?: bool}, treasury?: array{requested?: bool}, twint_payments?: array{requested?: bool}, us_bank_account_ach_payments?: array{requested?: bool}, us_bank_transfer_payments?: array{requested?: bool}, zip_payments?: array{requested?: bool}}, company?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, directors_provided?: bool, directorship_declaration?: array{date?: int, ip?: string, user_agent?: string}, executives_provided?: bool, export_license_id?: string, export_purpose_code?: string, name?: string, name_kana?: string, name_kanji?: string, owners_provided?: bool, ownership_declaration?: array{date?: int, ip?: string, user_agent?: string}, ownership_exemption_reason?: null|string, phone?: string, registration_date?: null|array{day: int, month: int, year: int}, registration_number?: string, representative_declaration?: array{date?: int, ip?: string, user_agent?: string}, structure?: null|string, tax_id?: string, tax_id_registrar?: string, vat_id?: string, verification?: array{document?: array{back?: string, front?: string}}}, default_currency?: string, documents?: array{bank_account_ownership_verification?: array{files?: string[]}, company_license?: array{files?: string[]}, company_memorandum_of_association?: array{files?: string[]}, company_ministerial_decree?: array{files?: string[]}, company_registration_verification?: array{files?: string[]}, company_tax_id_verification?: array{files?: string[]}, proof_of_address?: array{files?: string[]}, proof_of_registration?: array{files?: string[], signer?: array{person?: string}}, proof_of_ultimate_beneficial_ownership?: array{files?: string[], signer?: array{person?: string}}}, email?: string, expand?: string[], external_account?: null|array|string, groups?: array{payments_pricing?: null|string}, individual?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, dob?: null|array{day: int, month: int, year: int}, email?: string, first_name?: string, first_name_kana?: string, first_name_kanji?: string, full_name_aliases?: null|string[], gender?: string, id_number?: string, id_number_secondary?: string, last_name?: string, last_name_kana?: string, last_name_kanji?: string, maiden_name?: string, metadata?: null|array, phone?: string, political_exposure?: string, registered_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, relationship?: array{director?: bool, executive?: bool, owner?: bool, percent_ownership?: null|float, title?: string}, ssn_last_4?: string, verification?: array{additional_document?: array{back?: string, front?: string}, document?: array{back?: string, front?: string}}}, metadata?: null|array, settings?: array{bacs_debit_payments?: array{display_name?: string}, branding?: array{icon?: string, logo?: string, primary_color?: string, secondary_color?: string}, card_issuing?: array{tos_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}, card_payments?: array{decline_on?: array{avs_failure?: bool, cvc_failure?: bool}, statement_descriptor_prefix?: string, statement_descriptor_prefix_kana?: null|string, statement_descriptor_prefix_kanji?: null|string}, invoices?: array{default_account_tax_ids?: null|string[], hosted_payment_method_save?: string}, payments?: array{statement_descriptor?: string, statement_descriptor_kana?: string, statement_descriptor_kanji?: string}, payouts?: array{debit_negative_balances?: bool, schedule?: array{delay_days?: array|int|string, interval?: string, monthly_anchor?: int, monthly_payout_days?: int[], weekly_anchor?: string, weekly_payout_days?: string[]}, statement_descriptor?: string}, treasury?: array{tos_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}}, tos_acceptance?: array{date?: int, ip?: string, service_agreement?: string, user_agent?: string}} $params + * @param null|array{account_token?: string, business_profile?: array{annual_revenue?: array{amount: int, currency: string, fiscal_year_end: string}, estimated_worker_count?: int, mcc?: string, minority_owned_business_designation?: string[], monthly_estimated_revenue?: array{amount: int, currency: string}, name?: string, product_description?: string, support_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, support_email?: string, support_phone?: string, support_url?: null|string, url?: string}, business_type?: string, capabilities?: array{acss_debit_payments?: array{requested?: bool}, affirm_payments?: array{requested?: bool}, afterpay_clearpay_payments?: array{requested?: bool}, alma_payments?: array{requested?: bool}, amazon_pay_payments?: array{requested?: bool}, app_distribution?: array{requested?: bool}, au_becs_debit_payments?: array{requested?: bool}, bacs_debit_payments?: array{requested?: bool}, bancontact_payments?: array{requested?: bool}, bank_transfer_payments?: array{requested?: bool}, billie_payments?: array{requested?: bool}, bizum_payments?: array{requested?: bool}, blik_payments?: array{requested?: bool}, boleto_payments?: array{requested?: bool}, card_issuing?: array{requested?: bool}, card_payments?: array{requested?: bool}, cartes_bancaires_payments?: array{requested?: bool}, cashapp_payments?: array{requested?: bool}, crypto_payments?: array{requested?: bool}, eps_payments?: array{requested?: bool}, fpx_payments?: array{requested?: bool}, gb_bank_transfer_payments?: array{requested?: bool}, giropay_payments?: array{requested?: bool}, grabpay_payments?: array{requested?: bool}, ideal_payments?: array{requested?: bool}, india_international_payments?: array{requested?: bool}, jcb_payments?: array{requested?: bool}, jp_bank_transfer_payments?: array{requested?: bool}, kakao_pay_payments?: array{requested?: bool}, klarna_payments?: array{requested?: bool}, konbini_payments?: array{requested?: bool}, kr_card_payments?: array{requested?: bool}, legacy_payments?: array{requested?: bool}, link_payments?: array{requested?: bool}, mb_way_payments?: array{requested?: bool}, mobilepay_payments?: array{requested?: bool}, multibanco_payments?: array{requested?: bool}, mx_bank_transfer_payments?: array{requested?: bool}, naver_pay_payments?: array{requested?: bool}, nz_bank_account_becs_debit_payments?: array{requested?: bool}, oxxo_payments?: array{requested?: bool}, p24_payments?: array{requested?: bool}, pay_by_bank_payments?: array{requested?: bool}, payco_payments?: array{requested?: bool}, paynow_payments?: array{requested?: bool}, payto_payments?: array{requested?: bool}, pix_payments?: array{requested?: bool}, promptpay_payments?: array{requested?: bool}, revolut_pay_payments?: array{requested?: bool}, samsung_pay_payments?: array{requested?: bool}, satispay_payments?: array{requested?: bool}, scalapay_payments?: array{requested?: bool}, sepa_bank_transfer_payments?: array{requested?: bool}, sepa_debit_payments?: array{requested?: bool}, sofort_payments?: array{requested?: bool}, sunbit_payments?: array{requested?: bool}, swish_payments?: array{requested?: bool}, tax_reporting_us_1099_k?: array{requested?: bool}, tax_reporting_us_1099_misc?: array{requested?: bool}, transfers?: array{requested?: bool}, treasury?: array{requested?: bool}, twint_payments?: array{requested?: bool}, upi_payments?: array{requested?: bool}, us_bank_account_ach_payments?: array{requested?: bool}, us_bank_transfer_payments?: array{requested?: bool}, zip_payments?: array{requested?: bool}}, company?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, directors_provided?: bool, directorship_declaration?: array{date?: int, ip?: string, user_agent?: string}, executives_provided?: bool, export_license_id?: string, export_purpose_code?: string, name?: string, name_kana?: string, name_kanji?: string, owners_provided?: bool, ownership_declaration?: array{date?: int, ip?: string, user_agent?: string}, ownership_exemption_reason?: null|string, phone?: string, registration_date?: null|array{day: int, month: int, year: int}, registration_number?: string, representative_declaration?: array{date?: int, ip?: string, user_agent?: string}, structure?: null|string, tax_id?: string, tax_id_registrar?: string, vat_id?: string, verification?: array{document?: array{back?: string, front?: string}}}, default_currency?: string, documents?: array{bank_account_ownership_verification?: array{files?: string[]}, company_license?: array{files?: string[]}, company_memorandum_of_association?: array{files?: string[]}, company_ministerial_decree?: array{files?: string[]}, company_registration_verification?: array{files?: string[]}, company_tax_id_verification?: array{files?: string[]}, proof_of_address?: array{files?: string[]}, proof_of_registration?: array{files?: string[], signer?: array{person?: string}}, proof_of_ultimate_beneficial_ownership?: array{files?: string[], signer?: array{person?: string}}}, email?: string, expand?: string[], external_account?: null|array|string, groups?: array{payments_pricing?: null|string}, individual?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, dob?: null|array{day: int, month: int, year: int}, email?: string, first_name?: string, first_name_kana?: string, first_name_kanji?: string, full_name_aliases?: null|string[], gender?: string, id_number?: string, id_number_secondary?: string, last_name?: string, last_name_kana?: string, last_name_kanji?: string, maiden_name?: string, metadata?: null|array, phone?: string, political_exposure?: string, registered_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, relationship?: array{director?: bool, executive?: bool, owner?: bool, percent_ownership?: null|float, title?: string}, ssn_last_4?: string, verification?: array{additional_document?: array{back?: string, front?: string}, document?: array{back?: string, front?: string}}}, metadata?: null|array, settings?: array{bacs_debit_payments?: array{display_name?: string}, branding?: array{icon?: string, logo?: string, primary_color?: string, secondary_color?: string}, card_issuing?: array{tos_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}, card_payments?: array{decline_on?: array{avs_failure?: bool, cvc_failure?: bool}, statement_descriptor_prefix?: string, statement_descriptor_prefix_kana?: null|string, statement_descriptor_prefix_kanji?: null|string}, invoices?: array{default_account_tax_ids?: null|string[], hosted_payment_method_save?: string}, payments?: array{statement_descriptor?: string, statement_descriptor_kana?: string, statement_descriptor_kanji?: string}, payouts?: array{debit_negative_balances?: bool, schedule?: array{delay_days?: array|int|string, interval?: string, monthly_anchor?: int, monthly_payout_days?: int[], weekly_anchor?: string, weekly_payout_days?: string[]}, statement_descriptor?: string}, treasury?: array{tos_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}}, tos_acceptance?: array{date?: int, ip?: string, service_agreement?: string, user_agent?: string}} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\Account diff --git a/libs/stripe-php/lib/Service/AccountSessionService.php b/libs/stripe-php/lib/Service/AccountSessionService.php index f16182d42..c0bc154bf 100644 --- a/libs/stripe-php/lib/Service/AccountSessionService.php +++ b/libs/stripe-php/lib/Service/AccountSessionService.php @@ -15,7 +15,7 @@ class AccountSessionService extends AbstractService * Creates a AccountSession object that includes a single-use token that the * platform can use on their front-end to grant client-side API access. * - * @param null|array{account: string, components: array{account_management?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, external_account_collection?: bool}}, account_onboarding?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, external_account_collection?: bool}}, balances?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, edit_payout_schedule?: bool, external_account_collection?: bool, instant_payouts?: bool, standard_payouts?: bool}}, disputes_list?: array{enabled: bool, features?: array{capture_payments?: bool, destination_on_behalf_of_charge_management?: bool, dispute_management?: bool, refund_management?: bool}}, documents?: array{enabled: bool, features?: array{}}, financial_account?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, external_account_collection?: bool, send_money?: bool, transfer_balance?: bool}}, financial_account_transactions?: array{enabled: bool, features?: array{card_spend_dispute_management?: bool}}, instant_payouts_promotion?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, external_account_collection?: bool, instant_payouts?: bool}}, issuing_card?: array{enabled: bool, features?: array{card_management?: bool, card_spend_dispute_management?: bool, cardholder_management?: bool, spend_control_management?: bool}}, issuing_cards_list?: array{enabled: bool, features?: array{card_management?: bool, card_spend_dispute_management?: bool, cardholder_management?: bool, disable_stripe_user_authentication?: bool, spend_control_management?: bool}}, notification_banner?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, external_account_collection?: bool}}, payment_details?: array{enabled: bool, features?: array{capture_payments?: bool, destination_on_behalf_of_charge_management?: bool, dispute_management?: bool, refund_management?: bool}}, payment_disputes?: array{enabled: bool, features?: array{destination_on_behalf_of_charge_management?: bool, dispute_management?: bool, refund_management?: bool}}, payments?: array{enabled: bool, features?: array{capture_payments?: bool, destination_on_behalf_of_charge_management?: bool, dispute_management?: bool, refund_management?: bool}}, payout_details?: array{enabled: bool, features?: array{}}, payouts?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, edit_payout_schedule?: bool, external_account_collection?: bool, instant_payouts?: bool, standard_payouts?: bool}}, payouts_list?: array{enabled: bool, features?: array{}}, tax_registrations?: array{enabled: bool, features?: array{}}, tax_settings?: array{enabled: bool, features?: array{}}}, expand?: string[]} $params + * @param null|array{account: string, components: array{account_management?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, external_account_collection?: bool}}, account_onboarding?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, external_account_collection?: bool}}, balance_report?: array{enabled: bool, features?: array{}}, balances?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, edit_payout_schedule?: bool, external_account_collection?: bool, instant_payouts?: bool, standard_payouts?: bool}}, disputes_list?: array{enabled: bool, features?: array{capture_payments?: bool, destination_on_behalf_of_charge_management?: bool, dispute_management?: bool, refund_management?: bool}}, documents?: array{enabled: bool, features?: array{}}, financial_account?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, external_account_collection?: bool, send_money?: bool, transfer_balance?: bool}}, financial_account_transactions?: array{enabled: bool, features?: array{card_spend_dispute_management?: bool}}, instant_payouts_promotion?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, external_account_collection?: bool, instant_payouts?: bool}}, issuing_card?: array{enabled: bool, features?: array{card_management?: bool, card_spend_dispute_management?: bool, cardholder_management?: bool, spend_control_management?: bool}}, issuing_cards_list?: array{enabled: bool, features?: array{card_management?: bool, card_spend_dispute_management?: bool, cardholder_management?: bool, disable_stripe_user_authentication?: bool, spend_control_management?: bool}}, notification_banner?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, external_account_collection?: bool}}, payment_details?: array{enabled: bool, features?: array{capture_payments?: bool, destination_on_behalf_of_charge_management?: bool, dispute_management?: bool, refund_management?: bool}}, payment_disputes?: array{enabled: bool, features?: array{destination_on_behalf_of_charge_management?: bool, dispute_management?: bool, refund_management?: bool}}, payments?: array{enabled: bool, features?: array{capture_payments?: bool, destination_on_behalf_of_charge_management?: bool, dispute_management?: bool, refund_management?: bool}}, payout_details?: array{enabled: bool, features?: array{}}, payout_reconciliation_report?: array{enabled: bool, features?: array{}}, payouts?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, edit_payout_schedule?: bool, external_account_collection?: bool, instant_payouts?: bool, standard_payouts?: bool}}, payouts_list?: array{enabled: bool, features?: array{}}, tax_registrations?: array{enabled: bool, features?: array{}}, tax_settings?: array{enabled: bool, features?: array{}}}, expand?: string[]} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\AccountSession diff --git a/libs/stripe-php/lib/Service/BalanceSettingsService.php b/libs/stripe-php/lib/Service/BalanceSettingsService.php index 2908492c3..c0ce287c5 100644 --- a/libs/stripe-php/lib/Service/BalanceSettingsService.php +++ b/libs/stripe-php/lib/Service/BalanceSettingsService.php @@ -31,7 +31,7 @@ class BalanceSettingsService extends AbstractService * Updates balance settings for a given connected account. Related guide: Making API calls for connected accounts. * - * @param null|array{expand?: string[], payments?: array{debit_negative_balances?: bool, payouts?: array{minimum_balance_by_currency?: null|array, schedule?: array{interval?: string, monthly_payout_days?: int[], weekly_payout_days?: string[]}, statement_descriptor?: string}, settlement_timing?: array{delay_days_override?: null|int}}} $params + * @param null|array{expand?: string[], payments?: array{debit_negative_balances?: bool, payouts?: array{automatic_transfer_rules_by_currency?: null|array, minimum_balance_by_currency?: null|array, schedule?: array{interval?: string, monthly_payout_days?: int[], weekly_payout_days?: string[]}, statement_descriptor?: string}, settlement_timing?: array{delay_days_override?: null|int, start_of_day?: null|array{hour?: int, minutes?: int, timezone?: string}}}} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\BalanceSettings diff --git a/libs/stripe-php/lib/Service/BalanceTransactionService.php b/libs/stripe-php/lib/Service/BalanceTransactionService.php index d00ea6c6a..1877d61f2 100644 --- a/libs/stripe-php/lib/Service/BalanceTransactionService.php +++ b/libs/stripe-php/lib/Service/BalanceTransactionService.php @@ -13,11 +13,11 @@ class BalanceTransactionService extends AbstractService { /** * Returns a list of transactions that have contributed to the Stripe account - * balance (e.g., charges, transfers, and so forth). The transactions are returned - * in sorted order, with the most recent transactions appearing first. + * balance (for example, charges, transfers, and so on). The transactions return in + * sorted order, with the most recent transactions appearing first. * - * Note that this endpoint was previously called “Balance history” and used the - * path /v1/balance/history. + * The previous name of this endpoint was “Balance history,” and it used the path + * /v1/balance/history. * * @param null|array{created?: array|int, currency?: string, ending_before?: string, expand?: string[], limit?: int, payout?: string, source?: string, starting_after?: string, type?: string} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts diff --git a/libs/stripe-php/lib/Service/ChargeService.php b/libs/stripe-php/lib/Service/ChargeService.php index 301fd2bf6..8d3e70e9d 100644 --- a/libs/stripe-php/lib/Service/ChargeService.php +++ b/libs/stripe-php/lib/Service/ChargeService.php @@ -57,7 +57,7 @@ class ChargeService extends AbstractService * payment instead. Confirmation of the PaymentIntent creates the * Charge object used to request payment. * - * @param null|array{amount?: int, application_fee?: int, application_fee_amount?: int, capture?: bool, currency?: string, customer?: string, description?: string, destination?: array{account: string, amount?: int}, expand?: string[], metadata?: null|array, on_behalf_of?: string, radar_options?: array{session?: string}, receipt_email?: string, shipping?: array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name: string, phone?: string, tracking_number?: string}, source?: string, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_data?: array{amount?: int, destination: string}, transfer_group?: string} $params + * @param null|array{amount?: int, application_fee?: int, application_fee_amount?: int, capture?: bool, currency?: string, customer?: string, description?: string, destination?: array{account: string, amount?: int}, expand?: string[], metadata?: null|array, on_behalf_of?: string, radar_options?: array{session?: string}, receipt_email?: string, shipping?: array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name: string, phone?: string, tracking_number?: string}, source?: string, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_data?: array{amount?: int, description?: string, destination: string}, transfer_group?: string} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\Charge diff --git a/libs/stripe-php/lib/Service/Checkout/SessionService.php b/libs/stripe-php/lib/Service/Checkout/SessionService.php index 65bbbc2f3..c574fdc18 100644 --- a/libs/stripe-php/lib/Service/Checkout/SessionService.php +++ b/libs/stripe-php/lib/Service/Checkout/SessionService.php @@ -48,7 +48,7 @@ class SessionService extends \Stripe\Service\AbstractService /** * Creates a Checkout Session object. * - * @param null|array{adaptive_pricing?: array{enabled?: bool}, after_expiration?: array{recovery?: array{allow_promotion_codes?: bool, enabled: bool}}, allow_promotion_codes?: bool, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_address_collection?: string, branding_settings?: array{background_color?: null|string, border_style?: null|string, button_color?: null|string, display_name?: string, font_family?: null|string, icon?: array{file?: string, type: string, url?: string}, logo?: array{file?: string, type: string, url?: string}}, cancel_url?: string, client_reference_id?: string, consent_collection?: array{payment_method_reuse_agreement?: array{position: string}, promotions?: string, terms_of_service?: string}, currency?: string, custom_fields?: array{dropdown?: array{default_value?: string, options: array{label: string, value: string}[]}, key: string, label: array{custom: string, type: string}, numeric?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, optional?: bool, text?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, type: string}[], custom_text?: array{after_submit?: null|array{message: string}, shipping_address?: null|array{message: string}, submit?: null|array{message: string}, terms_of_service_acceptance?: null|array{message: string}}, customer?: string, customer_account?: string, customer_creation?: string, customer_email?: string, customer_update?: array{address?: string, name?: string, shipping?: string}, discounts?: array{coupon?: string, promotion_code?: string}[], excluded_payment_method_types?: string[], expand?: string[], expires_at?: int, invoice_creation?: array{enabled: bool, invoice_data?: array{account_tax_ids?: null|string[], custom_fields?: null|array{name: string, value: string}[], description?: string, footer?: string, issuer?: array{account?: string, type: string}, metadata?: array, rendering_options?: null|array{amount_tax_display?: null|string, template?: string}}}, line_items?: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, dynamic_tax_rates?: string[], metadata?: array, price?: string, price_data?: array{currency: string, product?: string, product_data?: array{description?: string, images?: string[], metadata?: array, name: string, tax_code?: string, unit_label?: string}, recurring?: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: string[]}[], locale?: string, metadata?: array, mode?: string, name_collection?: array{business?: array{enabled: bool, optional?: bool}, individual?: array{enabled: bool, optional?: bool}}, optional_items?: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, price: string, quantity: int}[], origin_context?: string, payment_intent_data?: array{application_fee_amount?: int, capture_method?: string, description?: string, metadata?: array, on_behalf_of?: string, receipt_email?: string, setup_future_usage?: string, shipping?: array{address: array{city?: string, country?: string, line1: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name: string, phone?: string, tracking_number?: string}, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_data?: array{amount?: int, destination: string}, transfer_group?: string}, payment_method_collection?: string, payment_method_configuration?: string, payment_method_data?: array{allow_redisplay?: string}, payment_method_options?: array{acss_debit?: array{currency?: string, mandate_options?: array{custom_mandate_url?: null|string, default_for?: string[], interval_description?: string, payment_schedule?: string, transaction_type?: string}, setup_future_usage?: string, target_date?: string, verification_method?: string}, affirm?: array{capture_method?: string, setup_future_usage?: string}, afterpay_clearpay?: array{capture_method?: string, setup_future_usage?: string}, alipay?: array{setup_future_usage?: string}, alma?: array{capture_method?: string}, amazon_pay?: array{capture_method?: string, setup_future_usage?: string}, au_becs_debit?: array{setup_future_usage?: string, target_date?: string}, bacs_debit?: array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: string, target_date?: string}, bancontact?: array{setup_future_usage?: string}, billie?: array{capture_method?: string}, boleto?: array{expires_after_days?: int, setup_future_usage?: string}, card?: array{capture_method?: string, installments?: array{enabled?: bool}, request_extended_authorization?: string, request_incremental_authorization?: string, request_multicapture?: string, request_overcapture?: string, request_three_d_secure?: string, restrictions?: array{brands_blocked?: string[]}, setup_future_usage?: string, statement_descriptor_suffix_kana?: string, statement_descriptor_suffix_kanji?: string}, cashapp?: array{capture_method?: string, setup_future_usage?: string}, customer_balance?: array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, requested_address_types?: string[], type: string}, funding_type?: string, setup_future_usage?: string}, demo_pay?: array{setup_future_usage?: string}, eps?: array{setup_future_usage?: string}, fpx?: array{setup_future_usage?: string}, giropay?: array{setup_future_usage?: string}, grabpay?: array{setup_future_usage?: string}, ideal?: array{setup_future_usage?: string}, kakao_pay?: array{capture_method?: string, setup_future_usage?: string}, klarna?: array{capture_method?: string, setup_future_usage?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing: array{amount: int, date: string}, reference: string}[]}, konbini?: array{expires_after_days?: int, setup_future_usage?: string}, kr_card?: array{capture_method?: string, setup_future_usage?: string}, link?: array{capture_method?: string, setup_future_usage?: string}, mobilepay?: array{capture_method?: string, setup_future_usage?: string}, multibanco?: array{setup_future_usage?: string}, naver_pay?: array{capture_method?: string, setup_future_usage?: string}, oxxo?: array{expires_after_days?: int, setup_future_usage?: string}, p24?: array{setup_future_usage?: string, tos_shown_and_accepted?: bool}, pay_by_bank?: array{}, payco?: array{capture_method?: string}, paynow?: array{setup_future_usage?: string}, paypal?: array{capture_method?: null|string, preferred_locale?: string, reference?: string, risk_correlation_id?: string, setup_future_usage?: null|string}, payto?: array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string, start_date?: null|string}, setup_future_usage?: string}, pix?: array{amount_includes_iof?: string, expires_after_seconds?: int, setup_future_usage?: string}, revolut_pay?: array{capture_method?: string, setup_future_usage?: string}, samsung_pay?: array{capture_method?: string}, satispay?: array{capture_method?: string}, sepa_debit?: array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: string, target_date?: string}, sofort?: array{setup_future_usage?: string}, swish?: array{reference?: string}, twint?: array{setup_future_usage?: string}, us_bank_account?: array{financial_connections?: array{permissions?: string[], prefetch?: string[]}, setup_future_usage?: string, target_date?: string, verification_method?: string}, wechat_pay?: array{app_id?: string, client: string, setup_future_usage?: string}}, payment_method_types?: string[], permissions?: array{update_shipping_details?: string}, phone_number_collection?: array{enabled: bool}, redirect_on_completion?: string, return_url?: string, saved_payment_method_options?: array{allow_redisplay_filters?: string[], payment_method_remove?: string, payment_method_save?: string}, setup_intent_data?: array{description?: string, metadata?: array, on_behalf_of?: string}, shipping_address_collection?: array{allowed_countries: string[]}, shipping_options?: array{shipping_rate?: string, shipping_rate_data?: array{delivery_estimate?: array{maximum?: array{unit: string, value: int}, minimum?: array{unit: string, value: int}}, display_name: string, fixed_amount?: array{amount: int, currency: string, currency_options?: array}, metadata?: array, tax_behavior?: string, tax_code?: string, type?: string}}[], submit_type?: string, subscription_data?: array{application_fee_percent?: float, billing_cycle_anchor?: int, billing_mode?: array{flexible?: array{proration_discounts?: string}, type: string}, default_tax_rates?: string[], description?: string, invoice_settings?: array{issuer?: array{account?: string, type: string}}, metadata?: array, on_behalf_of?: string, proration_behavior?: string, transfer_data?: array{amount_percent?: float, destination: string}, trial_end?: int, trial_period_days?: int, trial_settings?: array{end_behavior: array{missing_payment_method: string}}}, success_url?: string, tax_id_collection?: array{enabled: bool, required?: string}, ui_mode?: string, wallet_options?: array{link?: array{display?: string}}} $params + * @param null|array{adaptive_pricing?: array{enabled?: bool}, after_expiration?: array{recovery?: array{allow_promotion_codes?: bool, enabled: bool}}, allow_promotion_codes?: bool, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_address_collection?: string, branding_settings?: array{background_color?: null|string, border_style?: null|string, button_color?: null|string, display_name?: string, font_family?: null|string, icon?: array{file?: string, type: string, url?: string}, logo?: array{file?: string, type: string, url?: string}}, cancel_url?: string, client_reference_id?: string, consent_collection?: array{payment_method_reuse_agreement?: array{position: string}, promotions?: string, terms_of_service?: string}, currency?: string, custom_fields?: array{dropdown?: array{default_value?: string, options: array{label: string, value: string}[]}, key: string, label: array{custom: string, type: string}, numeric?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, optional?: bool, text?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, type: string}[], custom_text?: array{after_submit?: null|array{message: string}, shipping_address?: null|array{message: string}, submit?: null|array{message: string}, terms_of_service_acceptance?: null|array{message: string}}, customer?: string, customer_account?: string, customer_creation?: string, customer_email?: string, customer_update?: array{address?: string, name?: string, shipping?: string}, discounts?: array{coupon?: string, promotion_code?: string}[], excluded_payment_method_types?: string[], expand?: string[], expires_at?: int, integration_identifier?: string, invoice_creation?: array{enabled: bool, invoice_data?: array{account_tax_ids?: null|string[], custom_fields?: null|array{name: string, value: string}[], description?: string, footer?: string, issuer?: array{account?: string, type: string}, metadata?: array, rendering_options?: null|array{amount_tax_display?: null|string, template?: string}}}, line_items?: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, dynamic_tax_rates?: string[], metadata?: array, price?: string, price_data?: array{currency: string, product?: string, product_data?: array{description?: string, images?: string[], metadata?: array, name: string, tax_code?: string, unit_label?: string}, recurring?: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: string[]}[], locale?: string, managed_payments?: array{enabled?: bool}, metadata?: array, mode?: string, name_collection?: array{business?: array{enabled: bool, optional?: bool}, individual?: array{enabled: bool, optional?: bool}}, optional_items?: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, price: string, quantity: int}[], origin_context?: string, payment_intent_data?: array{application_fee_amount?: int, capture_method?: string, description?: string, metadata?: array, on_behalf_of?: string, receipt_email?: string, setup_future_usage?: string, shipping?: array{address: array{city?: string, country?: string, line1: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name: string, phone?: string, tracking_number?: string}, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_data?: array{amount?: int, destination: string}, transfer_group?: string}, payment_method_collection?: string, payment_method_configuration?: string, payment_method_data?: array{allow_redisplay?: string}, payment_method_options?: array{acss_debit?: array{currency?: string, mandate_options?: array{custom_mandate_url?: null|string, default_for?: string[], interval_description?: string, payment_schedule?: string, transaction_type?: string}, setup_future_usage?: string, target_date?: string, verification_method?: string}, affirm?: array{capture_method?: string, setup_future_usage?: string}, afterpay_clearpay?: array{capture_method?: string, setup_future_usage?: string}, alipay?: array{setup_future_usage?: string}, alma?: array{capture_method?: string}, amazon_pay?: array{capture_method?: string, setup_future_usage?: string}, au_becs_debit?: array{setup_future_usage?: string, target_date?: string}, bacs_debit?: array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: string, target_date?: string}, bancontact?: array{setup_future_usage?: string}, billie?: array{capture_method?: string}, boleto?: array{expires_after_days?: int, setup_future_usage?: string}, card?: array{capture_method?: string, installments?: array{enabled?: bool}, request_extended_authorization?: string, request_incremental_authorization?: string, request_multicapture?: string, request_overcapture?: string, request_three_d_secure?: string, restrictions?: array{brands_blocked?: string[]}, setup_future_usage?: string, statement_descriptor_suffix_kana?: string, statement_descriptor_suffix_kanji?: string}, cashapp?: array{capture_method?: string, setup_future_usage?: string}, crypto?: array{setup_future_usage?: string}, customer_balance?: array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, requested_address_types?: string[], type: string}, funding_type?: string, setup_future_usage?: string}, demo_pay?: array{setup_future_usage?: string}, eps?: array{setup_future_usage?: string}, fpx?: array{setup_future_usage?: string}, giropay?: array{setup_future_usage?: string}, grabpay?: array{setup_future_usage?: string}, ideal?: array{setup_future_usage?: string}, kakao_pay?: array{capture_method?: string, setup_future_usage?: string}, klarna?: array{capture_method?: string, setup_future_usage?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing: array{amount: int, date: string}, reference: string}[]}, konbini?: array{expires_after_days?: int, setup_future_usage?: string}, kr_card?: array{capture_method?: string, setup_future_usage?: string}, link?: array{capture_method?: string, setup_future_usage?: string}, mobilepay?: array{capture_method?: string, setup_future_usage?: string}, multibanco?: array{setup_future_usage?: string}, naver_pay?: array{capture_method?: string, setup_future_usage?: string}, oxxo?: array{expires_after_days?: int, setup_future_usage?: string}, p24?: array{setup_future_usage?: string, tos_shown_and_accepted?: bool}, pay_by_bank?: array{}, payco?: array{capture_method?: string}, paynow?: array{setup_future_usage?: string}, paypal?: array{capture_method?: null|string, preferred_locale?: string, reference?: string, risk_correlation_id?: string, setup_future_usage?: null|string}, payto?: array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string, start_date?: null|string}, setup_future_usage?: string}, pix?: array{amount_includes_iof?: string, expires_after_seconds?: int, mandate_options?: array{amount?: int, amount_includes_iof?: string, amount_type?: string, currency?: string, end_date?: string, payment_schedule?: string, reference?: string, start_date?: string}, setup_future_usage?: string}, revolut_pay?: array{capture_method?: string, setup_future_usage?: string}, samsung_pay?: array{capture_method?: string}, satispay?: array{capture_method?: string}, scalapay?: array{capture_method?: string}, sepa_debit?: array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: string, target_date?: string}, sofort?: array{setup_future_usage?: string}, sunbit?: array{capture_method?: string, setup_future_usage?: string}, swish?: array{reference?: string}, twint?: array{setup_future_usage?: string}, upi?: array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}, setup_future_usage?: null|string}, us_bank_account?: array{financial_connections?: array{permissions?: string[], prefetch?: string[]}, setup_future_usage?: string, target_date?: string, verification_method?: string}, wechat_pay?: array{app_id?: string, client: string, setup_future_usage?: string}}, payment_method_types?: string[], permissions?: array{update_shipping_details?: string}, phone_number_collection?: array{enabled: bool}, redirect_on_completion?: string, return_url?: string, saved_payment_method_options?: array{allow_redisplay_filters?: string[], payment_method_remove?: string, payment_method_save?: string}, setup_intent_data?: array{description?: string, metadata?: array, on_behalf_of?: string}, shipping_address_collection?: array{allowed_countries: string[]}, shipping_options?: array{shipping_rate?: string, shipping_rate_data?: array{delivery_estimate?: array{maximum?: array{unit: string, value: int}, minimum?: array{unit: string, value: int}}, display_name: string, fixed_amount?: array{amount: int, currency: string, currency_options?: array}, metadata?: array, tax_behavior?: string, tax_code?: string, type?: string}}[], submit_type?: string, subscription_data?: array{application_fee_percent?: float, billing_cycle_anchor?: int, billing_cycle_anchor_config?: array{day_of_month: int, hour?: int, minute?: int, month?: int, second?: int}, billing_mode?: array{flexible?: array{proration_discounts?: string}, type: string}, default_tax_rates?: string[], description?: string, invoice_settings?: array{issuer?: array{account?: string, type: string}}, metadata?: array, on_behalf_of?: string, pending_invoice_item_interval?: array{interval: string, interval_count?: int}, proration_behavior?: string, transfer_data?: array{amount_percent?: float, destination: string}, trial_end?: int, trial_period_days?: int, trial_settings?: array{end_behavior: array{missing_payment_method: string}}}, success_url?: string, tax_id_collection?: array{enabled: bool, required?: string}, ui_mode?: string, wallet_options?: array{link?: array{display?: string}}} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\Checkout\Session diff --git a/libs/stripe-php/lib/Service/CreditNoteService.php b/libs/stripe-php/lib/Service/CreditNoteService.php index b1b7a263f..fe277583f 100644 --- a/libs/stripe-php/lib/Service/CreditNoteService.php +++ b/libs/stripe-php/lib/Service/CreditNoteService.php @@ -67,7 +67,13 @@ class CreditNoteService extends AbstractService * post_payment_credit_notes_amount, or both, depending on the * invoice’s amount_remaining at the time of credit note creation. * - * @param null|array{amount?: int, credit_amount?: int, effective_at?: int, email_type?: string, expand?: string[], invoice: string, lines?: (array{amount?: int, description?: string, invoice_line_item?: string, quantity?: int, tax_amounts?: null|array{amount: int, tax_rate: string, taxable_amount: int}[], tax_rates?: null|string[], type: string, unit_amount?: int, unit_amount_decimal?: string})[], memo?: string, metadata?: array, out_of_band_amount?: int, reason?: string, refund_amount?: int, refunds?: array{amount_refunded?: int, payment_record_refund?: array{payment_record: string, refund_group: string}, refund?: string, type?: string}[], shipping_cost?: array{shipping_rate?: string}} $params + * For invoices that also have refunds created through the Refund API, the credit note API subtracts those + * refund amounts from the maximum creditable amount. This prevents the combined + * credit notes and refunds from exceeding the invoice amount. If you use both, + * ensure the combined total does not exceed the invoice’s paid amount. + * + * @param null|array{amount?: int, credit_amount?: int, effective_at?: int, email_type?: string, expand?: string[], invoice: string, lines?: (array{amount?: int, description?: string, invoice_line_item?: string, metadata?: array, quantity?: int, tax_amounts?: null|array{amount: int, tax_rate: string, taxable_amount: int}[], tax_rates?: null|string[], type: string, unit_amount?: int, unit_amount_decimal?: string})[], memo?: string, metadata?: array, out_of_band_amount?: int, reason?: string, refund_amount?: int, refunds?: array{amount_refunded?: int, payment_record_refund?: array{payment_record: string, refund_group: string}, refund?: string, type?: string}[], shipping_cost?: array{shipping_rate?: string}} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\CreditNote @@ -82,7 +88,7 @@ class CreditNoteService extends AbstractService /** * Get a preview of a credit note without creating it. * - * @param null|array{amount?: int, credit_amount?: int, effective_at?: int, email_type?: string, expand?: string[], invoice: string, lines?: (array{amount?: int, description?: string, invoice_line_item?: string, quantity?: int, tax_amounts?: null|array{amount: int, tax_rate: string, taxable_amount: int}[], tax_rates?: null|string[], type: string, unit_amount?: int, unit_amount_decimal?: string})[], memo?: string, metadata?: array, out_of_band_amount?: int, reason?: string, refund_amount?: int, refunds?: array{amount_refunded?: int, payment_record_refund?: array{payment_record: string, refund_group: string}, refund?: string, type?: string}[], shipping_cost?: array{shipping_rate?: string}} $params + * @param null|array{amount?: int, credit_amount?: int, effective_at?: int, email_type?: string, expand?: string[], invoice: string, lines?: (array{amount?: int, description?: string, invoice_line_item?: string, metadata?: array, quantity?: int, tax_amounts?: null|array{amount: int, tax_rate: string, taxable_amount: int}[], tax_rates?: null|string[], type: string, unit_amount?: int, unit_amount_decimal?: string})[], memo?: string, metadata?: array, out_of_band_amount?: int, reason?: string, refund_amount?: int, refunds?: array{amount_refunded?: int, payment_record_refund?: array{payment_record: string, refund_group: string}, refund?: string, type?: string}[], shipping_cost?: array{shipping_rate?: string}} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\CreditNote @@ -99,7 +105,7 @@ class CreditNoteService extends AbstractService * property containing the first handful of those items. This URL you can retrieve * the full (paginated) list of line items. * - * @param null|array{amount?: int, credit_amount?: int, effective_at?: int, email_type?: string, ending_before?: string, expand?: string[], invoice: string, limit?: int, lines?: (array{amount?: int, description?: string, invoice_line_item?: string, quantity?: int, tax_amounts?: null|array{amount: int, tax_rate: string, taxable_amount: int}[], tax_rates?: null|string[], type: string, unit_amount?: int, unit_amount_decimal?: string})[], memo?: string, metadata?: array, out_of_band_amount?: int, reason?: string, refund_amount?: int, refunds?: array{amount_refunded?: int, payment_record_refund?: array{payment_record: string, refund_group: string}, refund?: string, type?: string}[], shipping_cost?: array{shipping_rate?: string}, starting_after?: string} $params + * @param null|array{amount?: int, credit_amount?: int, effective_at?: int, email_type?: string, ending_before?: string, expand?: string[], invoice: string, limit?: int, lines?: (array{amount?: int, description?: string, invoice_line_item?: string, metadata?: array, quantity?: int, tax_amounts?: null|array{amount: int, tax_rate: string, taxable_amount: int}[], tax_rates?: null|string[], type: string, unit_amount?: int, unit_amount_decimal?: string})[], memo?: string, metadata?: array, out_of_band_amount?: int, reason?: string, refund_amount?: int, refunds?: array{amount_refunded?: int, payment_record_refund?: array{payment_record: string, refund_group: string}, refund?: string, type?: string}[], shipping_cost?: array{shipping_rate?: string}, starting_after?: string} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\Collection<\Stripe\CreditNoteLineItem> diff --git a/libs/stripe-php/lib/Service/CustomerService.php b/libs/stripe-php/lib/Service/CustomerService.php index 63a4548d6..d9e388dfe 100644 --- a/libs/stripe-php/lib/Service/CustomerService.php +++ b/libs/stripe-php/lib/Service/CustomerService.php @@ -167,7 +167,7 @@ class CustomerService extends AbstractService * * If the card’s owner has no default card, then the new card will become the * default. However, if the owner already has a default, then it will not change. - * To change the default, you should update the + * To change the default, you should update the * customer to have a new default_source. * * @param string $parentId diff --git a/libs/stripe-php/lib/Service/DisputeService.php b/libs/stripe-php/lib/Service/DisputeService.php index fadfe45b7..3f22fa42c 100644 --- a/libs/stripe-php/lib/Service/DisputeService.php +++ b/libs/stripe-php/lib/Service/DisputeService.php @@ -74,7 +74,7 @@ class DisputeService extends AbstractService * see our guide to dispute types. * * @param string $id - * @param null|array{evidence?: array{access_activity_log?: string, billing_address?: string, cancellation_policy?: string, cancellation_policy_disclosure?: string, cancellation_rebuttal?: string, customer_communication?: string, customer_email_address?: string, customer_name?: string, customer_purchase_ip?: string, customer_signature?: string, duplicate_charge_documentation?: string, duplicate_charge_explanation?: string, duplicate_charge_id?: string, enhanced_evidence?: null|array{visa_compelling_evidence_3?: array{disputed_transaction?: array{customer_account_id?: null|string, customer_device_fingerprint?: null|string, customer_device_id?: null|string, customer_email_address?: null|string, customer_purchase_ip?: null|string, merchandise_or_services?: string, product_description?: null|string, shipping_address?: array{city?: null|string, country?: null|string, line1?: null|string, line2?: null|string, postal_code?: null|string, state?: null|string}}, prior_undisputed_transactions?: (array{charge: string, customer_account_id?: null|string, customer_device_fingerprint?: null|string, customer_device_id?: null|string, customer_email_address?: null|string, customer_purchase_ip?: null|string, product_description?: null|string, shipping_address?: array{city?: null|string, country?: null|string, line1?: null|string, line2?: null|string, postal_code?: null|string, state?: null|string}})[]}, visa_compliance?: array{fee_acknowledged?: bool}}, product_description?: string, receipt?: string, refund_policy?: string, refund_policy_disclosure?: string, refund_refusal_explanation?: string, service_date?: string, service_documentation?: string, shipping_address?: string, shipping_carrier?: string, shipping_date?: string, shipping_documentation?: string, shipping_tracking_number?: string, uncategorized_file?: string, uncategorized_text?: string}, expand?: string[], metadata?: null|array, submit?: bool} $params + * @param null|array{evidence?: array{access_activity_log?: string, billing_address?: string, cancellation_policy?: string, cancellation_policy_disclosure?: string, cancellation_rebuttal?: string, customer_communication?: string, customer_email_address?: string, customer_name?: string, customer_purchase_ip?: string, customer_signature?: string, duplicate_charge_documentation?: string, duplicate_charge_explanation?: string, duplicate_charge_id?: string, enhanced_evidence?: null|array{mastercard_compliance?: array{fee_acknowledged?: bool}, visa_compelling_evidence_3?: array{disputed_transaction?: array{customer_account_id?: null|string, customer_device_fingerprint?: null|string, customer_device_id?: null|string, customer_email_address?: null|string, customer_purchase_ip?: null|string, merchandise_or_services?: string, product_description?: null|string, shipping_address?: array{city?: null|string, country?: null|string, line1?: null|string, line2?: null|string, postal_code?: null|string, state?: null|string}}, prior_undisputed_transactions?: (array{charge: string, customer_account_id?: null|string, customer_device_fingerprint?: null|string, customer_device_id?: null|string, customer_email_address?: null|string, customer_purchase_ip?: null|string, product_description?: null|string, shipping_address?: array{city?: null|string, country?: null|string, line1?: null|string, line2?: null|string, postal_code?: null|string, state?: null|string}})[]}, visa_compliance?: array{fee_acknowledged?: bool}}, product_description?: string, receipt?: string, refund_policy?: string, refund_policy_disclosure?: string, refund_refusal_explanation?: string, service_date?: string, service_documentation?: string, shipping_address?: string, shipping_carrier?: string, shipping_date?: string, shipping_documentation?: string, shipping_tracking_number?: string, uncategorized_file?: string, uncategorized_text?: string}, expand?: string[], metadata?: null|array, submit?: bool} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\Dispute diff --git a/libs/stripe-php/lib/Service/InvoiceItemService.php b/libs/stripe-php/lib/Service/InvoiceItemService.php index 07edc9463..72b32e347 100644 --- a/libs/stripe-php/lib/Service/InvoiceItemService.php +++ b/libs/stripe-php/lib/Service/InvoiceItemService.php @@ -32,7 +32,7 @@ class InvoiceItemService extends AbstractService * no invoice is specified, the item will be on the next invoice created for the * customer specified. * - * @param null|array{amount?: int, currency?: string, customer?: string, customer_account?: string, description?: string, discountable?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], invoice?: string, metadata?: null|array, period?: array{end: int, start: int}, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, pricing?: array{price?: string}, quantity?: int, subscription?: string, tax_behavior?: string, tax_code?: null|string, tax_rates?: string[], unit_amount_decimal?: string} $params + * @param null|array{amount?: int, currency?: string, customer?: string, customer_account?: string, description?: string, discountable?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], invoice?: string, metadata?: null|array, period?: array{end: int, start: int}, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, pricing?: array{price?: string}, quantity?: int, quantity_decimal?: string, subscription?: string, tax_behavior?: string, tax_code?: null|string, tax_rates?: string[], unit_amount_decimal?: string} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\InvoiceItem @@ -84,7 +84,7 @@ class InvoiceItemService extends AbstractService * closed. * * @param string $id - * @param null|array{amount?: int, description?: string, discountable?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], metadata?: null|array, period?: array{end: int, start: int}, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, pricing?: array{price?: string}, quantity?: int, tax_behavior?: string, tax_code?: null|string, tax_rates?: null|string[], unit_amount_decimal?: string} $params + * @param null|array{amount?: int, description?: string, discountable?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], metadata?: null|array, period?: array{end: int, start: int}, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, pricing?: array{price?: string}, quantity?: int, quantity_decimal?: string, tax_behavior?: string, tax_code?: null|string, tax_rates?: null|string[], unit_amount_decimal?: string} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\InvoiceItem diff --git a/libs/stripe-php/lib/Service/InvoiceService.php b/libs/stripe-php/lib/Service/InvoiceService.php index a531c1043..c582a87d1 100644 --- a/libs/stripe-php/lib/Service/InvoiceService.php +++ b/libs/stripe-php/lib/Service/InvoiceService.php @@ -16,7 +16,7 @@ class InvoiceService extends AbstractService * still a draft. * * @param string $id - * @param null|array{expand?: string[], invoice_metadata?: null|array, lines: (array{amount?: int, description?: string, discountable?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], invoice_item?: string, metadata?: null|array, period?: array{end: int, start: int}, price_data?: array{currency: string, product?: string, product_data?: array{description?: string, images?: string[], metadata?: array, name: string, tax_code?: string, unit_label?: string}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, pricing?: array{price?: string}, quantity?: int, tax_amounts?: null|array{amount: int, tax_rate_data: array{country?: string, description?: string, display_name: string, inclusive: bool, jurisdiction?: string, jurisdiction_level?: string, percentage: float, state?: string, tax_type?: string}, taxability_reason?: string, taxable_amount: int}[], tax_rates?: null|string[]})[]} $params + * @param null|array{expand?: string[], invoice_metadata?: null|array, lines: (array{amount?: int, description?: string, discountable?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], invoice_item?: string, metadata?: null|array, period?: array{end: int, start: int}, price_data?: array{currency: string, product?: string, product_data?: array{description?: string, images?: string[], metadata?: array, name: string, tax_code?: string, unit_label?: string}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, pricing?: array{price?: string}, quantity?: int, quantity_decimal?: string, tax_amounts?: null|array{amount: int, tax_rate_data: array{country?: string, description?: string, display_name: string, inclusive: bool, jurisdiction?: string, jurisdiction_level?: string, percentage: float, state?: string, tax_type?: string}, taxability_reason?: string, taxable_amount: int}[], tax_rates?: null|string[]})[]} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\Invoice @@ -94,11 +94,11 @@ class InvoiceService extends AbstractService /** * This endpoint creates a draft invoice for a given customer. The invoice remains - * a draft until you finalize the invoice, which - * allows you to pay or finalize the invoice, + * which allows you to pay or send the invoice to your customers. * - * @param null|array{account_tax_ids?: null|string[], application_fee_amount?: int, auto_advance?: bool, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, automatically_finalizes_at?: int, collection_method?: string, currency?: string, custom_fields?: null|array{name: string, value: string}[], customer?: string, customer_account?: string, days_until_due?: int, default_payment_method?: string, default_source?: string, default_tax_rates?: string[], description?: string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], due_date?: int, effective_at?: int, expand?: string[], footer?: string, from_invoice?: array{action: string, invoice: string}, issuer?: array{account?: string, type: string}, metadata?: null|array, number?: string, on_behalf_of?: string, payment_settings?: array{default_mandate?: null|string, payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{transaction_type?: string}, verification_method?: string}, bancontact?: null|array{preferred_language?: string}, card?: null|array{installments?: array{enabled?: bool, plan?: null|array{count?: int, interval?: string, type: string}}, request_three_d_secure?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, type?: string}, funding_type?: string}, konbini?: null|array{}, payto?: null|array{mandate_options?: array{amount?: int, purpose?: string}}, sepa_debit?: null|array{}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[]}, verification_method?: string}}, payment_method_types?: null|string[]}, pending_invoice_items_behavior?: string, rendering?: array{amount_tax_display?: null|string, pdf?: array{page_size?: string}, template?: string, template_version?: null|int}, shipping_cost?: array{shipping_rate?: string, shipping_rate_data?: array{delivery_estimate?: array{maximum?: array{unit: string, value: int}, minimum?: array{unit: string, value: int}}, display_name: string, fixed_amount?: array{amount: int, currency: string, currency_options?: array}, metadata?: array, tax_behavior?: string, tax_code?: string, type?: string}}, shipping_details?: array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name: string, phone?: null|string}, statement_descriptor?: string, subscription?: string, transfer_data?: array{amount?: int, destination: string}} $params + * @param null|array{account_tax_ids?: null|string[], application_fee_amount?: int, auto_advance?: bool, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, automatically_finalizes_at?: int, collection_method?: string, currency?: string, custom_fields?: null|array{name: string, value: string}[], customer?: string, customer_account?: string, days_until_due?: int, default_payment_method?: string, default_source?: string, default_tax_rates?: string[], description?: string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], due_date?: int, effective_at?: int, expand?: string[], footer?: string, from_invoice?: array{action: string, invoice: string}, issuer?: array{account?: string, type: string}, metadata?: null|array, number?: string, on_behalf_of?: string, payment_settings?: array{default_mandate?: null|string, payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{transaction_type?: string}, verification_method?: string}, bancontact?: null|array{preferred_language?: string}, card?: null|array{installments?: array{enabled?: bool, plan?: null|array{count?: int, interval?: string, type: string}}, request_three_d_secure?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, type?: string}, funding_type?: string}, konbini?: null|array{}, payto?: null|array{mandate_options?: array{amount?: int, purpose?: string}}, pix?: null|array{amount_includes_iof?: string, expires_after_seconds?: int}, sepa_debit?: null|array{}, upi?: null|array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[]}, verification_method?: string}}, payment_method_types?: null|string[]}, pending_invoice_items_behavior?: string, rendering?: array{amount_tax_display?: null|string, pdf?: array{page_size?: string}, template?: string, template_version?: null|int}, shipping_cost?: array{shipping_rate?: string, shipping_rate_data?: array{delivery_estimate?: array{maximum?: array{unit: string, value: int}, minimum?: array{unit: string, value: int}}, display_name: string, fixed_amount?: array{amount: int, currency: string, currency_options?: array}, metadata?: array, tax_behavior?: string, tax_code?: string, type?: string}}, shipping_details?: array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name: string, phone?: null|string}, statement_descriptor?: string, subscription?: string, transfer_data?: array{amount?: int, destination: string}} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\Invoice @@ -139,7 +139,7 @@ class InvoiceService extends AbstractService * invoice creation. Learn * more * - * @param null|array{automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, currency?: string, customer?: string, customer_account?: string, customer_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, shipping?: null|array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name: string, phone?: string}, tax?: array{ip_address?: null|string}, tax_exempt?: null|string, tax_ids?: array{type: string, value: string}[]}, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], invoice_items?: (array{amount?: int, currency?: string, description?: string, discountable?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], invoiceitem?: string, metadata?: null|array, period?: array{end: int, start: int}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_behavior?: string, tax_code?: null|string, tax_rates?: null|string[], unit_amount?: int, unit_amount_decimal?: string})[], issuer?: array{account?: string, type: string}, on_behalf_of?: null|string, preview_mode?: string, schedule?: string, schedule_details?: array{billing_mode?: array{flexible?: array{proration_discounts?: string}, type: string}, end_behavior?: string, phases?: (array{add_invoice_items?: (array{discounts?: array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, period?: array{end: array{timestamp?: int, type: string}, start: array{timestamp?: int, type: string}}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, collection_method?: string, currency?: string, default_payment_method?: string, default_tax_rates?: null|string[], description?: null|string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], duration?: array{interval: string, interval_count?: int}, end_date?: array|int|string, invoice_settings?: array{account_tax_ids?: null|string[], days_until_due?: int, issuer?: array{account?: string, type: string}}, items: (array{billing_thresholds?: null|array{usage_gte: int}, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: array, on_behalf_of?: string, proration_behavior?: string, start_date?: array|int|string, transfer_data?: array{amount_percent?: float, destination: string}, trial?: bool, trial_end?: array|int|string})[], proration_behavior?: string}, subscription?: string, subscription_details?: array{billing_cycle_anchor?: array|int|string, billing_mode?: array{flexible?: array{proration_discounts?: string}, type: string}, cancel_at?: null|array|int|string, cancel_at_period_end?: bool, cancel_now?: bool, default_tax_rates?: null|string[], items?: (array{billing_thresholds?: null|array{usage_gte: int}, clear_usage?: bool, deleted?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], id?: string, metadata?: null|array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], proration_behavior?: string, proration_date?: int, resume_at?: string, start_date?: int, trial_end?: array|int|string}} $params + * @param null|array{automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, currency?: string, customer?: string, customer_account?: string, customer_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, shipping?: null|array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name: string, phone?: string}, tax?: array{ip_address?: null|string}, tax_exempt?: null|string, tax_ids?: array{type: string, value: string}[]}, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], invoice_items?: (array{amount?: int, currency?: string, description?: string, discountable?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], invoiceitem?: string, metadata?: null|array, period?: array{end: int, start: int}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, quantity_decimal?: string, tax_behavior?: string, tax_code?: null|string, tax_rates?: null|string[], unit_amount?: int, unit_amount_decimal?: string})[], issuer?: array{account?: string, type: string}, on_behalf_of?: null|string, preview_mode?: string, schedule?: string, schedule_details?: array{billing_mode?: array{flexible?: array{proration_discounts?: string}, type: string}, end_behavior?: string, phases?: (array{add_invoice_items?: (array{discountable?: bool, discounts?: array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, period?: array{end: array{timestamp?: int, type: string}, start: array{timestamp?: int, type: string}}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, collection_method?: string, currency?: string, default_payment_method?: string, default_tax_rates?: null|string[], description?: null|string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], duration?: array{interval: string, interval_count?: int}, end_date?: array|int|string, invoice_settings?: array{account_tax_ids?: null|string[], days_until_due?: int, issuer?: array{account?: string, type: string}}, items: (array{billing_thresholds?: null|array{usage_gte: int}, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: array, on_behalf_of?: string, proration_behavior?: string, start_date?: array|int|string, transfer_data?: array{amount_percent?: float, destination: string}, trial?: bool, trial_end?: array|int|string})[], proration_behavior?: string}, subscription?: string, subscription_details?: array{billing_cycle_anchor?: array|int|string, billing_mode?: array{flexible?: array{proration_discounts?: string}, type: string}, billing_schedules?: null|array{applies_to?: array{price?: string, type: string}[], bill_until?: array{duration?: array{interval: string, interval_count?: int}, timestamp?: int, type: string}, key?: string}[], cancel_at?: null|array|int|string, cancel_at_period_end?: bool, cancel_now?: bool, default_tax_rates?: null|string[], items?: (array{billing_thresholds?: null|array{usage_gte: int}, clear_usage?: bool, deleted?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], id?: string, metadata?: null|array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], proration_behavior?: string, proration_date?: int, resume_at?: string, start_date?: int, trial_end?: array|int|string}} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\Invoice @@ -155,7 +155,7 @@ class InvoiceService extends AbstractService * Permanently deletes a one-off invoice draft. This cannot be undone. Attempts to * delete invoices that are no longer in a draft state will fail; once an invoice * has been finalized or if an invoice is for a subscription, it must be voided. + * href="/api/invoices/void">voided. * * @param string $id * @param null|array $params @@ -312,7 +312,7 @@ class InvoiceService extends AbstractService * invoices, pass auto_advance=false. * * @param string $id - * @param null|array{account_tax_ids?: null|string[], application_fee_amount?: int, auto_advance?: bool, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, automatically_finalizes_at?: int, collection_method?: string, custom_fields?: null|array{name: string, value: string}[], days_until_due?: int, default_payment_method?: string, default_source?: null|string, default_tax_rates?: null|string[], description?: string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], due_date?: int, effective_at?: null|int, expand?: string[], footer?: string, issuer?: array{account?: string, type: string}, metadata?: null|array, number?: null|string, on_behalf_of?: null|string, payment_settings?: array{default_mandate?: null|string, payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{transaction_type?: string}, verification_method?: string}, bancontact?: null|array{preferred_language?: string}, card?: null|array{installments?: array{enabled?: bool, plan?: null|array{count?: int, interval?: string, type: string}}, request_three_d_secure?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, type?: string}, funding_type?: string}, konbini?: null|array{}, payto?: null|array{mandate_options?: array{amount?: int, purpose?: string}}, sepa_debit?: null|array{}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[]}, verification_method?: string}}, payment_method_types?: null|string[]}, rendering?: array{amount_tax_display?: null|string, pdf?: array{page_size?: string}, template?: string, template_version?: null|int}, shipping_cost?: null|array{shipping_rate?: string, shipping_rate_data?: array{delivery_estimate?: array{maximum?: array{unit: string, value: int}, minimum?: array{unit: string, value: int}}, display_name: string, fixed_amount?: array{amount: int, currency: string, currency_options?: array}, metadata?: array, tax_behavior?: string, tax_code?: string, type?: string}}, shipping_details?: null|array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name: string, phone?: null|string}, statement_descriptor?: string, transfer_data?: null|array{amount?: int, destination: string}} $params + * @param null|array{account_tax_ids?: null|string[], application_fee_amount?: int, auto_advance?: bool, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, automatically_finalizes_at?: int, collection_method?: string, custom_fields?: null|array{name: string, value: string}[], days_until_due?: int, default_payment_method?: string, default_source?: null|string, default_tax_rates?: null|string[], description?: string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], due_date?: int, effective_at?: null|int, expand?: string[], footer?: string, issuer?: array{account?: string, type: string}, metadata?: null|array, number?: null|string, on_behalf_of?: null|string, payment_settings?: array{default_mandate?: null|string, payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{transaction_type?: string}, verification_method?: string}, bancontact?: null|array{preferred_language?: string}, card?: null|array{installments?: array{enabled?: bool, plan?: null|array{count?: int, interval?: string, type: string}}, request_three_d_secure?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, type?: string}, funding_type?: string}, konbini?: null|array{}, payto?: null|array{mandate_options?: array{amount?: int, purpose?: string}}, pix?: null|array{amount_includes_iof?: string, expires_after_seconds?: int}, sepa_debit?: null|array{}, upi?: null|array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[]}, verification_method?: string}}, payment_method_types?: null|string[]}, rendering?: array{amount_tax_display?: null|string, pdf?: array{page_size?: string}, template?: string, template_version?: null|int}, shipping_cost?: null|array{shipping_rate?: string, shipping_rate_data?: array{delivery_estimate?: array{maximum?: array{unit: string, value: int}, minimum?: array{unit: string, value: int}}, display_name: string, fixed_amount?: array{amount: int, currency: string, currency_options?: array}, metadata?: array, tax_behavior?: string, tax_code?: string, type?: string}}, shipping_details?: null|array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name: string, phone?: null|string}, statement_descriptor?: string, transfer_data?: null|array{amount?: int, destination: string}} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\Invoice @@ -334,7 +334,7 @@ class InvoiceService extends AbstractService * * @param string $parentId * @param string $id - * @param null|array{amount?: int, description?: string, discountable?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], metadata?: null|array, period?: array{end: int, start: int}, price_data?: array{currency: string, product?: string, product_data?: array{description?: string, images?: string[], metadata?: array, name: string, tax_code?: string, unit_label?: string}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, pricing?: array{price?: string}, quantity?: int, tax_amounts?: null|array{amount: int, tax_rate_data: array{country?: string, description?: string, display_name: string, inclusive: bool, jurisdiction?: string, jurisdiction_level?: string, percentage: float, state?: string, tax_type?: string}, taxability_reason?: string, taxable_amount: int}[], tax_rates?: null|string[]} $params + * @param null|array{amount?: int, description?: string, discountable?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], metadata?: null|array, period?: array{end: int, start: int}, price_data?: array{currency: string, product?: string, product_data?: array{description?: string, images?: string[], metadata?: array, name: string, tax_code?: string, unit_label?: string}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, pricing?: array{price?: string}, quantity?: int, quantity_decimal?: string, tax_amounts?: null|array{amount: int, tax_rate_data: array{country?: string, description?: string, display_name: string, inclusive: bool, jurisdiction?: string, jurisdiction_level?: string, percentage: float, state?: string, tax_type?: string}, taxability_reason?: string, taxable_amount: int}[], tax_rates?: null|string[]} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\InvoiceLineItem @@ -351,7 +351,7 @@ class InvoiceService extends AbstractService * is still a draft. * * @param string $id - * @param null|array{expand?: string[], invoice_metadata?: null|array, lines: (array{amount?: int, description?: string, discountable?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], id: string, metadata?: null|array, period?: array{end: int, start: int}, price_data?: array{currency: string, product?: string, product_data?: array{description?: string, images?: string[], metadata?: array, name: string, tax_code?: string, unit_label?: string}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, pricing?: array{price?: string}, quantity?: int, tax_amounts?: null|array{amount: int, tax_rate_data: array{country?: string, description?: string, display_name: string, inclusive: bool, jurisdiction?: string, jurisdiction_level?: string, percentage: float, state?: string, tax_type?: string}, taxability_reason?: string, taxable_amount: int}[], tax_rates?: null|string[]})[]} $params + * @param null|array{expand?: string[], invoice_metadata?: null|array, lines: (array{amount?: int, description?: string, discountable?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], id: string, metadata?: null|array, period?: array{end: int, start: int}, price_data?: array{currency: string, product?: string, product_data?: array{description?: string, images?: string[], metadata?: array, name: string, tax_code?: string, unit_label?: string}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, pricing?: array{price?: string}, quantity?: int, quantity_decimal?: string, tax_amounts?: null|array{amount: int, tax_rate_data: array{country?: string, description?: string, display_name: string, inclusive: bool, jurisdiction?: string, jurisdiction_level?: string, percentage: float, state?: string, tax_type?: string}, taxability_reason?: string, taxable_amount: int}[], tax_rates?: null|string[]})[]} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\Invoice @@ -365,15 +365,15 @@ class InvoiceService extends AbstractService /** * Mark a finalized invoice as void. This cannot be undone. Voiding an invoice is - * similar to deletion, however it only applies to - * finalized invoices and maintains a papertrail where the invoice can still be + * similar to deletion, however it only applies + * to finalized invoices and maintains a papertrail where the invoice can still be * found. * * Consult with local regulations to determine whether and how an invoice might be * amended, canceled, or voided in the jurisdiction you’re doing business in. You - * might need to issue another invoice or credit note instead. Stripe recommends that you - * consult with your legal counsel for advice specific to your business. + * might need to issue another invoice or credit note instead. Stripe recommends that + * you consult with your legal counsel for advice specific to your business. * * @param string $id * @param null|array{expand?: string[]} $params diff --git a/libs/stripe-php/lib/Service/Issuing/CardService.php b/libs/stripe-php/lib/Service/Issuing/CardService.php index 23dfd4089..85d75af33 100644 --- a/libs/stripe-php/lib/Service/Issuing/CardService.php +++ b/libs/stripe-php/lib/Service/Issuing/CardService.php @@ -31,7 +31,7 @@ class CardService extends \Stripe\Service\AbstractService /** * Creates an Issuing Card object. * - * @param null|array{cardholder?: string, currency: string, exp_month?: int, exp_year?: int, expand?: string[], financial_account?: string, metadata?: array, personalization_design?: string, pin?: array{encrypted_number?: string}, replacement_for?: string, replacement_reason?: string, second_line?: null|string, shipping?: array{address: array{city: string, country: string, line1: string, line2?: string, postal_code: string, state?: string}, address_validation?: array{mode: string}, customs?: array{eori_number?: string}, name: string, phone_number?: string, require_signature?: bool, service?: string, type?: string}, spending_controls?: array{allowed_categories?: string[], allowed_merchant_countries?: string[], blocked_categories?: string[], blocked_merchant_countries?: string[], spending_limits?: array{amount: int, categories?: string[], interval: string}[]}, status?: string, type: string} $params + * @param null|array{cardholder?: string, currency: string, exp_month?: int, exp_year?: int, expand?: string[], financial_account?: string, lifecycle_controls?: array{cancel_after: array{payment_count: int}}, metadata?: array, personalization_design?: string, pin?: array{encrypted_number?: string}, replacement_for?: string, replacement_reason?: string, second_line?: null|string, shipping?: array{address: array{city: string, country: string, line1: string, line2?: string, postal_code: string, state?: string}, address_validation?: array{mode: string}, customs?: array{eori_number?: string}, name: string, phone_number?: string, require_signature?: bool, service?: string, type?: string}, spending_controls?: array{allowed_card_presences?: string[], allowed_categories?: string[], allowed_merchant_countries?: string[], blocked_card_presences?: string[], blocked_categories?: string[], blocked_merchant_countries?: string[], spending_limits?: array{amount: int, categories?: string[], interval: string}[]}, status?: string, type: string} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\Issuing\Card @@ -64,7 +64,7 @@ class CardService extends \Stripe\Service\AbstractService * the parameters passed. Any parameters not provided will be left unchanged. * * @param string $id - * @param null|array{cancellation_reason?: string, expand?: string[], metadata?: null|array, personalization_design?: string, pin?: array{encrypted_number?: string}, shipping?: array{address: array{city: string, country: string, line1: string, line2?: string, postal_code: string, state?: string}, address_validation?: array{mode: string}, customs?: array{eori_number?: string}, name: string, phone_number?: string, require_signature?: bool, service?: string, type?: string}, spending_controls?: array{allowed_categories?: string[], allowed_merchant_countries?: string[], blocked_categories?: string[], blocked_merchant_countries?: string[], spending_limits?: array{amount: int, categories?: string[], interval: string}[]}, status?: string} $params + * @param null|array{cancellation_reason?: string, expand?: string[], metadata?: null|array, personalization_design?: string, pin?: array{encrypted_number?: string}, shipping?: array{address: array{city: string, country: string, line1: string, line2?: string, postal_code: string, state?: string}, address_validation?: array{mode: string}, customs?: array{eori_number?: string}, name: string, phone_number?: string, require_signature?: bool, service?: string, type?: string}, spending_controls?: array{allowed_card_presences?: string[], allowed_categories?: string[], allowed_merchant_countries?: string[], blocked_card_presences?: string[], blocked_categories?: string[], blocked_merchant_countries?: string[], spending_limits?: array{amount: int, categories?: string[], interval: string}[]}, status?: string} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\Issuing\Card diff --git a/libs/stripe-php/lib/Service/Issuing/CardholderService.php b/libs/stripe-php/lib/Service/Issuing/CardholderService.php index 2b9a0a0e3..7000fb14d 100644 --- a/libs/stripe-php/lib/Service/Issuing/CardholderService.php +++ b/libs/stripe-php/lib/Service/Issuing/CardholderService.php @@ -31,7 +31,7 @@ class CardholderService extends \Stripe\Service\AbstractService /** * Creates a new Issuing Cardholder object that can be issued cards. * - * @param null|array{billing: array{address: array{city: string, country: string, line1: string, line2?: string, postal_code: string, state?: string}}, company?: array{tax_id?: string}, email?: string, expand?: string[], individual?: array{card_issuing?: array{user_terms_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}, dob?: array{day: int, month: int, year: int}, first_name?: string, last_name?: string, verification?: array{document?: array{back?: string, front?: string}}}, metadata?: array, name: string, phone_number?: string, preferred_locales?: string[], spending_controls?: array{allowed_categories?: string[], allowed_merchant_countries?: string[], blocked_categories?: string[], blocked_merchant_countries?: string[], spending_limits?: array{amount: int, categories?: string[], interval: string}[], spending_limits_currency?: string}, status?: string, type?: string} $params + * @param null|array{billing: array{address: array{city: string, country: string, line1: string, line2?: string, postal_code: string, state?: string}}, company?: array{tax_id?: string}, email?: string, expand?: string[], individual?: array{card_issuing?: array{user_terms_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}, dob?: array{day: int, month: int, year: int}, first_name?: string, last_name?: string, verification?: array{document?: array{back?: string, front?: string}}}, metadata?: array, name: string, phone_number?: string, preferred_locales?: string[], spending_controls?: array{allowed_card_presences?: string[], allowed_categories?: string[], allowed_merchant_countries?: string[], blocked_card_presences?: string[], blocked_categories?: string[], blocked_merchant_countries?: string[], spending_limits?: array{amount: int, categories?: string[], interval: string}[], spending_limits_currency?: string}, status?: string, type?: string} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\Issuing\Cardholder @@ -65,7 +65,7 @@ class CardholderService extends \Stripe\Service\AbstractService * unchanged. * * @param string $id - * @param null|array{billing?: array{address: array{city: string, country: string, line1: string, line2?: string, postal_code: string, state?: string}}, company?: array{tax_id?: string}, email?: string, expand?: string[], individual?: array{card_issuing?: array{user_terms_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}, dob?: array{day: int, month: int, year: int}, first_name?: string, last_name?: string, verification?: array{document?: array{back?: string, front?: string}}}, metadata?: array, phone_number?: string, preferred_locales?: string[], spending_controls?: array{allowed_categories?: string[], allowed_merchant_countries?: string[], blocked_categories?: string[], blocked_merchant_countries?: string[], spending_limits?: array{amount: int, categories?: string[], interval: string}[], spending_limits_currency?: string}, status?: string} $params + * @param null|array{billing?: array{address: array{city: string, country: string, line1: string, line2?: string, postal_code: string, state?: string}}, company?: array{tax_id?: string}, email?: string, expand?: string[], individual?: array{card_issuing?: array{user_terms_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}, dob?: array{day: int, month: int, year: int}, first_name?: string, last_name?: string, verification?: array{document?: array{back?: string, front?: string}}}, metadata?: array, phone_number?: string, preferred_locales?: string[], spending_controls?: array{allowed_card_presences?: string[], allowed_categories?: string[], allowed_merchant_countries?: string[], blocked_card_presences?: string[], blocked_categories?: string[], blocked_merchant_countries?: string[], spending_limits?: array{amount: int, categories?: string[], interval: string}[], spending_limits_currency?: string}, status?: string} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\Issuing\Cardholder diff --git a/libs/stripe-php/lib/Service/PaymentIntentService.php b/libs/stripe-php/lib/Service/PaymentIntentService.php index ecc1619dc..861c67061 100644 --- a/libs/stripe-php/lib/Service/PaymentIntentService.php +++ b/libs/stripe-php/lib/Service/PaymentIntentService.php @@ -70,9 +70,9 @@ class PaymentIntentService extends AbstractService * status of requires_capture, the remaining * amount_capturable is automatically refunded. * - * You can’t cancel the PaymentIntent for a Checkout Session. Expire the Checkout Session - * instead. + * You can directly cancel the PaymentIntent for a Checkout Session only when the + * PaymentIntent has a status of requires_capture. Otherwise, you must + * expire the Checkout Session. * * @param string $id * @param null|array{cancellation_reason?: string, expand?: string[]} $params @@ -144,7 +144,7 @@ class PaymentIntentService extends AbstractService * transition the PaymentIntent to the canceled state. * * @param string $id - * @param null|array{amount_details?: null|array{discount_amount?: null|int, enforce_arithmetic_validation?: bool, line_items?: null|array{discount_amount?: int, payment_method_options?: array{card?: array{commodity_code?: string}, card_present?: array{commodity_code?: string}, klarna?: array{image_url?: string, product_url?: string, reference?: string, subscription_reference?: string}, paypal?: array{category?: string, description?: string, sold_by?: string}}, product_code?: string, product_name: string, quantity: int, tax?: array{total_tax_amount: int}, unit_cost: int, unit_of_measure?: string}[], shipping?: null|array{amount?: null|int, from_postal_code?: null|string, to_postal_code?: null|string}, tax?: null|array{total_tax_amount: int}}, capture_method?: string, confirmation_token?: string, error_on_requires_action?: bool, excluded_payment_method_types?: null|string[], expand?: string[], hooks?: array{inputs?: array{tax?: array{calculation: null|string}}}, mandate?: string, mandate_data?: null|array{customer_acceptance?: array{accepted_at?: int, offline?: array{}, online?: array{ip_address?: string, user_agent?: string}, type: string}}, off_session?: array|bool|string, payment_details?: null|array{customer_reference?: null|string, order_reference?: null|string}, payment_method?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, swish?: array{}, twint?: array{}, type: string, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{custom_mandate_url?: null|string, interval_description?: string, payment_schedule?: string, transaction_type?: string}, setup_future_usage?: null|string, target_date?: string, verification_method?: string}, affirm?: null|array{capture_method?: null|string, preferred_locale?: string, setup_future_usage?: string}, afterpay_clearpay?: null|array{capture_method?: null|string, reference?: string, setup_future_usage?: string}, alipay?: null|array{setup_future_usage?: null|string}, alma?: null|array{capture_method?: null|string}, amazon_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, au_becs_debit?: null|array{setup_future_usage?: null|string, target_date?: string}, bacs_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, bancontact?: null|array{preferred_language?: string, setup_future_usage?: null|string}, billie?: null|array{capture_method?: null|string}, blik?: null|array{code?: string, setup_future_usage?: null|string}, boleto?: null|array{expires_after_days?: int, setup_future_usage?: null|string}, card?: null|array{capture_method?: null|string, cvc_token?: string, installments?: array{enabled?: bool, plan?: null|array{count?: int, interval?: string, type: string}}, mandate_options?: array{amount: int, amount_type: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_extended_authorization?: string, request_incremental_authorization?: string, request_multicapture?: string, request_overcapture?: string, request_three_d_secure?: string, require_cvc_recollection?: bool, setup_future_usage?: null|string, statement_descriptor_suffix_kana?: null|string, statement_descriptor_suffix_kanji?: null|string, three_d_secure?: array{ares_trans_status?: string, cryptogram: string, electronic_commerce_indicator?: string, exemption_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id: string, version: string}}, card_present?: null|array{capture_method?: string, request_extended_authorization?: bool, request_incremental_authorization_support?: bool, routing?: array{requested_priority?: string}}, cashapp?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, crypto?: null|array{setup_future_usage?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, requested_address_types?: string[], type: string}, funding_type?: string, setup_future_usage?: string}, eps?: null|array{setup_future_usage?: string}, fpx?: null|array{setup_future_usage?: string}, giropay?: null|array{setup_future_usage?: string}, grabpay?: null|array{setup_future_usage?: string}, ideal?: null|array{setup_future_usage?: null|string}, interac_present?: null|array{}, kakao_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, klarna?: null|array{capture_method?: null|string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, setup_future_usage?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing?: array{amount: int, date: string}, reference: string}[]}, konbini?: null|array{confirmation_number?: null|string, expires_after_days?: null|int, expires_at?: null|int, product_description?: null|string, setup_future_usage?: string}, kr_card?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, link?: null|array{capture_method?: null|string, persistent_token?: string, setup_future_usage?: null|string}, mb_way?: null|array{setup_future_usage?: string}, mobilepay?: null|array{capture_method?: null|string, setup_future_usage?: string}, multibanco?: null|array{setup_future_usage?: string}, naver_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, nz_bank_account?: null|array{setup_future_usage?: null|string, target_date?: string}, oxxo?: null|array{expires_after_days?: int, setup_future_usage?: string}, p24?: null|array{setup_future_usage?: string, tos_shown_and_accepted?: bool}, pay_by_bank?: null|array{}, payco?: null|array{capture_method?: null|string}, paynow?: null|array{setup_future_usage?: string}, paypal?: null|array{capture_method?: null|string, preferred_locale?: string, reference?: string, risk_correlation_id?: string, setup_future_usage?: null|string}, payto?: null|array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string}, setup_future_usage?: null|string}, pix?: null|array{amount_includes_iof?: string, expires_after_seconds?: int, expires_at?: int, setup_future_usage?: string}, promptpay?: null|array{setup_future_usage?: string}, revolut_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, samsung_pay?: null|array{capture_method?: null|string}, satispay?: null|array{capture_method?: null|string}, sepa_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, sofort?: null|array{preferred_language?: null|string, setup_future_usage?: null|string}, swish?: null|array{reference?: null|string, setup_future_usage?: string}, twint?: null|array{setup_future_usage?: string}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, setup_future_usage?: null|string, target_date?: string, transaction_purpose?: null|string, verification_method?: string, preferred_settlement_speed?: null|string}, wechat_pay?: null|array{app_id?: string, client?: string, setup_future_usage?: string}, zip?: null|array{setup_future_usage?: string}}, payment_method_types?: string[], radar_options?: array{session?: string}, receipt_email?: null|string, return_url?: string, setup_future_usage?: null|string, shipping?: null|array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name: string, phone?: string, tracking_number?: string}, use_stripe_sdk?: bool} $params + * @param null|array{amount_details?: null|array{discount_amount?: null|int, enforce_arithmetic_validation?: bool, line_items?: null|array{discount_amount?: int, payment_method_options?: array{card?: array{commodity_code?: string}, card_present?: array{commodity_code?: string}, klarna?: array{image_url?: string, product_url?: string, reference?: string, subscription_reference?: string}, paypal?: array{category?: string, description?: string, sold_by?: string}}, product_code?: string, product_name: string, quantity: int, tax?: array{total_tax_amount: int}, unit_cost: int, unit_of_measure?: string}[], shipping?: null|array{amount?: null|int, from_postal_code?: null|string, to_postal_code?: null|string}, tax?: null|array{total_tax_amount: int}}, amount_to_confirm?: int, capture_method?: string, confirmation_token?: string, error_on_requires_action?: bool, excluded_payment_method_types?: null|string[], expand?: string[], hooks?: array{inputs?: array{tax?: array{calculation: null|string}}}, mandate?: string, mandate_data?: null|array{customer_acceptance?: array{accepted_at?: int, offline?: array{}, online?: array{ip_address?: string, user_agent?: string}, type: string}}, off_session?: array|bool|string, payment_details?: null|array{customer_reference?: null|string, order_reference?: null|string}, payment_method?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, bizum?: array{}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, scalapay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, sunbit?: array{}, swish?: array{}, twint?: array{}, type: string, upi?: array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}}, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{custom_mandate_url?: null|string, interval_description?: string, payment_schedule?: string, transaction_type?: string}, setup_future_usage?: null|string, target_date?: string, verification_method?: string}, affirm?: null|array{capture_method?: null|string, preferred_locale?: string, setup_future_usage?: string}, afterpay_clearpay?: null|array{capture_method?: null|string, reference?: string, setup_future_usage?: string}, alipay?: null|array{setup_future_usage?: null|string}, alma?: null|array{capture_method?: null|string}, amazon_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, au_becs_debit?: null|array{setup_future_usage?: null|string, target_date?: string}, bacs_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, bancontact?: null|array{preferred_language?: string, setup_future_usage?: null|string}, billie?: null|array{capture_method?: null|string}, bizum?: null|array{}, blik?: null|array{code?: string, setup_future_usage?: null|string}, boleto?: null|array{expires_after_days?: int, setup_future_usage?: null|string}, card?: null|array{capture_method?: null|string, cvc_token?: string, installments?: array{enabled?: bool, plan?: null|array{count?: int, interval?: string, type: string}}, mandate_options?: array{amount: int, amount_type: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_extended_authorization?: string, request_incremental_authorization?: string, request_multicapture?: string, request_overcapture?: string, request_three_d_secure?: string, require_cvc_recollection?: bool, setup_future_usage?: null|string, statement_descriptor_suffix_kana?: null|string, statement_descriptor_suffix_kanji?: null|string, three_d_secure?: array{ares_trans_status?: string, cryptogram: string, electronic_commerce_indicator?: string, exemption_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id: string, version: string}}, card_present?: null|array{capture_method?: string, request_extended_authorization?: bool, request_incremental_authorization_support?: bool, routing?: array{requested_priority?: string}}, cashapp?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, crypto?: null|array{setup_future_usage?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, requested_address_types?: string[], type: string}, funding_type?: string, setup_future_usage?: string}, eps?: null|array{setup_future_usage?: string}, fpx?: null|array{setup_future_usage?: string}, giropay?: null|array{setup_future_usage?: string}, grabpay?: null|array{setup_future_usage?: string}, ideal?: null|array{setup_future_usage?: null|string}, interac_present?: null|array{}, kakao_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, klarna?: null|array{capture_method?: null|string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, setup_future_usage?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing?: array{amount: int, date: string}, reference: string}[]}, konbini?: null|array{confirmation_number?: null|string, expires_after_days?: null|int, expires_at?: null|int, product_description?: null|string, setup_future_usage?: string}, kr_card?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, link?: null|array{capture_method?: null|string, persistent_token?: string, setup_future_usage?: null|string}, mb_way?: null|array{setup_future_usage?: string}, mobilepay?: null|array{capture_method?: null|string, setup_future_usage?: string}, multibanco?: null|array{setup_future_usage?: string}, naver_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, nz_bank_account?: null|array{setup_future_usage?: null|string, target_date?: string}, oxxo?: null|array{expires_after_days?: int, setup_future_usage?: string}, p24?: null|array{setup_future_usage?: string, tos_shown_and_accepted?: bool}, pay_by_bank?: null|array{}, payco?: null|array{capture_method?: null|string}, paynow?: null|array{setup_future_usage?: string}, paypal?: null|array{capture_method?: null|string, preferred_locale?: string, reference?: string, risk_correlation_id?: string, setup_future_usage?: null|string}, payto?: null|array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string}, setup_future_usage?: null|string}, pix?: null|array{amount_includes_iof?: string, expires_after_seconds?: int, expires_at?: int, mandate_options?: array{amount?: int, amount_includes_iof?: string, amount_type?: string, currency?: string, end_date?: string, payment_schedule?: string, reference?: string, start_date?: string}, setup_future_usage?: string}, promptpay?: null|array{setup_future_usage?: string}, revolut_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, samsung_pay?: null|array{capture_method?: null|string}, satispay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, scalapay?: null|array{capture_method?: null|string}, sepa_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, sofort?: null|array{preferred_language?: null|string, setup_future_usage?: null|string}, sunbit?: null|array{capture_method?: null|string, setup_future_usage?: string}, swish?: null|array{reference?: null|string, setup_future_usage?: string}, twint?: null|array{setup_future_usage?: string}, upi?: null|array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}, setup_future_usage?: null|string}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, setup_future_usage?: null|string, target_date?: string, transaction_purpose?: null|string, verification_method?: string}, wechat_pay?: null|array{app_id?: string, client?: string, setup_future_usage?: string}, zip?: null|array{setup_future_usage?: string}}, payment_method_types?: string[], radar_options?: array{session?: string}, receipt_email?: null|string, return_url?: string, setup_future_usage?: null|string, shipping?: null|array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name: string, phone?: string, tracking_number?: string}, use_stripe_sdk?: bool} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\PaymentIntent @@ -169,7 +169,7 @@ class PaymentIntentService extends AbstractService * parameters available in the confirm * API when you supply confirm=true. * - * @param null|array{amount: int, amount_details?: array{discount_amount?: null|int, enforce_arithmetic_validation?: bool, line_items?: null|array{discount_amount?: int, payment_method_options?: array{card?: array{commodity_code?: string}, card_present?: array{commodity_code?: string}, klarna?: array{image_url?: string, product_url?: string, reference?: string, subscription_reference?: string}, paypal?: array{category?: string, description?: string, sold_by?: string}}, product_code?: string, product_name: string, quantity: int, tax?: array{total_tax_amount: int}, unit_cost: int, unit_of_measure?: string}[], shipping?: null|array{amount?: null|int, from_postal_code?: null|string, to_postal_code?: null|string}, tax?: null|array{total_tax_amount: int}}, application_fee_amount?: int, automatic_payment_methods?: array{allow_redirects?: string, enabled: bool}, capture_method?: string, confirm?: bool, confirmation_method?: string, confirmation_token?: string, currency: string, customer?: string, customer_account?: string, description?: string, error_on_requires_action?: bool, excluded_payment_method_types?: string[], expand?: string[], hooks?: array{inputs?: array{tax?: array{calculation: null|string}}}, mandate?: string, mandate_data?: null|array{customer_acceptance: array{accepted_at?: int, offline?: array{}, online?: array{ip_address: string, user_agent: string}, type: string}}, metadata?: array, off_session?: array|bool|string, on_behalf_of?: string, payment_details?: array{customer_reference?: null|string, order_reference?: null|string}, payment_method?: string, payment_method_configuration?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, swish?: array{}, twint?: array{}, type: string, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{custom_mandate_url?: null|string, interval_description?: string, payment_schedule?: string, transaction_type?: string}, setup_future_usage?: null|string, target_date?: string, verification_method?: string}, affirm?: null|array{capture_method?: null|string, preferred_locale?: string, setup_future_usage?: string}, afterpay_clearpay?: null|array{capture_method?: null|string, reference?: string, setup_future_usage?: string}, alipay?: null|array{setup_future_usage?: null|string}, alma?: null|array{capture_method?: null|string}, amazon_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, au_becs_debit?: null|array{setup_future_usage?: null|string, target_date?: string}, bacs_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, bancontact?: null|array{preferred_language?: string, setup_future_usage?: null|string}, billie?: null|array{capture_method?: null|string}, blik?: null|array{code?: string, setup_future_usage?: null|string}, boleto?: null|array{expires_after_days?: int, setup_future_usage?: null|string}, card?: null|array{capture_method?: null|string, cvc_token?: string, installments?: array{enabled?: bool, plan?: null|array{count?: int, interval?: string, type: string}}, mandate_options?: array{amount: int, amount_type: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_extended_authorization?: string, request_incremental_authorization?: string, request_multicapture?: string, request_overcapture?: string, request_three_d_secure?: string, require_cvc_recollection?: bool, setup_future_usage?: null|string, statement_descriptor_suffix_kana?: null|string, statement_descriptor_suffix_kanji?: null|string, three_d_secure?: array{ares_trans_status?: string, cryptogram: string, electronic_commerce_indicator?: string, exemption_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id: string, version: string}}, card_present?: null|array{capture_method?: string, request_extended_authorization?: bool, request_incremental_authorization_support?: bool, routing?: array{requested_priority?: string}}, cashapp?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, crypto?: null|array{setup_future_usage?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, requested_address_types?: string[], type: string}, funding_type?: string, setup_future_usage?: string}, eps?: null|array{setup_future_usage?: string}, fpx?: null|array{setup_future_usage?: string}, giropay?: null|array{setup_future_usage?: string}, grabpay?: null|array{setup_future_usage?: string}, ideal?: null|array{setup_future_usage?: null|string}, interac_present?: null|array{}, kakao_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, klarna?: null|array{capture_method?: null|string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, setup_future_usage?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing?: array{amount: int, date: string}, reference: string}[]}, konbini?: null|array{confirmation_number?: null|string, expires_after_days?: null|int, expires_at?: null|int, product_description?: null|string, setup_future_usage?: string}, kr_card?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, link?: null|array{capture_method?: null|string, persistent_token?: string, setup_future_usage?: null|string}, mb_way?: null|array{setup_future_usage?: string}, mobilepay?: null|array{capture_method?: null|string, setup_future_usage?: string}, multibanco?: null|array{setup_future_usage?: string}, naver_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, nz_bank_account?: null|array{setup_future_usage?: null|string, target_date?: string}, oxxo?: null|array{expires_after_days?: int, setup_future_usage?: string}, p24?: null|array{setup_future_usage?: string, tos_shown_and_accepted?: bool}, pay_by_bank?: null|array{}, payco?: null|array{capture_method?: null|string}, paynow?: null|array{setup_future_usage?: string}, paypal?: null|array{capture_method?: null|string, preferred_locale?: string, reference?: string, risk_correlation_id?: string, setup_future_usage?: null|string}, payto?: null|array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string}, setup_future_usage?: null|string}, pix?: null|array{amount_includes_iof?: string, expires_after_seconds?: int, expires_at?: int, setup_future_usage?: string}, promptpay?: null|array{setup_future_usage?: string}, revolut_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, samsung_pay?: null|array{capture_method?: null|string}, satispay?: null|array{capture_method?: null|string}, sepa_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, sofort?: null|array{preferred_language?: null|string, setup_future_usage?: null|string}, swish?: null|array{reference?: null|string, setup_future_usage?: string}, twint?: null|array{setup_future_usage?: string}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, setup_future_usage?: null|string, target_date?: string, transaction_purpose?: null|string, verification_method?: string, preferred_settlement_speed?: null|string}, wechat_pay?: null|array{app_id?: string, client?: string, setup_future_usage?: string}, zip?: null|array{setup_future_usage?: string}}, payment_method_types?: string[], radar_options?: array{session?: string}, receipt_email?: string, return_url?: string, setup_future_usage?: string, shipping?: array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name: string, phone?: string, tracking_number?: string}, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_data?: array{amount?: int, destination: string}, transfer_group?: string, use_stripe_sdk?: bool} $params + * @param null|array{amount: int, amount_details?: array{discount_amount?: null|int, enforce_arithmetic_validation?: bool, line_items?: null|array{discount_amount?: int, payment_method_options?: array{card?: array{commodity_code?: string}, card_present?: array{commodity_code?: string}, klarna?: array{image_url?: string, product_url?: string, reference?: string, subscription_reference?: string}, paypal?: array{category?: string, description?: string, sold_by?: string}}, product_code?: string, product_name: string, quantity: int, tax?: array{total_tax_amount: int}, unit_cost: int, unit_of_measure?: string}[], shipping?: null|array{amount?: null|int, from_postal_code?: null|string, to_postal_code?: null|string}, tax?: null|array{total_tax_amount: int}}, application_fee_amount?: int, automatic_payment_methods?: array{allow_redirects?: string, enabled: bool}, capture_method?: string, confirm?: bool, confirmation_method?: string, confirmation_token?: string, currency: string, customer?: string, customer_account?: string, description?: string, error_on_requires_action?: bool, excluded_payment_method_types?: string[], expand?: string[], hooks?: array{inputs?: array{tax?: array{calculation: null|string}}}, mandate?: string, mandate_data?: null|array{customer_acceptance: array{accepted_at?: int, offline?: array{}, online?: array{ip_address: string, user_agent: string}, type: string}}, metadata?: array, off_session?: array|bool|string, on_behalf_of?: string, payment_details?: array{customer_reference?: null|string, order_reference?: null|string}, payment_method?: string, payment_method_configuration?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, bizum?: array{}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, scalapay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, sunbit?: array{}, swish?: array{}, twint?: array{}, type: string, upi?: array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}}, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{custom_mandate_url?: null|string, interval_description?: string, payment_schedule?: string, transaction_type?: string}, setup_future_usage?: null|string, target_date?: string, verification_method?: string}, affirm?: null|array{capture_method?: null|string, preferred_locale?: string, setup_future_usage?: string}, afterpay_clearpay?: null|array{capture_method?: null|string, reference?: string, setup_future_usage?: string}, alipay?: null|array{setup_future_usage?: null|string}, alma?: null|array{capture_method?: null|string}, amazon_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, au_becs_debit?: null|array{setup_future_usage?: null|string, target_date?: string}, bacs_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, bancontact?: null|array{preferred_language?: string, setup_future_usage?: null|string}, billie?: null|array{capture_method?: null|string}, bizum?: null|array{}, blik?: null|array{code?: string, setup_future_usage?: null|string}, boleto?: null|array{expires_after_days?: int, setup_future_usage?: null|string}, card?: null|array{capture_method?: null|string, cvc_token?: string, installments?: array{enabled?: bool, plan?: null|array{count?: int, interval?: string, type: string}}, mandate_options?: array{amount: int, amount_type: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_extended_authorization?: string, request_incremental_authorization?: string, request_multicapture?: string, request_overcapture?: string, request_three_d_secure?: string, require_cvc_recollection?: bool, setup_future_usage?: null|string, statement_descriptor_suffix_kana?: null|string, statement_descriptor_suffix_kanji?: null|string, three_d_secure?: array{ares_trans_status?: string, cryptogram: string, electronic_commerce_indicator?: string, exemption_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id: string, version: string}}, card_present?: null|array{capture_method?: string, request_extended_authorization?: bool, request_incremental_authorization_support?: bool, routing?: array{requested_priority?: string}}, cashapp?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, crypto?: null|array{setup_future_usage?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, requested_address_types?: string[], type: string}, funding_type?: string, setup_future_usage?: string}, eps?: null|array{setup_future_usage?: string}, fpx?: null|array{setup_future_usage?: string}, giropay?: null|array{setup_future_usage?: string}, grabpay?: null|array{setup_future_usage?: string}, ideal?: null|array{setup_future_usage?: null|string}, interac_present?: null|array{}, kakao_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, klarna?: null|array{capture_method?: null|string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, setup_future_usage?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing?: array{amount: int, date: string}, reference: string}[]}, konbini?: null|array{confirmation_number?: null|string, expires_after_days?: null|int, expires_at?: null|int, product_description?: null|string, setup_future_usage?: string}, kr_card?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, link?: null|array{capture_method?: null|string, persistent_token?: string, setup_future_usage?: null|string}, mb_way?: null|array{setup_future_usage?: string}, mobilepay?: null|array{capture_method?: null|string, setup_future_usage?: string}, multibanco?: null|array{setup_future_usage?: string}, naver_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, nz_bank_account?: null|array{setup_future_usage?: null|string, target_date?: string}, oxxo?: null|array{expires_after_days?: int, setup_future_usage?: string}, p24?: null|array{setup_future_usage?: string, tos_shown_and_accepted?: bool}, pay_by_bank?: null|array{}, payco?: null|array{capture_method?: null|string}, paynow?: null|array{setup_future_usage?: string}, paypal?: null|array{capture_method?: null|string, preferred_locale?: string, reference?: string, risk_correlation_id?: string, setup_future_usage?: null|string}, payto?: null|array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string}, setup_future_usage?: null|string}, pix?: null|array{amount_includes_iof?: string, expires_after_seconds?: int, expires_at?: int, mandate_options?: array{amount?: int, amount_includes_iof?: string, amount_type?: string, currency?: string, end_date?: string, payment_schedule?: string, reference?: string, start_date?: string}, setup_future_usage?: string}, promptpay?: null|array{setup_future_usage?: string}, revolut_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, samsung_pay?: null|array{capture_method?: null|string}, satispay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, scalapay?: null|array{capture_method?: null|string}, sepa_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, sofort?: null|array{preferred_language?: null|string, setup_future_usage?: null|string}, sunbit?: null|array{capture_method?: null|string, setup_future_usage?: string}, swish?: null|array{reference?: null|string, setup_future_usage?: string}, twint?: null|array{setup_future_usage?: string}, upi?: null|array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}, setup_future_usage?: null|string}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, setup_future_usage?: null|string, target_date?: string, transaction_purpose?: null|string, verification_method?: string}, wechat_pay?: null|array{app_id?: string, client?: string, setup_future_usage?: string}, zip?: null|array{setup_future_usage?: string}}, payment_method_types?: string[], radar_options?: array{session?: string}, receipt_email?: string, return_url?: string, setup_future_usage?: string, shipping?: array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name: string, phone?: string, tracking_number?: string}, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_data?: array{amount?: int, description?: string, destination: string, metadata?: null|array, payment_data?: array{description?: string, metadata?: null|array}}, transfer_group?: string, use_stripe_sdk?: bool} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\PaymentIntent @@ -206,9 +206,11 @@ class PaymentIntentService extends AbstractService * including declines. After it’s captured, a PaymentIntent can no longer be * incremented. * - * Learn more about incremental - * authorizations. + * Learn more about incremental authorizations with in-person payments + * and online + * payments. * * @param string $id * @param null|array{amount: int, amount_details?: array{discount_amount?: null|int, enforce_arithmetic_validation?: bool, line_items?: null|array{discount_amount?: int, payment_method_options?: array{card?: array{commodity_code?: string}, card_present?: array{commodity_code?: string}, klarna?: array{image_url?: string, product_url?: string, reference?: string, subscription_reference?: string}, paypal?: array{category?: string, description?: string, sold_by?: string}}, product_code?: string, product_name: string, quantity: int, tax?: array{total_tax_amount: int}, unit_cost: int, unit_of_measure?: string}[], shipping?: null|array{amount?: null|int, from_postal_code?: null|string, to_postal_code?: null|string}, tax?: null|array{total_tax_amount: int}}, application_fee_amount?: int, description?: string, expand?: string[], hooks?: array{inputs?: array{tax?: array{calculation: null|string}}}, metadata?: array, payment_details?: array{customer_reference?: null|string, order_reference?: null|string}, statement_descriptor?: string, transfer_data?: array{amount?: int}} $params @@ -276,7 +278,7 @@ class PaymentIntentService extends AbstractService * href="/docs/api/payment_intents/confirm">confirm API instead. * * @param string $id - * @param null|array{amount?: int, amount_details?: null|array{discount_amount?: null|int, enforce_arithmetic_validation?: bool, line_items?: null|array{discount_amount?: int, payment_method_options?: array{card?: array{commodity_code?: string}, card_present?: array{commodity_code?: string}, klarna?: array{image_url?: string, product_url?: string, reference?: string, subscription_reference?: string}, paypal?: array{category?: string, description?: string, sold_by?: string}}, product_code?: string, product_name: string, quantity: int, tax?: array{total_tax_amount: int}, unit_cost: int, unit_of_measure?: string}[], shipping?: null|array{amount?: null|int, from_postal_code?: null|string, to_postal_code?: null|string}, tax?: null|array{total_tax_amount: int}}, application_fee_amount?: null|int, capture_method?: string, currency?: string, customer?: string, customer_account?: string, description?: string, excluded_payment_method_types?: null|string[], expand?: string[], hooks?: array{inputs?: array{tax?: array{calculation: null|string}}}, metadata?: null|array, payment_details?: null|array{customer_reference?: null|string, order_reference?: null|string}, payment_method?: string, payment_method_configuration?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, swish?: array{}, twint?: array{}, type: string, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{custom_mandate_url?: null|string, interval_description?: string, payment_schedule?: string, transaction_type?: string}, setup_future_usage?: null|string, target_date?: string, verification_method?: string}, affirm?: null|array{capture_method?: null|string, preferred_locale?: string, setup_future_usage?: string}, afterpay_clearpay?: null|array{capture_method?: null|string, reference?: string, setup_future_usage?: string}, alipay?: null|array{setup_future_usage?: null|string}, alma?: null|array{capture_method?: null|string}, amazon_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, au_becs_debit?: null|array{setup_future_usage?: null|string, target_date?: string}, bacs_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, bancontact?: null|array{preferred_language?: string, setup_future_usage?: null|string}, billie?: null|array{capture_method?: null|string}, blik?: null|array{code?: string, setup_future_usage?: null|string}, boleto?: null|array{expires_after_days?: int, setup_future_usage?: null|string}, card?: null|array{capture_method?: null|string, cvc_token?: string, installments?: array{enabled?: bool, plan?: null|array{count?: int, interval?: string, type: string}}, mandate_options?: array{amount: int, amount_type: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_extended_authorization?: string, request_incremental_authorization?: string, request_multicapture?: string, request_overcapture?: string, request_three_d_secure?: string, require_cvc_recollection?: bool, setup_future_usage?: null|string, statement_descriptor_suffix_kana?: null|string, statement_descriptor_suffix_kanji?: null|string, three_d_secure?: array{ares_trans_status?: string, cryptogram: string, electronic_commerce_indicator?: string, exemption_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id: string, version: string}}, card_present?: null|array{capture_method?: string, request_extended_authorization?: bool, request_incremental_authorization_support?: bool, routing?: array{requested_priority?: string}}, cashapp?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, crypto?: null|array{setup_future_usage?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, requested_address_types?: string[], type: string}, funding_type?: string, setup_future_usage?: string}, eps?: null|array{setup_future_usage?: string}, fpx?: null|array{setup_future_usage?: string}, giropay?: null|array{setup_future_usage?: string}, grabpay?: null|array{setup_future_usage?: string}, ideal?: null|array{setup_future_usage?: null|string}, interac_present?: null|array{}, kakao_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, klarna?: null|array{capture_method?: null|string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, setup_future_usage?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing?: array{amount: int, date: string}, reference: string}[]}, konbini?: null|array{confirmation_number?: null|string, expires_after_days?: null|int, expires_at?: null|int, product_description?: null|string, setup_future_usage?: string}, kr_card?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, link?: null|array{capture_method?: null|string, persistent_token?: string, setup_future_usage?: null|string}, mb_way?: null|array{setup_future_usage?: string}, mobilepay?: null|array{capture_method?: null|string, setup_future_usage?: string}, multibanco?: null|array{setup_future_usage?: string}, naver_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, nz_bank_account?: null|array{setup_future_usage?: null|string, target_date?: string}, oxxo?: null|array{expires_after_days?: int, setup_future_usage?: string}, p24?: null|array{setup_future_usage?: string, tos_shown_and_accepted?: bool}, pay_by_bank?: null|array{}, payco?: null|array{capture_method?: null|string}, paynow?: null|array{setup_future_usage?: string}, paypal?: null|array{capture_method?: null|string, preferred_locale?: string, reference?: string, risk_correlation_id?: string, setup_future_usage?: null|string}, payto?: null|array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string}, setup_future_usage?: null|string}, pix?: null|array{amount_includes_iof?: string, expires_after_seconds?: int, expires_at?: int, setup_future_usage?: string}, promptpay?: null|array{setup_future_usage?: string}, revolut_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, samsung_pay?: null|array{capture_method?: null|string}, satispay?: null|array{capture_method?: null|string}, sepa_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, sofort?: null|array{preferred_language?: null|string, setup_future_usage?: null|string}, swish?: null|array{reference?: null|string, setup_future_usage?: string}, twint?: null|array{setup_future_usage?: string}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, setup_future_usage?: null|string, target_date?: string, transaction_purpose?: null|string, verification_method?: string, preferred_settlement_speed?: null|string}, wechat_pay?: null|array{app_id?: string, client?: string, setup_future_usage?: string}, zip?: null|array{setup_future_usage?: string}}, payment_method_types?: string[], receipt_email?: null|string, setup_future_usage?: null|string, shipping?: null|array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name: string, phone?: string, tracking_number?: string}, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_data?: array{amount?: int}, transfer_group?: string} $params + * @param null|array{amount?: int, amount_details?: null|array{discount_amount?: null|int, enforce_arithmetic_validation?: bool, line_items?: null|array{discount_amount?: int, payment_method_options?: array{card?: array{commodity_code?: string}, card_present?: array{commodity_code?: string}, klarna?: array{image_url?: string, product_url?: string, reference?: string, subscription_reference?: string}, paypal?: array{category?: string, description?: string, sold_by?: string}}, product_code?: string, product_name: string, quantity: int, tax?: array{total_tax_amount: int}, unit_cost: int, unit_of_measure?: string}[], shipping?: null|array{amount?: null|int, from_postal_code?: null|string, to_postal_code?: null|string}, tax?: null|array{total_tax_amount: int}}, application_fee_amount?: null|int, capture_method?: string, currency?: string, customer?: string, customer_account?: string, description?: string, excluded_payment_method_types?: null|string[], expand?: string[], hooks?: array{inputs?: array{tax?: array{calculation: null|string}}}, metadata?: null|array, payment_details?: null|array{customer_reference?: null|string, order_reference?: null|string}, payment_method?: string, payment_method_configuration?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, bizum?: array{}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, scalapay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, sunbit?: array{}, swish?: array{}, twint?: array{}, type: string, upi?: array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}}, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{custom_mandate_url?: null|string, interval_description?: string, payment_schedule?: string, transaction_type?: string}, setup_future_usage?: null|string, target_date?: string, verification_method?: string}, affirm?: null|array{capture_method?: null|string, preferred_locale?: string, setup_future_usage?: string}, afterpay_clearpay?: null|array{capture_method?: null|string, reference?: string, setup_future_usage?: string}, alipay?: null|array{setup_future_usage?: null|string}, alma?: null|array{capture_method?: null|string}, amazon_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, au_becs_debit?: null|array{setup_future_usage?: null|string, target_date?: string}, bacs_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, bancontact?: null|array{preferred_language?: string, setup_future_usage?: null|string}, billie?: null|array{capture_method?: null|string}, bizum?: null|array{}, blik?: null|array{code?: string, setup_future_usage?: null|string}, boleto?: null|array{expires_after_days?: int, setup_future_usage?: null|string}, card?: null|array{capture_method?: null|string, cvc_token?: string, installments?: array{enabled?: bool, plan?: null|array{count?: int, interval?: string, type: string}}, mandate_options?: array{amount: int, amount_type: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_extended_authorization?: string, request_incremental_authorization?: string, request_multicapture?: string, request_overcapture?: string, request_three_d_secure?: string, require_cvc_recollection?: bool, setup_future_usage?: null|string, statement_descriptor_suffix_kana?: null|string, statement_descriptor_suffix_kanji?: null|string, three_d_secure?: array{ares_trans_status?: string, cryptogram: string, electronic_commerce_indicator?: string, exemption_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id: string, version: string}}, card_present?: null|array{capture_method?: string, request_extended_authorization?: bool, request_incremental_authorization_support?: bool, routing?: array{requested_priority?: string}}, cashapp?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, crypto?: null|array{setup_future_usage?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, requested_address_types?: string[], type: string}, funding_type?: string, setup_future_usage?: string}, eps?: null|array{setup_future_usage?: string}, fpx?: null|array{setup_future_usage?: string}, giropay?: null|array{setup_future_usage?: string}, grabpay?: null|array{setup_future_usage?: string}, ideal?: null|array{setup_future_usage?: null|string}, interac_present?: null|array{}, kakao_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, klarna?: null|array{capture_method?: null|string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, setup_future_usage?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing?: array{amount: int, date: string}, reference: string}[]}, konbini?: null|array{confirmation_number?: null|string, expires_after_days?: null|int, expires_at?: null|int, product_description?: null|string, setup_future_usage?: string}, kr_card?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, link?: null|array{capture_method?: null|string, persistent_token?: string, setup_future_usage?: null|string}, mb_way?: null|array{setup_future_usage?: string}, mobilepay?: null|array{capture_method?: null|string, setup_future_usage?: string}, multibanco?: null|array{setup_future_usage?: string}, naver_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, nz_bank_account?: null|array{setup_future_usage?: null|string, target_date?: string}, oxxo?: null|array{expires_after_days?: int, setup_future_usage?: string}, p24?: null|array{setup_future_usage?: string, tos_shown_and_accepted?: bool}, pay_by_bank?: null|array{}, payco?: null|array{capture_method?: null|string}, paynow?: null|array{setup_future_usage?: string}, paypal?: null|array{capture_method?: null|string, preferred_locale?: string, reference?: string, risk_correlation_id?: string, setup_future_usage?: null|string}, payto?: null|array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string}, setup_future_usage?: null|string}, pix?: null|array{amount_includes_iof?: string, expires_after_seconds?: int, expires_at?: int, mandate_options?: array{amount?: int, amount_includes_iof?: string, amount_type?: string, currency?: string, end_date?: string, payment_schedule?: string, reference?: string, start_date?: string}, setup_future_usage?: string}, promptpay?: null|array{setup_future_usage?: string}, revolut_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, samsung_pay?: null|array{capture_method?: null|string}, satispay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, scalapay?: null|array{capture_method?: null|string}, sepa_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, sofort?: null|array{preferred_language?: null|string, setup_future_usage?: null|string}, sunbit?: null|array{capture_method?: null|string, setup_future_usage?: string}, swish?: null|array{reference?: null|string, setup_future_usage?: string}, twint?: null|array{setup_future_usage?: string}, upi?: null|array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}, setup_future_usage?: null|string}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, setup_future_usage?: null|string, target_date?: string, transaction_purpose?: null|string, verification_method?: string}, wechat_pay?: null|array{app_id?: string, client?: string, setup_future_usage?: string}, zip?: null|array{setup_future_usage?: string}}, payment_method_types?: string[], receipt_email?: null|string, setup_future_usage?: null|string, shipping?: null|array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name: string, phone?: string, tracking_number?: string}, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_data?: array{amount?: int, description?: string, metadata?: null|array, payment_data?: array{description?: string, metadata?: null|array}}, transfer_group?: string} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\PaymentIntent diff --git a/libs/stripe-php/lib/Service/PaymentLinkService.php b/libs/stripe-php/lib/Service/PaymentLinkService.php index 7f4ee0777..f40cb09a5 100644 --- a/libs/stripe-php/lib/Service/PaymentLinkService.php +++ b/libs/stripe-php/lib/Service/PaymentLinkService.php @@ -48,7 +48,7 @@ class PaymentLinkService extends AbstractService /** * Creates a payment link. * - * @param null|array{after_completion?: array{hosted_confirmation?: array{custom_message?: string}, redirect?: array{url: string}, type: string}, allow_promotion_codes?: bool, application_fee_amount?: int, application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_address_collection?: string, consent_collection?: array{payment_method_reuse_agreement?: array{position: string}, promotions?: string, terms_of_service?: string}, currency?: string, custom_fields?: array{dropdown?: array{default_value?: string, options: array{label: string, value: string}[]}, key: string, label: array{custom: string, type: string}, numeric?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, optional?: bool, text?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, type: string}[], custom_text?: array{after_submit?: null|array{message: string}, shipping_address?: null|array{message: string}, submit?: null|array{message: string}, terms_of_service_acceptance?: null|array{message: string}}, customer_creation?: string, expand?: string[], inactive_message?: string, invoice_creation?: array{enabled: bool, invoice_data?: array{account_tax_ids?: null|string[], custom_fields?: null|array{name: string, value: string}[], description?: string, footer?: string, issuer?: array{account?: string, type: string}, metadata?: null|array, rendering_options?: null|array{amount_tax_display?: null|string, template?: string}}}, line_items: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, price?: string, price_data?: array{currency: string, product?: string, product_data?: array{description?: string, images?: string[], metadata?: array, name: string, tax_code?: string, unit_label?: string}, recurring?: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity: int}[], metadata?: array, name_collection?: array{business?: array{enabled: bool, optional?: bool}, individual?: array{enabled: bool, optional?: bool}}, on_behalf_of?: string, optional_items?: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, price: string, quantity: int}[], payment_intent_data?: array{capture_method?: string, description?: string, metadata?: array, setup_future_usage?: string, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_group?: string}, payment_method_collection?: string, payment_method_types?: string[], phone_number_collection?: array{enabled: bool}, restrictions?: array{completed_sessions: array{limit: int}}, shipping_address_collection?: array{allowed_countries: string[]}, shipping_options?: array{shipping_rate?: string}[], submit_type?: string, subscription_data?: array{description?: string, invoice_settings?: array{issuer?: array{account?: string, type: string}}, metadata?: array, trial_period_days?: int, trial_settings?: array{end_behavior: array{missing_payment_method: string}}}, tax_id_collection?: array{enabled: bool, required?: string}, transfer_data?: array{amount?: int, destination: string}} $params + * @param null|array{after_completion?: array{hosted_confirmation?: array{custom_message?: string}, redirect?: array{url: string}, type: string}, allow_promotion_codes?: bool, application_fee_amount?: int, application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_address_collection?: string, consent_collection?: array{payment_method_reuse_agreement?: array{position: string}, promotions?: string, terms_of_service?: string}, currency?: string, custom_fields?: array{dropdown?: array{default_value?: string, options: array{label: string, value: string}[]}, key: string, label: array{custom: string, type: string}, numeric?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, optional?: bool, text?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, type: string}[], custom_text?: array{after_submit?: null|array{message: string}, shipping_address?: null|array{message: string}, submit?: null|array{message: string}, terms_of_service_acceptance?: null|array{message: string}}, customer_creation?: string, expand?: string[], inactive_message?: string, invoice_creation?: array{enabled: bool, invoice_data?: array{account_tax_ids?: null|string[], custom_fields?: null|array{name: string, value: string}[], description?: string, footer?: string, issuer?: array{account?: string, type: string}, metadata?: null|array, rendering_options?: null|array{amount_tax_display?: null|string, template?: string}}}, line_items: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, price?: string, price_data?: array{currency: string, product?: string, product_data?: array{description?: string, images?: string[], metadata?: array, name: string, tax_code?: string, unit_label?: string}, recurring?: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity: int}[], managed_payments?: array{enabled?: bool}, metadata?: array, name_collection?: array{business?: array{enabled: bool, optional?: bool}, individual?: array{enabled: bool, optional?: bool}}, on_behalf_of?: string, optional_items?: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, price: string, quantity: int}[], payment_intent_data?: array{capture_method?: string, description?: string, metadata?: array, setup_future_usage?: string, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_group?: string}, payment_method_collection?: string, payment_method_options?: array{card?: array{restrictions?: array{brands_blocked?: string[]}}}, payment_method_types?: string[], phone_number_collection?: array{enabled: bool}, restrictions?: array{completed_sessions: array{limit: int}}, shipping_address_collection?: array{allowed_countries: string[]}, shipping_options?: array{shipping_rate?: string}[], submit_type?: string, subscription_data?: array{description?: string, invoice_settings?: array{issuer?: array{account?: string, type: string}}, metadata?: array, trial_period_days?: int, trial_settings?: array{end_behavior: array{missing_payment_method: string}}}, tax_id_collection?: array{enabled: bool, required?: string}, transfer_data?: array{amount?: int, destination: string}} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\PaymentLink @@ -80,7 +80,7 @@ class PaymentLinkService extends AbstractService * Updates a payment link. * * @param string $id - * @param null|array{active?: bool, after_completion?: array{hosted_confirmation?: array{custom_message?: string}, redirect?: array{url: string}, type: string}, allow_promotion_codes?: bool, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_address_collection?: string, custom_fields?: null|array{dropdown?: array{default_value?: string, options: array{label: string, value: string}[]}, key: string, label: array{custom: string, type: string}, numeric?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, optional?: bool, text?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, type: string}[], custom_text?: array{after_submit?: null|array{message: string}, shipping_address?: null|array{message: string}, submit?: null|array{message: string}, terms_of_service_acceptance?: null|array{message: string}}, customer_creation?: string, expand?: string[], inactive_message?: null|string, invoice_creation?: array{enabled: bool, invoice_data?: array{account_tax_ids?: null|string[], custom_fields?: null|array{name: string, value: string}[], description?: string, footer?: string, issuer?: array{account?: string, type: string}, metadata?: null|array, rendering_options?: null|array{amount_tax_display?: null|string, template?: string}}}, line_items?: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, id: string, quantity?: int}[], metadata?: array, name_collection?: null|array{business?: array{enabled: bool, optional?: bool}, individual?: array{enabled: bool, optional?: bool}}, optional_items?: null|array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, price: string, quantity: int}[], payment_intent_data?: array{description?: null|string, metadata?: null|array, statement_descriptor?: null|string, statement_descriptor_suffix?: null|string, transfer_group?: null|string}, payment_method_collection?: string, payment_method_types?: null|string[], phone_number_collection?: array{enabled: bool}, restrictions?: null|array{completed_sessions: array{limit: int}}, shipping_address_collection?: null|array{allowed_countries: string[]}, submit_type?: string, subscription_data?: array{invoice_settings?: array{issuer?: array{account?: string, type: string}}, metadata?: null|array, trial_period_days?: null|int, trial_settings?: null|array{end_behavior: array{missing_payment_method: string}}}, tax_id_collection?: array{enabled: bool, required?: string}} $params + * @param null|array{active?: bool, after_completion?: array{hosted_confirmation?: array{custom_message?: string}, redirect?: array{url: string}, type: string}, allow_promotion_codes?: bool, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_address_collection?: string, custom_fields?: null|array{dropdown?: array{default_value?: string, options: array{label: string, value: string}[]}, key: string, label: array{custom: string, type: string}, numeric?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, optional?: bool, text?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, type: string}[], custom_text?: array{after_submit?: null|array{message: string}, shipping_address?: null|array{message: string}, submit?: null|array{message: string}, terms_of_service_acceptance?: null|array{message: string}}, customer_creation?: string, expand?: string[], inactive_message?: null|string, invoice_creation?: array{enabled: bool, invoice_data?: array{account_tax_ids?: null|string[], custom_fields?: null|array{name: string, value: string}[], description?: string, footer?: string, issuer?: array{account?: string, type: string}, metadata?: null|array, rendering_options?: null|array{amount_tax_display?: null|string, template?: string}}}, line_items?: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, id: string, quantity?: int}[], metadata?: array, name_collection?: null|array{business?: array{enabled: bool, optional?: bool}, individual?: array{enabled: bool, optional?: bool}}, optional_items?: null|array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, price: string, quantity: int}[], payment_intent_data?: array{description?: null|string, metadata?: null|array, statement_descriptor?: null|string, statement_descriptor_suffix?: null|string, transfer_group?: null|string}, payment_method_collection?: string, payment_method_options?: null|array{card?: null|array{restrictions?: null|array{brands_blocked?: null|string[]}}}, payment_method_types?: null|string[], phone_number_collection?: array{enabled: bool}, restrictions?: null|array{completed_sessions: array{limit: int}}, shipping_address_collection?: null|array{allowed_countries: string[]}, submit_type?: string, subscription_data?: array{invoice_settings?: array{issuer?: array{account?: string, type: string}}, metadata?: null|array, trial_period_days?: null|int, trial_settings?: null|array{end_behavior: array{missing_payment_method: string}}}, tax_id_collection?: array{enabled: bool, required?: string}} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\PaymentLink diff --git a/libs/stripe-php/lib/Service/PaymentMethodConfigurationService.php b/libs/stripe-php/lib/Service/PaymentMethodConfigurationService.php index 2f54573e4..03deda20d 100644 --- a/libs/stripe-php/lib/Service/PaymentMethodConfigurationService.php +++ b/libs/stripe-php/lib/Service/PaymentMethodConfigurationService.php @@ -14,7 +14,7 @@ class PaymentMethodConfigurationService extends AbstractService /** * List payment method configurations. * - * @param null|array{application?: null|string, ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|array{active?: bool, application?: null|string, ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\Collection<\Stripe\PaymentMethodConfiguration> @@ -29,7 +29,7 @@ class PaymentMethodConfigurationService extends AbstractService /** * Creates a payment method configuration. * - * @param null|array{acss_debit?: array{display_preference?: array{preference?: string}}, affirm?: array{display_preference?: array{preference?: string}}, afterpay_clearpay?: array{display_preference?: array{preference?: string}}, alipay?: array{display_preference?: array{preference?: string}}, alma?: array{display_preference?: array{preference?: string}}, amazon_pay?: array{display_preference?: array{preference?: string}}, apple_pay?: array{display_preference?: array{preference?: string}}, apple_pay_later?: array{display_preference?: array{preference?: string}}, au_becs_debit?: array{display_preference?: array{preference?: string}}, bacs_debit?: array{display_preference?: array{preference?: string}}, bancontact?: array{display_preference?: array{preference?: string}}, billie?: array{display_preference?: array{preference?: string}}, blik?: array{display_preference?: array{preference?: string}}, boleto?: array{display_preference?: array{preference?: string}}, card?: array{display_preference?: array{preference?: string}}, cartes_bancaires?: array{display_preference?: array{preference?: string}}, cashapp?: array{display_preference?: array{preference?: string}}, crypto?: array{display_preference?: array{preference?: string}}, customer_balance?: array{display_preference?: array{preference?: string}}, eps?: array{display_preference?: array{preference?: string}}, expand?: string[], fpx?: array{display_preference?: array{preference?: string}}, fr_meal_voucher_conecs?: array{display_preference?: array{preference?: string}}, giropay?: array{display_preference?: array{preference?: string}}, google_pay?: array{display_preference?: array{preference?: string}}, grabpay?: array{display_preference?: array{preference?: string}}, ideal?: array{display_preference?: array{preference?: string}}, jcb?: array{display_preference?: array{preference?: string}}, kakao_pay?: array{display_preference?: array{preference?: string}}, klarna?: array{display_preference?: array{preference?: string}}, konbini?: array{display_preference?: array{preference?: string}}, kr_card?: array{display_preference?: array{preference?: string}}, link?: array{display_preference?: array{preference?: string}}, mb_way?: array{display_preference?: array{preference?: string}}, mobilepay?: array{display_preference?: array{preference?: string}}, multibanco?: array{display_preference?: array{preference?: string}}, name?: string, naver_pay?: array{display_preference?: array{preference?: string}}, nz_bank_account?: array{display_preference?: array{preference?: string}}, oxxo?: array{display_preference?: array{preference?: string}}, p24?: array{display_preference?: array{preference?: string}}, parent?: string, pay_by_bank?: array{display_preference?: array{preference?: string}}, payco?: array{display_preference?: array{preference?: string}}, paynow?: array{display_preference?: array{preference?: string}}, paypal?: array{display_preference?: array{preference?: string}}, payto?: array{display_preference?: array{preference?: string}}, pix?: array{display_preference?: array{preference?: string}}, promptpay?: array{display_preference?: array{preference?: string}}, revolut_pay?: array{display_preference?: array{preference?: string}}, samsung_pay?: array{display_preference?: array{preference?: string}}, satispay?: array{display_preference?: array{preference?: string}}, sepa_debit?: array{display_preference?: array{preference?: string}}, sofort?: array{display_preference?: array{preference?: string}}, swish?: array{display_preference?: array{preference?: string}}, twint?: array{display_preference?: array{preference?: string}}, us_bank_account?: array{display_preference?: array{preference?: string}}, wechat_pay?: array{display_preference?: array{preference?: string}}, zip?: array{display_preference?: array{preference?: string}}} $params + * @param null|array{acss_debit?: array{display_preference?: array{preference?: string}}, affirm?: array{display_preference?: array{preference?: string}}, afterpay_clearpay?: array{display_preference?: array{preference?: string}}, alipay?: array{display_preference?: array{preference?: string}}, alma?: array{display_preference?: array{preference?: string}}, amazon_pay?: array{display_preference?: array{preference?: string}}, apple_pay?: array{display_preference?: array{preference?: string}}, apple_pay_later?: array{display_preference?: array{preference?: string}}, au_becs_debit?: array{display_preference?: array{preference?: string}}, bacs_debit?: array{display_preference?: array{preference?: string}}, bancontact?: array{display_preference?: array{preference?: string}}, billie?: array{display_preference?: array{preference?: string}}, bizum?: array{display_preference?: array{preference?: string}}, blik?: array{display_preference?: array{preference?: string}}, boleto?: array{display_preference?: array{preference?: string}}, card?: array{display_preference?: array{preference?: string}}, cartes_bancaires?: array{display_preference?: array{preference?: string}}, cashapp?: array{display_preference?: array{preference?: string}}, crypto?: array{display_preference?: array{preference?: string}}, customer_balance?: array{display_preference?: array{preference?: string}}, eps?: array{display_preference?: array{preference?: string}}, expand?: string[], fpx?: array{display_preference?: array{preference?: string}}, fr_meal_voucher_conecs?: array{display_preference?: array{preference?: string}}, giropay?: array{display_preference?: array{preference?: string}}, google_pay?: array{display_preference?: array{preference?: string}}, grabpay?: array{display_preference?: array{preference?: string}}, ideal?: array{display_preference?: array{preference?: string}}, jcb?: array{display_preference?: array{preference?: string}}, kakao_pay?: array{display_preference?: array{preference?: string}}, klarna?: array{display_preference?: array{preference?: string}}, konbini?: array{display_preference?: array{preference?: string}}, kr_card?: array{display_preference?: array{preference?: string}}, link?: array{display_preference?: array{preference?: string}}, mb_way?: array{display_preference?: array{preference?: string}}, mobilepay?: array{display_preference?: array{preference?: string}}, multibanco?: array{display_preference?: array{preference?: string}}, name?: string, naver_pay?: array{display_preference?: array{preference?: string}}, nz_bank_account?: array{display_preference?: array{preference?: string}}, oxxo?: array{display_preference?: array{preference?: string}}, p24?: array{display_preference?: array{preference?: string}}, parent?: string, pay_by_bank?: array{display_preference?: array{preference?: string}}, payco?: array{display_preference?: array{preference?: string}}, paynow?: array{display_preference?: array{preference?: string}}, paypal?: array{display_preference?: array{preference?: string}}, payto?: array{display_preference?: array{preference?: string}}, pix?: array{display_preference?: array{preference?: string}}, promptpay?: array{display_preference?: array{preference?: string}}, revolut_pay?: array{display_preference?: array{preference?: string}}, samsung_pay?: array{display_preference?: array{preference?: string}}, satispay?: array{display_preference?: array{preference?: string}}, scalapay?: array{display_preference?: array{preference?: string}}, sepa_debit?: array{display_preference?: array{preference?: string}}, sofort?: array{display_preference?: array{preference?: string}}, sunbit?: array{display_preference?: array{preference?: string}}, swish?: array{display_preference?: array{preference?: string}}, twint?: array{display_preference?: array{preference?: string}}, upi?: array{display_preference?: array{preference?: string}}, us_bank_account?: array{display_preference?: array{preference?: string}}, wechat_pay?: array{display_preference?: array{preference?: string}}, zip?: array{display_preference?: array{preference?: string}}} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\PaymentMethodConfiguration @@ -61,7 +61,7 @@ class PaymentMethodConfigurationService extends AbstractService * Update payment method configuration. * * @param string $id - * @param null|array{acss_debit?: array{display_preference?: array{preference?: string}}, active?: bool, affirm?: array{display_preference?: array{preference?: string}}, afterpay_clearpay?: array{display_preference?: array{preference?: string}}, alipay?: array{display_preference?: array{preference?: string}}, alma?: array{display_preference?: array{preference?: string}}, amazon_pay?: array{display_preference?: array{preference?: string}}, apple_pay?: array{display_preference?: array{preference?: string}}, apple_pay_later?: array{display_preference?: array{preference?: string}}, au_becs_debit?: array{display_preference?: array{preference?: string}}, bacs_debit?: array{display_preference?: array{preference?: string}}, bancontact?: array{display_preference?: array{preference?: string}}, billie?: array{display_preference?: array{preference?: string}}, blik?: array{display_preference?: array{preference?: string}}, boleto?: array{display_preference?: array{preference?: string}}, card?: array{display_preference?: array{preference?: string}}, cartes_bancaires?: array{display_preference?: array{preference?: string}}, cashapp?: array{display_preference?: array{preference?: string}}, crypto?: array{display_preference?: array{preference?: string}}, customer_balance?: array{display_preference?: array{preference?: string}}, eps?: array{display_preference?: array{preference?: string}}, expand?: string[], fpx?: array{display_preference?: array{preference?: string}}, fr_meal_voucher_conecs?: array{display_preference?: array{preference?: string}}, giropay?: array{display_preference?: array{preference?: string}}, google_pay?: array{display_preference?: array{preference?: string}}, grabpay?: array{display_preference?: array{preference?: string}}, ideal?: array{display_preference?: array{preference?: string}}, jcb?: array{display_preference?: array{preference?: string}}, kakao_pay?: array{display_preference?: array{preference?: string}}, klarna?: array{display_preference?: array{preference?: string}}, konbini?: array{display_preference?: array{preference?: string}}, kr_card?: array{display_preference?: array{preference?: string}}, link?: array{display_preference?: array{preference?: string}}, mb_way?: array{display_preference?: array{preference?: string}}, mobilepay?: array{display_preference?: array{preference?: string}}, multibanco?: array{display_preference?: array{preference?: string}}, name?: string, naver_pay?: array{display_preference?: array{preference?: string}}, nz_bank_account?: array{display_preference?: array{preference?: string}}, oxxo?: array{display_preference?: array{preference?: string}}, p24?: array{display_preference?: array{preference?: string}}, pay_by_bank?: array{display_preference?: array{preference?: string}}, payco?: array{display_preference?: array{preference?: string}}, paynow?: array{display_preference?: array{preference?: string}}, paypal?: array{display_preference?: array{preference?: string}}, payto?: array{display_preference?: array{preference?: string}}, pix?: array{display_preference?: array{preference?: string}}, promptpay?: array{display_preference?: array{preference?: string}}, revolut_pay?: array{display_preference?: array{preference?: string}}, samsung_pay?: array{display_preference?: array{preference?: string}}, satispay?: array{display_preference?: array{preference?: string}}, sepa_debit?: array{display_preference?: array{preference?: string}}, sofort?: array{display_preference?: array{preference?: string}}, swish?: array{display_preference?: array{preference?: string}}, twint?: array{display_preference?: array{preference?: string}}, us_bank_account?: array{display_preference?: array{preference?: string}}, wechat_pay?: array{display_preference?: array{preference?: string}}, zip?: array{display_preference?: array{preference?: string}}} $params + * @param null|array{acss_debit?: array{display_preference?: array{preference?: string}}, active?: bool, affirm?: array{display_preference?: array{preference?: string}}, afterpay_clearpay?: array{display_preference?: array{preference?: string}}, alipay?: array{display_preference?: array{preference?: string}}, alma?: array{display_preference?: array{preference?: string}}, amazon_pay?: array{display_preference?: array{preference?: string}}, apple_pay?: array{display_preference?: array{preference?: string}}, apple_pay_later?: array{display_preference?: array{preference?: string}}, au_becs_debit?: array{display_preference?: array{preference?: string}}, bacs_debit?: array{display_preference?: array{preference?: string}}, bancontact?: array{display_preference?: array{preference?: string}}, billie?: array{display_preference?: array{preference?: string}}, bizum?: array{display_preference?: array{preference?: string}}, blik?: array{display_preference?: array{preference?: string}}, boleto?: array{display_preference?: array{preference?: string}}, card?: array{display_preference?: array{preference?: string}}, cartes_bancaires?: array{display_preference?: array{preference?: string}}, cashapp?: array{display_preference?: array{preference?: string}}, crypto?: array{display_preference?: array{preference?: string}}, customer_balance?: array{display_preference?: array{preference?: string}}, eps?: array{display_preference?: array{preference?: string}}, expand?: string[], fpx?: array{display_preference?: array{preference?: string}}, fr_meal_voucher_conecs?: array{display_preference?: array{preference?: string}}, giropay?: array{display_preference?: array{preference?: string}}, google_pay?: array{display_preference?: array{preference?: string}}, grabpay?: array{display_preference?: array{preference?: string}}, ideal?: array{display_preference?: array{preference?: string}}, jcb?: array{display_preference?: array{preference?: string}}, kakao_pay?: array{display_preference?: array{preference?: string}}, klarna?: array{display_preference?: array{preference?: string}}, konbini?: array{display_preference?: array{preference?: string}}, kr_card?: array{display_preference?: array{preference?: string}}, link?: array{display_preference?: array{preference?: string}}, mb_way?: array{display_preference?: array{preference?: string}}, mobilepay?: array{display_preference?: array{preference?: string}}, multibanco?: array{display_preference?: array{preference?: string}}, name?: string, naver_pay?: array{display_preference?: array{preference?: string}}, nz_bank_account?: array{display_preference?: array{preference?: string}}, oxxo?: array{display_preference?: array{preference?: string}}, p24?: array{display_preference?: array{preference?: string}}, pay_by_bank?: array{display_preference?: array{preference?: string}}, payco?: array{display_preference?: array{preference?: string}}, paynow?: array{display_preference?: array{preference?: string}}, paypal?: array{display_preference?: array{preference?: string}}, payto?: array{display_preference?: array{preference?: string}}, pix?: array{display_preference?: array{preference?: string}}, promptpay?: array{display_preference?: array{preference?: string}}, revolut_pay?: array{display_preference?: array{preference?: string}}, samsung_pay?: array{display_preference?: array{preference?: string}}, satispay?: array{display_preference?: array{preference?: string}}, scalapay?: array{display_preference?: array{preference?: string}}, sepa_debit?: array{display_preference?: array{preference?: string}}, sofort?: array{display_preference?: array{preference?: string}}, sunbit?: array{display_preference?: array{preference?: string}}, swish?: array{display_preference?: array{preference?: string}}, twint?: array{display_preference?: array{preference?: string}}, upi?: array{display_preference?: array{preference?: string}}, us_bank_account?: array{display_preference?: array{preference?: string}}, wechat_pay?: array{display_preference?: array{preference?: string}}, zip?: array{display_preference?: array{preference?: string}}} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\PaymentMethodConfiguration diff --git a/libs/stripe-php/lib/Service/PaymentMethodService.php b/libs/stripe-php/lib/Service/PaymentMethodService.php index f52f947ce..08cd0aecd 100644 --- a/libs/stripe-php/lib/Service/PaymentMethodService.php +++ b/libs/stripe-php/lib/Service/PaymentMethodService.php @@ -70,7 +70,7 @@ class PaymentMethodService extends AbstractService * href="/docs/payments/save-and-reuse">SetupIntent API to collect payment * method details ahead of a future payment. * - * @param null|array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, blik?: array{}, boleto?: array{tax_id: string}, card?: array{cvc?: string, exp_month?: int, exp_year?: int, networks?: array{preferred?: string}, number?: string, token?: string}, cashapp?: array{}, crypto?: array{}, custom?: array{type: string}, customer?: string, customer_balance?: array{}, eps?: array{bank?: string}, expand?: string[], fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, payment_method?: string, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, swish?: array{}, twint?: array{}, type?: string, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}} $params + * @param null|array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, bizum?: array{}, blik?: array{}, boleto?: array{tax_id: string}, card?: array{cvc?: string, exp_month?: int, exp_year?: int, networks?: array{preferred?: string}, number?: string, token?: string}, cashapp?: array{}, crypto?: array{}, custom?: array{type: string}, customer?: string, customer_balance?: array{}, eps?: array{bank?: string}, expand?: string[], fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, payment_method?: string, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, scalapay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, sunbit?: array{}, swish?: array{}, twint?: array{}, type?: string, upi?: array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}}, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\PaymentMethod diff --git a/libs/stripe-php/lib/Service/PaymentRecordService.php b/libs/stripe-php/lib/Service/PaymentRecordService.php index d2668ae41..da73df85a 100644 --- a/libs/stripe-php/lib/Service/PaymentRecordService.php +++ b/libs/stripe-php/lib/Service/PaymentRecordService.php @@ -118,7 +118,7 @@ class PaymentRecordService extends AbstractService * refunded. * * @param string $id - * @param null|array{amount?: array{currency: string, value: int}, expand?: string[], initiated_at?: int, metadata?: null|array, outcome: string, processor_details: array{custom?: array{refund_reference: string}, type: string}, refunded: array{refunded_at: int}} $params + * @param null|array{amount?: array{currency: string, value: int}, expand?: string[], initiated_at?: int, metadata?: null|array, outcome: string, processor_details: array{custom?: array{refund_reference: string}, type: string}, refunded?: array{refunded_at: int}} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\PaymentRecord diff --git a/libs/stripe-php/lib/Service/PayoutService.php b/libs/stripe-php/lib/Service/PayoutService.php index a6e1b5cb7..2fed81c21 100644 --- a/libs/stripe-php/lib/Service/PayoutService.php +++ b/libs/stripe-php/lib/Service/PayoutService.php @@ -56,8 +56,8 @@ class PayoutService extends AbstractService * * If you create a manual payout on a Stripe account that uses multiple payment * source types, you need to specify the source type balance that the payout draws - * from. The balance object details available and - * pending amounts by source type. + * from. The balance object details available + * and pending amounts by source type. * * @param null|array{amount: int, currency: string, description?: string, destination?: string, expand?: string[], metadata?: array, method?: string, payout_method?: string, source_type?: string, statement_descriptor?: string} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts diff --git a/libs/stripe-php/lib/Service/SetupIntentService.php b/libs/stripe-php/lib/Service/SetupIntentService.php index 65c64e487..eadf4c448 100644 --- a/libs/stripe-php/lib/Service/SetupIntentService.php +++ b/libs/stripe-php/lib/Service/SetupIntentService.php @@ -63,7 +63,7 @@ class SetupIntentService extends AbstractService * or the canceled status if the confirmation limit is reached. * * @param string $id - * @param null|array{confirmation_token?: string, expand?: string[], mandate_data?: null|array{customer_acceptance?: array{accepted_at?: int, offline?: array{}, online?: array{ip_address?: string, user_agent?: string}, type: string}}, payment_method?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, swish?: array{}, twint?: array{}, type: string, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: array{currency?: string, mandate_options?: array{custom_mandate_url?: null|string, default_for?: string[], interval_description?: string, payment_schedule?: string, transaction_type?: string}, verification_method?: string}, amazon_pay?: array{}, bacs_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, card?: array{mandate_options?: array{amount: int, amount_type: string, currency: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_three_d_secure?: string, three_d_secure?: array{ares_trans_status?: string, cryptogram?: string, electronic_commerce_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id?: string, version?: string}}, card_present?: array{}, klarna?: array{currency?: string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing: array{amount: int, date: string}, reference: string}[]}, link?: array{persistent_token?: string}, paypal?: array{billing_agreement_id?: string}, payto?: array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string, start_date?: null|string}}, sepa_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, us_bank_account?: array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, verification_method?: string}}, return_url?: string, use_stripe_sdk?: bool} $params + * @param null|array{confirmation_token?: string, expand?: string[], mandate_data?: null|array{customer_acceptance?: array{accepted_at?: int, offline?: array{}, online?: array{ip_address?: string, user_agent?: string}, type: string}}, payment_method?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, bizum?: array{}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, scalapay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, sunbit?: array{}, swish?: array{}, twint?: array{}, type: string, upi?: array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}}, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: array{currency?: string, mandate_options?: array{custom_mandate_url?: null|string, default_for?: string[], interval_description?: string, payment_schedule?: string, transaction_type?: string}, verification_method?: string}, amazon_pay?: array{}, bacs_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, bizum?: array{}, card?: array{mandate_options?: array{amount: int, amount_type: string, currency: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_three_d_secure?: string, three_d_secure?: array{ares_trans_status?: string, cryptogram?: string, electronic_commerce_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id?: string, version?: string}}, card_present?: array{}, klarna?: array{currency?: string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing: array{amount: int, date: string}, reference: string}[]}, link?: array{persistent_token?: string}, paypal?: array{billing_agreement_id?: string}, payto?: array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string, start_date?: null|string}}, pix?: array{mandate_options?: array{amount?: int, amount_includes_iof?: string, amount_type?: string, currency?: string, end_date?: string, payment_schedule?: string, reference?: string, start_date?: string}}, sepa_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, upi?: array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}, setup_future_usage?: null|string}, us_bank_account?: array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, verification_method?: string}}, return_url?: string, use_stripe_sdk?: bool} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\SetupIntent @@ -82,7 +82,7 @@ class SetupIntentService extends AbstractService * href="/docs/api/setup_intents/confirm">confirm it to collect any required * permissions to charge the payment method later. * - * @param null|array{attach_to_self?: bool, automatic_payment_methods?: array{allow_redirects?: string, enabled: bool}, confirm?: bool, confirmation_token?: string, customer?: string, customer_account?: string, description?: string, excluded_payment_method_types?: string[], expand?: string[], flow_directions?: string[], mandate_data?: null|array{customer_acceptance: array{accepted_at?: int, offline?: array{}, online?: array{ip_address: string, user_agent: string}, type: string}}, metadata?: array, on_behalf_of?: string, payment_method?: string, payment_method_configuration?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, swish?: array{}, twint?: array{}, type: string, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: array{currency?: string, mandate_options?: array{custom_mandate_url?: null|string, default_for?: string[], interval_description?: string, payment_schedule?: string, transaction_type?: string}, verification_method?: string}, amazon_pay?: array{}, bacs_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, card?: array{mandate_options?: array{amount: int, amount_type: string, currency: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_three_d_secure?: string, three_d_secure?: array{ares_trans_status?: string, cryptogram?: string, electronic_commerce_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id?: string, version?: string}}, card_present?: array{}, klarna?: array{currency?: string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing: array{amount: int, date: string}, reference: string}[]}, link?: array{persistent_token?: string}, paypal?: array{billing_agreement_id?: string}, payto?: array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string, start_date?: null|string}}, sepa_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, us_bank_account?: array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, verification_method?: string}}, payment_method_types?: string[], return_url?: string, single_use?: array{amount: int, currency: string}, usage?: string, use_stripe_sdk?: bool} $params + * @param null|array{attach_to_self?: bool, automatic_payment_methods?: array{allow_redirects?: string, enabled: bool}, confirm?: bool, confirmation_token?: string, customer?: string, customer_account?: string, description?: string, excluded_payment_method_types?: string[], expand?: string[], flow_directions?: string[], mandate_data?: null|array{customer_acceptance: array{accepted_at?: int, offline?: array{}, online?: array{ip_address: string, user_agent: string}, type: string}}, metadata?: array, on_behalf_of?: string, payment_method?: string, payment_method_configuration?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, bizum?: array{}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, scalapay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, sunbit?: array{}, swish?: array{}, twint?: array{}, type: string, upi?: array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}}, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: array{currency?: string, mandate_options?: array{custom_mandate_url?: null|string, default_for?: string[], interval_description?: string, payment_schedule?: string, transaction_type?: string}, verification_method?: string}, amazon_pay?: array{}, bacs_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, bizum?: array{}, card?: array{mandate_options?: array{amount: int, amount_type: string, currency: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_three_d_secure?: string, three_d_secure?: array{ares_trans_status?: string, cryptogram?: string, electronic_commerce_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id?: string, version?: string}}, card_present?: array{}, klarna?: array{currency?: string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing: array{amount: int, date: string}, reference: string}[]}, link?: array{persistent_token?: string}, paypal?: array{billing_agreement_id?: string}, payto?: array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string, start_date?: null|string}}, pix?: array{mandate_options?: array{amount?: int, amount_includes_iof?: string, amount_type?: string, currency?: string, end_date?: string, payment_schedule?: string, reference?: string, start_date?: string}}, sepa_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, upi?: array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}, setup_future_usage?: null|string}, us_bank_account?: array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, verification_method?: string}}, payment_method_types?: string[], return_url?: string, single_use?: array{amount: int, currency: string}, usage?: string, use_stripe_sdk?: bool} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\SetupIntent @@ -121,7 +121,7 @@ class SetupIntentService extends AbstractService * Updates a SetupIntent object. * * @param string $id - * @param null|array{attach_to_self?: bool, customer?: string, customer_account?: string, description?: string, excluded_payment_method_types?: null|string[], expand?: string[], flow_directions?: string[], metadata?: null|array, payment_method?: string, payment_method_configuration?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, swish?: array{}, twint?: array{}, type: string, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: array{currency?: string, mandate_options?: array{custom_mandate_url?: null|string, default_for?: string[], interval_description?: string, payment_schedule?: string, transaction_type?: string}, verification_method?: string}, amazon_pay?: array{}, bacs_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, card?: array{mandate_options?: array{amount: int, amount_type: string, currency: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_three_d_secure?: string, three_d_secure?: array{ares_trans_status?: string, cryptogram?: string, electronic_commerce_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id?: string, version?: string}}, card_present?: array{}, klarna?: array{currency?: string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing: array{amount: int, date: string}, reference: string}[]}, link?: array{persistent_token?: string}, paypal?: array{billing_agreement_id?: string}, payto?: array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string, start_date?: null|string}}, sepa_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, us_bank_account?: array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, verification_method?: string}}, payment_method_types?: string[]} $params + * @param null|array{attach_to_self?: bool, customer?: string, customer_account?: string, description?: string, excluded_payment_method_types?: null|string[], expand?: string[], flow_directions?: string[], metadata?: null|array, payment_method?: string, payment_method_configuration?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, bizum?: array{}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, scalapay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, sunbit?: array{}, swish?: array{}, twint?: array{}, type: string, upi?: array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}}, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: array{currency?: string, mandate_options?: array{custom_mandate_url?: null|string, default_for?: string[], interval_description?: string, payment_schedule?: string, transaction_type?: string}, verification_method?: string}, amazon_pay?: array{}, bacs_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, bizum?: array{}, card?: array{mandate_options?: array{amount: int, amount_type: string, currency: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_three_d_secure?: string, three_d_secure?: array{ares_trans_status?: string, cryptogram?: string, electronic_commerce_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id?: string, version?: string}}, card_present?: array{}, klarna?: array{currency?: string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing: array{amount: int, date: string}, reference: string}[]}, link?: array{persistent_token?: string}, paypal?: array{billing_agreement_id?: string}, payto?: array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string, start_date?: null|string}}, pix?: array{mandate_options?: array{amount?: int, amount_includes_iof?: string, amount_type?: string, currency?: string, end_date?: string, payment_schedule?: string, reference?: string, start_date?: string}}, sepa_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, upi?: array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}, setup_future_usage?: null|string}, us_bank_account?: array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, verification_method?: string}}, payment_method_types?: string[]} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\SetupIntent diff --git a/libs/stripe-php/lib/Service/SubscriptionScheduleService.php b/libs/stripe-php/lib/Service/SubscriptionScheduleService.php index 69b8f7cc5..0db3b4599 100644 --- a/libs/stripe-php/lib/Service/SubscriptionScheduleService.php +++ b/libs/stripe-php/lib/Service/SubscriptionScheduleService.php @@ -49,7 +49,7 @@ class SubscriptionScheduleService extends AbstractService * Creates a new subscription schedule object. Each customer can have up to 500 * active or scheduled subscriptions. * - * @param null|array{billing_mode?: array{flexible?: array{proration_discounts?: string}, type: string}, customer?: string, customer_account?: string, default_settings?: array{application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, collection_method?: string, default_payment_method?: string, description?: null|string, invoice_settings?: array{account_tax_ids?: null|string[], days_until_due?: int, issuer?: array{account?: string, type: string}}, on_behalf_of?: null|string, transfer_data?: null|array{amount_percent?: float, destination: string}}, end_behavior?: string, expand?: string[], from_subscription?: string, metadata?: null|array, phases?: (array{add_invoice_items?: (array{discounts?: array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, period?: array{end: array{timestamp?: int, type: string}, start: array{timestamp?: int, type: string}}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, collection_method?: string, currency?: string, default_payment_method?: string, default_tax_rates?: null|string[], description?: null|string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], duration?: array{interval: string, interval_count?: int}, end_date?: int, invoice_settings?: array{account_tax_ids?: null|string[], days_until_due?: int, issuer?: array{account?: string, type: string}}, items: (array{billing_thresholds?: null|array{usage_gte: int}, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: array, on_behalf_of?: string, proration_behavior?: string, transfer_data?: array{amount_percent?: float, destination: string}, trial?: bool, trial_end?: int})[], start_date?: array|int|string} $params + * @param null|array{billing_mode?: array{flexible?: array{proration_discounts?: string}, type: string}, customer?: string, customer_account?: string, default_settings?: array{application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, collection_method?: string, default_payment_method?: string, description?: null|string, invoice_settings?: array{account_tax_ids?: null|string[], days_until_due?: int, issuer?: array{account?: string, type: string}}, on_behalf_of?: null|string, transfer_data?: null|array{amount_percent?: float, destination: string}}, end_behavior?: string, expand?: string[], from_subscription?: string, metadata?: null|array, phases?: (array{add_invoice_items?: (array{discountable?: bool, discounts?: array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, period?: array{end: array{timestamp?: int, type: string}, start: array{timestamp?: int, type: string}}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, collection_method?: string, currency?: string, default_payment_method?: string, default_tax_rates?: null|string[], description?: null|string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], duration?: array{interval: string, interval_count?: int}, end_date?: int, invoice_settings?: array{account_tax_ids?: null|string[], days_until_due?: int, issuer?: array{account?: string, type: string}}, items: (array{billing_thresholds?: null|array{usage_gte: int}, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: array, on_behalf_of?: string, proration_behavior?: string, transfer_data?: array{amount_percent?: float, destination: string}, trial?: bool, trial_end?: int})[], start_date?: array|int|string} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\SubscriptionSchedule @@ -104,7 +104,7 @@ class SubscriptionScheduleService extends AbstractService * Updates an existing subscription schedule. * * @param string $id - * @param null|array{default_settings?: array{application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, collection_method?: string, default_payment_method?: string, description?: null|string, invoice_settings?: array{account_tax_ids?: null|string[], days_until_due?: int, issuer?: array{account?: string, type: string}}, on_behalf_of?: null|string, transfer_data?: null|array{amount_percent?: float, destination: string}}, end_behavior?: string, expand?: string[], metadata?: null|array, phases?: (array{add_invoice_items?: (array{discounts?: array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, period?: array{end: array{timestamp?: int, type: string}, start: array{timestamp?: int, type: string}}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, collection_method?: string, currency?: string, default_payment_method?: string, default_tax_rates?: null|string[], description?: null|string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], duration?: array{interval: string, interval_count?: int}, end_date?: array|int|string, invoice_settings?: array{account_tax_ids?: null|string[], days_until_due?: int, issuer?: array{account?: string, type: string}}, items: (array{billing_thresholds?: null|array{usage_gte: int}, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: array, on_behalf_of?: string, proration_behavior?: string, start_date?: array|int|string, transfer_data?: array{amount_percent?: float, destination: string}, trial?: bool, trial_end?: array|int|string})[], proration_behavior?: string} $params + * @param null|array{default_settings?: array{application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, collection_method?: string, default_payment_method?: string, description?: null|string, invoice_settings?: array{account_tax_ids?: null|string[], days_until_due?: int, issuer?: array{account?: string, type: string}}, on_behalf_of?: null|string, transfer_data?: null|array{amount_percent?: float, destination: string}}, end_behavior?: string, expand?: string[], metadata?: null|array, phases?: (array{add_invoice_items?: (array{discountable?: bool, discounts?: array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, period?: array{end: array{timestamp?: int, type: string}, start: array{timestamp?: int, type: string}}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, collection_method?: string, currency?: string, default_payment_method?: string, default_tax_rates?: null|string[], description?: null|string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], duration?: array{interval: string, interval_count?: int}, end_date?: array|int|string, invoice_settings?: array{account_tax_ids?: null|string[], days_until_due?: int, issuer?: array{account?: string, type: string}}, items: (array{billing_thresholds?: null|array{usage_gte: int}, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: array, on_behalf_of?: string, proration_behavior?: string, start_date?: array|int|string, transfer_data?: array{amount_percent?: float, destination: string}, trial?: bool, trial_end?: array|int|string})[], proration_behavior?: string} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\SubscriptionSchedule diff --git a/libs/stripe-php/lib/Service/SubscriptionService.php b/libs/stripe-php/lib/Service/SubscriptionService.php index 4d29cde92..adc5c20e4 100644 --- a/libs/stripe-php/lib/Service/SubscriptionService.php +++ b/libs/stripe-php/lib/Service/SubscriptionService.php @@ -29,15 +29,16 @@ class SubscriptionService extends AbstractService /** * Cancels a customer’s subscription immediately. The customer won’t be charged - * again for the subscription. After it’s canceled, you can no longer update the - * subscription or its metadata. + * again for the subscription. After it’s canceled, the subscription is largely + * immutable. You can still update its metadata and + * cancellation_details. * * Any pending invoice items that you’ve created are still charged at the end of - * the period, unless manually deleted. If you’ve - * set the subscription to cancel at the end of the period, any pending prorations - * are also left in place and collected at the end of the period. But if the - * subscription is set to cancel immediately, pending prorations are removed if - * invoice_now and prorate are both set to true. + * the period, unless manually deleted. If + * you’ve set the subscription to cancel at the end of the period, any pending + * prorations are also left in place and collected at the end of the period. But if + * the subscription is set to cancel immediately, pending prorations are removed if + * invoice_now and prorate are both set to false. * * By default, upon subscription cancellation, Stripe stops automatic collection of * all finalized invoices for the customer. This is intended to prevent unexpected @@ -74,7 +75,7 @@ class SubscriptionService extends AbstractService * schedules instead. Schedules provide the flexibility to model more complex * billing configurations that change over time. * - * @param null|array{add_invoice_items?: (array{discounts?: array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, period?: array{end: array{timestamp?: int, type: string}, start: array{timestamp?: int, type: string}}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], application_fee_percent?: null|float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, backdate_start_date?: int, billing_cycle_anchor?: int, billing_cycle_anchor_config?: array{day_of_month: int, hour?: int, minute?: int, month?: int, second?: int}, billing_mode?: array{flexible?: array{proration_discounts?: string}, type: string}, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, cancel_at?: array|int|string, cancel_at_period_end?: bool, collection_method?: string, currency?: string, customer?: string, customer_account?: string, days_until_due?: int, default_payment_method?: string, default_source?: string, default_tax_rates?: null|string[], description?: string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], invoice_settings?: array{account_tax_ids?: null|string[], issuer?: array{account?: string, type: string}}, items?: (array{billing_thresholds?: null|array{usage_gte: int}, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: null|array, off_session?: bool, on_behalf_of?: null|string, payment_behavior?: string, payment_settings?: array{payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{transaction_type?: string}, verification_method?: string}, bancontact?: null|array{preferred_language?: string}, card?: null|array{mandate_options?: array{amount?: int, amount_type?: string, description?: string}, network?: string, request_three_d_secure?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, type?: string}, funding_type?: string}, konbini?: null|array{}, payto?: null|array{mandate_options?: array{amount?: int, purpose?: string}}, sepa_debit?: null|array{}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[]}, verification_method?: string}}, payment_method_types?: null|string[], save_default_payment_method?: string}, pending_invoice_item_interval?: null|array{interval: string, interval_count?: int}, proration_behavior?: string, transfer_data?: array{amount_percent?: float, destination: string}, trial_end?: array|int|string, trial_from_plan?: bool, trial_period_days?: int, trial_settings?: array{end_behavior: array{missing_payment_method: string}}} $params + * @param null|array{add_invoice_items?: (array{discountable?: bool, discounts?: array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, period?: array{end: array{timestamp?: int, type: string}, start: array{timestamp?: int, type: string}}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], application_fee_percent?: null|float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, backdate_start_date?: int, billing_cycle_anchor?: int, billing_cycle_anchor_config?: array{day_of_month: int, hour?: int, minute?: int, month?: int, second?: int}, billing_mode?: array{flexible?: array{proration_discounts?: string}, type: string}, billing_schedules?: array{applies_to?: array{price?: string, type: string}[], bill_until: array{duration?: array{interval: string, interval_count?: int}, timestamp?: int, type: string}, key?: string}[], billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, cancel_at?: array|int|string, cancel_at_period_end?: bool, collection_method?: string, currency?: string, customer?: string, customer_account?: string, days_until_due?: int, default_payment_method?: string, default_source?: string, default_tax_rates?: null|string[], description?: string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], invoice_settings?: array{account_tax_ids?: null|string[], custom_fields?: null|array{name: string, value: string}[], description?: string, footer?: string, issuer?: array{account?: string, type: string}}, items?: (array{billing_thresholds?: null|array{usage_gte: int}, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: null|array, off_session?: bool, on_behalf_of?: null|string, payment_behavior?: string, payment_settings?: array{payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{transaction_type?: string}, verification_method?: string}, bancontact?: null|array{preferred_language?: string}, card?: null|array{mandate_options?: array{amount?: int, amount_type?: string, description?: string}, network?: string, request_three_d_secure?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, type?: string}, funding_type?: string}, konbini?: null|array{}, payto?: null|array{mandate_options?: array{amount?: int, purpose?: string}}, pix?: null|array{expires_after_seconds?: int, mandate_options?: array{amount?: int, amount_includes_iof?: string, end_date?: string, payment_schedule?: string}}, sepa_debit?: null|array{}, upi?: null|array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[]}, verification_method?: string}}, payment_method_types?: null|string[], save_default_payment_method?: string}, pending_invoice_item_interval?: null|array{interval: string, interval_count?: int}, proration_behavior?: string, transfer_data?: array{amount_percent?: float, destination: string}, trial_end?: array|int|string, trial_from_plan?: bool, trial_period_days?: int, trial_settings?: array{end_behavior: array{missing_payment_method: string}}} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\Subscription @@ -120,11 +121,17 @@ class SubscriptionService extends AbstractService /** * Initiates resumption of a paused subscription, optionally resetting the billing - * cycle anchor and creating prorations. If no resumption invoice is generated, the - * subscription becomes active immediately. If a resumption invoice is - * generated, the subscription remains paused until the invoice is - * paid or marked uncollectible. If the invoice is not paid by the expiration date, - * it is voided and the subscription remains paused. + * cycle anchor and creating prorations. Resume is only available for subscriptions + * that use charge_automatically collection. If Stripe doesn’t + * generate a resumption invoice, the subscription becomes active + * immediately. When a resumption invoice is generated, Stripe finalizes it + * immediately. If the invoice is paid or marked uncollectible, the subscription + * becomes active. If the invoice is manually voided, the subscription + * stays paused. If there is no payment attempt within 23 hours, + * Stripe voids the invoice and the subscription stays paused. Learn + * more about resuming + * subscriptions. * * @param string $id * @param null|array{billing_cycle_anchor?: string, expand?: string[], proration_behavior?: string, proration_date?: int} $params @@ -227,7 +234,7 @@ class SubscriptionService extends AbstractService * href="/docs/billing/subscriptions/usage-based">usage-based billing instead. * * @param string $id - * @param null|array{add_invoice_items?: (array{discounts?: array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, period?: array{end: array{timestamp?: int, type: string}, start: array{timestamp?: int, type: string}}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], application_fee_percent?: null|float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, cancel_at?: null|array|int|string, cancel_at_period_end?: bool, cancellation_details?: array{comment?: null|string, feedback?: null|string}, collection_method?: string, days_until_due?: int, default_payment_method?: string, default_source?: null|string, default_tax_rates?: null|string[], description?: null|string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], invoice_settings?: array{account_tax_ids?: null|string[], issuer?: array{account?: string, type: string}}, items?: (array{billing_thresholds?: null|array{usage_gte: int}, clear_usage?: bool, deleted?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], id?: string, metadata?: null|array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: null|array, off_session?: bool, on_behalf_of?: null|string, pause_collection?: null|array{behavior: string, resumes_at?: int}, payment_behavior?: string, payment_settings?: array{payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{transaction_type?: string}, verification_method?: string}, bancontact?: null|array{preferred_language?: string}, card?: null|array{mandate_options?: array{amount?: int, amount_type?: string, description?: string}, network?: string, request_three_d_secure?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, type?: string}, funding_type?: string}, konbini?: null|array{}, payto?: null|array{mandate_options?: array{amount?: int, purpose?: string}}, sepa_debit?: null|array{}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[]}, verification_method?: string}}, payment_method_types?: null|string[], save_default_payment_method?: string}, pending_invoice_item_interval?: null|array{interval: string, interval_count?: int}, proration_behavior?: string, proration_date?: int, transfer_data?: null|array{amount_percent?: float, destination: string}, trial_end?: array|int|string, trial_from_plan?: bool, trial_settings?: array{end_behavior: array{missing_payment_method: string}}} $params + * @param null|array{add_invoice_items?: (array{discountable?: bool, discounts?: array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, period?: array{end: array{timestamp?: int, type: string}, start: array{timestamp?: int, type: string}}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], application_fee_percent?: null|float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_schedules?: null|array{applies_to?: array{price?: string, type: string}[], bill_until?: array{duration?: array{interval: string, interval_count?: int}, timestamp?: int, type: string}, key?: string}[], billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, cancel_at?: null|array|int|string, cancel_at_period_end?: bool, cancellation_details?: array{comment?: null|string, feedback?: null|string}, collection_method?: string, days_until_due?: int, default_payment_method?: string, default_source?: null|string, default_tax_rates?: null|string[], description?: null|string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], invoice_settings?: array{account_tax_ids?: null|string[], custom_fields?: null|array{name: string, value: string}[], description?: null|string, footer?: null|string, issuer?: array{account?: string, type: string}}, items?: (array{billing_thresholds?: null|array{usage_gte: int}, clear_usage?: bool, deleted?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], id?: string, metadata?: null|array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: null|array, off_session?: bool, on_behalf_of?: null|string, pause_collection?: null|array{behavior: string, resumes_at?: int}, payment_behavior?: string, payment_settings?: array{payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{transaction_type?: string}, verification_method?: string}, bancontact?: null|array{preferred_language?: string}, card?: null|array{mandate_options?: array{amount?: int, amount_type?: string, description?: string}, network?: string, request_three_d_secure?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, type?: string}, funding_type?: string}, konbini?: null|array{}, payto?: null|array{mandate_options?: array{amount?: int, purpose?: string}}, pix?: null|array{expires_after_seconds?: int, mandate_options?: array{amount?: int, amount_includes_iof?: string, end_date?: string, payment_schedule?: string}}, sepa_debit?: null|array{}, upi?: null|array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[]}, verification_method?: string}}, payment_method_types?: null|string[], save_default_payment_method?: string}, pending_invoice_item_interval?: null|array{interval: string, interval_count?: int}, proration_behavior?: string, proration_date?: int, transfer_data?: null|array{amount_percent?: float, destination: string}, trial_end?: array|int|string, trial_from_plan?: bool, trial_settings?: array{end_behavior: array{missing_payment_method: string}}} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\Subscription diff --git a/libs/stripe-php/lib/Service/Terminal/ConfigurationService.php b/libs/stripe-php/lib/Service/Terminal/ConfigurationService.php index 8a14741fe..6dcb6b05f 100644 --- a/libs/stripe-php/lib/Service/Terminal/ConfigurationService.php +++ b/libs/stripe-php/lib/Service/Terminal/ConfigurationService.php @@ -29,7 +29,7 @@ class ConfigurationService extends \Stripe\Service\AbstractService /** * Creates a new Configuration object. * - * @param null|array{bbpos_wisepad3?: array{splashscreen?: null|string}, bbpos_wisepos_e?: array{splashscreen?: null|string}, cellular?: null|array{enabled: bool}, expand?: string[], name?: string, offline?: null|array{enabled: bool}, reboot_window?: array{end_hour: int, start_hour: int}, stripe_s700?: array{splashscreen?: null|string}, stripe_s710?: array{splashscreen?: null|string}, tipping?: null|array{aed?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, aud?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, cad?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, chf?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, czk?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, dkk?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, eur?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, gbp?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, gip?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, hkd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, huf?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, jpy?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, mxn?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, myr?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, nok?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, nzd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, pln?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, ron?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, sek?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, sgd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, usd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}}, verifone_p400?: array{splashscreen?: null|string}, wifi?: null|array{enterprise_eap_peap?: array{ca_certificate_file?: string, password: string, ssid: string, username: string}, enterprise_eap_tls?: array{ca_certificate_file?: string, client_certificate_file: string, private_key_file: string, private_key_file_password?: string, ssid: string}, personal_psk?: array{password: string, ssid: string}, type: string}} $params + * @param null|array{bbpos_wisepad3?: array{splashscreen?: null|string}, bbpos_wisepos_e?: array{splashscreen?: null|string}, cellular?: null|array{enabled: bool}, expand?: string[], name?: string, offline?: null|array{enabled: bool}, reboot_window?: array{end_hour: int, start_hour: int}, stripe_s700?: array{splashscreen?: null|string}, stripe_s710?: array{splashscreen?: null|string}, tipping?: null|array{aed?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, aud?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, cad?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, chf?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, czk?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, dkk?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, eur?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, gbp?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, gip?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, hkd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, huf?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, jpy?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, mxn?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, myr?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, nok?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, nzd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, pln?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, ron?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, sek?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, sgd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, usd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}}, verifone_m425?: array{splashscreen?: null|string}, verifone_p400?: array{splashscreen?: null|string}, verifone_p630?: array{splashscreen?: null|string}, verifone_ux700?: array{splashscreen?: null|string}, verifone_v660p?: array{splashscreen?: null|string}, wifi?: null|array{enterprise_eap_peap?: array{ca_certificate_file?: string, password: string, ssid: string, username: string}, enterprise_eap_tls?: array{ca_certificate_file?: string, client_certificate_file: string, private_key_file: string, private_key_file_password?: string, ssid: string}, personal_psk?: array{password: string, ssid: string}, type: string}} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\Terminal\Configuration @@ -77,7 +77,7 @@ class ConfigurationService extends \Stripe\Service\AbstractService * Updates a new Configuration object. * * @param string $id - * @param null|array{bbpos_wisepad3?: null|array{splashscreen?: null|string}, bbpos_wisepos_e?: null|array{splashscreen?: null|string}, cellular?: null|array{enabled: bool}, expand?: string[], name?: string, offline?: null|array{enabled: bool}, reboot_window?: null|array{end_hour: int, start_hour: int}, stripe_s700?: null|array{splashscreen?: null|string}, stripe_s710?: null|array{splashscreen?: null|string}, tipping?: null|array{aed?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, aud?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, cad?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, chf?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, czk?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, dkk?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, eur?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, gbp?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, gip?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, hkd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, huf?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, jpy?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, mxn?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, myr?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, nok?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, nzd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, pln?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, ron?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, sek?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, sgd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, usd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}}, verifone_p400?: null|array{splashscreen?: null|string}, wifi?: null|array{enterprise_eap_peap?: array{ca_certificate_file?: string, password: string, ssid: string, username: string}, enterprise_eap_tls?: array{ca_certificate_file?: string, client_certificate_file: string, private_key_file: string, private_key_file_password?: string, ssid: string}, personal_psk?: array{password: string, ssid: string}, type: string}} $params + * @param null|array{bbpos_wisepad3?: null|array{splashscreen?: null|string}, bbpos_wisepos_e?: null|array{splashscreen?: null|string}, cellular?: null|array{enabled: bool}, expand?: string[], name?: string, offline?: null|array{enabled: bool}, reboot_window?: null|array{end_hour: int, start_hour: int}, stripe_s700?: null|array{splashscreen?: null|string}, stripe_s710?: null|array{splashscreen?: null|string}, tipping?: null|array{aed?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, aud?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, cad?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, chf?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, czk?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, dkk?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, eur?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, gbp?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, gip?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, hkd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, huf?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, jpy?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, mxn?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, myr?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, nok?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, nzd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, pln?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, ron?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, sek?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, sgd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, usd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}}, verifone_m425?: null|array{splashscreen?: null|string}, verifone_p400?: null|array{splashscreen?: null|string}, verifone_p630?: null|array{splashscreen?: null|string}, verifone_ux700?: null|array{splashscreen?: null|string}, verifone_v660p?: null|array{splashscreen?: null|string}, wifi?: null|array{enterprise_eap_peap?: array{ca_certificate_file?: string, password: string, ssid: string, username: string}, enterprise_eap_tls?: array{ca_certificate_file?: string, client_certificate_file: string, private_key_file: string, private_key_file_password?: string, ssid: string}, personal_psk?: array{password: string, ssid: string}, type: string}} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\Terminal\Configuration diff --git a/libs/stripe-php/lib/Service/TestHelpers/ConfirmationTokenService.php b/libs/stripe-php/lib/Service/TestHelpers/ConfirmationTokenService.php index 0b90f8c2a..16883239f 100644 --- a/libs/stripe-php/lib/Service/TestHelpers/ConfirmationTokenService.php +++ b/libs/stripe-php/lib/Service/TestHelpers/ConfirmationTokenService.php @@ -14,7 +14,7 @@ class ConfirmationTokenService extends \Stripe\Service\AbstractService /** * Creates a test mode Confirmation Token server side for your integration tests. * - * @param null|array{expand?: string[], payment_method?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, swish?: array{}, twint?: array{}, type: string, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{card?: array{installments?: array{plan: array{count?: int, interval?: string, type: string}}}}, return_url?: string, setup_future_usage?: string, shipping?: array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name: string, phone?: null|string}} $params + * @param null|array{expand?: string[], payment_method?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, bizum?: array{}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, scalapay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, sunbit?: array{}, swish?: array{}, twint?: array{}, type: string, upi?: array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}}, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{card?: array{installments?: array{plan: array{count?: int, interval?: string, type: string}}}}, return_url?: string, setup_future_usage?: string, shipping?: array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name: string, phone?: null|string}} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\ConfirmationToken diff --git a/libs/stripe-php/lib/Service/TestHelpers/Issuing/AuthorizationService.php b/libs/stripe-php/lib/Service/TestHelpers/Issuing/AuthorizationService.php index a843304df..1aec88028 100644 --- a/libs/stripe-php/lib/Service/TestHelpers/Issuing/AuthorizationService.php +++ b/libs/stripe-php/lib/Service/TestHelpers/Issuing/AuthorizationService.php @@ -30,7 +30,7 @@ class AuthorizationService extends \Stripe\Service\AbstractService /** * Create a test-mode authorization. * - * @param null|array{amount?: int, amount_details?: array{atm_fee?: int, cashback_amount?: int}, authorization_method?: string, card: string, currency?: string, expand?: string[], fleet?: array{cardholder_prompt_data?: array{driver_id?: string, odometer?: int, unspecified_id?: string, user_id?: string, vehicle_number?: string}, purchase_type?: string, reported_breakdown?: array{fuel?: array{gross_amount_decimal?: string}, non_fuel?: array{gross_amount_decimal?: string}, tax?: array{local_amount_decimal?: string, national_amount_decimal?: string}}, service_type?: string}, fraud_disputability_likelihood?: string, fuel?: array{industry_product_code?: string, quantity_decimal?: string, type?: string, unit?: string, unit_cost_decimal?: string}, is_amount_controllable?: bool, merchant_amount?: int, merchant_currency?: string, merchant_data?: array{category?: string, city?: string, country?: string, name?: string, network_id?: string, postal_code?: string, state?: string, terminal_id?: string, url?: string}, network_data?: array{acquiring_institution_id?: string}, risk_assessment?: array{card_testing_risk?: array{invalid_account_number_decline_rate_past_hour?: int, invalid_credentials_decline_rate_past_hour?: int, risk_level: string}, fraud_risk?: array{level: string, score?: float}, merchant_dispute_risk?: array{dispute_rate?: int, risk_level: string}}, verification_data?: array{address_line1_check?: string, address_postal_code_check?: string, authentication_exemption?: array{claimed_by: string, type: string}, cvc_check?: string, expiry_check?: string, three_d_secure?: array{result: string}}, wallet?: string} $params + * @param null|array{amount?: int, amount_details?: array{atm_fee?: int, cashback_amount?: int}, authorization_method?: string, card: string, currency?: string, expand?: string[], fleet?: array{cardholder_prompt_data?: array{driver_id?: string, odometer?: int, unspecified_id?: string, user_id?: string, vehicle_number?: string}, purchase_type?: string, reported_breakdown?: array{fuel?: array{gross_amount_decimal?: string}, non_fuel?: array{gross_amount_decimal?: string}, tax?: array{local_amount_decimal?: string, national_amount_decimal?: string}}, service_type?: string}, fraud_disputability_likelihood?: string, fuel?: array{industry_product_code?: string, quantity_decimal?: string, type?: string, unit?: string, unit_cost_decimal?: string}, is_amount_controllable?: bool, merchant_amount?: int, merchant_currency?: string, merchant_data?: array{category?: string, city?: string, country?: string, name?: string, network_id?: string, postal_code?: string, state?: string, terminal_id?: string, url?: string}, network_data?: array{acquiring_institution_id?: string}, risk_assessment?: array{card_testing_risk?: array{invalid_account_number_decline_rate_past_hour?: int, invalid_credentials_decline_rate_past_hour?: int, level: string}, fraud_risk?: array{level: string, score?: float}, merchant_dispute_risk?: array{dispute_rate?: int, level: string}}, verification_data?: array{address_line1_check?: string, address_postal_code_check?: string, authentication_exemption?: array{claimed_by: string, type: string}, cvc_check?: string, expiry_check?: string, three_d_secure?: array{result: string}}, wallet?: string} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\Issuing\Authorization diff --git a/libs/stripe-php/lib/Service/TestHelpers/TestClockService.php b/libs/stripe-php/lib/Service/TestHelpers/TestClockService.php index 7d47271c3..129baff59 100644 --- a/libs/stripe-php/lib/Service/TestHelpers/TestClockService.php +++ b/libs/stripe-php/lib/Service/TestHelpers/TestClockService.php @@ -46,7 +46,7 @@ class TestClockService extends \Stripe\Service\AbstractService /** * Creates a new test clock that can be attached to new customers and quotes. * - * @param null|array{expand?: string[], frozen_time: int, name?: string} $params + * @param null|array{customer?: string, expand?: string[], frozen_time: int, name?: string} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\TestHelpers\TestClock diff --git a/libs/stripe-php/lib/Service/TopupService.php b/libs/stripe-php/lib/Service/TopupService.php index d7cb146ca..7da9718f9 100644 --- a/libs/stripe-php/lib/Service/TopupService.php +++ b/libs/stripe-php/lib/Service/TopupService.php @@ -45,7 +45,7 @@ class TopupService extends AbstractService /** * Top up the balance of an account. * - * @param null|array{amount: int, currency: string, description?: string, expand?: string[], metadata?: null|array, source?: string, statement_descriptor?: string, transfer_group?: string} $params + * @param null|array{amount: int, currency: string, description?: string, expand?: string[], metadata?: null|array, payment_method?: string, payment_method_options?: array{us_bank_account?: array{network: string}}, source?: string, statement_descriptor?: string, transfer_group?: string} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\Topup diff --git a/libs/stripe-php/lib/Service/V2/Billing/MeterEventSessionService.php b/libs/stripe-php/lib/Service/V2/Billing/MeterEventSessionService.php index b46ac83da..fa8ca7263 100644 --- a/libs/stripe-php/lib/Service/V2/Billing/MeterEventSessionService.php +++ b/libs/stripe-php/lib/Service/V2/Billing/MeterEventSessionService.php @@ -13,7 +13,7 @@ class MeterEventSessionService extends \Stripe\Service\AbstractService { /** * Creates a meter event session to send usage on the high-throughput meter event - * stream. Authentication tokens are only valid for 15 minutes, so you will need to + * stream. Authentication tokens are only valid for 15 minutes, so you need to * create a new meter event session when your token expires. * * @param null|array $params diff --git a/libs/stripe-php/lib/Service/V2/Commerce/CommerceServiceFactory.php b/libs/stripe-php/lib/Service/V2/Commerce/CommerceServiceFactory.php new file mode 100644 index 000000000..64f41e509 --- /dev/null +++ b/libs/stripe-php/lib/Service/V2/Commerce/CommerceServiceFactory.php @@ -0,0 +1,25 @@ + + */ + private static $classMap = [ + 'productCatalog' => ProductCatalog\ProductCatalogServiceFactory::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/libs/stripe-php/lib/Service/V2/Commerce/ProductCatalog/ImportService.php b/libs/stripe-php/lib/Service/V2/Commerce/ProductCatalog/ImportService.php new file mode 100644 index 000000000..b45f4dcfe --- /dev/null +++ b/libs/stripe-php/lib/Service/V2/Commerce/ProductCatalog/ImportService.php @@ -0,0 +1,239 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v2/commerce/product_catalog/imports', $params, $opts, [ + 'response_schema' => [ + 'kind' => 'object', + 'fields' => [ + 'data' => [ + 'kind' => 'array', + 'element' => [ + 'kind' => 'object', + 'fields' => [ + 'status_details' => [ + 'kind' => 'object', + 'fields' => [ + 'processing' => [ + 'kind' => 'object', + 'fields' => [ + 'error_count' => [ + 'kind' => 'int64_string', + ], + 'success_count' => [ + 'kind' => 'int64_string', + ], + ], + ], + 'succeeded' => [ + 'kind' => 'object', + 'fields' => [ + 'success_count' => [ + 'kind' => 'int64_string', + ], + ], + ], + 'succeeded_with_errors' => [ + 'kind' => 'object', + 'fields' => [ + 'error_count' => [ + 'kind' => 'int64_string', + ], + 'error_file' => [ + 'kind' => 'object', + 'fields' => [ + 'size' => [ + 'kind' => 'int64_string', + ], + ], + ], + 'samples' => [ + 'kind' => 'array', + 'element' => [ + 'kind' => 'object', + 'fields' => [ + 'row' => [ + 'kind' => 'int64_string', + ], + ], + ], + ], + 'success_count' => [ + 'kind' => 'int64_string', + ], + ], + ], + ], + ], + ], + ], + ], + ], + ], + ]); + } + + /** + * Creates a ProductCatalogImport. + * + * @param null|array{feed_type: string, metadata: array, mode: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\V2\Commerce\ProductCatalogImport + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v2/commerce/product_catalog/imports', $params, $opts, [ + 'response_schema' => [ + 'kind' => 'object', + 'fields' => [ + 'status_details' => [ + 'kind' => 'object', + 'fields' => [ + 'processing' => [ + 'kind' => 'object', + 'fields' => [ + 'error_count' => ['kind' => 'int64_string'], + 'success_count' => [ + 'kind' => 'int64_string', + ], + ], + ], + 'succeeded' => [ + 'kind' => 'object', + 'fields' => [ + 'success_count' => [ + 'kind' => 'int64_string', + ], + ], + ], + 'succeeded_with_errors' => [ + 'kind' => 'object', + 'fields' => [ + 'error_count' => ['kind' => 'int64_string'], + 'error_file' => [ + 'kind' => 'object', + 'fields' => [ + 'size' => [ + 'kind' => 'int64_string', + ], + ], + ], + 'samples' => [ + 'kind' => 'array', + 'element' => [ + 'kind' => 'object', + 'fields' => [ + 'row' => [ + 'kind' => 'int64_string', + ], + ], + ], + ], + 'success_count' => [ + 'kind' => 'int64_string', + ], + ], + ], + ], + ], + ], + ], + ]); + } + + /** + * Retrieves a ProductCatalogImport by ID. + * + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\V2\Commerce\ProductCatalogImport + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v2/commerce/product_catalog/imports/%s', $id), $params, $opts, [ + 'response_schema' => [ + 'kind' => 'object', + 'fields' => [ + 'status_details' => [ + 'kind' => 'object', + 'fields' => [ + 'processing' => [ + 'kind' => 'object', + 'fields' => [ + 'error_count' => ['kind' => 'int64_string'], + 'success_count' => [ + 'kind' => 'int64_string', + ], + ], + ], + 'succeeded' => [ + 'kind' => 'object', + 'fields' => [ + 'success_count' => [ + 'kind' => 'int64_string', + ], + ], + ], + 'succeeded_with_errors' => [ + 'kind' => 'object', + 'fields' => [ + 'error_count' => ['kind' => 'int64_string'], + 'error_file' => [ + 'kind' => 'object', + 'fields' => [ + 'size' => [ + 'kind' => 'int64_string', + ], + ], + ], + 'samples' => [ + 'kind' => 'array', + 'element' => [ + 'kind' => 'object', + 'fields' => [ + 'row' => [ + 'kind' => 'int64_string', + ], + ], + ], + ], + 'success_count' => [ + 'kind' => 'int64_string', + ], + ], + ], + ], + ], + ], + ], + ]); + } +} diff --git a/libs/stripe-php/lib/Service/V2/Commerce/ProductCatalog/ProductCatalogServiceFactory.php b/libs/stripe-php/lib/Service/V2/Commerce/ProductCatalog/ProductCatalogServiceFactory.php new file mode 100644 index 000000000..973f41d4a --- /dev/null +++ b/libs/stripe-php/lib/Service/V2/Commerce/ProductCatalog/ProductCatalogServiceFactory.php @@ -0,0 +1,25 @@ + + */ + private static $classMap = [ + 'imports' => ImportService::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/libs/stripe-php/lib/Service/V2/Core/AccountLinkService.php b/libs/stripe-php/lib/Service/V2/Core/AccountLinkService.php index 83fd1d72b..e86b8b927 100644 --- a/libs/stripe-php/lib/Service/V2/Core/AccountLinkService.php +++ b/libs/stripe-php/lib/Service/V2/Core/AccountLinkService.php @@ -16,12 +16,12 @@ class AccountLinkService extends \Stripe\Service\AbstractService * use to access a Stripe-hosted flow for collecting or updating required * information. * - * @param null|array{account: string, use_case: array{type: string, account_onboarding?: array{collection_options?: array{fields?: string, future_requirements?: string}, configurations: string[], refresh_url: string, return_url?: string}, account_update?: array{collection_options?: array{fields?: string, future_requirements?: string}, configurations: string[], refresh_url: string, return_url?: string}}} $params + * @param null|array{account: string, use_case: array{account_onboarding?: array{collection_options?: array{fields?: string, future_requirements?: string}, configurations: string[], refresh_url: string, return_url?: string}, account_update?: array{collection_options?: array{fields?: string, future_requirements?: string}, configurations: string[], refresh_url: string, return_url?: string}, type: string}} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\V2\Core\AccountLink * - * @throws \Stripe\Exception\ApiErrorException if the request fails + * @throws \Stripe\Exception\RateLimitException */ public function create($params = null, $opts = null) { diff --git a/libs/stripe-php/lib/Service/V2/Core/AccountService.php b/libs/stripe-php/lib/Service/V2/Core/AccountService.php index 541e4bcbe..dfa7c5d69 100644 --- a/libs/stripe-php/lib/Service/V2/Core/AccountService.php +++ b/libs/stripe-php/lib/Service/V2/Core/AccountService.php @@ -29,11 +29,43 @@ class AccountService extends \Stripe\Service\AbstractService * * @return \Stripe\V2\Collection<\Stripe\V2\Core\Account> * - * @throws \Stripe\Exception\ApiErrorException if the request fails + * @throws \Stripe\Exception\RateLimitException */ public function all($params = null, $opts = null) { - return $this->requestCollection('get', '/v2/core/accounts', $params, $opts); + return $this->requestCollection('get', '/v2/core/accounts', $params, $opts, [ + 'response_schema' => [ + 'kind' => 'object', + 'fields' => [ + 'data' => [ + 'kind' => 'array', + 'element' => [ + 'kind' => 'object', + 'fields' => [ + 'identity' => [ + 'kind' => 'object', + 'fields' => [ + 'individual' => [ + 'kind' => 'object', + 'fields' => [ + 'relationship' => [ + 'kind' => 'object', + 'fields' => [ + 'percent_ownership' => [ + 'kind' => 'decimal_string', + ], + ], + ], + ], + ], + ], + ], + ], + ], + ], + ], + ], + ]); } /** @@ -47,30 +79,101 @@ class AccountService extends \Stripe\Service\AbstractService * * @return \Stripe\V2\Core\Account * - * @throws \Stripe\Exception\ApiErrorException if the request fails + * @throws \Stripe\Exception\RateLimitException */ public function close($id, $params = null, $opts = null) { - return $this->request('post', $this->buildPath('/v2/core/accounts/%s/close', $id), $params, $opts); + return $this->request('post', $this->buildPath('/v2/core/accounts/%s/close', $id), $params, $opts, [ + 'response_schema' => [ + 'kind' => 'object', + 'fields' => [ + 'identity' => [ + 'kind' => 'object', + 'fields' => [ + 'individual' => [ + 'kind' => 'object', + 'fields' => [ + 'relationship' => [ + 'kind' => 'object', + 'fields' => [ + 'percent_ownership' => [ + 'kind' => 'decimal_string', + ], + ], + ], + ], + ], + ], + ], + ], + ], + ]); } /** - * An Account is a representation of a company, individual or other entity that a - * user interacts with. Accounts contain identifying information about the entity, - * and configurations that store the features an account has access to. An account - * can be configured as any or all of the following configurations: Customer, - * Merchant and/or Recipient. + * Create an Account that represents a company, individual, or other entity that + * your business interacts with. Accounts contain identifying information about the + * entity, and configurations that store the features an account has access to. An + * account can be configured as any or all of the following configurations: + * Customer, Merchant and/or Recipient. * - * @param null|array{account_token?: string, configuration?: array{customer?: array{automatic_indirect_tax?: array{exempt?: string, ip_address?: string}, billing?: array{invoice?: array{custom_fields?: array{name: string, value: string}[], footer?: string, next_sequence?: int, prefix?: string, rendering?: array{amount_tax_display?: string, template?: string}}}, capabilities?: array{automatic_indirect_tax?: array{requested: bool}}, shipping?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name?: string, phone?: string}, test_clock?: string}, merchant?: array{bacs_debit_payments?: array{display_name?: string}, branding?: array{icon?: string, logo?: string, primary_color?: string, secondary_color?: string}, capabilities?: array{ach_debit_payments?: array{requested: bool}, acss_debit_payments?: array{requested: bool}, affirm_payments?: array{requested: bool}, afterpay_clearpay_payments?: array{requested: bool}, alma_payments?: array{requested: bool}, amazon_pay_payments?: array{requested: bool}, au_becs_debit_payments?: array{requested: bool}, bacs_debit_payments?: array{requested: bool}, bancontact_payments?: array{requested: bool}, blik_payments?: array{requested: bool}, boleto_payments?: array{requested: bool}, card_payments?: array{requested: bool}, cartes_bancaires_payments?: array{requested: bool}, cashapp_payments?: array{requested: bool}, eps_payments?: array{requested: bool}, fpx_payments?: array{requested: bool}, gb_bank_transfer_payments?: array{requested: bool}, grabpay_payments?: array{requested: bool}, ideal_payments?: array{requested: bool}, jcb_payments?: array{requested: bool}, jp_bank_transfer_payments?: array{requested: bool}, kakao_pay_payments?: array{requested: bool}, klarna_payments?: array{requested: bool}, konbini_payments?: array{requested: bool}, kr_card_payments?: array{requested: bool}, link_payments?: array{requested: bool}, mobilepay_payments?: array{requested: bool}, multibanco_payments?: array{requested: bool}, mx_bank_transfer_payments?: array{requested: bool}, naver_pay_payments?: array{requested: bool}, oxxo_payments?: array{requested: bool}, p24_payments?: array{requested: bool}, pay_by_bank_payments?: array{requested: bool}, payco_payments?: array{requested: bool}, paynow_payments?: array{requested: bool}, promptpay_payments?: array{requested: bool}, revolut_pay_payments?: array{requested: bool}, samsung_pay_payments?: array{requested: bool}, sepa_bank_transfer_payments?: array{requested: bool}, sepa_debit_payments?: array{requested: bool}, swish_payments?: array{requested: bool}, twint_payments?: array{requested: bool}, us_bank_transfer_payments?: array{requested: bool}, zip_payments?: array{requested: bool}}, card_payments?: array{decline_on?: array{avs_failure?: bool, cvc_failure?: bool}}, konbini_payments?: array{support?: array{email?: string, hours?: array{end_time?: string, start_time?: string}, phone?: string}}, mcc?: string, script_statement_descriptor?: array{kana?: array{descriptor?: string, prefix?: string}, kanji?: array{descriptor?: string, prefix?: string}}, statement_descriptor?: array{descriptor?: string, prefix?: string}, support?: array{address?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, email?: string, phone?: string, url?: string}}, recipient?: array{capabilities?: array{stripe_balance?: array{stripe_transfers?: array{requested: bool}}}}}, contact_email?: string, contact_phone?: string, dashboard?: string, defaults?: array{currency?: string, locales?: string[], profile?: array{business_url?: string, doing_business_as?: string, product_description?: string}, responsibilities?: array{fees_collector: string, losses_collector: string}}, display_name?: string, identity?: array{attestations?: array{directorship_declaration?: array{date?: string, ip?: string, user_agent?: string}, ownership_declaration?: array{date?: string, ip?: string, user_agent?: string}, persons_provided?: array{directors?: bool, executives?: bool, owners?: bool, ownership_exemption_reason?: string}, representative_declaration?: array{date?: string, ip?: string, user_agent?: string}, terms_of_service?: array{account?: array{date: string, ip: string, user_agent?: string}}}, business_details?: array{address?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, annual_revenue?: array{amount?: array{value?: int, currency?: string}, fiscal_year_end?: string}, documents?: array{bank_account_ownership_verification?: array{files: string[], type: string}, company_license?: array{files: string[], type: string}, company_memorandum_of_association?: array{files: string[], type: string}, company_ministerial_decree?: array{files: string[], type: string}, company_registration_verification?: array{files: string[], type: string}, company_tax_id_verification?: array{files: string[], type: string}, primary_verification?: array{front_back: array{back?: string, front: string}, type: string}, proof_of_address?: array{files: string[], type: string}, proof_of_registration?: array{files: string[], type: string}, proof_of_ultimate_beneficial_ownership?: array{files: string[], type: string}}, estimated_worker_count?: int, id_numbers?: array{registrar?: string, type: string, value: string}[], monthly_estimated_revenue?: array{amount?: array{value?: int, currency?: string}}, phone?: string, registered_name?: string, registration_date?: array{day: int, month: int, year: int}, script_addresses?: array{kana?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, kanji?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}}, script_names?: array{kana?: array{registered_name?: string}, kanji?: array{registered_name?: string}}, structure?: string}, country?: string, entity_type?: string, individual?: array{additional_addresses?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, purpose: string, state?: string, town?: string}[], additional_names?: array{full_name?: string, given_name?: string, purpose: string, surname?: string}[], address?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, date_of_birth?: array{day: int, month: int, year: int}, documents?: array{company_authorization?: array{files: string[], type: string}, passport?: array{files: string[], type: string}, primary_verification?: array{front_back: array{back?: string, front: string}, type: string}, secondary_verification?: array{front_back: array{back?: string, front: string}, type: string}, visa?: array{files: string[], type: string}}, email?: string, given_name?: string, id_numbers?: array{type: string, value: string}[], legal_gender?: string, metadata?: array, nationalities?: string[], phone?: string, political_exposure?: string, relationship?: array{director?: bool, executive?: bool, owner?: bool, percent_ownership?: string, title?: string}, script_addresses?: array{kana?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, kanji?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}}, script_names?: array{kana?: array{given_name?: string, surname?: string}, kanji?: array{given_name?: string, surname?: string}}, surname?: string}}, include?: string[], metadata?: array} $params + * @param null|array{account_token?: string, configuration?: array{customer?: array{automatic_indirect_tax?: array{exempt?: string, ip_address?: string}, billing?: array{invoice?: array{custom_fields?: array{name: string, value: string}[], footer?: string, next_sequence?: int, prefix?: string, rendering?: array{amount_tax_display?: string, template?: string}}}, capabilities?: array{automatic_indirect_tax?: array{requested: bool}}, shipping?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name?: string, phone?: string}, test_clock?: string}, merchant?: array{bacs_debit_payments?: array{display_name?: string}, branding?: array{icon?: string, logo?: string, primary_color?: string, secondary_color?: string}, capabilities?: array{ach_debit_payments?: array{requested: bool}, acss_debit_payments?: array{requested: bool}, affirm_payments?: array{requested: bool}, afterpay_clearpay_payments?: array{requested: bool}, alma_payments?: array{requested: bool}, amazon_pay_payments?: array{requested: bool}, au_becs_debit_payments?: array{requested: bool}, bacs_debit_payments?: array{requested: bool}, bancontact_payments?: array{requested: bool}, blik_payments?: array{requested: bool}, boleto_payments?: array{requested: bool}, card_payments?: array{requested: bool}, cartes_bancaires_payments?: array{requested: bool}, cashapp_payments?: array{requested: bool}, eps_payments?: array{requested: bool}, fpx_payments?: array{requested: bool}, gb_bank_transfer_payments?: array{requested: bool}, grabpay_payments?: array{requested: bool}, ideal_payments?: array{requested: bool}, jcb_payments?: array{requested: bool}, jp_bank_transfer_payments?: array{requested: bool}, kakao_pay_payments?: array{requested: bool}, klarna_payments?: array{requested: bool}, konbini_payments?: array{requested: bool}, kr_card_payments?: array{requested: bool}, link_payments?: array{requested: bool}, mobilepay_payments?: array{requested: bool}, multibanco_payments?: array{requested: bool}, mx_bank_transfer_payments?: array{requested: bool}, naver_pay_payments?: array{requested: bool}, oxxo_payments?: array{requested: bool}, p24_payments?: array{requested: bool}, pay_by_bank_payments?: array{requested: bool}, payco_payments?: array{requested: bool}, paynow_payments?: array{requested: bool}, promptpay_payments?: array{requested: bool}, revolut_pay_payments?: array{requested: bool}, samsung_pay_payments?: array{requested: bool}, sepa_bank_transfer_payments?: array{requested: bool}, sepa_debit_payments?: array{requested: bool}, sunbit_payments?: array{requested: bool}, swish_payments?: array{requested: bool}, twint_payments?: array{requested: bool}, us_bank_transfer_payments?: array{requested: bool}, zip_payments?: array{requested: bool}}, card_payments?: array{decline_on?: array{avs_failure?: bool, cvc_failure?: bool}}, konbini_payments?: array{support?: array{email?: string, hours?: array{end_time?: string, start_time?: string}, phone?: string}}, mcc?: string, script_statement_descriptor?: array{kana?: array{descriptor?: string, prefix?: string}, kanji?: array{descriptor?: string, prefix?: string}}, statement_descriptor?: array{descriptor?: string, prefix?: string}, support?: array{address?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, email?: string, phone?: string, url?: string}}, recipient?: array{capabilities?: array{stripe_balance?: array{stripe_transfers?: array{requested: bool}}}}}, contact_email?: string, contact_phone?: string, dashboard?: string, defaults?: array{currency?: string, locales?: string[], profile?: array{business_url?: string, doing_business_as?: string, product_description?: string}, responsibilities?: array{fees_collector: string, losses_collector: string}}, display_name?: string, identity?: array{attestations?: array{directorship_declaration?: array{date?: string, ip?: string, user_agent?: string}, ownership_declaration?: array{date?: string, ip?: string, user_agent?: string}, persons_provided?: array{directors?: bool, executives?: bool, owners?: bool, ownership_exemption_reason?: string}, representative_declaration?: array{date?: string, ip?: string, user_agent?: string}, terms_of_service?: array{account?: array{date: string, ip: string, user_agent?: string}}}, business_details?: array{address?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, annual_revenue?: array{amount?: \Stripe\StripeObject, fiscal_year_end?: string}, documents?: array{bank_account_ownership_verification?: array{files: string[], type: string}, company_license?: array{files: string[], type: string}, company_memorandum_of_association?: array{files: string[], type: string}, company_ministerial_decree?: array{files: string[], type: string}, company_registration_verification?: array{files: string[], type: string}, company_tax_id_verification?: array{files: string[], type: string}, primary_verification?: array{front_back: array{back?: string, front: string}, type: string}, proof_of_address?: array{files: string[], type: string}, proof_of_registration?: array{files: string[], signer?: array{person: string}, type: string}, proof_of_ultimate_beneficial_ownership?: array{files: string[], signer?: array{person: string}, type: string}}, estimated_worker_count?: int, id_numbers?: array{registrar?: string, type: string, value: string}[], monthly_estimated_revenue?: array{amount?: \Stripe\StripeObject}, phone?: string, registered_name?: string, registration_date?: array{day: int, month: int, year: int}, script_addresses?: array{kana?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, kanji?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}}, script_names?: array{kana?: array{registered_name?: string}, kanji?: array{registered_name?: string}}, structure?: string}, country?: string, entity_type?: string, individual?: array{additional_addresses?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, purpose: string, state?: string, town?: string}[], additional_names?: array{full_name?: string, given_name?: string, purpose: string, surname?: string}[], address?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, date_of_birth?: array{day: int, month: int, year: int}, documents?: array{company_authorization?: array{files: string[], type: string}, passport?: array{files: string[], type: string}, primary_verification?: array{front_back: array{back?: string, front: string}, type: string}, secondary_verification?: array{front_back: array{back?: string, front: string}, type: string}, visa?: array{files: string[], type: string}}, email?: string, given_name?: string, id_numbers?: array{type: string, value: string}[], legal_gender?: string, metadata?: array, nationalities?: string[], phone?: string, political_exposure?: string, relationship?: array{director?: bool, executive?: bool, owner?: bool, percent_ownership?: string, title?: string}, script_addresses?: array{kana?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, kanji?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}}, script_names?: array{kana?: array{given_name?: string, surname?: string}, kanji?: array{given_name?: string, surname?: string}}, surname?: string}}, include?: string[], metadata?: array} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\V2\Core\Account * - * @throws \Stripe\Exception\ApiErrorException if the request fails + * @throws \Stripe\Exception\RateLimitException */ public function create($params = null, $opts = null) { - return $this->request('post', '/v2/core/accounts', $params, $opts); + return $this->request('post', '/v2/core/accounts', $params, $opts, [ + 'request_schema' => [ + 'kind' => 'object', + 'fields' => [ + 'identity' => [ + 'kind' => 'object', + 'fields' => [ + 'individual' => [ + 'kind' => 'object', + 'fields' => [ + 'relationship' => [ + 'kind' => 'object', + 'fields' => [ + 'percent_ownership' => [ + 'kind' => 'decimal_string', + ], + ], + ], + ], + ], + ], + ], + ], + ], + 'response_schema' => [ + 'kind' => 'object', + 'fields' => [ + 'identity' => [ + 'kind' => 'object', + 'fields' => [ + 'individual' => [ + 'kind' => 'object', + 'fields' => [ + 'relationship' => [ + 'kind' => 'object', + 'fields' => [ + 'percent_ownership' => [ + 'kind' => 'decimal_string', + ], + ], + ], + ], + ], + ], + ], + ], + ], + ]); } /** @@ -82,27 +185,98 @@ class AccountService extends \Stripe\Service\AbstractService * * @return \Stripe\V2\Core\Account * - * @throws \Stripe\Exception\ApiErrorException if the request fails + * @throws \Stripe\Exception\RateLimitException */ public function retrieve($id, $params = null, $opts = null) { - return $this->request('get', $this->buildPath('/v2/core/accounts/%s', $id), $params, $opts); + return $this->request('get', $this->buildPath('/v2/core/accounts/%s', $id), $params, $opts, [ + 'response_schema' => [ + 'kind' => 'object', + 'fields' => [ + 'identity' => [ + 'kind' => 'object', + 'fields' => [ + 'individual' => [ + 'kind' => 'object', + 'fields' => [ + 'relationship' => [ + 'kind' => 'object', + 'fields' => [ + 'percent_ownership' => [ + 'kind' => 'decimal_string', + ], + ], + ], + ], + ], + ], + ], + ], + ], + ]); } /** * Updates the details of an Account. * * @param string $id - * @param null|array{account_token?: string, configuration?: array{customer?: array{applied?: bool, automatic_indirect_tax?: array{exempt?: string, ip_address?: string, validate_location?: string}, billing?: array{default_payment_method?: string, invoice?: array{custom_fields?: array{name: string, value: string}[], footer?: string, next_sequence?: int, prefix?: string, rendering?: array{amount_tax_display?: string, template?: string}}}, capabilities?: array{automatic_indirect_tax?: array{requested?: bool}}, shipping?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name?: string, phone?: string}, test_clock?: string}, merchant?: array{applied?: bool, bacs_debit_payments?: array{display_name?: string}, branding?: array{icon?: string, logo?: string, primary_color?: string, secondary_color?: string}, capabilities?: array{ach_debit_payments?: array{requested?: bool}, acss_debit_payments?: array{requested?: bool}, affirm_payments?: array{requested?: bool}, afterpay_clearpay_payments?: array{requested?: bool}, alma_payments?: array{requested?: bool}, amazon_pay_payments?: array{requested?: bool}, au_becs_debit_payments?: array{requested?: bool}, bacs_debit_payments?: array{requested?: bool}, bancontact_payments?: array{requested?: bool}, blik_payments?: array{requested?: bool}, boleto_payments?: array{requested?: bool}, card_payments?: array{requested?: bool}, cartes_bancaires_payments?: array{requested?: bool}, cashapp_payments?: array{requested?: bool}, eps_payments?: array{requested?: bool}, fpx_payments?: array{requested?: bool}, gb_bank_transfer_payments?: array{requested?: bool}, grabpay_payments?: array{requested?: bool}, ideal_payments?: array{requested?: bool}, jcb_payments?: array{requested?: bool}, jp_bank_transfer_payments?: array{requested?: bool}, kakao_pay_payments?: array{requested?: bool}, klarna_payments?: array{requested?: bool}, konbini_payments?: array{requested?: bool}, kr_card_payments?: array{requested?: bool}, link_payments?: array{requested?: bool}, mobilepay_payments?: array{requested?: bool}, multibanco_payments?: array{requested?: bool}, mx_bank_transfer_payments?: array{requested?: bool}, naver_pay_payments?: array{requested?: bool}, oxxo_payments?: array{requested?: bool}, p24_payments?: array{requested?: bool}, pay_by_bank_payments?: array{requested?: bool}, payco_payments?: array{requested?: bool}, paynow_payments?: array{requested?: bool}, promptpay_payments?: array{requested?: bool}, revolut_pay_payments?: array{requested?: bool}, samsung_pay_payments?: array{requested?: bool}, sepa_bank_transfer_payments?: array{requested?: bool}, sepa_debit_payments?: array{requested?: bool}, swish_payments?: array{requested?: bool}, twint_payments?: array{requested?: bool}, us_bank_transfer_payments?: array{requested?: bool}, zip_payments?: array{requested?: bool}}, card_payments?: array{decline_on?: array{avs_failure?: bool, cvc_failure?: bool}}, konbini_payments?: array{support?: array{email?: string, hours?: array{end_time?: string, start_time?: string}, phone?: string}}, mcc?: string, script_statement_descriptor?: array{kana?: array{descriptor?: string, prefix?: string}, kanji?: array{descriptor?: string, prefix?: string}}, statement_descriptor?: array{descriptor?: string, prefix?: string}, support?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, email?: string, phone?: string, url?: string}}, recipient?: array{applied?: bool, capabilities?: array{stripe_balance?: array{stripe_transfers?: array{requested?: bool}}}}}, contact_email?: string, contact_phone?: string, dashboard?: string, defaults?: array{currency?: string, locales?: string[], profile?: array{business_url?: string, doing_business_as?: string, product_description?: string}, responsibilities?: array{fees_collector: string, losses_collector: string}}, display_name?: string, identity?: array{attestations?: array{directorship_declaration?: array{date?: string, ip?: string, user_agent?: string}, ownership_declaration?: array{date?: string, ip?: string, user_agent?: string}, persons_provided?: array{directors?: bool, executives?: bool, owners?: bool, ownership_exemption_reason?: string}, representative_declaration?: array{date?: string, ip?: string, user_agent?: string}, terms_of_service?: array{account?: array{date?: string, ip?: string, user_agent?: string}, crypto_storer?: array{date?: string, ip?: string, user_agent?: string}, storer?: array{date?: string, ip?: string, user_agent?: string}}}, business_details?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, annual_revenue?: array{amount?: array{value?: int, currency?: string}, fiscal_year_end?: string}, documents?: array{bank_account_ownership_verification?: array{files: string[], type: string}, company_license?: array{files: string[], type: string}, company_memorandum_of_association?: array{files: string[], type: string}, company_ministerial_decree?: array{files: string[], type: string}, company_registration_verification?: array{files: string[], type: string}, company_tax_id_verification?: array{files: string[], type: string}, primary_verification?: array{front_back: array{back?: string, front?: string}, type: string}, proof_of_address?: array{files: string[], type: string}, proof_of_registration?: array{files: string[], type: string}, proof_of_ultimate_beneficial_ownership?: array{files: string[], type: string}}, estimated_worker_count?: int, id_numbers?: array{registrar?: string, type: string, value: string}[], monthly_estimated_revenue?: array{amount?: array{value?: int, currency?: string}}, phone?: string, registered_name?: string, registration_date?: array{day: int, month: int, year: int}, script_addresses?: array{kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}}, script_names?: array{kana?: array{registered_name?: string}, kanji?: array{registered_name?: string}}, structure?: string}, country?: string, entity_type?: string, individual?: array{additional_addresses?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, purpose: string, state?: string, town?: string}[], additional_names?: array{full_name?: string, given_name?: string, purpose: string, surname?: string}[], address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, date_of_birth?: array{day: int, month: int, year: int}, documents?: array{company_authorization?: array{files: string[], type: string}, passport?: array{files: string[], type: string}, primary_verification?: array{front_back: array{back?: string, front?: string}, type: string}, secondary_verification?: array{front_back: array{back?: string, front?: string}, type: string}, visa?: array{files: string[], type: string}}, email?: string, given_name?: string, id_numbers?: array{type: string, value: string}[], legal_gender?: string, metadata?: array, nationalities?: string[], phone?: string, political_exposure?: string, relationship?: array{director?: bool, executive?: bool, owner?: bool, percent_ownership?: string, title?: string}, script_addresses?: array{kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}}, script_names?: array{kana?: array{given_name?: string, surname?: string}, kanji?: array{given_name?: string, surname?: string}}, surname?: string}}, include?: string[], metadata?: array} $params + * @param null|array{account_token?: string, configuration?: array{customer?: array{applied?: bool, automatic_indirect_tax?: array{exempt?: string, ip_address?: string, validate_location?: string}, billing?: array{default_payment_method?: string, invoice?: array{custom_fields?: array{name: string, value: string}[], footer?: string, next_sequence?: int, prefix?: string, rendering?: array{amount_tax_display?: string, template?: string}}}, capabilities?: array{automatic_indirect_tax?: array{requested?: bool}}, shipping?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name?: string, phone?: string}, test_clock?: string}, merchant?: array{applied?: bool, bacs_debit_payments?: array{display_name?: string}, branding?: array{icon?: string, logo?: string, primary_color?: string, secondary_color?: string}, capabilities?: array{ach_debit_payments?: array{requested?: bool}, acss_debit_payments?: array{requested?: bool}, affirm_payments?: array{requested?: bool}, afterpay_clearpay_payments?: array{requested?: bool}, alma_payments?: array{requested?: bool}, amazon_pay_payments?: array{requested?: bool}, au_becs_debit_payments?: array{requested?: bool}, bacs_debit_payments?: array{requested?: bool}, bancontact_payments?: array{requested?: bool}, blik_payments?: array{requested?: bool}, boleto_payments?: array{requested?: bool}, card_payments?: array{requested?: bool}, cartes_bancaires_payments?: array{requested?: bool}, cashapp_payments?: array{requested?: bool}, eps_payments?: array{requested?: bool}, fpx_payments?: array{requested?: bool}, gb_bank_transfer_payments?: array{requested?: bool}, grabpay_payments?: array{requested?: bool}, ideal_payments?: array{requested?: bool}, jcb_payments?: array{requested?: bool}, jp_bank_transfer_payments?: array{requested?: bool}, kakao_pay_payments?: array{requested?: bool}, klarna_payments?: array{requested?: bool}, konbini_payments?: array{requested?: bool}, kr_card_payments?: array{requested?: bool}, link_payments?: array{requested?: bool}, mobilepay_payments?: array{requested?: bool}, multibanco_payments?: array{requested?: bool}, mx_bank_transfer_payments?: array{requested?: bool}, naver_pay_payments?: array{requested?: bool}, oxxo_payments?: array{requested?: bool}, p24_payments?: array{requested?: bool}, pay_by_bank_payments?: array{requested?: bool}, payco_payments?: array{requested?: bool}, paynow_payments?: array{requested?: bool}, promptpay_payments?: array{requested?: bool}, revolut_pay_payments?: array{requested?: bool}, samsung_pay_payments?: array{requested?: bool}, sepa_bank_transfer_payments?: array{requested?: bool}, sepa_debit_payments?: array{requested?: bool}, sunbit_payments?: array{requested?: bool}, swish_payments?: array{requested?: bool}, twint_payments?: array{requested?: bool}, us_bank_transfer_payments?: array{requested?: bool}, zip_payments?: array{requested?: bool}}, card_payments?: array{decline_on?: array{avs_failure?: bool, cvc_failure?: bool}}, konbini_payments?: array{support?: array{email?: string, hours?: array{end_time?: string, start_time?: string}, phone?: string}}, mcc?: string, script_statement_descriptor?: array{kana?: array{descriptor?: string, prefix?: string}, kanji?: array{descriptor?: string, prefix?: string}}, statement_descriptor?: array{descriptor?: string, prefix?: string}, support?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, email?: string, phone?: string, url?: string}}, recipient?: array{applied?: bool, capabilities?: array{stripe_balance?: array{stripe_transfers?: array{requested?: bool}}}}}, contact_email?: string, contact_phone?: string, dashboard?: string, defaults?: array{currency?: string, locales?: string[], profile?: array{business_url?: string, doing_business_as?: string, product_description?: string}, responsibilities?: array{fees_collector: string, losses_collector: string}}, display_name?: string, identity?: array{attestations?: array{directorship_declaration?: array{date?: string, ip?: string, user_agent?: string}, ownership_declaration?: array{date?: string, ip?: string, user_agent?: string}, persons_provided?: array{directors?: bool, executives?: bool, owners?: bool, ownership_exemption_reason?: string}, representative_declaration?: array{date?: string, ip?: string, user_agent?: string}, terms_of_service?: array{account?: array{date?: string, ip?: string, user_agent?: string}, crypto_money_manager?: array{date?: string, ip?: string, user_agent?: string}, money_manager?: array{date?: string, ip?: string, user_agent?: string}}}, business_details?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, annual_revenue?: array{amount?: \Stripe\StripeObject, fiscal_year_end?: string}, documents?: array{bank_account_ownership_verification?: array{files: string[], type: string}, company_license?: array{files: string[], type: string}, company_memorandum_of_association?: array{files: string[], type: string}, company_ministerial_decree?: array{files: string[], type: string}, company_registration_verification?: array{files: string[], type: string}, company_tax_id_verification?: array{files: string[], type: string}, primary_verification?: array{front_back: array{back?: string, front?: string}, type: string}, proof_of_address?: array{files: string[], type: string}, proof_of_registration?: array{files: string[], signer?: array{person: string}, type: string}, proof_of_ultimate_beneficial_ownership?: array{files: string[], signer?: array{person: string}, type: string}}, estimated_worker_count?: int, id_numbers?: array{registrar?: string, type: string, value: string}[], monthly_estimated_revenue?: array{amount?: \Stripe\StripeObject}, phone?: string, registered_name?: string, registration_date?: array{day: int, month: int, year: int}, script_addresses?: array{kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}}, script_names?: array{kana?: array{registered_name?: string}, kanji?: array{registered_name?: string}}, structure?: string}, country?: string, entity_type?: string, individual?: array{additional_addresses?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, purpose: string, state?: string, town?: string}[], additional_names?: array{full_name?: string, given_name?: string, purpose: string, surname?: string}[], address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, date_of_birth?: array{day: int, month: int, year: int}, documents?: array{company_authorization?: array{files: string[], type: string}, passport?: array{files: string[], type: string}, primary_verification?: array{front_back: array{back?: string, front?: string}, type: string}, secondary_verification?: array{front_back: array{back?: string, front?: string}, type: string}, visa?: array{files: string[], type: string}}, email?: string, given_name?: string, id_numbers?: array{type: string, value: string}[], legal_gender?: string, metadata?: array, nationalities?: string[], phone?: string, political_exposure?: string, relationship?: array{director?: bool, executive?: bool, owner?: bool, percent_ownership?: string, title?: string}, script_addresses?: array{kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}}, script_names?: array{kana?: array{given_name?: string, surname?: string}, kanji?: array{given_name?: string, surname?: string}}, surname?: string}}, include?: string[], metadata?: array} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\V2\Core\Account * - * @throws \Stripe\Exception\ApiErrorException if the request fails + * @throws \Stripe\Exception\RateLimitException */ public function update($id, $params = null, $opts = null) { - return $this->request('post', $this->buildPath('/v2/core/accounts/%s', $id), $params, $opts); + return $this->request('post', $this->buildPath('/v2/core/accounts/%s', $id), $params, $opts, [ + 'request_schema' => [ + 'kind' => 'object', + 'fields' => [ + 'identity' => [ + 'kind' => 'object', + 'fields' => [ + 'individual' => [ + 'kind' => 'object', + 'fields' => [ + 'relationship' => [ + 'kind' => 'object', + 'fields' => [ + 'percent_ownership' => [ + 'kind' => 'decimal_string', + ], + ], + ], + ], + ], + ], + ], + ], + ], + 'response_schema' => [ + 'kind' => 'object', + 'fields' => [ + 'identity' => [ + 'kind' => 'object', + 'fields' => [ + 'individual' => [ + 'kind' => 'object', + 'fields' => [ + 'relationship' => [ + 'kind' => 'object', + 'fields' => [ + 'percent_ownership' => [ + 'kind' => 'decimal_string', + ], + ], + ], + ], + ], + ], + ], + ], + ], + ]); } protected function getServiceClass($name) diff --git a/libs/stripe-php/lib/Service/V2/Core/AccountTokenService.php b/libs/stripe-php/lib/Service/V2/Core/AccountTokenService.php index de59b8578..44f68f12d 100644 --- a/libs/stripe-php/lib/Service/V2/Core/AccountTokenService.php +++ b/libs/stripe-php/lib/Service/V2/Core/AccountTokenService.php @@ -12,18 +12,47 @@ namespace Stripe\Service\V2\Core; class AccountTokenService extends \Stripe\Service\AbstractService { /** - * Creates an Account Token. + * Create an account token with a publishable key and pass it to the Accounts v2 + * API to create or update an account without its data touching your server. Learn + * more about [account tokens](https://docs.stripe.com/connect/account-tokens). In + * live mode, you can only create account tokens with your application's + * publishable key. In test mode, you can create account tokens with your secret + * key or publishable key. * - * @param null|array{contact_email?: string, contact_phone?: string, display_name?: string, identity?: array{attestations?: array{directorship_declaration?: array{attested?: bool}, ownership_declaration?: array{attested?: bool}, persons_provided?: array{directors?: bool, executives?: bool, owners?: bool, ownership_exemption_reason?: string}, representative_declaration?: array{attested?: bool}, terms_of_service?: array{account?: array{shown_and_accepted?: bool}}}, business_details?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, annual_revenue?: array{amount?: array{value?: int, currency?: string}, fiscal_year_end?: string}, documents?: array{bank_account_ownership_verification?: array{files: string[], type: string}, company_license?: array{files: string[], type: string}, company_memorandum_of_association?: array{files: string[], type: string}, company_ministerial_decree?: array{files: string[], type: string}, company_registration_verification?: array{files: string[], type: string}, company_tax_id_verification?: array{files: string[], type: string}, primary_verification?: array{front_back: array{back?: string, front?: string}, type: string}, proof_of_address?: array{files: string[], type: string}, proof_of_registration?: array{files: string[], type: string}, proof_of_ultimate_beneficial_ownership?: array{files: string[], type: string}}, estimated_worker_count?: int, id_numbers?: array{registrar?: string, type: string, value: string}[], monthly_estimated_revenue?: array{amount?: array{value?: int, currency?: string}}, phone?: string, registered_name?: string, registration_date?: array{day: int, month: int, year: int}, script_addresses?: array{kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}}, script_names?: array{kana?: array{registered_name?: string}, kanji?: array{registered_name?: string}}, structure?: string}, entity_type?: string, individual?: array{additional_addresses?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, purpose: string, state?: string, town?: string}[], additional_names?: array{full_name?: string, given_name?: string, purpose: string, surname?: string}[], address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, date_of_birth?: array{day: int, month: int, year: int}, documents?: array{company_authorization?: array{files: string[], type: string}, passport?: array{files: string[], type: string}, primary_verification?: array{front_back: array{back?: string, front?: string}, type: string}, secondary_verification?: array{front_back: array{back?: string, front?: string}, type: string}, visa?: array{files: string[], type: string}}, email?: string, given_name?: string, id_numbers?: array{type: string, value: string}[], legal_gender?: string, metadata?: array, nationalities?: string[], phone?: string, political_exposure?: string, relationship?: array{director?: bool, executive?: bool, owner?: bool, percent_ownership?: string, title?: string}, script_addresses?: array{kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}}, script_names?: array{kana?: array{given_name?: string, surname?: string}, kanji?: array{given_name?: string, surname?: string}}, surname?: string}}} $params + * @param null|array{contact_email?: string, contact_phone?: string, display_name?: string, identity?: array{attestations?: array{directorship_declaration?: array{attested?: bool}, ownership_declaration?: array{attested?: bool}, persons_provided?: array{directors?: bool, executives?: bool, owners?: bool, ownership_exemption_reason?: string}, representative_declaration?: array{attested?: bool}, terms_of_service?: array{account?: array{shown_and_accepted?: bool}}}, business_details?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, annual_revenue?: array{amount?: \Stripe\StripeObject, fiscal_year_end?: string}, documents?: array{bank_account_ownership_verification?: array{files: string[], type: string}, company_license?: array{files: string[], type: string}, company_memorandum_of_association?: array{files: string[], type: string}, company_ministerial_decree?: array{files: string[], type: string}, company_registration_verification?: array{files: string[], type: string}, company_tax_id_verification?: array{files: string[], type: string}, primary_verification?: array{front_back: array{back?: string, front?: string}, type: string}, proof_of_address?: array{files: string[], type: string}, proof_of_registration?: array{files: string[], signer?: array{person: string}, type: string}, proof_of_ultimate_beneficial_ownership?: array{files: string[], signer?: array{person: string}, type: string}}, estimated_worker_count?: int, id_numbers?: array{registrar?: string, type: string, value: string}[], monthly_estimated_revenue?: array{amount?: \Stripe\StripeObject}, phone?: string, registered_name?: string, registration_date?: array{day: int, month: int, year: int}, script_addresses?: array{kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}}, script_names?: array{kana?: array{registered_name?: string}, kanji?: array{registered_name?: string}}, structure?: string}, entity_type?: string, individual?: array{additional_addresses?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, purpose: string, state?: string, town?: string}[], additional_names?: array{full_name?: string, given_name?: string, purpose: string, surname?: string}[], address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, date_of_birth?: array{day: int, month: int, year: int}, documents?: array{company_authorization?: array{files: string[], type: string}, passport?: array{files: string[], type: string}, primary_verification?: array{front_back: array{back?: string, front?: string}, type: string}, secondary_verification?: array{front_back: array{back?: string, front?: string}, type: string}, visa?: array{files: string[], type: string}}, email?: string, given_name?: string, id_numbers?: array{type: string, value: string}[], legal_gender?: string, metadata?: array, nationalities?: string[], phone?: string, political_exposure?: string, relationship?: array{director?: bool, executive?: bool, owner?: bool, percent_ownership?: string, title?: string}, script_addresses?: array{kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}}, script_names?: array{kana?: array{given_name?: string, surname?: string}, kanji?: array{given_name?: string, surname?: string}}, surname?: string}}} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\V2\Core\AccountToken * - * @throws \Stripe\Exception\ApiErrorException if the request fails + * @throws \Stripe\Exception\RateLimitException */ public function create($params = null, $opts = null) { - return $this->request('post', '/v2/core/account_tokens', $params, $opts); + return $this->request('post', '/v2/core/account_tokens', $params, $opts, [ + 'request_schema' => [ + 'kind' => 'object', + 'fields' => [ + 'identity' => [ + 'kind' => 'object', + 'fields' => [ + 'individual' => [ + 'kind' => 'object', + 'fields' => [ + 'relationship' => [ + 'kind' => 'object', + 'fields' => [ + 'percent_ownership' => [ + 'kind' => 'decimal_string', + ], + ], + ], + ], + ], + ], + ], + ], + ], + ]); } /** @@ -35,7 +64,7 @@ class AccountTokenService extends \Stripe\Service\AbstractService * * @return \Stripe\V2\Core\AccountToken * - * @throws \Stripe\Exception\ApiErrorException if the request fails + * @throws \Stripe\Exception\RateLimitException */ public function retrieve($id, $params = null, $opts = null) { diff --git a/libs/stripe-php/lib/Service/V2/Core/Accounts/PersonService.php b/libs/stripe-php/lib/Service/V2/Core/Accounts/PersonService.php index f55768b27..dc0fa77aa 100644 --- a/libs/stripe-php/lib/Service/V2/Core/Accounts/PersonService.php +++ b/libs/stripe-php/lib/Service/V2/Core/Accounts/PersonService.php @@ -20,11 +20,33 @@ class PersonService extends \Stripe\Service\AbstractService * * @return \Stripe\V2\Collection<\Stripe\V2\Core\AccountPerson> * - * @throws \Stripe\Exception\ApiErrorException if the request fails + * @throws \Stripe\Exception\RateLimitException */ public function all($id, $params = null, $opts = null) { - return $this->requestCollection('get', $this->buildPath('/v2/core/accounts/%s/persons', $id), $params, $opts); + return $this->requestCollection('get', $this->buildPath('/v2/core/accounts/%s/persons', $id), $params, $opts, [ + 'response_schema' => [ + 'kind' => 'object', + 'fields' => [ + 'data' => [ + 'kind' => 'array', + 'element' => [ + 'kind' => 'object', + 'fields' => [ + 'relationship' => [ + 'kind' => 'object', + 'fields' => [ + 'percent_ownership' => [ + 'kind' => 'decimal_string', + ], + ], + ], + ], + ], + ], + ], + ], + ]); } /** @@ -37,11 +59,34 @@ class PersonService extends \Stripe\Service\AbstractService * * @return \Stripe\V2\Core\AccountPerson * - * @throws \Stripe\Exception\ApiErrorException if the request fails + * @throws \Stripe\Exception\RateLimitException */ public function create($id, $params = null, $opts = null) { - return $this->request('post', $this->buildPath('/v2/core/accounts/%s/persons', $id), $params, $opts); + return $this->request('post', $this->buildPath('/v2/core/accounts/%s/persons', $id), $params, $opts, [ + 'request_schema' => [ + 'kind' => 'object', + 'fields' => [ + 'relationship' => [ + 'kind' => 'object', + 'fields' => [ + 'percent_ownership' => ['kind' => 'decimal_string'], + ], + ], + ], + ], + 'response_schema' => [ + 'kind' => 'object', + 'fields' => [ + 'relationship' => [ + 'kind' => 'object', + 'fields' => [ + 'percent_ownership' => ['kind' => 'decimal_string'], + ], + ], + ], + ], + ]); } /** @@ -54,7 +99,7 @@ class PersonService extends \Stripe\Service\AbstractService * * @return \Stripe\V2\DeletedObject * - * @throws \Stripe\Exception\ApiErrorException if the request fails + * @throws \Stripe\Exception\RateLimitException */ public function delete($parentId, $id, $params = null, $opts = null) { @@ -71,11 +116,23 @@ class PersonService extends \Stripe\Service\AbstractService * * @return \Stripe\V2\Core\AccountPerson * - * @throws \Stripe\Exception\ApiErrorException if the request fails + * @throws \Stripe\Exception\RateLimitException */ public function retrieve($parentId, $id, $params = null, $opts = null) { - return $this->request('get', $this->buildPath('/v2/core/accounts/%s/persons/%s', $parentId, $id), $params, $opts); + return $this->request('get', $this->buildPath('/v2/core/accounts/%s/persons/%s', $parentId, $id), $params, $opts, [ + 'response_schema' => [ + 'kind' => 'object', + 'fields' => [ + 'relationship' => [ + 'kind' => 'object', + 'fields' => [ + 'percent_ownership' => ['kind' => 'decimal_string'], + ], + ], + ], + ], + ]); } /** @@ -88,10 +145,33 @@ class PersonService extends \Stripe\Service\AbstractService * * @return \Stripe\V2\Core\AccountPerson * - * @throws \Stripe\Exception\ApiErrorException if the request fails + * @throws \Stripe\Exception\RateLimitException */ public function update($parentId, $id, $params = null, $opts = null) { - return $this->request('post', $this->buildPath('/v2/core/accounts/%s/persons/%s', $parentId, $id), $params, $opts); + return $this->request('post', $this->buildPath('/v2/core/accounts/%s/persons/%s', $parentId, $id), $params, $opts, [ + 'request_schema' => [ + 'kind' => 'object', + 'fields' => [ + 'relationship' => [ + 'kind' => 'object', + 'fields' => [ + 'percent_ownership' => ['kind' => 'decimal_string'], + ], + ], + ], + ], + 'response_schema' => [ + 'kind' => 'object', + 'fields' => [ + 'relationship' => [ + 'kind' => 'object', + 'fields' => [ + 'percent_ownership' => ['kind' => 'decimal_string'], + ], + ], + ], + ], + ]); } } diff --git a/libs/stripe-php/lib/Service/V2/Core/Accounts/PersonTokenService.php b/libs/stripe-php/lib/Service/V2/Core/Accounts/PersonTokenService.php index 081fc43af..e1e21a972 100644 --- a/libs/stripe-php/lib/Service/V2/Core/Accounts/PersonTokenService.php +++ b/libs/stripe-php/lib/Service/V2/Core/Accounts/PersonTokenService.php @@ -12,7 +12,12 @@ namespace Stripe\Service\V2\Core\Accounts; class PersonTokenService extends \Stripe\Service\AbstractService { /** - * Creates a Person Token associated with an Account. + * Creates a single-use token that represents the details for a person. Use this + * when you create or update persons associated with an Account v2. Learn more + * about [account tokens](https://docs.stripe.com/connect/account-tokens). You can + * only create person tokens with your application's publishable key and in live + * mode. You can use your application's secret key to create person tokens only in + * test mode. * * @param string $id * @param null|array{additional_addresses?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, purpose: string, state?: string, town?: string}[], additional_names?: array{full_name?: string, given_name?: string, purpose: string, surname?: string}[], additional_terms_of_service?: array{account?: array{shown_and_accepted?: bool}}, address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, date_of_birth?: array{day: int, month: int, year: int}, documents?: array{company_authorization?: array{files: string[], type: string}, passport?: array{files: string[], type: string}, primary_verification?: array{front_back: array{back?: string, front?: string}, type: string}, secondary_verification?: array{front_back: array{back?: string, front?: string}, type: string}, visa?: array{files: string[], type: string}}, email?: string, given_name?: string, id_numbers?: array{type: string, value: string}[], legal_gender?: string, metadata?: array, nationalities?: string[], phone?: string, political_exposure?: string, relationship?: array{authorizer?: bool, director?: bool, executive?: bool, legal_guardian?: bool, owner?: bool, percent_ownership?: string, representative?: bool, title?: string}, script_addresses?: array{kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}}, script_names?: array{kana?: array{given_name?: string, surname?: string}, kanji?: array{given_name?: string, surname?: string}}, surname?: string} $params @@ -20,11 +25,23 @@ class PersonTokenService extends \Stripe\Service\AbstractService * * @return \Stripe\V2\Core\AccountPersonToken * - * @throws \Stripe\Exception\ApiErrorException if the request fails + * @throws \Stripe\Exception\RateLimitException */ public function create($id, $params = null, $opts = null) { - return $this->request('post', $this->buildPath('/v2/core/accounts/%s/person_tokens', $id), $params, $opts); + return $this->request('post', $this->buildPath('/v2/core/accounts/%s/person_tokens', $id), $params, $opts, [ + 'request_schema' => [ + 'kind' => 'object', + 'fields' => [ + 'relationship' => [ + 'kind' => 'object', + 'fields' => [ + 'percent_ownership' => ['kind' => 'decimal_string'], + ], + ], + ], + ], + ]); } /** @@ -37,7 +54,7 @@ class PersonTokenService extends \Stripe\Service\AbstractService * * @return \Stripe\V2\Core\AccountPersonToken * - * @throws \Stripe\Exception\ApiErrorException if the request fails + * @throws \Stripe\Exception\RateLimitException */ public function retrieve($parentId, $id, $params = null, $opts = null) { diff --git a/libs/stripe-php/lib/Service/V2/Core/EventDestinationService.php b/libs/stripe-php/lib/Service/V2/Core/EventDestinationService.php index b021525d9..233a1f2b1 100644 --- a/libs/stripe-php/lib/Service/V2/Core/EventDestinationService.php +++ b/libs/stripe-php/lib/Service/V2/Core/EventDestinationService.php @@ -29,7 +29,7 @@ class EventDestinationService extends \Stripe\Service\AbstractService /** * Create a new event destination. * - * @param null|array{description?: string, enabled_events: string[], event_payload: string, events_from?: string[], include?: string[], metadata?: array, name: string, snapshot_api_version?: string, type: string, amazon_eventbridge?: array{aws_account_id: string, aws_region: string}, webhook_endpoint?: array{url: string}} $params + * @param null|array{amazon_eventbridge?: array{aws_account_id: string, aws_region: string}, azure_event_grid?: array{azure_region: string, azure_resource_group_name: string, azure_subscription_id: string}, description?: string, enabled_events: string[], event_payload: string, events_from?: string[], include?: string[], metadata?: array, name: string, snapshot_api_version?: string, type: string, webhook_endpoint?: array{url: string}} $params * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts * * @return \Stripe\V2\Core\EventDestination diff --git a/libs/stripe-php/lib/Service/V2/Core/EventService.php b/libs/stripe-php/lib/Service/V2/Core/EventService.php index 627c51e5f..35cb6d209 100644 --- a/libs/stripe-php/lib/Service/V2/Core/EventService.php +++ b/libs/stripe-php/lib/Service/V2/Core/EventService.php @@ -27,7 +27,9 @@ class EventService extends \Stripe\Service\AbstractService } /** - * Retrieves the details of an event. + * Retrieves the details of an event if it was created in the last 30 days. Supply + * the unique identifier of the event, which might have been delivered to your + * event destination. * * @param string $id * @param null|array $params diff --git a/libs/stripe-php/lib/Service/V2/V2ServiceFactory.php b/libs/stripe-php/lib/Service/V2/V2ServiceFactory.php index f16fe6238..305d53b96 100644 --- a/libs/stripe-php/lib/Service/V2/V2ServiceFactory.php +++ b/libs/stripe-php/lib/Service/V2/V2ServiceFactory.php @@ -8,6 +8,7 @@ namespace Stripe\Service\V2; * Service factory class for API resources in the V2 namespace. * * @property Billing\BillingServiceFactory $billing + * @property Commerce\CommerceServiceFactory $commerce * @property Core\CoreServiceFactory $core */ class V2ServiceFactory extends \Stripe\Service\AbstractServiceFactory @@ -17,6 +18,7 @@ class V2ServiceFactory extends \Stripe\Service\AbstractServiceFactory */ private static $classMap = [ 'billing' => Billing\BillingServiceFactory::class, + 'commerce' => Commerce\CommerceServiceFactory::class, 'core' => Core\CoreServiceFactory::class, ]; diff --git a/libs/stripe-php/lib/SetupAttempt.php b/libs/stripe-php/lib/SetupAttempt.php index a5d420936..5d342c7db 100644 --- a/libs/stripe-php/lib/SetupAttempt.php +++ b/libs/stripe-php/lib/SetupAttempt.php @@ -18,10 +18,10 @@ namespace Stripe; * @property null|Customer|string $customer The value of customer on the SetupIntent at the time of this confirmation. * @property null|string $customer_account The value of customer_account on the SetupIntent at the time of this confirmation. * @property null|string[] $flow_directions

    Indicates the directions of money movement for which this payment method is intended to be used.

    Include inbound if you intend to use the payment method as the origin to pull funds from. Include outbound if you intend to use the payment method as the destination to send funds to. You can include both if you intend to use the payment method for both purposes.

    - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|Account|string $on_behalf_of The value of on_behalf_of on the SetupIntent at the time of this confirmation. * @property PaymentMethod|string $payment_method ID of the payment method used with this SetupAttempt. - * @property (object{acss_debit?: (object{}&StripeObject), amazon_pay?: (object{}&StripeObject), au_becs_debit?: (object{}&StripeObject), bacs_debit?: (object{}&StripeObject), bancontact?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, preferred_language: null|string, verified_name: null|string}&StripeObject), boleto?: (object{}&StripeObject), card?: (object{brand: null|string, checks: null|(object{address_line1_check: null|string, address_postal_code_check: null|string, cvc_check: null|string}&StripeObject), country: null|string, description?: null|string, exp_month: null|int, exp_year: null|int, fingerprint?: null|string, funding: null|string, iin?: null|string, issuer?: null|string, last4: null|string, network: null|string, three_d_secure: null|(object{authentication_flow: null|string, electronic_commerce_indicator: null|string, result: null|string, result_reason: null|string, transaction_id: null|string, version: null|string}&StripeObject), wallet: null|(object{apple_pay?: (object{}&StripeObject), google_pay?: (object{}&StripeObject), type: string}&StripeObject)}&StripeObject), card_present?: (object{generated_card: null|PaymentMethod|string, offline: null|(object{stored_at: null|int, type: null|string}&StripeObject)}&StripeObject), cashapp?: (object{}&StripeObject), ideal?: (object{bank: null|string, bic: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, verified_name: null|string}&StripeObject), kakao_pay?: (object{}&StripeObject), klarna?: (object{}&StripeObject), kr_card?: (object{}&StripeObject), link?: (object{}&StripeObject), naver_pay?: (object{buyer_id?: string}&StripeObject), nz_bank_account?: (object{}&StripeObject), paypal?: (object{}&StripeObject), payto?: (object{}&StripeObject), revolut_pay?: (object{}&StripeObject), sepa_debit?: (object{}&StripeObject), sofort?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, preferred_language: null|string, verified_name: null|string}&StripeObject), type: string, us_bank_account?: (object{}&StripeObject)}&StripeObject) $payment_method_details + * @property (object{acss_debit?: (object{}&StripeObject), amazon_pay?: (object{}&StripeObject), au_becs_debit?: (object{}&StripeObject), bacs_debit?: (object{}&StripeObject), bancontact?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, preferred_language: null|string, verified_name: null|string}&StripeObject), boleto?: (object{}&StripeObject), card?: (object{brand: null|string, checks: null|(object{address_line1_check: null|string, address_postal_code_check: null|string, cvc_check: null|string}&StripeObject), country: null|string, description?: null|string, exp_month: null|int, exp_year: null|int, fingerprint?: null|string, funding: null|string, iin?: null|string, issuer?: null|string, last4: null|string, moto?: bool, network: null|string, three_d_secure: null|(object{authentication_flow: null|string, electronic_commerce_indicator: null|string, result: null|string, result_reason: null|string, transaction_id: null|string, version: null|string}&StripeObject), wallet: null|(object{apple_pay?: (object{}&StripeObject), google_pay?: (object{}&StripeObject), type: string}&StripeObject)}&StripeObject), card_present?: (object{generated_card: null|PaymentMethod|string, offline: null|(object{stored_at: null|int, type: null|string}&StripeObject)}&StripeObject), cashapp?: (object{}&StripeObject), ideal?: (object{bank: null|string, bic: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, verified_name: null|string}&StripeObject), kakao_pay?: (object{}&StripeObject), klarna?: (object{}&StripeObject), kr_card?: (object{}&StripeObject), link?: (object{}&StripeObject), naver_pay?: (object{buyer_id?: string}&StripeObject), nz_bank_account?: (object{}&StripeObject), paypal?: (object{}&StripeObject), payto?: (object{}&StripeObject), pix?: (object{fingerprint?: null|string}&StripeObject), revolut_pay?: (object{}&StripeObject), satispay?: (object{}&StripeObject), sepa_debit?: (object{}&StripeObject), sofort?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, preferred_language: null|string, verified_name: null|string}&StripeObject), twint?: (object{}&StripeObject), type: string, upi?: (object{}&StripeObject), us_bank_account?: (object{}&StripeObject)}&StripeObject) $payment_method_details * @property null|(object{advice_code?: string, charge?: string, code?: string, decline_code?: string, doc_url?: string, message?: string, network_advice_code?: string, network_decline_code?: string, param?: string, payment_intent?: PaymentIntent, payment_method?: PaymentMethod, payment_method_type?: string, request_log_url?: string, setup_intent?: SetupIntent, source?: Account|BankAccount|Card|Source, type: string}&StripeObject) $setup_error The error encountered during this attempt to confirm the SetupIntent, if any. * @property SetupIntent|string $setup_intent ID of the SetupIntent that this attempt belongs to. * @property string $status Status of this SetupAttempt, one of requires_confirmation, requires_action, processing, succeeded, failed, or abandoned. diff --git a/libs/stripe-php/lib/SetupIntent.php b/libs/stripe-php/lib/SetupIntent.php index d9328de5c..052f50a7e 100644 --- a/libs/stripe-php/lib/SetupIntent.php +++ b/libs/stripe-php/lib/SetupIntent.php @@ -42,14 +42,15 @@ namespace Stripe; * @property null|string[] $flow_directions

    Indicates the directions of money movement for which this payment method is intended to be used.

    Include inbound if you intend to use the payment method as the origin to pull funds from. Include outbound if you intend to use the payment method as the destination to send funds to. You can include both if you intend to use the payment method for both purposes.

    * @property null|(object{advice_code?: string, charge?: string, code?: string, decline_code?: string, doc_url?: string, message?: string, network_advice_code?: string, network_decline_code?: string, param?: string, payment_intent?: PaymentIntent, payment_method?: PaymentMethod, payment_method_type?: string, request_log_url?: string, setup_intent?: SetupIntent, source?: Account|BankAccount|Card|Source, type: string}&StripeObject) $last_setup_error The error encountered in the previous SetupIntent confirmation. * @property null|SetupAttempt|string $latest_attempt The most recent SetupAttempt for this SetupIntent. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. + * @property null|(object{enabled: bool}&StripeObject) $managed_payments * @property null|Mandate|string $mandate ID of the multi use Mandate generated by the SetupIntent. * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property null|(object{cashapp_handle_redirect_or_display_qr_code?: (object{hosted_instructions_url: string, mobile_auth_url: string, qr_code: (object{expires_at: int, image_url_png: string, image_url_svg: string}&StripeObject)}&StripeObject), redirect_to_url?: (object{return_url: null|string, url: null|string}&StripeObject), type: string, use_stripe_sdk?: StripeObject, verify_with_microdeposits?: (object{arrival_date: int, hosted_verification_url: string, microdeposit_type: null|string}&StripeObject)}&StripeObject) $next_action If present, this property tells you what actions you need to take in order for your customer to continue payment setup. + * @property null|(object{blik_authorize?: (object{}&StripeObject), cashapp_handle_redirect_or_display_qr_code?: (object{hosted_instructions_url: string, mobile_auth_url: string, qr_code: (object{expires_at: int, image_url_png: string, image_url_svg: string}&StripeObject)}&StripeObject), pix_display_qr_code?: (object{data: string, expires_at: int, hosted_instructions_url: string, image_url_png: string, image_url_svg: string}&StripeObject), redirect_to_url?: (object{return_url: null|string, url: null|string}&StripeObject), type: string, upi_handle_redirect_or_display_qr_code?: (object{hosted_instructions_url: string, qr_code: (object{expires_at: int, image_url_png: string, image_url_svg: string}&StripeObject)}&StripeObject), use_stripe_sdk?: StripeObject, verify_with_microdeposits?: (object{arrival_date: int, hosted_verification_url: string, microdeposit_type: null|string}&StripeObject)}&StripeObject) $next_action If present, this property tells you what actions you need to take in order for your customer to continue payment setup. * @property null|Account|string $on_behalf_of The account (if any) for which the setup is intended. * @property null|PaymentMethod|string $payment_method ID of the payment method used with this SetupIntent. If the payment method is card_present and isn't a digital wallet, then the generated_card associated with the latest_attempt is attached to the Customer instead. * @property null|(object{id: string, parent: null|string}&StripeObject) $payment_method_configuration_details Information about the payment method configuration used for this Setup Intent. - * @property null|(object{acss_debit?: (object{currency: null|string, mandate_options?: (object{custom_mandate_url?: string, default_for?: string[], interval_description: null|string, payment_schedule: null|string, transaction_type: null|string}&StripeObject), verification_method?: string}&StripeObject), amazon_pay?: (object{}&StripeObject), bacs_debit?: (object{mandate_options?: (object{reference_prefix?: string}&StripeObject)}&StripeObject), card?: (object{mandate_options: null|(object{amount: int, amount_type: string, currency: string, description: null|string, end_date: null|int, interval: string, interval_count: null|int, reference: string, start_date: int, supported_types: null|string[]}&StripeObject), network: null|string, request_three_d_secure: null|string}&StripeObject), card_present?: (object{}&StripeObject), klarna?: (object{currency: null|string, preferred_locale: null|string}&StripeObject), link?: (object{persistent_token: null|string}&StripeObject), paypal?: (object{billing_agreement_id: null|string}&StripeObject), payto?: (object{mandate_options?: (object{amount: null|int, amount_type: null|string, end_date: null|string, payment_schedule: null|string, payments_per_period: null|int, purpose: null|string, start_date: null|string}&StripeObject)}&StripeObject), sepa_debit?: (object{mandate_options?: (object{reference_prefix?: string}&StripeObject)}&StripeObject), us_bank_account?: (object{financial_connections?: (object{filters?: (object{account_subcategories?: string[]}&StripeObject), permissions?: string[], prefetch: null|string[], return_url?: string}&StripeObject), mandate_options?: (object{collection_method?: string}&StripeObject), verification_method?: string}&StripeObject)}&StripeObject) $payment_method_options Payment method-specific configuration for this SetupIntent. + * @property null|(object{acss_debit?: (object{currency: null|string, mandate_options?: (object{custom_mandate_url?: string, default_for?: string[], interval_description: null|string, payment_schedule: null|string, transaction_type: null|string}&StripeObject), verification_method?: string}&StripeObject), amazon_pay?: (object{}&StripeObject), bacs_debit?: (object{mandate_options?: (object{reference_prefix?: string}&StripeObject)}&StripeObject), bizum?: (object{}&StripeObject), card?: (object{mandate_options: null|(object{amount: int, amount_type: string, currency: string, description: null|string, end_date: null|int, interval: string, interval_count: null|int, reference: string, start_date: int, supported_types: null|string[]}&StripeObject), network: null|string, request_three_d_secure: null|string}&StripeObject), card_present?: (object{}&StripeObject), klarna?: (object{currency: null|string, preferred_locale: null|string}&StripeObject), link?: (object{persistent_token: null|string}&StripeObject), paypal?: (object{billing_agreement_id: null|string}&StripeObject), payto?: (object{mandate_options?: (object{amount: null|int, amount_type: null|string, end_date: null|string, payment_schedule: null|string, payments_per_period: null|int, purpose: null|string, start_date: null|string}&StripeObject)}&StripeObject), pix?: (object{mandate_options?: (object{amount?: int, amount_includes_iof?: string, amount_type?: string, currency?: string, end_date?: string, payment_schedule?: string, reference?: string, start_date?: string}&StripeObject)}&StripeObject), sepa_debit?: (object{mandate_options?: (object{reference_prefix?: string}&StripeObject)}&StripeObject), upi?: (object{mandate_options?: (object{amount: null|int, amount_type: null|string, description: null|string, end_date: null|int}&StripeObject)}&StripeObject), us_bank_account?: (object{financial_connections?: (object{filters?: (object{account_subcategories?: string[]}&StripeObject), permissions?: string[], prefetch: null|string[], return_url?: string}&StripeObject), mandate_options?: (object{collection_method?: string}&StripeObject), verification_method?: string}&StripeObject)}&StripeObject) $payment_method_options Payment method-specific configuration for this SetupIntent. * @property string[] $payment_method_types The list of payment method types (e.g. card) that this SetupIntent is allowed to set up. A list of valid payment method types can be found here. * @property null|Mandate|string $single_use_mandate ID of the single_use Mandate generated by the SetupIntent. * @property string $status Status of this SetupIntent, one of requires_payment_method, requires_confirmation, requires_action, processing, canceled, or succeeded. @@ -79,7 +80,7 @@ class SetupIntent extends ApiResource * href="/docs/api/setup_intents/confirm">confirm it to collect any required * permissions to charge the payment method later. * - * @param null|array{attach_to_self?: bool, automatic_payment_methods?: array{allow_redirects?: string, enabled: bool}, confirm?: bool, confirmation_token?: string, customer?: string, customer_account?: string, description?: string, excluded_payment_method_types?: string[], expand?: string[], flow_directions?: string[], mandate_data?: null|array{customer_acceptance: array{accepted_at?: int, offline?: array{}, online?: array{ip_address: string, user_agent: string}, type: string}}, metadata?: array, on_behalf_of?: string, payment_method?: string, payment_method_configuration?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, swish?: array{}, twint?: array{}, type: string, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: array{currency?: string, mandate_options?: array{custom_mandate_url?: null|string, default_for?: string[], interval_description?: string, payment_schedule?: string, transaction_type?: string}, verification_method?: string}, amazon_pay?: array{}, bacs_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, card?: array{mandate_options?: array{amount: int, amount_type: string, currency: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_three_d_secure?: string, three_d_secure?: array{ares_trans_status?: string, cryptogram?: string, electronic_commerce_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id?: string, version?: string}}, card_present?: array{}, klarna?: array{currency?: string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing: array{amount: int, date: string}, reference: string}[]}, link?: array{persistent_token?: string}, paypal?: array{billing_agreement_id?: string}, payto?: array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string, start_date?: null|string}}, sepa_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, us_bank_account?: array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, verification_method?: string}}, payment_method_types?: string[], return_url?: string, single_use?: array{amount: int, currency: string}, usage?: string, use_stripe_sdk?: bool} $params + * @param null|array{attach_to_self?: bool, automatic_payment_methods?: array{allow_redirects?: string, enabled: bool}, confirm?: bool, confirmation_token?: string, customer?: string, customer_account?: string, description?: string, excluded_payment_method_types?: string[], expand?: string[], flow_directions?: string[], mandate_data?: null|array{customer_acceptance: array{accepted_at?: int, offline?: array{}, online?: array{ip_address: string, user_agent: string}, type: string}}, metadata?: array, on_behalf_of?: string, payment_method?: string, payment_method_configuration?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, bizum?: array{}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, scalapay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, sunbit?: array{}, swish?: array{}, twint?: array{}, type: string, upi?: array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}}, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: array{currency?: string, mandate_options?: array{custom_mandate_url?: null|string, default_for?: string[], interval_description?: string, payment_schedule?: string, transaction_type?: string}, verification_method?: string}, amazon_pay?: array{}, bacs_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, bizum?: array{}, card?: array{mandate_options?: array{amount: int, amount_type: string, currency: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_three_d_secure?: string, three_d_secure?: array{ares_trans_status?: string, cryptogram?: string, electronic_commerce_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id?: string, version?: string}}, card_present?: array{}, klarna?: array{currency?: string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing: array{amount: int, date: string}, reference: string}[]}, link?: array{persistent_token?: string}, paypal?: array{billing_agreement_id?: string}, payto?: array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string, start_date?: null|string}}, pix?: array{mandate_options?: array{amount?: int, amount_includes_iof?: string, amount_type?: string, currency?: string, end_date?: string, payment_schedule?: string, reference?: string, start_date?: string}}, sepa_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, upi?: array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}, setup_future_usage?: null|string}, us_bank_account?: array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, verification_method?: string}}, payment_method_types?: string[], return_url?: string, single_use?: array{amount: int, currency: string}, usage?: string, use_stripe_sdk?: bool} $params * @param null|array|string $options * * @return SetupIntent the created resource @@ -145,7 +146,7 @@ class SetupIntent extends ApiResource * Updates a SetupIntent object. * * @param string $id the ID of the resource to update - * @param null|array{attach_to_self?: bool, customer?: string, customer_account?: string, description?: string, excluded_payment_method_types?: null|string[], expand?: string[], flow_directions?: string[], metadata?: null|array, payment_method?: string, payment_method_configuration?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, swish?: array{}, twint?: array{}, type: string, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: array{currency?: string, mandate_options?: array{custom_mandate_url?: null|string, default_for?: string[], interval_description?: string, payment_schedule?: string, transaction_type?: string}, verification_method?: string}, amazon_pay?: array{}, bacs_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, card?: array{mandate_options?: array{amount: int, amount_type: string, currency: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_three_d_secure?: string, three_d_secure?: array{ares_trans_status?: string, cryptogram?: string, electronic_commerce_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id?: string, version?: string}}, card_present?: array{}, klarna?: array{currency?: string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing: array{amount: int, date: string}, reference: string}[]}, link?: array{persistent_token?: string}, paypal?: array{billing_agreement_id?: string}, payto?: array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string, start_date?: null|string}}, sepa_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, us_bank_account?: array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, verification_method?: string}}, payment_method_types?: string[]} $params + * @param null|array{attach_to_self?: bool, customer?: string, customer_account?: string, description?: string, excluded_payment_method_types?: null|string[], expand?: string[], flow_directions?: string[], metadata?: null|array, payment_method?: string, payment_method_configuration?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, bizum?: array{}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, scalapay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, sunbit?: array{}, swish?: array{}, twint?: array{}, type: string, upi?: array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}}, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: array{currency?: string, mandate_options?: array{custom_mandate_url?: null|string, default_for?: string[], interval_description?: string, payment_schedule?: string, transaction_type?: string}, verification_method?: string}, amazon_pay?: array{}, bacs_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, bizum?: array{}, card?: array{mandate_options?: array{amount: int, amount_type: string, currency: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_three_d_secure?: string, three_d_secure?: array{ares_trans_status?: string, cryptogram?: string, electronic_commerce_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id?: string, version?: string}}, card_present?: array{}, klarna?: array{currency?: string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing: array{amount: int, date: string}, reference: string}[]}, link?: array{persistent_token?: string}, paypal?: array{billing_agreement_id?: string}, payto?: array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string, start_date?: null|string}}, pix?: array{mandate_options?: array{amount?: int, amount_includes_iof?: string, amount_type?: string, currency?: string, end_date?: string, payment_schedule?: string, reference?: string, start_date?: string}}, sepa_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, upi?: array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}, setup_future_usage?: null|string}, us_bank_account?: array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, verification_method?: string}}, payment_method_types?: string[]} $params * @param null|array|string $opts * * @return SetupIntent the updated resource diff --git a/libs/stripe-php/lib/ShippingRate.php b/libs/stripe-php/lib/ShippingRate.php index a213a2eb7..ccf357d6d 100644 --- a/libs/stripe-php/lib/ShippingRate.php +++ b/libs/stripe-php/lib/ShippingRate.php @@ -15,7 +15,7 @@ namespace Stripe; * @property null|(object{maximum: null|(object{unit: string, value: int}&StripeObject), minimum: null|(object{unit: string, value: int}&StripeObject)}&StripeObject) $delivery_estimate The estimated range for how long shipping will take, meant to be displayable to the customer. This will appear on CheckoutSessions. * @property null|string $display_name The name of the shipping rate, meant to be displayable to the customer. This will appear on CheckoutSessions. * @property null|(object{amount: int, currency: string, currency_options?: StripeObject}&StripeObject) $fixed_amount - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|string $tax_behavior Specifies whether the rate is considered inclusive of taxes or exclusive of taxes. One of inclusive, exclusive, or unspecified. * @property null|string|TaxCode $tax_code A tax code ID. The Shipping tax code is txcd_92010001. diff --git a/libs/stripe-php/lib/Sigma/ScheduledQueryRun.php b/libs/stripe-php/lib/Sigma/ScheduledQueryRun.php index 53f84a641..dc0d885a5 100644 --- a/libs/stripe-php/lib/Sigma/ScheduledQueryRun.php +++ b/libs/stripe-php/lib/Sigma/ScheduledQueryRun.php @@ -16,7 +16,7 @@ namespace Stripe\Sigma; * @property int $data_load_time When the query was run, Sigma contained a snapshot of your Stripe data at this time. * @property null|(object{message: string}&\Stripe\StripeObject) $error * @property null|\Stripe\File $file The file object representing the results of the query. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property int $result_available_until Time at which the result expires and is no longer available for download. * @property string $sql SQL for the query. * @property string $status The query's execution status, which will be completed for successful runs, and canceled, failed, or timed_out otherwise. diff --git a/libs/stripe-php/lib/Source.php b/libs/stripe-php/lib/Source.php index dba4cca5a..b163f89c0 100644 --- a/libs/stripe-php/lib/Source.php +++ b/libs/stripe-php/lib/Source.php @@ -38,7 +38,7 @@ namespace Stripe; * @property null|(object{bank_code?: null|string, bank_name?: null|string, bic?: null|string, statement_descriptor?: null|string}&StripeObject) $giropay * @property null|(object{bank?: null|string, bic?: null|string, iban_last4?: null|string, statement_descriptor?: null|string}&StripeObject) $ideal * @property null|(object{background_image_url?: string, client_token?: null|string, first_name?: string, last_name?: string, locale?: string, logo_url?: string, page_title?: string, pay_later_asset_urls_descriptive?: string, pay_later_asset_urls_standard?: string, pay_later_name?: string, pay_later_redirect_url?: string, pay_now_asset_urls_descriptive?: string, pay_now_asset_urls_standard?: string, pay_now_name?: string, pay_now_redirect_url?: string, pay_over_time_asset_urls_descriptive?: string, pay_over_time_asset_urls_standard?: string, pay_over_time_name?: string, pay_over_time_redirect_url?: string, payment_method_categories?: string, purchase_country?: string, purchase_type?: string, redirect_url?: string, shipping_delay?: int, shipping_first_name?: string, shipping_last_name?: string}&StripeObject) $klarna - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|(object{entity?: null|string, reference?: null|string, refund_account_holder_address_city?: null|string, refund_account_holder_address_country?: null|string, refund_account_holder_address_line1?: null|string, refund_account_holder_address_line2?: null|string, refund_account_holder_address_postal_code?: null|string, refund_account_holder_address_state?: null|string, refund_account_holder_name?: null|string, refund_iban?: null|string}&StripeObject) $multibanco * @property null|(object{address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, phone: null|string, verified_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), verified_email: null|string, verified_name: null|string, verified_phone: null|string}&StripeObject) $owner Information about the owner of the payment instrument that may be used or required by particular source types. diff --git a/libs/stripe-php/lib/SourceMandateNotification.php b/libs/stripe-php/lib/SourceMandateNotification.php index 91928ab55..8a0db2e38 100644 --- a/libs/stripe-php/lib/SourceMandateNotification.php +++ b/libs/stripe-php/lib/SourceMandateNotification.php @@ -15,7 +15,7 @@ namespace Stripe; * @property null|int $amount A positive integer in the smallest currency unit (that is, 100 cents for $1.00, or 1 for ¥1, Japanese Yen being a zero-decimal currency) representing the amount associated with the mandate notification. The amount is expressed in the currency of the underlying source. Required if the notification type is debit_initiated. * @property null|(object{last4?: string}&StripeObject) $bacs_debit * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property string $reason The reason of the mandate notification. Valid reasons are mandate_confirmed or debit_initiated. * @property null|(object{creditor_identifier?: string, last4?: string, mandate_reference?: string}&StripeObject) $sepa_debit * @property Source $source

    Source objects allow you to accept a variety of payment methods. They represent a customer's payment instrument, and can be used with the Stripe API just like a Card object: once chargeable, they can be charged, or can be attached to customers.

    Stripe doesn't recommend using the deprecated Sources API. We recommend that you adopt the PaymentMethods API. This newer API provides access to our latest features and payment method types.

    Related guides: Sources API and Sources & Customers.

    diff --git a/libs/stripe-php/lib/SourceTransaction.php b/libs/stripe-php/lib/SourceTransaction.php index 79966b75c..70e927bee 100644 --- a/libs/stripe-php/lib/SourceTransaction.php +++ b/libs/stripe-php/lib/SourceTransaction.php @@ -18,7 +18,7 @@ namespace Stripe; * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. * @property null|(object{fingerprint?: string, funding_method?: string, last4?: string, reference?: string, sender_account_number?: string, sender_name?: string, sender_sort_code?: string}&StripeObject) $gbp_credit_transfer - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|(object{available_at?: string, invoices?: string}&StripeObject) $paper_check * @property null|(object{reference?: string, sender_iban?: string, sender_name?: string}&StripeObject) $sepa_credit_transfer * @property string $source The ID of the source this transaction is attached to. diff --git a/libs/stripe-php/lib/Stripe.php b/libs/stripe-php/lib/Stripe.php index b09db93c1..5f6bf4cb5 100644 --- a/libs/stripe-php/lib/Stripe.php +++ b/libs/stripe-php/lib/Stripe.php @@ -58,13 +58,10 @@ class Stripe /** @var float Maximum delay between retries, in seconds */ private static $maxNetworkRetryDelay = 2.0; - /** @var float Maximum delay between retries, in seconds, that will be respected from the Stripe API */ - private static $maxRetryAfter = 60.0; - /** @var float Initial delay between retries, in seconds */ private static $initialNetworkRetryDelay = 0.5; - const VERSION = '19.4.1'; + const VERSION = '21.0.0'; /** * @return string the API key used for requests @@ -247,14 +244,6 @@ class Stripe return self::$maxNetworkRetryDelay; } - /** - * @return float Maximum delay between retries, in seconds, that will be respected from the Stripe API - */ - public static function getMaxRetryAfter() - { - return self::$maxRetryAfter; - } - /** * @return float Initial delay between retries, in seconds */ diff --git a/libs/stripe-php/lib/StripeObject.php b/libs/stripe-php/lib/StripeObject.php index 58eb10986..6c3b30694 100644 --- a/libs/stripe-php/lib/StripeObject.php +++ b/libs/stripe-php/lib/StripeObject.php @@ -296,6 +296,16 @@ class StripeObject implements \ArrayAccess, \Countable, \JsonSerializable $values = $values->toArray(); } + // Apply int64_string response coercion on raw values before hydration. + // V2 resource classes declare fieldEncodings() with metadata about which + // fields are int64_string (wire format: JSON string, SDK type: PHP int). + if (\method_exists(static::class, 'fieldEncodings')) { + $encodings = static::fieldEncodings(); + if (!empty($encodings)) { + $values = Util\Int64::coerceResponseValues($values, $encodings); + } + } + // Wipe old state before setting new. This is useful for e.g. updating a // customer, where there is no persistent card parameter. Mark those values // which don't persist as transient @@ -331,7 +341,8 @@ class StripeObject implements \ArrayAccess, \Countable, \JsonSerializable // This is necessary in case metadata is empty, as PHP arrays do // not differentiate between lists and hashes, and we consider // empty arrays to be lists. - if (('metadata' === $k) && \is_array($v)) { + // The same applies to the previous_attributes attribute. + if (('metadata' === $k || 'previous_attributes' === $k) && \is_array($v)) { $this->_values[$k] = StripeObject::constructFrom($v, $opts, $apiMode); } else { $this->_values[$k] = Util\Util::convertToStripeObject($v, $opts, $apiMode); diff --git a/libs/stripe-php/lib/Subscription.php b/libs/stripe-php/lib/Subscription.php index 90c92231b..5057426fe 100644 --- a/libs/stripe-php/lib/Subscription.php +++ b/libs/stripe-php/lib/Subscription.php @@ -17,6 +17,7 @@ namespace Stripe; * @property int $billing_cycle_anchor The reference point that aligns future billing cycle dates. It sets the day of week for week intervals, the day of month for month and year intervals, and the month of year for year intervals. The timestamp is in UTC format. * @property null|(object{day_of_month: int, hour: null|int, minute: null|int, month: null|int, second: null|int}&StripeObject) $billing_cycle_anchor_config The fixed values used to calculate the billing_cycle_anchor. * @property (object{flexible: null|(object{proration_discounts?: string}&StripeObject), type: string, updated_at?: int}&StripeObject) $billing_mode The billing mode of the subscription. + * @property ((object{applies_to: null|((object{price: null|Price|string, type: string}&StripeObject))[], bill_until: (object{computed_timestamp: int, duration: null|(object{interval: string, interval_count: null|int}&StripeObject), timestamp: null|int, type: string}&StripeObject), key: string}&StripeObject))[] $billing_schedules Billing schedules for this subscription. * @property null|(object{amount_gte: null|int, reset_billing_cycle_anchor: null|bool}&StripeObject) $billing_thresholds Define thresholds at which an invoice will be sent, and the subscription advanced to a new billing period * @property null|int $cancel_at A date in the future at which the subscription will automatically get canceled * @property bool $cancel_at_period_end Whether this subscription will (if status=active) or did (if status=canceled) cancel at the end of the current billing period. @@ -34,18 +35,20 @@ namespace Stripe; * @property null|string $description The subscription's description, meant to be displayable to the customer. Use this field to optionally store an explanation of the subscription for rendering in Stripe surfaces and certain local payment methods UIs. * @property (Discount|string)[] $discounts The discounts applied to the subscription. Subscription item discounts are applied before subscription discounts. Use expand[]=discounts to expand each discount. * @property null|int $ended_at If the subscription has ended, the date the subscription ended. - * @property (object{account_tax_ids: null|(string|TaxId)[], issuer: (object{account?: Account|string, type: string}&StripeObject)}&StripeObject) $invoice_settings + * @property (object{account_tax_ids: null|(string|TaxId)[], custom_fields: null|(object{name: string, value: string}&StripeObject)[], description: null|string, footer: null|string, issuer: (object{account?: Account|string, type: string}&StripeObject)}&StripeObject) $invoice_settings * @property Collection $items List of subscription items, each with an attached price. * @property null|Invoice|string $latest_invoice The most recent invoice this subscription has generated over its lifecycle (for example, when it cycles or is updated). - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. + * @property null|(object{enabled: bool}&StripeObject) $managed_payments Settings for Managed Payments for this Subscription and resulting Invoices and PaymentIntents. * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|int $next_pending_invoice_item_invoice Specifies the approximate timestamp on which any pending invoice items will be billed according to the schedule provided at pending_invoice_item_interval. * @property null|Account|string $on_behalf_of The account (if any) the charge was made on behalf of for charges associated with this subscription. See the Connect documentation for details. * @property null|(object{behavior: string, resumes_at: null|int}&StripeObject) $pause_collection If specified, payment collection for this subscription will be paused. Note that the subscription status will be unchanged and will not be updated to paused. Learn more about pausing collection. - * @property null|(object{payment_method_options: null|(object{acss_debit: null|(object{mandate_options?: (object{transaction_type: null|string}&StripeObject), verification_method?: string}&StripeObject), bancontact: null|(object{preferred_language: string}&StripeObject), card: null|(object{mandate_options?: (object{amount: null|int, amount_type: null|string, description: null|string}&StripeObject), network: null|string, request_three_d_secure: null|string}&StripeObject), customer_balance: null|(object{bank_transfer?: (object{eu_bank_transfer?: (object{country: string}&StripeObject), type: null|string}&StripeObject), funding_type: null|string}&StripeObject), konbini: null|(object{}&StripeObject), payto: null|(object{mandate_options?: (object{amount: null|int, amount_type: null|string, purpose: null|string}&StripeObject)}&StripeObject), sepa_debit: null|(object{}&StripeObject), us_bank_account: null|(object{financial_connections?: (object{filters?: (object{account_subcategories?: string[]}&StripeObject), permissions?: string[], prefetch: null|string[]}&StripeObject), verification_method?: string}&StripeObject)}&StripeObject), payment_method_types: null|string[], save_default_payment_method: null|string}&StripeObject) $payment_settings Payment settings passed on to invoices created by the subscription. - * @property null|(object{interval: string, interval_count: int}&StripeObject) $pending_invoice_item_interval Specifies an interval for how often to bill for any pending invoice items. It is analogous to calling Create an invoice for the given subscription at the specified interval. + * @property null|(object{payment_method_options: null|(object{acss_debit: null|(object{mandate_options?: (object{transaction_type: null|string}&StripeObject), verification_method?: string}&StripeObject), bancontact: null|(object{preferred_language: string}&StripeObject), card: null|(object{mandate_options?: (object{amount: null|int, amount_type: null|string, description: null|string}&StripeObject), network: null|string, request_three_d_secure: null|string}&StripeObject), customer_balance: null|(object{bank_transfer?: (object{eu_bank_transfer?: (object{country: string}&StripeObject), type: null|string}&StripeObject), funding_type: null|string}&StripeObject), konbini: null|(object{}&StripeObject), payto: null|(object{mandate_options?: (object{amount: null|int, amount_type: null|string, purpose: null|string}&StripeObject)}&StripeObject), pix: null|(object{expires_after_seconds?: int, mandate_options?: (object{amount: null|int, amount_includes_iof: null|string, end_date: null|string, payment_schedule: null|string}&StripeObject)}&StripeObject), sepa_debit: null|(object{}&StripeObject), upi: null|(object{mandate_options?: (object{amount: null|int, amount_type: null|string, description: null|string, end_date: null|int}&StripeObject)}&StripeObject), us_bank_account: null|(object{financial_connections?: (object{filters?: (object{account_subcategories?: string[]}&StripeObject), permissions?: string[], prefetch: null|string[]}&StripeObject), verification_method?: string}&StripeObject)}&StripeObject), payment_method_types: null|string[], save_default_payment_method: null|string}&StripeObject) $payment_settings Payment settings passed on to invoices created by the subscription. + * @property null|(object{interval: string, interval_count: int}&StripeObject) $pending_invoice_item_interval Specifies an interval for how often to bill for any pending invoice items. It is analogous to calling Create an invoice for the given subscription at the specified interval. * @property null|SetupIntent|string $pending_setup_intent You can use this SetupIntent to collect user authentication when creating a subscription without immediate payment or updating a subscription's payment method, allowing you to optimize for off-session payments. Learn more in the SCA Migration Guide. - * @property null|(object{billing_cycle_anchor: null|int, expires_at: int, subscription_items: null|SubscriptionItem[], trial_end: null|int, trial_from_plan: null|bool}&StripeObject) $pending_update If specified, pending updates that will be applied to the subscription once the latest_invoice has been paid. + * @property null|(object{billing_cycle_anchor: null|int, discount: null|Discount, discounts: null|(Discount|string)[], expires_at: int, metadata: null|StripeObject, subscription_items: null|SubscriptionItem[], trial_end: null|int, trial_from_plan: null|bool}&StripeObject) $pending_update If specified, pending updates that will be applied to the subscription once the latest_invoice has been paid. + * @property null|(object{presentment_currency: string}&StripeObject) $presentment_details * @property null|string|SubscriptionSchedule $schedule The schedule attached to the subscription * @property int $start_date Date when the subscription was first created. The date might differ from the created date due to backdating. * @property string $status

    Possible values are incomplete, incomplete_expired, trialing, active, past_due, canceled, unpaid, or paused.

    For collection_method=charge_automatically a subscription moves into incomplete if the initial payment attempt fails. A subscription in this status can only have metadata and default_source updated. Once the first invoice is paid, the subscription moves into an active status. If the first invoice is not paid within 23 hours, the subscription transitions to incomplete_expired. This is a terminal status, the open invoice will be voided and no further invoices will be generated.

    A subscription that is currently in a trial period is trialing and moves to active when the trial period is over.

    A subscription can only enter a paused status when a trial ends without a payment method. A paused subscription doesn't generate invoices and can be resumed after your customer adds their payment method. The paused status is different from pausing collection, which still generates invoices and leaves the subscription's status unchanged.

    If subscription collection_method=charge_automatically, it becomes past_due when payment is required but cannot be paid (due to failed payment or awaiting additional user actions). Once Stripe has exhausted all payment retry attempts, the subscription will become canceled or unpaid (depending on your subscriptions settings).

    If subscription collection_method=send_invoice it becomes past_due when its invoice is not paid by the due date, and canceled or unpaid if it is still not paid by an additional deadline after that. Note that when a subscription has a status of unpaid, no subsequent invoices will be attempted (invoices will be created, but then immediately automatically closed). After receiving updated payment information from a customer, you may choose to reopen and pay their closed invoices.

    @@ -88,7 +91,7 @@ class Subscription extends ApiResource * schedules instead. Schedules provide the flexibility to model more complex * billing configurations that change over time. * - * @param null|array{add_invoice_items?: (array{discounts?: array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, period?: array{end: array{timestamp?: int, type: string}, start: array{timestamp?: int, type: string}}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], application_fee_percent?: null|float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, backdate_start_date?: int, billing_cycle_anchor?: int, billing_cycle_anchor_config?: array{day_of_month: int, hour?: int, minute?: int, month?: int, second?: int}, billing_mode?: array{flexible?: array{proration_discounts?: string}, type: string}, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, cancel_at?: array|int|string, cancel_at_period_end?: bool, collection_method?: string, currency?: string, customer?: string, customer_account?: string, days_until_due?: int, default_payment_method?: string, default_source?: string, default_tax_rates?: null|string[], description?: string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], invoice_settings?: array{account_tax_ids?: null|string[], issuer?: array{account?: string, type: string}}, items?: (array{billing_thresholds?: null|array{usage_gte: int}, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: null|array, off_session?: bool, on_behalf_of?: null|string, payment_behavior?: string, payment_settings?: array{payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{transaction_type?: string}, verification_method?: string}, bancontact?: null|array{preferred_language?: string}, card?: null|array{mandate_options?: array{amount?: int, amount_type?: string, description?: string}, network?: string, request_three_d_secure?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, type?: string}, funding_type?: string}, konbini?: null|array{}, payto?: null|array{mandate_options?: array{amount?: int, purpose?: string}}, sepa_debit?: null|array{}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[]}, verification_method?: string}}, payment_method_types?: null|string[], save_default_payment_method?: string}, pending_invoice_item_interval?: null|array{interval: string, interval_count?: int}, proration_behavior?: string, transfer_data?: array{amount_percent?: float, destination: string}, trial_end?: array|int|string, trial_from_plan?: bool, trial_period_days?: int, trial_settings?: array{end_behavior: array{missing_payment_method: string}}} $params + * @param null|array{add_invoice_items?: (array{discountable?: bool, discounts?: array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, period?: array{end: array{timestamp?: int, type: string}, start: array{timestamp?: int, type: string}}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], application_fee_percent?: null|float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, backdate_start_date?: int, billing_cycle_anchor?: int, billing_cycle_anchor_config?: array{day_of_month: int, hour?: int, minute?: int, month?: int, second?: int}, billing_mode?: array{flexible?: array{proration_discounts?: string}, type: string}, billing_schedules?: array{applies_to?: array{price?: string, type: string}[], bill_until: array{duration?: array{interval: string, interval_count?: int}, timestamp?: int, type: string}, key?: string}[], billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, cancel_at?: array|int|string, cancel_at_period_end?: bool, collection_method?: string, currency?: string, customer?: string, customer_account?: string, days_until_due?: int, default_payment_method?: string, default_source?: string, default_tax_rates?: null|string[], description?: string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], invoice_settings?: array{account_tax_ids?: null|string[], custom_fields?: null|array{name: string, value: string}[], description?: string, footer?: string, issuer?: array{account?: string, type: string}}, items?: (array{billing_thresholds?: null|array{usage_gte: int}, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: null|array, off_session?: bool, on_behalf_of?: null|string, payment_behavior?: string, payment_settings?: array{payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{transaction_type?: string}, verification_method?: string}, bancontact?: null|array{preferred_language?: string}, card?: null|array{mandate_options?: array{amount?: int, amount_type?: string, description?: string}, network?: string, request_three_d_secure?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, type?: string}, funding_type?: string}, konbini?: null|array{}, payto?: null|array{mandate_options?: array{amount?: int, purpose?: string}}, pix?: null|array{expires_after_seconds?: int, mandate_options?: array{amount?: int, amount_includes_iof?: string, end_date?: string, payment_schedule?: string}}, sepa_debit?: null|array{}, upi?: null|array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[]}, verification_method?: string}}, payment_method_types?: null|string[], save_default_payment_method?: string}, pending_invoice_item_interval?: null|array{interval: string, interval_count?: int}, proration_behavior?: string, transfer_data?: array{amount_percent?: float, destination: string}, trial_end?: array|int|string, trial_from_plan?: bool, trial_period_days?: int, trial_settings?: array{end_behavior: array{missing_payment_method: string}}} $params * @param null|array|string $options * * @return Subscription the created resource @@ -196,7 +199,7 @@ class Subscription extends ApiResource * href="/docs/billing/subscriptions/usage-based">usage-based billing instead. * * @param string $id the ID of the resource to update - * @param null|array{add_invoice_items?: (array{discounts?: array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, period?: array{end: array{timestamp?: int, type: string}, start: array{timestamp?: int, type: string}}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], application_fee_percent?: null|float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, cancel_at?: null|array|int|string, cancel_at_period_end?: bool, cancellation_details?: array{comment?: null|string, feedback?: null|string}, collection_method?: string, days_until_due?: int, default_payment_method?: string, default_source?: null|string, default_tax_rates?: null|string[], description?: null|string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], invoice_settings?: array{account_tax_ids?: null|string[], issuer?: array{account?: string, type: string}}, items?: (array{billing_thresholds?: null|array{usage_gte: int}, clear_usage?: bool, deleted?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], id?: string, metadata?: null|array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: null|array, off_session?: bool, on_behalf_of?: null|string, pause_collection?: null|array{behavior: string, resumes_at?: int}, payment_behavior?: string, payment_settings?: array{payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{transaction_type?: string}, verification_method?: string}, bancontact?: null|array{preferred_language?: string}, card?: null|array{mandate_options?: array{amount?: int, amount_type?: string, description?: string}, network?: string, request_three_d_secure?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, type?: string}, funding_type?: string}, konbini?: null|array{}, payto?: null|array{mandate_options?: array{amount?: int, purpose?: string}}, sepa_debit?: null|array{}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[]}, verification_method?: string}}, payment_method_types?: null|string[], save_default_payment_method?: string}, pending_invoice_item_interval?: null|array{interval: string, interval_count?: int}, proration_behavior?: string, proration_date?: int, transfer_data?: null|array{amount_percent?: float, destination: string}, trial_end?: array|int|string, trial_from_plan?: bool, trial_settings?: array{end_behavior: array{missing_payment_method: string}}} $params + * @param null|array{add_invoice_items?: (array{discountable?: bool, discounts?: array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, period?: array{end: array{timestamp?: int, type: string}, start: array{timestamp?: int, type: string}}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], application_fee_percent?: null|float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_schedules?: null|array{applies_to?: array{price?: string, type: string}[], bill_until?: array{duration?: array{interval: string, interval_count?: int}, timestamp?: int, type: string}, key?: string}[], billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, cancel_at?: null|array|int|string, cancel_at_period_end?: bool, cancellation_details?: array{comment?: null|string, feedback?: null|string}, collection_method?: string, days_until_due?: int, default_payment_method?: string, default_source?: null|string, default_tax_rates?: null|string[], description?: null|string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], invoice_settings?: array{account_tax_ids?: null|string[], custom_fields?: null|array{name: string, value: string}[], description?: null|string, footer?: null|string, issuer?: array{account?: string, type: string}}, items?: (array{billing_thresholds?: null|array{usage_gte: int}, clear_usage?: bool, deleted?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], id?: string, metadata?: null|array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: null|array, off_session?: bool, on_behalf_of?: null|string, pause_collection?: null|array{behavior: string, resumes_at?: int}, payment_behavior?: string, payment_settings?: array{payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{transaction_type?: string}, verification_method?: string}, bancontact?: null|array{preferred_language?: string}, card?: null|array{mandate_options?: array{amount?: int, amount_type?: string, description?: string}, network?: string, request_three_d_secure?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, type?: string}, funding_type?: string}, konbini?: null|array{}, payto?: null|array{mandate_options?: array{amount?: int, purpose?: string}}, pix?: null|array{expires_after_seconds?: int, mandate_options?: array{amount?: int, amount_includes_iof?: string, end_date?: string, payment_schedule?: string}}, sepa_debit?: null|array{}, upi?: null|array{mandate_options?: array{amount?: int, amount_type?: string, description?: string, end_date?: int}}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[]}, verification_method?: string}}, payment_method_types?: null|string[], save_default_payment_method?: string}, pending_invoice_item_interval?: null|array{interval: string, interval_count?: int}, proration_behavior?: string, proration_date?: int, transfer_data?: null|array{amount_percent?: float, destination: string}, trial_end?: array|int|string, trial_from_plan?: bool, trial_settings?: array{end_behavior: array{missing_payment_method: string}}} $params * @param null|array|string $opts * * @return Subscription the updated resource diff --git a/libs/stripe-php/lib/SubscriptionItem.php b/libs/stripe-php/lib/SubscriptionItem.php index 5e6f66a4f..abb64e18d 100644 --- a/libs/stripe-php/lib/SubscriptionItem.php +++ b/libs/stripe-php/lib/SubscriptionItem.php @@ -10,6 +10,7 @@ namespace Stripe; * * @property string $id Unique identifier for the object. * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|int $billed_until The time period the subscription item has been billed for. * @property null|(object{usage_gte: null|int}&StripeObject) $billing_thresholds Define thresholds at which an invoice will be sent, and the related subscription advanced to a new billing period * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. * @property int $current_period_end The end time of this subscription item's current billing period. diff --git a/libs/stripe-php/lib/SubscriptionSchedule.php b/libs/stripe-php/lib/SubscriptionSchedule.php index bee52936b..1971da761 100644 --- a/libs/stripe-php/lib/SubscriptionSchedule.php +++ b/libs/stripe-php/lib/SubscriptionSchedule.php @@ -21,9 +21,9 @@ namespace Stripe; * @property null|string $customer_account ID of the account who owns the subscription schedule. * @property (object{application_fee_percent: null|float, automatic_tax?: (object{disabled_reason: null|string, enabled: bool, liability: null|(object{account?: Account|string, type: string}&StripeObject)}&StripeObject), billing_cycle_anchor: string, billing_thresholds: null|(object{amount_gte: null|int, reset_billing_cycle_anchor: null|bool}&StripeObject), collection_method: null|string, default_payment_method: null|PaymentMethod|string, description: null|string, invoice_settings: (object{account_tax_ids: null|(string|TaxId)[], days_until_due: null|int, issuer: (object{account?: Account|string, type: string}&StripeObject)}&StripeObject), on_behalf_of: null|Account|string, transfer_data: null|(object{amount_percent: null|float, destination: Account|string}&StripeObject)}&StripeObject) $default_settings * @property string $end_behavior Behavior of the subscription schedule and underlying subscription when it ends. Possible values are release or cancel with the default being release. release will end the subscription schedule and keep the underlying subscription running. cancel will end the subscription schedule and cancel the underlying subscription. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. - * @property ((object{add_invoice_items: ((object{discounts: ((object{coupon: null|Coupon|string, discount: null|Discount|string, promotion_code: null|PromotionCode|string}&StripeObject))[], metadata: null|StripeObject, period: (object{end: (object{timestamp?: int, type: string}&StripeObject), start: (object{timestamp?: int, type: string}&StripeObject)}&StripeObject), price: Price|string, quantity: null|int, tax_rates?: null|TaxRate[]}&StripeObject))[], application_fee_percent: null|float, automatic_tax?: (object{disabled_reason: null|string, enabled: bool, liability: null|(object{account?: Account|string, type: string}&StripeObject)}&StripeObject), billing_cycle_anchor: null|string, billing_thresholds: null|(object{amount_gte: null|int, reset_billing_cycle_anchor: null|bool}&StripeObject), collection_method: null|string, currency: string, default_payment_method: null|PaymentMethod|string, default_tax_rates?: null|TaxRate[], description: null|string, discounts: ((object{coupon: null|Coupon|string, discount: null|Discount|string, promotion_code: null|PromotionCode|string}&StripeObject))[], end_date: int, invoice_settings: null|(object{account_tax_ids: null|(string|TaxId)[], days_until_due: null|int, issuer: null|(object{account?: Account|string, type: string}&StripeObject)}&StripeObject), items: ((object{billing_thresholds: null|(object{usage_gte: null|int}&StripeObject), discounts: ((object{coupon: null|Coupon|string, discount: null|Discount|string, promotion_code: null|PromotionCode|string}&StripeObject))[], metadata: null|StripeObject, plan: Plan|string, price: Price|string, quantity?: int, tax_rates?: null|TaxRate[]}&StripeObject))[], metadata: null|StripeObject, on_behalf_of: null|Account|string, proration_behavior: string, start_date: int, transfer_data: null|(object{amount_percent: null|float, destination: Account|string}&StripeObject), trial_end: null|int}&StripeObject))[] $phases Configuration for the subscription schedule's phases. + * @property ((object{add_invoice_items: ((object{discountable: null|bool, discounts: ((object{coupon: null|Coupon|string, discount: null|Discount|string, promotion_code: null|PromotionCode|string}&StripeObject))[], metadata: null|StripeObject, period: (object{end: (object{timestamp?: int, type: string}&StripeObject), start: (object{timestamp?: int, type: string}&StripeObject)}&StripeObject), price: Price|string, quantity: null|int, tax_rates?: null|TaxRate[]}&StripeObject))[], application_fee_percent: null|float, automatic_tax?: (object{disabled_reason: null|string, enabled: bool, liability: null|(object{account?: Account|string, type: string}&StripeObject)}&StripeObject), billing_cycle_anchor: null|string, billing_thresholds: null|(object{amount_gte: null|int, reset_billing_cycle_anchor: null|bool}&StripeObject), collection_method: null|string, currency: string, default_payment_method: null|PaymentMethod|string, default_tax_rates?: null|TaxRate[], description: null|string, discounts: ((object{coupon: null|Coupon|string, discount: null|Discount|string, promotion_code: null|PromotionCode|string}&StripeObject))[], end_date: int, invoice_settings: null|(object{account_tax_ids: null|(string|TaxId)[], days_until_due: null|int, issuer: null|(object{account?: Account|string, type: string}&StripeObject)}&StripeObject), items: ((object{billing_thresholds: null|(object{usage_gte: null|int}&StripeObject), discounts: ((object{coupon: null|Coupon|string, discount: null|Discount|string, promotion_code: null|PromotionCode|string}&StripeObject))[], metadata: null|StripeObject, plan: Plan|string, price: Price|string, quantity?: int, tax_rates?: null|TaxRate[]}&StripeObject))[], metadata: null|StripeObject, on_behalf_of: null|Account|string, proration_behavior: string, start_date: int, transfer_data: null|(object{amount_percent: null|float, destination: Account|string}&StripeObject), trial_end: null|int}&StripeObject))[] $phases Configuration for the subscription schedule's phases. * @property null|int $released_at Time at which the subscription schedule was released. Measured in seconds since the Unix epoch. * @property null|string $released_subscription ID of the subscription once managed by the subscription schedule (if it is released). * @property string $status The present status of the subscription schedule. Possible values are not_started, active, completed, released, and canceled. You can read more about the different states in our behavior guide. @@ -51,7 +51,7 @@ class SubscriptionSchedule extends ApiResource * Creates a new subscription schedule object. Each customer can have up to 500 * active or scheduled subscriptions. * - * @param null|array{billing_mode?: array{flexible?: array{proration_discounts?: string}, type: string}, customer?: string, customer_account?: string, default_settings?: array{application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, collection_method?: string, default_payment_method?: string, description?: null|string, invoice_settings?: array{account_tax_ids?: null|string[], days_until_due?: int, issuer?: array{account?: string, type: string}}, on_behalf_of?: null|string, transfer_data?: null|array{amount_percent?: float, destination: string}}, end_behavior?: string, expand?: string[], from_subscription?: string, metadata?: null|array, phases?: (array{add_invoice_items?: (array{discounts?: array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, period?: array{end: array{timestamp?: int, type: string}, start: array{timestamp?: int, type: string}}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, collection_method?: string, currency?: string, default_payment_method?: string, default_tax_rates?: null|string[], description?: null|string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], duration?: array{interval: string, interval_count?: int}, end_date?: int, invoice_settings?: array{account_tax_ids?: null|string[], days_until_due?: int, issuer?: array{account?: string, type: string}}, items: (array{billing_thresholds?: null|array{usage_gte: int}, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: array, on_behalf_of?: string, proration_behavior?: string, transfer_data?: array{amount_percent?: float, destination: string}, trial?: bool, trial_end?: int})[], start_date?: array|int|string} $params + * @param null|array{billing_mode?: array{flexible?: array{proration_discounts?: string}, type: string}, customer?: string, customer_account?: string, default_settings?: array{application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, collection_method?: string, default_payment_method?: string, description?: null|string, invoice_settings?: array{account_tax_ids?: null|string[], days_until_due?: int, issuer?: array{account?: string, type: string}}, on_behalf_of?: null|string, transfer_data?: null|array{amount_percent?: float, destination: string}}, end_behavior?: string, expand?: string[], from_subscription?: string, metadata?: null|array, phases?: (array{add_invoice_items?: (array{discountable?: bool, discounts?: array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, period?: array{end: array{timestamp?: int, type: string}, start: array{timestamp?: int, type: string}}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, collection_method?: string, currency?: string, default_payment_method?: string, default_tax_rates?: null|string[], description?: null|string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], duration?: array{interval: string, interval_count?: int}, end_date?: int, invoice_settings?: array{account_tax_ids?: null|string[], days_until_due?: int, issuer?: array{account?: string, type: string}}, items: (array{billing_thresholds?: null|array{usage_gte: int}, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: array, on_behalf_of?: string, proration_behavior?: string, transfer_data?: array{amount_percent?: float, destination: string}, trial?: bool, trial_end?: int})[], start_date?: array|int|string} $params * @param null|array|string $options * * @return SubscriptionSchedule the created resource @@ -112,7 +112,7 @@ class SubscriptionSchedule extends ApiResource * Updates an existing subscription schedule. * * @param string $id the ID of the resource to update - * @param null|array{default_settings?: array{application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, collection_method?: string, default_payment_method?: string, description?: null|string, invoice_settings?: array{account_tax_ids?: null|string[], days_until_due?: int, issuer?: array{account?: string, type: string}}, on_behalf_of?: null|string, transfer_data?: null|array{amount_percent?: float, destination: string}}, end_behavior?: string, expand?: string[], metadata?: null|array, phases?: (array{add_invoice_items?: (array{discounts?: array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, period?: array{end: array{timestamp?: int, type: string}, start: array{timestamp?: int, type: string}}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, collection_method?: string, currency?: string, default_payment_method?: string, default_tax_rates?: null|string[], description?: null|string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], duration?: array{interval: string, interval_count?: int}, end_date?: array|int|string, invoice_settings?: array{account_tax_ids?: null|string[], days_until_due?: int, issuer?: array{account?: string, type: string}}, items: (array{billing_thresholds?: null|array{usage_gte: int}, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: array, on_behalf_of?: string, proration_behavior?: string, start_date?: array|int|string, transfer_data?: array{amount_percent?: float, destination: string}, trial?: bool, trial_end?: array|int|string})[], proration_behavior?: string} $params + * @param null|array{default_settings?: array{application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, collection_method?: string, default_payment_method?: string, description?: null|string, invoice_settings?: array{account_tax_ids?: null|string[], days_until_due?: int, issuer?: array{account?: string, type: string}}, on_behalf_of?: null|string, transfer_data?: null|array{amount_percent?: float, destination: string}}, end_behavior?: string, expand?: string[], metadata?: null|array, phases?: (array{add_invoice_items?: (array{discountable?: bool, discounts?: array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, period?: array{end: array{timestamp?: int, type: string}, start: array{timestamp?: int, type: string}}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, collection_method?: string, currency?: string, default_payment_method?: string, default_tax_rates?: null|string[], description?: null|string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], duration?: array{interval: string, interval_count?: int}, end_date?: array|int|string, invoice_settings?: array{account_tax_ids?: null|string[], days_until_due?: int, issuer?: array{account?: string, type: string}}, items: (array{billing_thresholds?: null|array{usage_gte: int}, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: array, on_behalf_of?: string, proration_behavior?: string, start_date?: array|int|string, transfer_data?: array{amount_percent?: float, destination: string}, trial?: bool, trial_end?: array|int|string})[], proration_behavior?: string} $params * @param null|array|string $opts * * @return SubscriptionSchedule the updated resource diff --git a/libs/stripe-php/lib/Tax/Calculation.php b/libs/stripe-php/lib/Tax/Calculation.php index 7218d9d55..822a28bcc 100644 --- a/libs/stripe-php/lib/Tax/Calculation.php +++ b/libs/stripe-php/lib/Tax/Calculation.php @@ -11,19 +11,19 @@ namespace Stripe\Tax; * * @property null|string $id Unique identifier for the calculation. * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $amount_total Total amount after taxes in the smallest currency unit. + * @property int $amount_total Total amount after taxes in the smallest currency unit. * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. * @property null|string $customer The ID of an existing Customer used for the resource. * @property (object{address: null|(object{city: null|string, country: string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject), address_source: null|string, ip_address: null|string, tax_ids: (object{type: string, value: string}&\Stripe\StripeObject)[], taxability_override: string}&\Stripe\StripeObject) $customer_details * @property null|int $expires_at Timestamp of date at which the tax calculation will expire. * @property null|\Stripe\Collection $line_items The list of items the customer is purchasing. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|(object{address: (object{city: null|string, country: string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $ship_from_details The details of the ship from location, such as the address. * @property null|(object{amount: int, amount_tax: int, shipping_rate?: string, tax_behavior: string, tax_breakdown?: ((object{amount: int, jurisdiction: (object{country: string, display_name: string, level: string, state: null|string}&\Stripe\StripeObject), sourcing: string, tax_rate_details: null|(object{display_name: string, percentage_decimal: string, tax_type: string}&\Stripe\StripeObject), taxability_reason: string, taxable_amount: int}&\Stripe\StripeObject))[], tax_code: string}&\Stripe\StripeObject) $shipping_cost The shipping cost details for the calculation. * @property int $tax_amount_exclusive The amount of tax to be collected on top of the line item prices. * @property int $tax_amount_inclusive The amount of tax already included in the line item prices. * @property ((object{amount: int, inclusive: bool, tax_rate_details: (object{country: null|string, flat_amount: null|(object{amount: int, currency: string}&\Stripe\StripeObject), percentage_decimal: string, rate_type: null|string, state: null|string, tax_type: null|string}&\Stripe\StripeObject), taxability_reason: string, taxable_amount: int}&\Stripe\StripeObject))[] $tax_breakdown Breakdown of individual tax amounts that add up to the total. - * @property int $tax_date Timestamp of date at which the tax rules and rates in effect applies for the calculation. + * @property int $tax_date The calculation uses the tax rules and rates that are in effect at this timestamp. You can use a date up to 31 days in the past or up to 31 days in the future. If you use a future date, Stripe doesn't guarantee that the expected tax rules and rate being used match the actual rules and rate that will be in effect on that date. We deploy tax changes before their effective date, but not within a fixed window. */ class Calculation extends \Stripe\ApiResource { diff --git a/libs/stripe-php/lib/Tax/CalculationLineItem.php b/libs/stripe-php/lib/Tax/CalculationLineItem.php index a84e415a7..c3f4eb1c1 100644 --- a/libs/stripe-php/lib/Tax/CalculationLineItem.php +++ b/libs/stripe-php/lib/Tax/CalculationLineItem.php @@ -7,9 +7,9 @@ namespace Stripe\Tax; /** * @property string $id Unique identifier for the object. * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $amount The line item amount in the smallest currency unit. If tax_behavior=inclusive, then this amount includes taxes. Otherwise, taxes were calculated on top of this amount. - * @property int $amount_tax The amount of tax calculated for this line item, in the smallest currency unit. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property int $amount The line item amount in the smallest currency unit. If tax_behavior=inclusive, then this amount includes taxes. Otherwise, taxes were calculated on top of this amount. + * @property int $amount_tax The amount of tax calculated for this line item, in the smallest currency unit. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|string $product The ID of an existing Product. * @property int $quantity The number of units of the item being purchased. For reversals, this is the quantity reversed. diff --git a/libs/stripe-php/lib/Tax/Registration.php b/libs/stripe-php/lib/Tax/Registration.php index 234048b08..87d5a41bc 100644 --- a/libs/stripe-php/lib/Tax/Registration.php +++ b/libs/stripe-php/lib/Tax/Registration.php @@ -18,7 +18,7 @@ namespace Stripe\Tax; * @property (object{ae?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), al?: (object{type: string}&\Stripe\StripeObject), am?: (object{type: string}&\Stripe\StripeObject), ao?: (object{type: string}&\Stripe\StripeObject), at?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), au?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), aw?: (object{type: string}&\Stripe\StripeObject), az?: (object{type: string}&\Stripe\StripeObject), ba?: (object{type: string}&\Stripe\StripeObject), bb?: (object{type: string}&\Stripe\StripeObject), bd?: (object{type: string}&\Stripe\StripeObject), be?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), bf?: (object{type: string}&\Stripe\StripeObject), bg?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), bh?: (object{type: string}&\Stripe\StripeObject), bj?: (object{type: string}&\Stripe\StripeObject), bs?: (object{type: string}&\Stripe\StripeObject), by?: (object{type: string}&\Stripe\StripeObject), ca?: (object{province_standard?: (object{province: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), cd?: (object{type: string}&\Stripe\StripeObject), ch?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), cl?: (object{type: string}&\Stripe\StripeObject), cm?: (object{type: string}&\Stripe\StripeObject), co?: (object{type: string}&\Stripe\StripeObject), cr?: (object{type: string}&\Stripe\StripeObject), cv?: (object{type: string}&\Stripe\StripeObject), cy?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), cz?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), de?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), dk?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), ec?: (object{type: string}&\Stripe\StripeObject), ee?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), eg?: (object{type: string}&\Stripe\StripeObject), es?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), et?: (object{type: string}&\Stripe\StripeObject), fi?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), fr?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), gb?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), ge?: (object{type: string}&\Stripe\StripeObject), gn?: (object{type: string}&\Stripe\StripeObject), gr?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), hr?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), hu?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), id?: (object{type: string}&\Stripe\StripeObject), ie?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), in?: (object{type: string}&\Stripe\StripeObject), is?: (object{type: string}&\Stripe\StripeObject), it?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), jp?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), ke?: (object{type: string}&\Stripe\StripeObject), kg?: (object{type: string}&\Stripe\StripeObject), kh?: (object{type: string}&\Stripe\StripeObject), kr?: (object{type: string}&\Stripe\StripeObject), kz?: (object{type: string}&\Stripe\StripeObject), la?: (object{type: string}&\Stripe\StripeObject), lk?: (object{type: string}&\Stripe\StripeObject), lt?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), lu?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), lv?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), ma?: (object{type: string}&\Stripe\StripeObject), md?: (object{type: string}&\Stripe\StripeObject), me?: (object{type: string}&\Stripe\StripeObject), mk?: (object{type: string}&\Stripe\StripeObject), mr?: (object{type: string}&\Stripe\StripeObject), mt?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), mx?: (object{type: string}&\Stripe\StripeObject), my?: (object{type: string}&\Stripe\StripeObject), ng?: (object{type: string}&\Stripe\StripeObject), nl?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), no?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), np?: (object{type: string}&\Stripe\StripeObject), nz?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), om?: (object{type: string}&\Stripe\StripeObject), pe?: (object{type: string}&\Stripe\StripeObject), ph?: (object{type: string}&\Stripe\StripeObject), pl?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), pt?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), ro?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), rs?: (object{type: string}&\Stripe\StripeObject), ru?: (object{type: string}&\Stripe\StripeObject), sa?: (object{type: string}&\Stripe\StripeObject), se?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), sg?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), si?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), sk?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), sn?: (object{type: string}&\Stripe\StripeObject), sr?: (object{type: string}&\Stripe\StripeObject), th?: (object{type: string}&\Stripe\StripeObject), tj?: (object{type: string}&\Stripe\StripeObject), tr?: (object{type: string}&\Stripe\StripeObject), tw?: (object{type: string}&\Stripe\StripeObject), tz?: (object{type: string}&\Stripe\StripeObject), ua?: (object{type: string}&\Stripe\StripeObject), ug?: (object{type: string}&\Stripe\StripeObject), us?: (object{local_amusement_tax?: (object{jurisdiction: string}&\Stripe\StripeObject), local_lease_tax?: (object{jurisdiction: string}&\Stripe\StripeObject), state: string, state_sales_tax?: (object{elections?: (object{jurisdiction?: string, type: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), uy?: (object{type: string}&\Stripe\StripeObject), uz?: (object{type: string}&\Stripe\StripeObject), vn?: (object{type: string}&\Stripe\StripeObject), za?: (object{type: string}&\Stripe\StripeObject), zm?: (object{type: string}&\Stripe\StripeObject), zw?: (object{type: string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $country_options * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. * @property null|int $expires_at If set, the registration stops being active at this time. If not set, the registration will be active indefinitely. Measured in seconds since the Unix epoch. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property string $status The status of the registration. This field is present for convenience and can be deduced from active_from and expires_at. */ class Registration extends \Stripe\ApiResource diff --git a/libs/stripe-php/lib/Tax/Settings.php b/libs/stripe-php/lib/Tax/Settings.php index 321e5d3ae..32293b435 100644 --- a/libs/stripe-php/lib/Tax/Settings.php +++ b/libs/stripe-php/lib/Tax/Settings.php @@ -12,7 +12,7 @@ namespace Stripe\Tax; * @property string $object String representing the object's type. Objects of the same type share the same value. * @property (object{provider: string, tax_behavior: null|string, tax_code: null|string}&\Stripe\StripeObject) $defaults * @property null|(object{address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $head_office The place where your business is located. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property string $status The status of the Tax Settings. * @property (object{active?: (object{}&\Stripe\StripeObject), pending?: (object{missing_fields: null|string[]}&\Stripe\StripeObject)}&\Stripe\StripeObject) $status_details */ diff --git a/libs/stripe-php/lib/Tax/Transaction.php b/libs/stripe-php/lib/Tax/Transaction.php index e851a9523..93fb83feb 100644 --- a/libs/stripe-php/lib/Tax/Transaction.php +++ b/libs/stripe-php/lib/Tax/Transaction.php @@ -16,14 +16,14 @@ namespace Stripe\Tax; * @property null|string $customer The ID of an existing Customer used for the resource. * @property (object{address: null|(object{city: null|string, country: string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject), address_source: null|string, ip_address: null|string, tax_ids: (object{type: string, value: string}&\Stripe\StripeObject)[], taxability_override: string}&\Stripe\StripeObject) $customer_details * @property null|\Stripe\Collection $line_items The tax collected or refunded, by line item. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property int $posted_at The Unix timestamp representing when the tax liability is assumed or reduced. * @property string $reference A custom unique identifier, such as 'myOrder_123'. * @property null|(object{original_transaction: null|string}&\Stripe\StripeObject) $reversal If type=reversal, contains information about what was reversed. * @property null|(object{address: (object{city: null|string, country: string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $ship_from_details The details of the ship from location, such as the address. * @property null|(object{amount: int, amount_tax: int, shipping_rate?: string, tax_behavior: string, tax_breakdown?: ((object{amount: int, jurisdiction: (object{country: string, display_name: string, level: string, state: null|string}&\Stripe\StripeObject), sourcing: string, tax_rate_details: null|(object{display_name: string, percentage_decimal: string, tax_type: string}&\Stripe\StripeObject), taxability_reason: string, taxable_amount: int}&\Stripe\StripeObject))[], tax_code: string}&\Stripe\StripeObject) $shipping_cost The shipping cost details for the transaction. - * @property int $tax_date Timestamp of date at which the tax rules and rates in effect applies for the calculation. + * @property int $tax_date The calculation uses the tax rules and rates that are in effect at this timestamp. You can use a date up to 31 days in the past or up to 31 days in the future. If you use a future date, Stripe doesn't guarantee that the expected tax rules and rate being used match the actual rules and rate that will be in effect on that date. We deploy tax changes before their effective date, but not within a fixed window. * @property string $type If reversal, this transaction reverses an earlier transaction. */ class Transaction extends \Stripe\ApiResource diff --git a/libs/stripe-php/lib/Tax/TransactionLineItem.php b/libs/stripe-php/lib/Tax/TransactionLineItem.php index fae64c44a..2ed489361 100644 --- a/libs/stripe-php/lib/Tax/TransactionLineItem.php +++ b/libs/stripe-php/lib/Tax/TransactionLineItem.php @@ -7,9 +7,9 @@ namespace Stripe\Tax; /** * @property string $id Unique identifier for the object. * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property int $amount The line item amount in the smallest currency unit. If tax_behavior=inclusive, then this amount includes taxes. Otherwise, taxes were calculated on top of this amount. - * @property int $amount_tax The amount of tax calculated for this line item, in the smallest currency unit. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property int $amount The line item amount in the smallest currency unit. If tax_behavior=inclusive, then this amount includes taxes. Otherwise, taxes were calculated on top of this amount. + * @property int $amount_tax The amount of tax calculated for this line item, in the smallest currency unit. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|string $product The ID of an existing Product. * @property int $quantity The number of units of the item being purchased. For reversals, this is the quantity reversed. diff --git a/libs/stripe-php/lib/TaxId.php b/libs/stripe-php/lib/TaxId.php index c3caa0604..a0a6cd6ae 100644 --- a/libs/stripe-php/lib/TaxId.php +++ b/libs/stripe-php/lib/TaxId.php @@ -16,9 +16,9 @@ namespace Stripe; * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. * @property null|Customer|string $customer ID of the customer. * @property null|string $customer_account ID of the Account representing the customer. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|(object{account?: Account|string, application?: Application|string, customer?: Customer|string, customer_account: null|string, type: string}&StripeObject) $owner The account or customer the tax ID belongs to. - * @property string $type Type of the tax ID, one of ad_nrt, ae_trn, al_tin, am_tin, ao_tin, ar_cuit, au_abn, au_arn, aw_tin, az_tin, ba_tin, bb_tin, bd_bin, bf_ifu, bg_uic, bh_vat, bj_ifu, bo_tin, br_cnpj, br_cpf, bs_tin, by_tin, ca_bn, ca_gst_hst, ca_pst_bc, ca_pst_mb, ca_pst_sk, ca_qst, cd_nif, ch_uid, ch_vat, cl_tin, cm_niu, cn_tin, co_nit, cr_tin, cv_nif, de_stn, do_rcn, ec_ruc, eg_tin, es_cif, et_tin, eu_oss_vat, eu_vat, gb_vat, ge_vat, gn_nif, hk_br, hr_oib, hu_tin, id_npwp, il_vat, in_gst, is_vat, jp_cn, jp_rn, jp_trn, ke_pin, kg_tin, kh_tin, kr_brn, kz_bin, la_tin, li_uid, li_vat, lk_vat, ma_vat, md_vat, me_pib, mk_vat, mr_nif, mx_rfc, my_frp, my_itn, my_sst, ng_tin, no_vat, no_voec, np_pan, nz_gst, om_vat, pe_ruc, ph_tin, pl_nip, ro_tin, rs_pib, ru_inn, ru_kpp, sa_vat, sg_gst, sg_uen, si_tin, sn_ninea, sr_fin, sv_nit, th_vat, tj_tin, tr_tin, tw_vat, tz_vat, ua_vat, ug_tin, us_ein, uy_ruc, uz_tin, uz_vat, ve_rif, vn_tin, za_vat, zm_tin, or zw_tin. Note that some legacy tax IDs have type unknown + * @property string $type Type of the tax ID, one of ad_nrt, ae_trn, al_tin, am_tin, ao_tin, ar_cuit, au_abn, au_arn, aw_tin, az_tin, ba_tin, bb_tin, bd_bin, bf_ifu, bg_uic, bh_vat, bj_ifu, bo_tin, br_cnpj, br_cpf, bs_tin, by_tin, ca_bn, ca_gst_hst, ca_pst_bc, ca_pst_mb, ca_pst_sk, ca_qst, cd_nif, ch_uid, ch_vat, cl_tin, cm_niu, cn_tin, co_nit, cr_tin, cv_nif, de_stn, do_rcn, ec_ruc, eg_tin, es_cif, et_tin, eu_oss_vat, eu_vat, fo_vat, gb_vat, ge_vat, gi_tin, gn_nif, hk_br, hr_oib, hu_tin, id_npwp, il_vat, in_gst, is_vat, it_cf, jp_cn, jp_rn, jp_trn, ke_pin, kg_tin, kh_tin, kr_brn, kz_bin, la_tin, li_uid, li_vat, lk_vat, ma_vat, md_vat, me_pib, mk_vat, mr_nif, mx_rfc, my_frp, my_itn, my_sst, ng_tin, no_vat, no_voec, np_pan, nz_gst, om_vat, pe_ruc, ph_tin, pl_nip, py_ruc, ro_tin, rs_pib, ru_inn, ru_kpp, sa_vat, sg_gst, sg_uen, si_tin, sn_ninea, sr_fin, sv_nit, th_vat, tj_tin, tr_tin, tw_vat, tz_vat, ua_vat, ug_tin, us_ein, uy_ruc, uz_tin, uz_vat, ve_rif, vn_tin, za_vat, zm_tin, or zw_tin. Note that some legacy tax IDs have type unknown * @property string $value Value of the tax ID. * @property null|(object{status: string, verified_address: null|string, verified_name: null|string}&StripeObject) $verification Tax ID verification information. */ @@ -71,8 +71,10 @@ class TaxId extends ApiResource const TYPE_ET_TIN = 'et_tin'; const TYPE_EU_OSS_VAT = 'eu_oss_vat'; const TYPE_EU_VAT = 'eu_vat'; + const TYPE_FO_VAT = 'fo_vat'; const TYPE_GB_VAT = 'gb_vat'; const TYPE_GE_VAT = 'ge_vat'; + const TYPE_GI_TIN = 'gi_tin'; const TYPE_GN_NIF = 'gn_nif'; const TYPE_HK_BR = 'hk_br'; const TYPE_HR_OIB = 'hr_oib'; @@ -81,6 +83,7 @@ class TaxId extends ApiResource const TYPE_IL_VAT = 'il_vat'; const TYPE_IN_GST = 'in_gst'; const TYPE_IS_VAT = 'is_vat'; + const TYPE_IT_CF = 'it_cf'; const TYPE_JP_CN = 'jp_cn'; const TYPE_JP_RN = 'jp_rn'; const TYPE_JP_TRN = 'jp_trn'; @@ -111,6 +114,7 @@ class TaxId extends ApiResource const TYPE_PE_RUC = 'pe_ruc'; const TYPE_PH_TIN = 'ph_tin'; const TYPE_PL_NIP = 'pl_nip'; + const TYPE_PY_RUC = 'py_ruc'; const TYPE_RO_TIN = 'ro_tin'; const TYPE_RS_PIB = 'rs_pib'; const TYPE_RU_INN = 'ru_inn'; diff --git a/libs/stripe-php/lib/TaxRate.php b/libs/stripe-php/lib/TaxRate.php index 148745a71..e0eb5bdfb 100644 --- a/libs/stripe-php/lib/TaxRate.php +++ b/libs/stripe-php/lib/TaxRate.php @@ -21,7 +21,7 @@ namespace Stripe; * @property bool $inclusive This specifies if the tax rate is inclusive or exclusive. * @property null|string $jurisdiction The jurisdiction for the tax rate. You can use this label field for tax reporting purposes. It also appears on your customer’s invoice. * @property null|string $jurisdiction_level The level of the jurisdiction that imposes this tax rate. Will be null for manually defined tax rates. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property float $percentage Tax rate percentage out of 100. For tax calculations with automatic_tax[enabled]=true, this percentage includes the statutory tax rate of non-taxable jurisdictions. * @property null|string $rate_type Indicates the type of tax rate applied to the taxable amount. This value can be null when no tax applies to the location. This field is only present for TaxRates created by Stripe Tax. diff --git a/libs/stripe-php/lib/TelemetryId.php b/libs/stripe-php/lib/TelemetryId.php new file mode 100644 index 000000000..f6a1b90cd --- /dev/null +++ b/libs/stripe-php/lib/TelemetryId.php @@ -0,0 +1,105 @@ +true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|string $name String indicating the name of the Configuration object, set by the user * @property null|(object{enabled: null|bool}&\Stripe\StripeObject) $offline * @property null|(object{end_hour: int, start_hour: int}&\Stripe\StripeObject) $reboot_window * @property null|(object{splashscreen?: string|\Stripe\File}&\Stripe\StripeObject) $stripe_s700 * @property null|(object{splashscreen?: string|\Stripe\File}&\Stripe\StripeObject) $stripe_s710 * @property null|(object{aed?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), aud?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), cad?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), chf?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), czk?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), dkk?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), eur?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), gbp?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), gip?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), hkd?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), huf?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), jpy?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), mxn?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), myr?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), nok?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), nzd?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), pln?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), ron?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), sek?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), sgd?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), usd?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject)}&\Stripe\StripeObject) $tipping + * @property null|(object{splashscreen?: string|\Stripe\File}&\Stripe\StripeObject) $verifone_m425 * @property null|(object{splashscreen?: string|\Stripe\File}&\Stripe\StripeObject) $verifone_p400 + * @property null|(object{splashscreen?: string|\Stripe\File}&\Stripe\StripeObject) $verifone_p630 + * @property null|(object{splashscreen?: string|\Stripe\File}&\Stripe\StripeObject) $verifone_ux700 + * @property null|(object{splashscreen?: string|\Stripe\File}&\Stripe\StripeObject) $verifone_v660p * @property null|(object{enterprise_eap_peap?: (object{ca_certificate_file?: string, password: string, ssid: string, username: string}&\Stripe\StripeObject), enterprise_eap_tls?: (object{ca_certificate_file?: string, client_certificate_file: string, private_key_file: string, private_key_file_password?: string, ssid: string}&\Stripe\StripeObject), personal_psk?: (object{password: string, ssid: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject) $wifi */ class Configuration extends \Stripe\ApiResource @@ -33,7 +37,7 @@ class Configuration extends \Stripe\ApiResource /** * Creates a new Configuration object. * - * @param null|array{bbpos_wisepad3?: array{splashscreen?: null|string}, bbpos_wisepos_e?: array{splashscreen?: null|string}, cellular?: null|array{enabled: bool}, expand?: string[], name?: string, offline?: null|array{enabled: bool}, reboot_window?: array{end_hour: int, start_hour: int}, stripe_s700?: array{splashscreen?: null|string}, stripe_s710?: array{splashscreen?: null|string}, tipping?: null|array{aed?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, aud?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, cad?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, chf?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, czk?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, dkk?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, eur?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, gbp?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, gip?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, hkd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, huf?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, jpy?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, mxn?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, myr?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, nok?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, nzd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, pln?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, ron?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, sek?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, sgd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, usd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}}, verifone_p400?: array{splashscreen?: null|string}, wifi?: null|array{enterprise_eap_peap?: array{ca_certificate_file?: string, password: string, ssid: string, username: string}, enterprise_eap_tls?: array{ca_certificate_file?: string, client_certificate_file: string, private_key_file: string, private_key_file_password?: string, ssid: string}, personal_psk?: array{password: string, ssid: string}, type: string}} $params + * @param null|array{bbpos_wisepad3?: array{splashscreen?: null|string}, bbpos_wisepos_e?: array{splashscreen?: null|string}, cellular?: null|array{enabled: bool}, expand?: string[], name?: string, offline?: null|array{enabled: bool}, reboot_window?: array{end_hour: int, start_hour: int}, stripe_s700?: array{splashscreen?: null|string}, stripe_s710?: array{splashscreen?: null|string}, tipping?: null|array{aed?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, aud?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, cad?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, chf?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, czk?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, dkk?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, eur?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, gbp?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, gip?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, hkd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, huf?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, jpy?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, mxn?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, myr?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, nok?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, nzd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, pln?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, ron?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, sek?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, sgd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, usd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}}, verifone_m425?: array{splashscreen?: null|string}, verifone_p400?: array{splashscreen?: null|string}, verifone_p630?: array{splashscreen?: null|string}, verifone_ux700?: array{splashscreen?: null|string}, verifone_v660p?: array{splashscreen?: null|string}, wifi?: null|array{enterprise_eap_peap?: array{ca_certificate_file?: string, password: string, ssid: string, username: string}, enterprise_eap_tls?: array{ca_certificate_file?: string, client_certificate_file: string, private_key_file: string, private_key_file_password?: string, ssid: string}, personal_psk?: array{password: string, ssid: string}, type: string}} $params * @param null|array|string $options * * @return Configuration the created resource @@ -113,7 +117,7 @@ class Configuration extends \Stripe\ApiResource * Updates a new Configuration object. * * @param string $id the ID of the resource to update - * @param null|array{bbpos_wisepad3?: null|array{splashscreen?: null|string}, bbpos_wisepos_e?: null|array{splashscreen?: null|string}, cellular?: null|array{enabled: bool}, expand?: string[], name?: string, offline?: null|array{enabled: bool}, reboot_window?: null|array{end_hour: int, start_hour: int}, stripe_s700?: null|array{splashscreen?: null|string}, stripe_s710?: null|array{splashscreen?: null|string}, tipping?: null|array{aed?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, aud?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, cad?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, chf?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, czk?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, dkk?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, eur?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, gbp?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, gip?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, hkd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, huf?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, jpy?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, mxn?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, myr?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, nok?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, nzd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, pln?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, ron?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, sek?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, sgd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, usd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}}, verifone_p400?: null|array{splashscreen?: null|string}, wifi?: null|array{enterprise_eap_peap?: array{ca_certificate_file?: string, password: string, ssid: string, username: string}, enterprise_eap_tls?: array{ca_certificate_file?: string, client_certificate_file: string, private_key_file: string, private_key_file_password?: string, ssid: string}, personal_psk?: array{password: string, ssid: string}, type: string}} $params + * @param null|array{bbpos_wisepad3?: null|array{splashscreen?: null|string}, bbpos_wisepos_e?: null|array{splashscreen?: null|string}, cellular?: null|array{enabled: bool}, expand?: string[], name?: string, offline?: null|array{enabled: bool}, reboot_window?: null|array{end_hour: int, start_hour: int}, stripe_s700?: null|array{splashscreen?: null|string}, stripe_s710?: null|array{splashscreen?: null|string}, tipping?: null|array{aed?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, aud?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, cad?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, chf?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, czk?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, dkk?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, eur?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, gbp?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, gip?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, hkd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, huf?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, jpy?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, mxn?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, myr?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, nok?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, nzd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, pln?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, ron?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, sek?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, sgd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, usd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}}, verifone_m425?: null|array{splashscreen?: null|string}, verifone_p400?: null|array{splashscreen?: null|string}, verifone_p630?: null|array{splashscreen?: null|string}, verifone_ux700?: null|array{splashscreen?: null|string}, verifone_v660p?: null|array{splashscreen?: null|string}, wifi?: null|array{enterprise_eap_peap?: array{ca_certificate_file?: string, password: string, ssid: string, username: string}, enterprise_eap_tls?: array{ca_certificate_file?: string, client_certificate_file: string, private_key_file: string, private_key_file_password?: string, ssid: string}, personal_psk?: array{password: string, ssid: string}, type: string}} $params * @param null|array|string $opts * * @return Configuration the updated resource diff --git a/libs/stripe-php/lib/Terminal/Location.php b/libs/stripe-php/lib/Terminal/Location.php index ed55213bb..885d710ae 100644 --- a/libs/stripe-php/lib/Terminal/Location.php +++ b/libs/stripe-php/lib/Terminal/Location.php @@ -18,7 +18,7 @@ namespace Stripe\Terminal; * @property string $display_name The display name of the location. * @property null|string $display_name_kana The Kana variation of the display name of the location. * @property null|string $display_name_kanji The Kanji variation of the display name of the location. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|string $phone The phone number of the location. */ diff --git a/libs/stripe-php/lib/Terminal/Reader.php b/libs/stripe-php/lib/Terminal/Reader.php index 8bf16c185..9b237c4d7 100644 --- a/libs/stripe-php/lib/Terminal/Reader.php +++ b/libs/stripe-php/lib/Terminal/Reader.php @@ -11,13 +11,13 @@ namespace Stripe\Terminal; * * @property string $id Unique identifier for the object. * @property string $object String representing the object's type. Objects of the same type share the same value. - * @property null|(object{collect_inputs?: (object{inputs: ((object{custom_text: null|(object{description: null|string, skip_button: null|string, submit_button: null|string, title: null|string}&\Stripe\StripeObject), email?: (object{value: null|string}&\Stripe\StripeObject), numeric?: (object{value: null|string}&\Stripe\StripeObject), phone?: (object{value: null|string}&\Stripe\StripeObject), required: null|bool, selection?: (object{choices: ((object{id: null|string, style: null|string, text: string}&\Stripe\StripeObject))[], id: null|string, text: null|string}&\Stripe\StripeObject), signature?: (object{value: null|string}&\Stripe\StripeObject), skipped?: bool, text?: (object{value: null|string}&\Stripe\StripeObject), toggles: null|((object{default_value: null|string, description: null|string, title: null|string, value: null|string}&\Stripe\StripeObject))[], type: string}&\Stripe\StripeObject))[], metadata: null|\Stripe\StripeObject}&\Stripe\StripeObject), collect_payment_method?: (object{collect_config?: (object{enable_customer_cancellation?: bool, skip_tipping?: bool, tipping?: (object{amount_eligible?: int}&\Stripe\StripeObject)}&\Stripe\StripeObject), payment_intent: string|\Stripe\PaymentIntent, payment_method?: \Stripe\PaymentMethod}&\Stripe\StripeObject), confirm_payment_intent?: (object{confirm_config?: (object{return_url?: string}&\Stripe\StripeObject), payment_intent: string|\Stripe\PaymentIntent}&\Stripe\StripeObject), failure_code: null|string, failure_message: null|string, process_payment_intent?: (object{payment_intent: string|\Stripe\PaymentIntent, process_config?: (object{enable_customer_cancellation?: bool, return_url?: string, skip_tipping?: bool, tipping?: (object{amount_eligible?: int}&\Stripe\StripeObject)}&\Stripe\StripeObject)}&\Stripe\StripeObject), process_setup_intent?: (object{generated_card?: string, process_config?: (object{enable_customer_cancellation?: bool}&\Stripe\StripeObject), setup_intent: string|\Stripe\SetupIntent}&\Stripe\StripeObject), refund_payment?: (object{amount?: int, charge?: string|\Stripe\Charge, metadata?: \Stripe\StripeObject, payment_intent?: string|\Stripe\PaymentIntent, reason?: string, refund?: string|\Stripe\Refund, refund_application_fee?: bool, refund_payment_config?: (object{enable_customer_cancellation?: bool}&\Stripe\StripeObject), reverse_transfer?: bool}&\Stripe\StripeObject), set_reader_display?: (object{cart: null|(object{currency: string, line_items: (object{amount: int, description: string, quantity: int}&\Stripe\StripeObject)[], tax: null|int, total: int}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), status: string, type: string}&\Stripe\StripeObject) $action The most recent action performed by the reader. + * @property null|(object{api_error: null|(object{advice_code?: string, charge?: string, code?: string, decline_code?: string, doc_url?: string, message?: string, network_advice_code?: string, network_decline_code?: string, param?: string, payment_intent?: \Stripe\PaymentIntent, payment_method?: \Stripe\PaymentMethod, payment_method_type?: string, request_log_url?: string, setup_intent?: \Stripe\SetupIntent, source?: \Stripe\Account|\Stripe\BankAccount|\Stripe\Card|\Stripe\Source, type: string}&\Stripe\StripeObject), collect_inputs?: (object{inputs: ((object{custom_text: null|(object{description: null|string, skip_button: null|string, submit_button: null|string, title: null|string}&\Stripe\StripeObject), email?: (object{value: null|string}&\Stripe\StripeObject), numeric?: (object{value: null|string}&\Stripe\StripeObject), phone?: (object{value: null|string}&\Stripe\StripeObject), required: null|bool, selection?: (object{choices: ((object{id: null|string, style: null|string, text: string}&\Stripe\StripeObject))[], id: null|string, text: null|string}&\Stripe\StripeObject), signature?: (object{value: null|string}&\Stripe\StripeObject), skipped?: bool, text?: (object{value: null|string}&\Stripe\StripeObject), toggles: null|((object{default_value: null|string, description: null|string, title: null|string, value: null|string}&\Stripe\StripeObject))[], type: string}&\Stripe\StripeObject))[], metadata: null|\Stripe\StripeObject}&\Stripe\StripeObject), collect_payment_method?: (object{collect_config?: (object{enable_customer_cancellation?: bool, skip_tipping?: bool, tipping?: (object{amount_eligible?: int}&\Stripe\StripeObject)}&\Stripe\StripeObject), payment_intent: string|\Stripe\PaymentIntent, payment_method?: \Stripe\PaymentMethod}&\Stripe\StripeObject), confirm_payment_intent?: (object{confirm_config?: (object{return_url?: string}&\Stripe\StripeObject), payment_intent: string|\Stripe\PaymentIntent}&\Stripe\StripeObject), failure_code: null|string, failure_message: null|string, print_content?: (object{image?: (object{created_at: int, filename: string, size: int, type: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), process_payment_intent?: (object{payment_intent: string|\Stripe\PaymentIntent, process_config?: (object{enable_customer_cancellation?: bool, return_url?: string, skip_tipping?: bool, tipping?: (object{amount_eligible?: int}&\Stripe\StripeObject)}&\Stripe\StripeObject)}&\Stripe\StripeObject), process_setup_intent?: (object{generated_card?: string, process_config?: (object{enable_customer_cancellation?: bool}&\Stripe\StripeObject), setup_intent: string|\Stripe\SetupIntent}&\Stripe\StripeObject), refund_payment?: (object{amount?: int, charge?: string|\Stripe\Charge, metadata?: \Stripe\StripeObject, payment_intent?: string|\Stripe\PaymentIntent, reason?: string, refund?: string|\Stripe\Refund, refund_application_fee?: bool, refund_payment_config?: (object{enable_customer_cancellation?: bool}&\Stripe\StripeObject), reverse_transfer?: bool}&\Stripe\StripeObject), set_reader_display?: (object{cart: null|(object{currency: string, line_items: (object{amount: int, description: string, quantity: int}&\Stripe\StripeObject)[], tax: null|int, total: int}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), status: string, type: string}&\Stripe\StripeObject) $action The most recent action performed by the reader. * @property null|string $device_sw_version The current software version of the reader. * @property string $device_type Device type of the reader. * @property null|string $ip_address The local IP address of the reader. * @property string $label Custom label given to the reader for easier identification. * @property null|int $last_seen_at The last time this reader reported to Stripe backend. Timestamp is measured in milliseconds since the Unix epoch. Unlike most other Stripe timestamp fields which use seconds, this field uses milliseconds. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|Location|string $location The location identifier of the reader. * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property string $serial_number Serial number of the reader. @@ -35,11 +35,19 @@ class Reader extends \Stripe\ApiResource const DEVICE_TYPE_MOBILE_PHONE_READER = 'mobile_phone_reader'; const DEVICE_TYPE_SIMULATED_STRIPE_S700 = 'simulated_stripe_s700'; const DEVICE_TYPE_SIMULATED_STRIPE_S710 = 'simulated_stripe_s710'; + const DEVICE_TYPE_SIMULATED_VERIFONE_M425 = 'simulated_verifone_m425'; + const DEVICE_TYPE_SIMULATED_VERIFONE_P630 = 'simulated_verifone_p630'; + const DEVICE_TYPE_SIMULATED_VERIFONE_UX700 = 'simulated_verifone_ux700'; + const DEVICE_TYPE_SIMULATED_VERIFONE_V660P = 'simulated_verifone_v660p'; const DEVICE_TYPE_SIMULATED_WISEPOS_E = 'simulated_wisepos_e'; const DEVICE_TYPE_STRIPE_M2 = 'stripe_m2'; const DEVICE_TYPE_STRIPE_S700 = 'stripe_s700'; const DEVICE_TYPE_STRIPE_S710 = 'stripe_s710'; + const DEVICE_TYPE_VERIFONE_M425 = 'verifone_m425'; const DEVICE_TYPE_VERIFONE_P400 = 'verifone_P400'; + const DEVICE_TYPE_VERIFONE_P630 = 'verifone_p630'; + const DEVICE_TYPE_VERIFONE_UX700 = 'verifone_ux700'; + const DEVICE_TYPE_VERIFONE_V660P = 'verifone_v660p'; const STATUS_OFFLINE = 'offline'; const STATUS_ONLINE = 'online'; diff --git a/libs/stripe-php/lib/TestHelpers/TestClock.php b/libs/stripe-php/lib/TestHelpers/TestClock.php index 61d86f1d7..4e8423926 100644 --- a/libs/stripe-php/lib/TestHelpers/TestClock.php +++ b/libs/stripe-php/lib/TestHelpers/TestClock.php @@ -14,7 +14,7 @@ namespace Stripe\TestHelpers; * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. * @property int $deletes_after Time at which this clock is scheduled to auto delete. * @property int $frozen_time Time at which all objects belonging to this clock are frozen. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|string $name The custom name supplied at creation. * @property string $status The status of the Test Clock. * @property (object{advancing?: (object{target_frozen_time: int}&\Stripe\StripeObject)}&\Stripe\StripeObject) $status_details @@ -30,7 +30,7 @@ class TestClock extends \Stripe\ApiResource /** * Creates a new test clock that can be attached to new customers and quotes. * - * @param null|array{expand?: string[], frozen_time: int, name?: string} $params + * @param null|array{customer?: string, expand?: string[], frozen_time: int, name?: string} $params * @param null|array|string $options * * @return TestClock the created resource diff --git a/libs/stripe-php/lib/Token.php b/libs/stripe-php/lib/Token.php index 4aa0182ff..4e2b5c3f6 100644 --- a/libs/stripe-php/lib/Token.php +++ b/libs/stripe-php/lib/Token.php @@ -32,7 +32,7 @@ namespace Stripe; * @property null|Card $card

    You can store multiple cards on a customer in order to charge the customer later. You can also store multiple debit cards on a recipient in order to transfer to those cards later.

    Related guide: Card payments with Sources

    * @property null|string $client_ip IP address of the client that generates the token. * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property string $type Type of the token: account, bank_account, card, or pii. * @property bool $used Determines if you have already used this token (you can only use tokens once). */ diff --git a/libs/stripe-php/lib/Topup.php b/libs/stripe-php/lib/Topup.php index 70028016d..bacfb5044 100644 --- a/libs/stripe-php/lib/Topup.php +++ b/libs/stripe-php/lib/Topup.php @@ -19,9 +19,9 @@ namespace Stripe; * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. * @property null|int $expected_availability_date Date the funds are expected to arrive in your Stripe account for payouts. This factors in delays like weekends or bank holidays. May not be specified depending on status of top-up. - * @property null|string $failure_code Error code explaining reason for top-up failure if available (see the errors section for a list of codes). + * @property null|string $failure_code Error code explaining reason for top-up failure if available (see the errors section for a list of codes). * @property null|string $failure_message Message to user further explaining reason for top-up failure if available. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|Source $source The source field is deprecated. It might not always be present in the API response. * @property null|string $statement_descriptor Extra information about a top-up. This will appear on your source's bank statement. It must contain at least one letter. @@ -43,7 +43,7 @@ class Topup extends ApiResource /** * Top up the balance of an account. * - * @param null|array{amount: int, currency: string, description?: string, expand?: string[], metadata?: null|array, source?: string, statement_descriptor?: string, transfer_group?: string} $params + * @param null|array{amount: int, currency: string, description?: string, expand?: string[], metadata?: null|array, payment_method?: string, payment_method_options?: array{us_bank_account?: array{network: string}}, source?: string, statement_descriptor?: string, transfer_group?: string} $params * @param null|array|string $options * * @return Topup the created resource diff --git a/libs/stripe-php/lib/Transfer.php b/libs/stripe-php/lib/Transfer.php index 0c4eca5e1..4f6a8fbd8 100644 --- a/libs/stripe-php/lib/Transfer.php +++ b/libs/stripe-php/lib/Transfer.php @@ -26,7 +26,7 @@ namespace Stripe; * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. * @property null|Account|string $destination ID of the Stripe account the transfer was sent to. * @property null|Charge|string $destination_payment If the destination is a Stripe account, this will be the ID of the payment that the destination account received for the transfer. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property Collection $reversals A list of reversals that have been applied to the transfer. * @property bool $reversed Whether the transfer has been fully reversed. If the transfer is only partially reversed, this attribute will still be false. diff --git a/libs/stripe-php/lib/Treasury/CreditReversal.php b/libs/stripe-php/lib/Treasury/CreditReversal.php index 5f65a695d..7a4ea617d 100644 --- a/libs/stripe-php/lib/Treasury/CreditReversal.php +++ b/libs/stripe-php/lib/Treasury/CreditReversal.php @@ -14,7 +14,7 @@ namespace Stripe\Treasury; * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. * @property string $financial_account The FinancialAccount to reverse funds from. * @property null|string $hosted_regulatory_receipt_url A hosted transaction receipt URL that is provided when money movement is considered regulated under Stripe's money transmission licenses. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property string $network The rails used to reverse the funds. * @property string $received_credit The ReceivedCredit being reversed. diff --git a/libs/stripe-php/lib/Treasury/DebitReversal.php b/libs/stripe-php/lib/Treasury/DebitReversal.php index c2c400d22..727f3e696 100644 --- a/libs/stripe-php/lib/Treasury/DebitReversal.php +++ b/libs/stripe-php/lib/Treasury/DebitReversal.php @@ -15,7 +15,7 @@ namespace Stripe\Treasury; * @property null|string $financial_account The FinancialAccount to reverse funds from. * @property null|string $hosted_regulatory_receipt_url A hosted transaction receipt URL that is provided when money movement is considered regulated under Stripe's money transmission licenses. * @property null|(object{issuing_dispute: null|string}&\Stripe\StripeObject) $linked_flows Other flows linked to a DebitReversal. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property string $network The rails used to reverse the funds. * @property string $received_debit The ReceivedDebit being reversed. diff --git a/libs/stripe-php/lib/Treasury/FinancialAccount.php b/libs/stripe-php/lib/Treasury/FinancialAccount.php index 5ef63fb21..43e2168c4 100644 --- a/libs/stripe-php/lib/Treasury/FinancialAccount.php +++ b/libs/stripe-php/lib/Treasury/FinancialAccount.php @@ -17,7 +17,7 @@ namespace Stripe\Treasury; * @property null|FinancialAccountFeatures $features Encodes whether a FinancialAccount has access to a particular Feature, with a status enum and associated status_details. Stripe or the platform can control Features via the requested field. * @property ((object{aba?: (object{account_holder_name: string, account_number?: null|string, account_number_last4: string, bank_name: string, routing_number: string}&\Stripe\StripeObject), supported_networks?: string[], type: string}&\Stripe\StripeObject))[] $financial_addresses The set of credentials that resolve to a FinancialAccount. * @property null|bool $is_default - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|string $nickname The nickname for the FinancialAccount. * @property null|string[] $pending_features The array of paths to pending Features in the Features hash. diff --git a/libs/stripe-php/lib/Treasury/InboundTransfer.php b/libs/stripe-php/lib/Treasury/InboundTransfer.php index 9ed106ebb..568b7f02e 100644 --- a/libs/stripe-php/lib/Treasury/InboundTransfer.php +++ b/libs/stripe-php/lib/Treasury/InboundTransfer.php @@ -20,7 +20,7 @@ namespace Stripe\Treasury; * @property string $financial_account The FinancialAccount that received the funds. * @property null|string $hosted_regulatory_receipt_url A hosted transaction receipt URL that is provided when money movement is considered regulated under Stripe's money transmission licenses. * @property (object{received_debit: null|string}&\Stripe\StripeObject) $linked_flows - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|string $origin_payment_method The origin payment method to be debited for an InboundTransfer. * @property null|(object{billing_details: (object{address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject), email: null|string, name: null|string}&\Stripe\StripeObject), type: string, us_bank_account?: (object{account_holder_type: null|string, account_type: null|string, bank_name: null|string, fingerprint: null|string, last4: null|string, mandate?: string|\Stripe\Mandate, network: string, routing_number: null|string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $origin_payment_method_details Details about the PaymentMethod for an InboundTransfer. diff --git a/libs/stripe-php/lib/Treasury/OutboundPayment.php b/libs/stripe-php/lib/Treasury/OutboundPayment.php index 727de9007..9aa119d92 100644 --- a/libs/stripe-php/lib/Treasury/OutboundPayment.php +++ b/libs/stripe-php/lib/Treasury/OutboundPayment.php @@ -25,7 +25,7 @@ namespace Stripe\Treasury; * @property int $expected_arrival_date The date when funds are expected to arrive in the destination account. * @property string $financial_account The FinancialAccount that funds were pulled from. * @property null|string $hosted_regulatory_receipt_url A hosted transaction receipt URL that is provided when money movement is considered regulated under Stripe's money transmission licenses. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|(object{code: string, transaction: string|Transaction}&\Stripe\StripeObject) $returned_details Details about a returned OutboundPayment. Only set when the status is returned. * @property string $statement_descriptor The description that appears on the receiving end for an OutboundPayment (for example, bank statement for external bank transfer). diff --git a/libs/stripe-php/lib/Treasury/OutboundTransfer.php b/libs/stripe-php/lib/Treasury/OutboundTransfer.php index 7e01b5759..c6311bcb8 100644 --- a/libs/stripe-php/lib/Treasury/OutboundTransfer.php +++ b/libs/stripe-php/lib/Treasury/OutboundTransfer.php @@ -23,7 +23,7 @@ namespace Stripe\Treasury; * @property int $expected_arrival_date The date when funds are expected to arrive in the destination account. * @property string $financial_account The FinancialAccount that funds were pulled from. * @property null|string $hosted_regulatory_receipt_url A hosted transaction receipt URL that is provided when money movement is considered regulated under Stripe's money transmission licenses. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|(object{code: string, transaction: string|Transaction}&\Stripe\StripeObject) $returned_details Details about a returned OutboundTransfer. Only set when the status is returned. * @property string $statement_descriptor Information about the OutboundTransfer to be sent to the recipient account. diff --git a/libs/stripe-php/lib/Treasury/ReceivedCredit.php b/libs/stripe-php/lib/Treasury/ReceivedCredit.php index 4fb198de1..3ecf05516 100644 --- a/libs/stripe-php/lib/Treasury/ReceivedCredit.php +++ b/libs/stripe-php/lib/Treasury/ReceivedCredit.php @@ -18,7 +18,7 @@ namespace Stripe\Treasury; * @property null|string $hosted_regulatory_receipt_url A hosted transaction receipt URL that is provided when money movement is considered regulated under Stripe's money transmission licenses. * @property (object{balance?: string, billing_details: (object{address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject), email: null|string, name: null|string}&\Stripe\StripeObject), financial_account?: (object{id: string, network: string}&\Stripe\StripeObject), issuing_card?: string, type: string, us_bank_account?: (object{bank_name: null|string, last4: null|string, routing_number: null|string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $initiating_payment_method_details * @property (object{credit_reversal: null|string, issuing_authorization: null|string, issuing_transaction: null|string, source_flow: null|string, source_flow_details?: null|(object{credit_reversal?: CreditReversal, outbound_payment?: OutboundPayment, outbound_transfer?: OutboundTransfer, payout?: \Stripe\Payout, type: string}&\Stripe\StripeObject), source_flow_type: null|string}&\Stripe\StripeObject) $linked_flows - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property string $network The rails used to send the funds. * @property null|(object{deadline: null|int, restricted_reason: null|string}&\Stripe\StripeObject) $reversal_details Details describing when a ReceivedCredit may be reversed. * @property string $status Status of the ReceivedCredit. ReceivedCredits are created either succeeded (approved) or failed (declined). If a ReceivedCredit is declined, the failure reason can be found in the failure_code field. diff --git a/libs/stripe-php/lib/Treasury/ReceivedDebit.php b/libs/stripe-php/lib/Treasury/ReceivedDebit.php index 8753abe87..9d74951db 100644 --- a/libs/stripe-php/lib/Treasury/ReceivedDebit.php +++ b/libs/stripe-php/lib/Treasury/ReceivedDebit.php @@ -18,7 +18,7 @@ namespace Stripe\Treasury; * @property null|string $hosted_regulatory_receipt_url A hosted transaction receipt URL that is provided when money movement is considered regulated under Stripe's money transmission licenses. * @property null|(object{balance?: string, billing_details: (object{address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject), email: null|string, name: null|string}&\Stripe\StripeObject), financial_account?: (object{id: string, network: string}&\Stripe\StripeObject), issuing_card?: string, type: string, us_bank_account?: (object{bank_name: null|string, last4: null|string, routing_number: null|string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $initiating_payment_method_details * @property (object{debit_reversal: null|string, inbound_transfer: null|string, issuing_authorization: null|string, issuing_transaction: null|string, payout: null|string, topup: null|string}&\Stripe\StripeObject) $linked_flows - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property string $network The network used for the ReceivedDebit. * @property null|(object{deadline: null|int, restricted_reason: null|string}&\Stripe\StripeObject) $reversal_details Details describing when a ReceivedDebit might be reversed. * @property string $status Status of the ReceivedDebit. ReceivedDebits are created with a status of either succeeded (approved) or failed (declined). The failure reason can be found under the failure_code. diff --git a/libs/stripe-php/lib/Treasury/Transaction.php b/libs/stripe-php/lib/Treasury/Transaction.php index e16a9912b..e032ae512 100644 --- a/libs/stripe-php/lib/Treasury/Transaction.php +++ b/libs/stripe-php/lib/Treasury/Transaction.php @@ -19,7 +19,7 @@ namespace Stripe\Treasury; * @property null|string $flow ID of the flow that created the Transaction. * @property null|(object{credit_reversal?: CreditReversal, debit_reversal?: DebitReversal, inbound_transfer?: InboundTransfer, issuing_authorization?: \Stripe\Issuing\Authorization, outbound_payment?: OutboundPayment, outbound_transfer?: OutboundTransfer, received_credit?: ReceivedCredit, received_debit?: ReceivedDebit, type: string}&\Stripe\StripeObject) $flow_details Details of the flow that created the Transaction. * @property string $flow_type Type of the flow that created the Transaction. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property string $status Status of the Transaction. * @property (object{posted_at: null|int, void_at: null|int}&\Stripe\StripeObject) $status_transitions */ diff --git a/libs/stripe-php/lib/Treasury/TransactionEntry.php b/libs/stripe-php/lib/Treasury/TransactionEntry.php index 130b29816..f41b4128c 100644 --- a/libs/stripe-php/lib/Treasury/TransactionEntry.php +++ b/libs/stripe-php/lib/Treasury/TransactionEntry.php @@ -17,7 +17,7 @@ namespace Stripe\Treasury; * @property null|string $flow Token of the flow associated with the TransactionEntry. * @property null|(object{credit_reversal?: CreditReversal, debit_reversal?: DebitReversal, inbound_transfer?: InboundTransfer, issuing_authorization?: \Stripe\Issuing\Authorization, outbound_payment?: OutboundPayment, outbound_transfer?: OutboundTransfer, received_credit?: ReceivedCredit, received_debit?: ReceivedDebit, type: string}&\Stripe\StripeObject) $flow_details Details of the flow associated with the TransactionEntry. * @property string $flow_type Type of the flow associated with the TransactionEntry. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property string|Transaction $transaction The Transaction associated with this object. * @property string $type The specific money movement that generated the TransactionEntry. */ diff --git a/libs/stripe-php/lib/Util/ApiVersion.php b/libs/stripe-php/lib/Util/ApiVersion.php index fe1e30cf2..e81f065ae 100644 --- a/libs/stripe-php/lib/Util/ApiVersion.php +++ b/libs/stripe-php/lib/Util/ApiVersion.php @@ -6,6 +6,6 @@ namespace Stripe\Util; class ApiVersion { - const CURRENT = '2026-02-25.clover'; - const CURRENT_MAJOR = 'clover'; + const CURRENT = '2026-06-24.dahlia'; + const CURRENT_MAJOR = 'dahlia'; } diff --git a/libs/stripe-php/lib/Util/EventNotificationTypes.php b/libs/stripe-php/lib/Util/EventNotificationTypes.php index f3dc9f487..222e77842 100644 --- a/libs/stripe-php/lib/Util/EventNotificationTypes.php +++ b/libs/stripe-php/lib/Util/EventNotificationTypes.php @@ -8,6 +8,10 @@ class EventNotificationTypes // The beginning of the section generated from our OpenAPI spec \Stripe\Events\V1BillingMeterErrorReportTriggeredEventNotification::LOOKUP_TYPE => \Stripe\Events\V1BillingMeterErrorReportTriggeredEventNotification::class, \Stripe\Events\V1BillingMeterNoMeterFoundEventNotification::LOOKUP_TYPE => \Stripe\Events\V1BillingMeterNoMeterFoundEventNotification::class, + \Stripe\Events\V2CommerceProductCatalogImportsFailedEventNotification::LOOKUP_TYPE => \Stripe\Events\V2CommerceProductCatalogImportsFailedEventNotification::class, + \Stripe\Events\V2CommerceProductCatalogImportsProcessingEventNotification::LOOKUP_TYPE => \Stripe\Events\V2CommerceProductCatalogImportsProcessingEventNotification::class, + \Stripe\Events\V2CommerceProductCatalogImportsSucceededEventNotification::LOOKUP_TYPE => \Stripe\Events\V2CommerceProductCatalogImportsSucceededEventNotification::class, + \Stripe\Events\V2CommerceProductCatalogImportsSucceededWithErrorsEventNotification::LOOKUP_TYPE => \Stripe\Events\V2CommerceProductCatalogImportsSucceededWithErrorsEventNotification::class, \Stripe\Events\V2CoreAccountClosedEventNotification::LOOKUP_TYPE => \Stripe\Events\V2CoreAccountClosedEventNotification::class, \Stripe\Events\V2CoreAccountCreatedEventNotification::LOOKUP_TYPE => \Stripe\Events\V2CoreAccountCreatedEventNotification::class, \Stripe\Events\V2CoreAccountUpdatedEventNotification::LOOKUP_TYPE => \Stripe\Events\V2CoreAccountUpdatedEventNotification::class, diff --git a/libs/stripe-php/lib/Util/EventTypes.php b/libs/stripe-php/lib/Util/EventTypes.php index 1e26a9103..7ac9a5d66 100644 --- a/libs/stripe-php/lib/Util/EventTypes.php +++ b/libs/stripe-php/lib/Util/EventTypes.php @@ -8,6 +8,10 @@ class EventTypes // The beginning of the section generated from our OpenAPI spec \Stripe\Events\V1BillingMeterErrorReportTriggeredEvent::LOOKUP_TYPE => \Stripe\Events\V1BillingMeterErrorReportTriggeredEvent::class, \Stripe\Events\V1BillingMeterNoMeterFoundEvent::LOOKUP_TYPE => \Stripe\Events\V1BillingMeterNoMeterFoundEvent::class, + \Stripe\Events\V2CommerceProductCatalogImportsFailedEvent::LOOKUP_TYPE => \Stripe\Events\V2CommerceProductCatalogImportsFailedEvent::class, + \Stripe\Events\V2CommerceProductCatalogImportsProcessingEvent::LOOKUP_TYPE => \Stripe\Events\V2CommerceProductCatalogImportsProcessingEvent::class, + \Stripe\Events\V2CommerceProductCatalogImportsSucceededEvent::LOOKUP_TYPE => \Stripe\Events\V2CommerceProductCatalogImportsSucceededEvent::class, + \Stripe\Events\V2CommerceProductCatalogImportsSucceededWithErrorsEvent::LOOKUP_TYPE => \Stripe\Events\V2CommerceProductCatalogImportsSucceededWithErrorsEvent::class, \Stripe\Events\V2CoreAccountClosedEvent::LOOKUP_TYPE => \Stripe\Events\V2CoreAccountClosedEvent::class, \Stripe\Events\V2CoreAccountCreatedEvent::LOOKUP_TYPE => \Stripe\Events\V2CoreAccountCreatedEvent::class, \Stripe\Events\V2CoreAccountUpdatedEvent::LOOKUP_TYPE => \Stripe\Events\V2CoreAccountUpdatedEvent::class, diff --git a/libs/stripe-php/lib/Util/Int64.php b/libs/stripe-php/lib/Util/Int64.php new file mode 100644 index 000000000..ff2bccbca --- /dev/null +++ b/libs/stripe-php/lib/Util/Int64.php @@ -0,0 +1,128 @@ + 'object', 'fields' => ['amount' => ['kind' => 'int64_string']]] + * + * @return mixed + */ + public static function coerceRequestParams($params, $schema) + { + if (null === $params) { + return null; + } + + if (!isset($schema['kind'])) { + return $params; + } + + if ('int64_string' === $schema['kind']) { + if (\is_int($params)) { + return (string) $params; + } + + return $params; + } + + if ('array' === $schema['kind'] && isset($schema['items'])) { + if (\is_array($params)) { + $result = []; + foreach ($params as $key => $value) { + $result[$key] = self::coerceRequestParams($value, $schema['items']); + } + + return $result; + } + + return $params; + } + + if ('object' === $schema['kind'] && isset($schema['fields'])) { + if (\is_array($params)) { + $result = $params; + foreach ($schema['fields'] as $field => $fieldSchema) { + if (\array_key_exists($field, $result)) { + $result[$field] = self::coerceRequestParams($result[$field], $fieldSchema); + } + } + + return $result; + } + + return $params; + } + + return $params; + } + + /** + * Coerce inbound response values: convert JSON strings to PHP ints where + * the field encodings indicate an int64_string field. + * + * @param mixed $values + * @param array $encodings e.g. ['amount' => ['kind' => 'int64_string'], 'nested' => ['kind' => 'object', 'fields' => [...]]] + * + * @return mixed + */ + public static function coerceResponseValues($values, $encodings) + { + if (!\is_array($values)) { + return $values; + } + + foreach ($encodings as $field => $encoding) { + if (!\array_key_exists($field, $values)) { + continue; + } + + $value = $values[$field]; + + if (!isset($encoding['kind'])) { + continue; + } + + if ('int64_string' === $encoding['kind']) { + if (\is_string($value) && \is_numeric($value)) { + $values[$field] = (int) $value; + } + } elseif ('array' === $encoding['kind'] && isset($encoding['items'])) { + if (\is_array($value)) { + foreach ($value as $i => $item) { + if (!isset($encoding['items']['kind'])) { + continue; + } + + if ('int64_string' === $encoding['items']['kind']) { + if (\is_string($item) && \is_numeric($item)) { + $values[$field][$i] = (int) $item; + } + } elseif ('object' === $encoding['items']['kind'] && isset($encoding['items']['fields'])) { + if (\is_array($item)) { + $values[$field][$i] = self::coerceResponseValues($item, $encoding['items']['fields']); + } + } + } + } + } elseif ('object' === $encoding['kind'] && isset($encoding['fields'])) { + if (\is_array($value)) { + $values[$field] = self::coerceResponseValues($value, $encoding['fields']); + } + } + } + + return $values; + } +} diff --git a/libs/stripe-php/lib/Util/ObjectTypes.php b/libs/stripe-php/lib/Util/ObjectTypes.php index 4935fb3d9..63b0bade3 100644 --- a/libs/stripe-php/lib/Util/ObjectTypes.php +++ b/libs/stripe-php/lib/Util/ObjectTypes.php @@ -172,6 +172,7 @@ class ObjectTypes \Stripe\V2\Billing\MeterEvent::OBJECT_NAME => \Stripe\V2\Billing\MeterEvent::class, \Stripe\V2\Billing\MeterEventAdjustment::OBJECT_NAME => \Stripe\V2\Billing\MeterEventAdjustment::class, \Stripe\V2\Billing\MeterEventSession::OBJECT_NAME => \Stripe\V2\Billing\MeterEventSession::class, + \Stripe\V2\Commerce\ProductCatalogImport::OBJECT_NAME => \Stripe\V2\Commerce\ProductCatalogImport::class, \Stripe\V2\Core\Account::OBJECT_NAME => \Stripe\V2\Core\Account::class, \Stripe\V2\Core\AccountLink::OBJECT_NAME => \Stripe\V2\Core\AccountLink::class, \Stripe\V2\Core\AccountPerson::OBJECT_NAME => \Stripe\V2\Core\AccountPerson::class, diff --git a/libs/stripe-php/lib/Util/Util.php b/libs/stripe-php/lib/Util/Util.php index 96f92a61e..2388b92e4 100644 --- a/libs/stripe-php/lib/Util/Util.php +++ b/libs/stripe-php/lib/Util/Util.php @@ -154,11 +154,17 @@ abstract class Util * ApiResource, then it is replaced by the resource's ID. * Also clears out null values. * + * When $serializeNull is true (used for V2 POST request + * bodies), null values in associative arrays are preserved instead of + * stripped. This is necessary because V2 JSON bodies use explicit null + * to signal "delete this field / metadata key". + * * @param mixed $h + * @param bool $serializeNull when true, preserve null values instead of stripping them * * @return mixed */ - public static function objectsToIds($h) + public static function objectsToIds($h, $serializeNull) { if ($h instanceof \Stripe\ApiResource) { return $h->id; @@ -166,7 +172,7 @@ abstract class Util if (static::isList($h)) { $results = []; foreach ($h as $v) { - $results[] = static::objectsToIds($v); + $results[] = static::objectsToIds($v, $serializeNull); } return $results; @@ -175,9 +181,21 @@ abstract class Util $results = []; foreach ($h as $k => $v) { if (null === $v) { + if ($serializeNull) { + $results[$k] = null; + } + continue; } - $results[$k] = static::objectsToIds($v); + $results[$k] = static::objectsToIds($v, $serializeNull); + } + + // If the input was an associative array with string keys but + // all values were stripped, $results is an empty indexed array. + // PHP's json_encode would render that as [] (JSON array) instead + // of {} (JSON object). Cast to object to preserve the type. + if (empty($results) && !empty($h)) { + return (object) $results; } return $results; @@ -256,12 +274,12 @@ abstract class Util if (self::isList($elem)) { $result = \array_merge( $result, - self::flattenParamsList($elem, $calculatedKey) + self::flattenParamsList($elem, "{$calculatedKey}[{$i}]", $apiMode) ); } elseif (\is_array($elem)) { $result = \array_merge( $result, - self::flattenParams($elem, "{$calculatedKey}[{$i}]") + self::flattenParams($elem, "{$calculatedKey}[{$i}]", $apiMode) ); } else { // Always use indexed format for arrays diff --git a/libs/stripe-php/lib/V2/Billing/MeterEventAdjustment.php b/libs/stripe-php/lib/V2/Billing/MeterEventAdjustment.php index f5bfd362a..fd473e284 100644 --- a/libs/stripe-php/lib/V2/Billing/MeterEventAdjustment.php +++ b/libs/stripe-php/lib/V2/Billing/MeterEventAdjustment.php @@ -7,14 +7,14 @@ namespace Stripe\V2\Billing; /** * A Meter Event Adjustment is used to cancel or modify previously recorded meter events. Meter Event Adjustments allow you to correct billing data by canceling individual events or event ranges, with tracking of adjustment status and creation time. * - * @property string $id The unique id of this meter event adjustment. + * @property string $id The unique ID of this meter event adjustment. * @property string $object String representing the object's type. Objects of the same type share the same value of the object field. * @property (object{identifier: string}&\Stripe\StripeObject) $cancel Specifies which event to cancel. * @property int $created The time the adjustment was created. * @property string $event_name The name of the meter event. Corresponds with the event_name field on a meter. * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. * @property string $status Open Enum. The meter event adjustment’s status. - * @property string $type Open Enum. Specifies whether to cancel a single event or a range of events for a time period. Time period cancellation is not supported yet. + * @property string $type Open Enum. Specifies the type of cancellation. Currently supports canceling a single event. */ class MeterEventAdjustment extends \Stripe\ApiResource { diff --git a/libs/stripe-php/lib/V2/Billing/MeterEventSession.php b/libs/stripe-php/lib/V2/Billing/MeterEventSession.php index e81585e63..4b865f465 100644 --- a/libs/stripe-php/lib/V2/Billing/MeterEventSession.php +++ b/libs/stripe-php/lib/V2/Billing/MeterEventSession.php @@ -7,11 +7,11 @@ namespace Stripe\V2\Billing; /** * A Meter Event Session is an authentication session for the high-throughput meter event API. Meter Event Sessions provide temporary authentication tokens with expiration times, enabling secure and efficient bulk submission of usage events. * - * @property string $id The unique id of this auth session. + * @property string $id The unique ID of this auth session. * @property string $object String representing the object's type. Objects of the same type share the same value of the object field. - * @property string $authentication_token The authentication token for this session. Use this token when calling the high-throughput meter event API. + * @property string $authentication_token The authentication token for this session. Use this token when calling the high-throughput meter event API. * @property int $created The creation time of this session. - * @property int $expires_at The time at which this session will expire. + * @property int $expires_at The time at which this session expires. * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. */ class MeterEventSession extends \Stripe\ApiResource diff --git a/libs/stripe-php/lib/V2/Commerce/ProductCatalogImport.php b/libs/stripe-php/lib/V2/Commerce/ProductCatalogImport.php new file mode 100644 index 000000000..e2a6b82a3 --- /dev/null +++ b/libs/stripe-php/lib/V2/Commerce/ProductCatalogImport.php @@ -0,0 +1,83 @@ +true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Additional information about the object in a structured format. + * @property string $mode The import strategy for handling existing catalog data. + * @property string $status The current status of this ProductCatalogImport. + * @property null|(object{awaiting_upload?: (object{upload_url: (object{expires_at: int, url: string}&\Stripe\StripeObject)}&\Stripe\StripeObject), failed?: (object{code: string, failure_message: string, type: string}&\Stripe\StripeObject), processing?: (object{error_count: int, success_count: int}&\Stripe\StripeObject), succeeded?: (object{success_count: int}&\Stripe\StripeObject), succeeded_with_errors?: (object{error_count: int, error_file: (object{content_type: string, download_url: (object{expires_at: int, url: string}&\Stripe\StripeObject), size: int}&\Stripe\StripeObject), samples: (object{error_message: string, field: string, id: string, row: int}&\Stripe\StripeObject)[], success_count: int}&\Stripe\StripeObject)}&\Stripe\StripeObject) $status_details Details about the current import status. + */ +class ProductCatalogImport extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'v2.commerce.product_catalog_import'; + + public static function fieldEncodings() + { + return [ + 'status_details' => [ + 'kind' => 'object', + 'fields' => [ + 'processing' => [ + 'kind' => 'object', + 'fields' => [ + 'error_count' => ['kind' => 'int64_string'], + 'success_count' => ['kind' => 'int64_string'], + ], + ], + 'succeeded' => [ + 'kind' => 'object', + 'fields' => [ + 'success_count' => ['kind' => 'int64_string'], + ], + ], + 'succeeded_with_errors' => [ + 'kind' => 'object', + 'fields' => [ + 'error_count' => ['kind' => 'int64_string'], + 'error_file' => [ + 'kind' => 'object', + 'fields' => [ + 'size' => ['kind' => 'int64_string'], + ], + ], + 'samples' => [ + 'kind' => 'array', + 'element' => [ + 'kind' => 'object', + 'fields' => [ + 'row' => ['kind' => 'int64_string'], + ], + ], + ], + 'success_count' => ['kind' => 'int64_string'], + ], + ], + ], + ], + ]; + } + + const FEED_TYPE_INVENTORY = 'inventory'; + const FEED_TYPE_PRICING = 'pricing'; + const FEED_TYPE_PRODUCT = 'product'; + const FEED_TYPE_PROMOTION = 'promotion'; + + const MODE_REPLACE = 'replace'; + const MODE_UPSERT = 'upsert'; + + const STATUS_AWAITING_UPLOAD = 'awaiting_upload'; + const STATUS_FAILED = 'failed'; + const STATUS_PROCESSING = 'processing'; + const STATUS_SUCCEEDED = 'succeeded'; + const STATUS_SUCCEEDED_WITH_ERRORS = 'succeeded_with_errors'; +} diff --git a/libs/stripe-php/lib/V2/Core/Account.php b/libs/stripe-php/lib/V2/Core/Account.php index 57fc0f539..84c5658eb 100644 --- a/libs/stripe-php/lib/V2/Core/Account.php +++ b/libs/stripe-php/lib/V2/Core/Account.php @@ -5,23 +5,22 @@ namespace Stripe\V2\Core; /** - * An Account v2 object represents a company, individual, or other entity that interacts with a platform on Stripe. It contains both identifying information and properties that control its behavior and functionality. An Account can have one or more configurations that enable sets of related features, such as allowing it to act as a merchant or customer. - * The Accounts v2 API supports both the Global Payouts preview feature and the Connect-Billing integration preview feature. However, a particular Account can only access one of them. - * The Connect-Billing integration preview feature allows an Account v2 to pay subscription fees to a platform. An Account v1 required a separate Customer object to pay subscription fees. + * An Account v2 object represents a company, individual, or other entity that your Stripe integration interacts with. It contains both identifying information and properties that control its behavior and functionality. An Account can have one or more configurations that enable sets of related features, such as allowing it to act as a merchant or customer. + * The Accounts v2 API is broadly available to Connect platforms, and to other users in preview. The Accounts v2 API also supports the Global Payouts preview feature. * * @property string $id Unique identifier for the Account. * @property string $object String representing the object's type. Objects of the same type share the same value of the object field. * @property string[] $applied_configurations The configurations that have been applied to this account. * @property null|bool $closed Indicates whether the account has been closed. - * @property null|(object{customer?: (object{applied: bool, automatic_indirect_tax?: (object{exempt?: string, ip_address?: string, location?: (object{country?: string, state?: string}&\Stripe\StripeObject), location_source?: string}&\Stripe\StripeObject), billing?: (object{default_payment_method?: string, invoice?: (object{custom_fields: (object{name: string, value: string}&\Stripe\StripeObject)[], footer?: string, next_sequence?: int, prefix?: string, rendering?: (object{amount_tax_display?: string, template?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject)}&\Stripe\StripeObject), capabilities?: (object{automatic_indirect_tax?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject)}&\Stripe\StripeObject), shipping?: (object{address?: (object{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}&\Stripe\StripeObject), name?: string, phone?: string}&\Stripe\StripeObject), test_clock?: string}&\Stripe\StripeObject), merchant?: (object{applied: bool, bacs_debit_payments?: (object{display_name?: string, service_user_number?: string}&\Stripe\StripeObject), branding?: (object{icon?: string, logo?: string, primary_color?: string, secondary_color?: string}&\Stripe\StripeObject), capabilities?: (object{ach_debit_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), acss_debit_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), affirm_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), afterpay_clearpay_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), alma_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), amazon_pay_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), au_becs_debit_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), bacs_debit_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), bancontact_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), blik_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), boleto_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), card_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), cartes_bancaires_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), cashapp_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), eps_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), fpx_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), gb_bank_transfer_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), grabpay_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), ideal_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), jcb_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), jp_bank_transfer_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), kakao_pay_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), klarna_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), konbini_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), kr_card_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), link_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), mobilepay_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), multibanco_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), mx_bank_transfer_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), naver_pay_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), oxxo_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), p24_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), pay_by_bank_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), payco_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), paynow_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), promptpay_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), revolut_pay_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), samsung_pay_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), sepa_bank_transfer_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), sepa_debit_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), stripe_balance?: (object{payouts?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject)}&\Stripe\StripeObject), swish_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), twint_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), us_bank_transfer_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), zip_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject)}&\Stripe\StripeObject), card_payments?: (object{decline_on?: (object{avs_failure?: bool, cvc_failure?: bool}&\Stripe\StripeObject)}&\Stripe\StripeObject), konbini_payments?: (object{support?: (object{email?: string, hours?: (object{end_time?: string, start_time?: string}&\Stripe\StripeObject), phone?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject), mcc?: string, script_statement_descriptor?: (object{kana?: (object{descriptor?: string, prefix?: string}&\Stripe\StripeObject), kanji?: (object{descriptor?: string, prefix?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject), sepa_debit_payments?: (object{creditor_id?: string}&\Stripe\StripeObject), statement_descriptor?: (object{descriptor?: string, prefix?: string}&\Stripe\StripeObject), support?: (object{address?: (object{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}&\Stripe\StripeObject), email?: string, phone?: string, url?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject), recipient?: (object{applied: bool, capabilities?: (object{stripe_balance?: (object{payouts?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), stripe_transfers?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject)}&\Stripe\StripeObject)}&\Stripe\StripeObject)}&\Stripe\StripeObject)}&\Stripe\StripeObject) $configuration An Account represents a company, individual, or other entity that a user interacts with. Accounts store identity information and one or more configurations that enable product-specific capabilities. You can assign configurations at creation or add them later. - * @property null|string $contact_email The default contact email address for the Account. Required when configuring the account as a merchant or recipient. + * @property null|(object{customer?: (object{applied: bool, automatic_indirect_tax?: (object{exempt?: string, ip_address?: string, location?: (object{country?: string, state?: string}&\Stripe\StripeObject), location_source?: string}&\Stripe\StripeObject), billing?: (object{default_payment_method?: string, invoice?: (object{custom_fields: (object{name: string, value: string}&\Stripe\StripeObject)[], footer?: string, next_sequence?: int, prefix?: string, rendering?: (object{amount_tax_display?: string, template?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject)}&\Stripe\StripeObject), capabilities?: (object{automatic_indirect_tax?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject)}&\Stripe\StripeObject), shipping?: (object{address?: (object{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}&\Stripe\StripeObject), name?: string, phone?: string}&\Stripe\StripeObject), test_clock?: string}&\Stripe\StripeObject), merchant?: (object{applied: bool, bacs_debit_payments?: (object{display_name?: string, service_user_number?: string}&\Stripe\StripeObject), branding?: (object{icon?: string, logo?: string, primary_color?: string, secondary_color?: string}&\Stripe\StripeObject), capabilities?: (object{ach_debit_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), acss_debit_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), affirm_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), afterpay_clearpay_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), alma_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), amazon_pay_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), au_becs_debit_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), bacs_debit_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), bancontact_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), blik_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), boleto_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), card_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), cartes_bancaires_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), cashapp_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), eps_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), fpx_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), gb_bank_transfer_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), grabpay_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), ideal_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), jcb_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), jp_bank_transfer_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), kakao_pay_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), klarna_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), konbini_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), kr_card_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), link_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), mobilepay_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), multibanco_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), mx_bank_transfer_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), naver_pay_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), oxxo_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), p24_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), pay_by_bank_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), payco_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), paynow_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), promptpay_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), revolut_pay_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), samsung_pay_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), sepa_bank_transfer_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), sepa_debit_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), stripe_balance?: (object{payouts?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject)}&\Stripe\StripeObject), sunbit_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), swish_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), twint_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), us_bank_transfer_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), zip_payments?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject)}&\Stripe\StripeObject), card_payments?: (object{decline_on?: (object{avs_failure?: bool, cvc_failure?: bool}&\Stripe\StripeObject)}&\Stripe\StripeObject), konbini_payments?: (object{support?: (object{email?: string, hours?: (object{end_time?: string, start_time?: string}&\Stripe\StripeObject), phone?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject), mcc?: string, script_statement_descriptor?: (object{kana?: (object{descriptor?: string, prefix?: string}&\Stripe\StripeObject), kanji?: (object{descriptor?: string, prefix?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject), sepa_debit_payments?: (object{creditor_id?: string}&\Stripe\StripeObject), statement_descriptor?: (object{descriptor?: string, prefix?: string}&\Stripe\StripeObject), support?: (object{address?: (object{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}&\Stripe\StripeObject), email?: string, phone?: string, url?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject), recipient?: (object{applied: bool, capabilities?: (object{stripe_balance?: (object{payouts?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), stripe_transfers?: (object{status: string, status_details: (object{code: string, resolution: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject)}&\Stripe\StripeObject)}&\Stripe\StripeObject)}&\Stripe\StripeObject)}&\Stripe\StripeObject) $configuration An Account represents a company, individual, or other entity that a user interacts with. Accounts store identity information and one or more configurations that enable product-specific capabilities. You can assign configurations at creation or add them later. + * @property null|string $contact_email The primary contact email address for the Account. * @property null|string $contact_phone The default contact phone for the Account. * @property int $created Time at which the object was created. Represented as a RFC 3339 date & time UTC value in millisecond precision, for example: 2022-09-18T13:22:18.123Z. * @property null|string $dashboard A value indicating the Stripe dashboard this Account has access to. This will depend on which configurations are enabled for this account. * @property null|(object{currency?: string, locales?: string[], profile?: (object{business_url?: string, doing_business_as?: string, product_description?: string}&\Stripe\StripeObject), responsibilities: (object{fees_collector?: string, losses_collector?: string, requirements_collector: string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $defaults Default values for settings shared across Account configurations. * @property null|string $display_name A descriptive name for the Account. This name will be surfaced in the Stripe Dashboard and on any invoices sent to the Account. * @property null|(object{entries?: (object{awaiting_action_from: string, description: string, errors: (object{code: string, description: string}&\Stripe\StripeObject)[], impact: (object{restricts_capabilities?: (object{capability: string, configuration: string, deadline: (object{status: string}&\Stripe\StripeObject)}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), minimum_deadline: (object{status: string}&\Stripe\StripeObject), reference?: (object{inquiry?: string, resource?: string, type: string}&\Stripe\StripeObject), requested_reasons: (object{code: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject)[], minimum_transition_date?: int, summary?: (object{minimum_deadline?: (object{status: string, time?: int}&\Stripe\StripeObject)}&\Stripe\StripeObject)}&\Stripe\StripeObject) $future_requirements Information about the future requirements for the Account that will eventually come into effect, including what information needs to be collected, and by when. - * @property null|(object{attestations?: (object{directorship_declaration?: (object{date?: int, ip?: string, user_agent?: string}&\Stripe\StripeObject), ownership_declaration?: (object{date?: int, ip?: string, user_agent?: string}&\Stripe\StripeObject), persons_provided?: (object{directors?: bool, executives?: bool, owners?: bool, ownership_exemption_reason?: string}&\Stripe\StripeObject), representative_declaration?: (object{date?: int, ip?: string, user_agent?: string}&\Stripe\StripeObject), terms_of_service?: (object{account?: (object{date?: int, ip?: string, user_agent?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject)}&\Stripe\StripeObject), business_details?: (object{address?: (object{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}&\Stripe\StripeObject), annual_revenue?: (object{amount?: (object{value?: int, currency?: string}&\Stripe\StripeObject), fiscal_year_end?: string}&\Stripe\StripeObject), documents?: (object{bank_account_ownership_verification?: (object{files: string[], type: string}&\Stripe\StripeObject), company_license?: (object{files: string[], type: string}&\Stripe\StripeObject), company_memorandum_of_association?: (object{files: string[], type: string}&\Stripe\StripeObject), company_ministerial_decree?: (object{files: string[], type: string}&\Stripe\StripeObject), company_registration_verification?: (object{files: string[], type: string}&\Stripe\StripeObject), company_tax_id_verification?: (object{files: string[], type: string}&\Stripe\StripeObject), primary_verification?: (object{front_back: (object{back?: string, front: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), proof_of_address?: (object{files: string[], type: string}&\Stripe\StripeObject), proof_of_registration?: (object{files: string[], type: string}&\Stripe\StripeObject), proof_of_ultimate_beneficial_ownership?: (object{files: string[], type: string}&\Stripe\StripeObject)}&\Stripe\StripeObject), estimated_worker_count?: int, id_numbers?: (object{registrar?: string, type: string}&\Stripe\StripeObject)[], monthly_estimated_revenue?: (object{amount?: (object{value?: int, currency?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject), phone?: string, registered_name?: string, registration_date?: (object{day: int, month: int, year: int}&\Stripe\StripeObject), script_addresses?: (object{kana?: (object{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}&\Stripe\StripeObject), kanji?: (object{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject), script_names?: (object{kana?: (object{registered_name?: string}&\Stripe\StripeObject), kanji?: (object{registered_name?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject), structure?: string}&\Stripe\StripeObject), country?: string, entity_type?: string, individual?: (object{account: string, additional_addresses?: (object{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, purpose: string, state?: string, town?: string}&\Stripe\StripeObject)[], additional_names?: (object{full_name?: string, given_name?: string, purpose: string, surname?: string}&\Stripe\StripeObject)[], additional_terms_of_service?: (object{account?: (object{date?: int, ip?: string, user_agent?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject), address?: (object{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}&\Stripe\StripeObject), created: int, date_of_birth?: (object{day: int, month: int, year: int}&\Stripe\StripeObject), documents?: (object{company_authorization?: (object{files: string[], type: string}&\Stripe\StripeObject), passport?: (object{files: string[], type: string}&\Stripe\StripeObject), primary_verification?: (object{front_back: (object{back?: string, front: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), secondary_verification?: (object{front_back: (object{back?: string, front: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), visa?: (object{files: string[], type: string}&\Stripe\StripeObject)}&\Stripe\StripeObject), email?: string, given_name?: string, id: string, id_numbers?: (object{type: string}&\Stripe\StripeObject)[], legal_gender?: string, metadata?: \Stripe\StripeObject, nationalities?: string[], object: string, phone?: string, political_exposure?: string, relationship?: (object{authorizer?: bool, director?: bool, executive?: bool, legal_guardian?: bool, owner?: bool, percent_ownership?: string, representative?: bool, title?: string}&\Stripe\StripeObject), script_addresses?: (object{kana?: (object{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}&\Stripe\StripeObject), kanji?: (object{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject), script_names?: (object{kana?: (object{given_name?: string, surname?: string}&\Stripe\StripeObject), kanji?: (object{given_name?: string, surname?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject), surname?: string, updated: int}&\Stripe\StripeObject)}&\Stripe\StripeObject) $identity Information about the company, individual, and business represented by the Account. + * @property null|(object{attestations?: (object{directorship_declaration?: (object{date?: int, ip?: string, user_agent?: string}&\Stripe\StripeObject), ownership_declaration?: (object{date?: int, ip?: string, user_agent?: string}&\Stripe\StripeObject), persons_provided?: (object{directors?: bool, executives?: bool, owners?: bool, ownership_exemption_reason?: string}&\Stripe\StripeObject), representative_declaration?: (object{date?: int, ip?: string, user_agent?: string}&\Stripe\StripeObject), terms_of_service?: (object{account?: (object{date?: int, ip?: string, user_agent?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject)}&\Stripe\StripeObject), business_details?: (object{address?: (object{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}&\Stripe\StripeObject), annual_revenue?: (object{amount?: \Stripe\StripeObject, fiscal_year_end?: string}&\Stripe\StripeObject), documents?: (object{bank_account_ownership_verification?: (object{files: string[], type: string}&\Stripe\StripeObject), company_license?: (object{files: string[], type: string}&\Stripe\StripeObject), company_memorandum_of_association?: (object{files: string[], type: string}&\Stripe\StripeObject), company_ministerial_decree?: (object{files: string[], type: string}&\Stripe\StripeObject), company_registration_verification?: (object{files: string[], type: string}&\Stripe\StripeObject), company_tax_id_verification?: (object{files: string[], type: string}&\Stripe\StripeObject), primary_verification?: (object{front_back: (object{back?: string, front: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), proof_of_address?: (object{files: string[], type: string}&\Stripe\StripeObject), proof_of_registration?: (object{files: string[], signer?: (object{person: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), proof_of_ultimate_beneficial_ownership?: (object{files: string[], signer?: (object{person: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject)}&\Stripe\StripeObject), estimated_worker_count?: int, id_numbers?: (object{registrar?: string, type: string}&\Stripe\StripeObject)[], monthly_estimated_revenue?: (object{amount?: \Stripe\StripeObject}&\Stripe\StripeObject), phone?: string, registered_name?: string, registration_date?: (object{day: int, month: int, year: int}&\Stripe\StripeObject), script_addresses?: (object{kana?: (object{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}&\Stripe\StripeObject), kanji?: (object{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject), script_names?: (object{kana?: (object{registered_name?: string}&\Stripe\StripeObject), kanji?: (object{registered_name?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject), structure?: string}&\Stripe\StripeObject), country?: string, entity_type?: string, individual?: (object{account: string, additional_addresses?: (object{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, purpose: string, state?: string, town?: string}&\Stripe\StripeObject)[], additional_names?: (object{full_name?: string, given_name?: string, purpose: string, surname?: string}&\Stripe\StripeObject)[], additional_terms_of_service?: (object{account?: (object{date?: int, ip?: string, user_agent?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject), address?: (object{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}&\Stripe\StripeObject), created: int, date_of_birth?: (object{day: int, month: int, year: int}&\Stripe\StripeObject), documents?: (object{company_authorization?: (object{files: string[], type: string}&\Stripe\StripeObject), passport?: (object{files: string[], type: string}&\Stripe\StripeObject), primary_verification?: (object{front_back: (object{back?: string, front: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), secondary_verification?: (object{front_back: (object{back?: string, front: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), visa?: (object{files: string[], type: string}&\Stripe\StripeObject)}&\Stripe\StripeObject), email?: string, given_name?: string, id: string, id_numbers?: (object{type: string}&\Stripe\StripeObject)[], legal_gender?: string, metadata?: \Stripe\StripeObject, nationalities?: string[], object: string, phone?: string, political_exposure?: string, relationship?: (object{authorizer?: bool, director?: bool, executive?: bool, legal_guardian?: bool, owner?: bool, percent_ownership?: string, representative?: bool, title?: string}&\Stripe\StripeObject), script_addresses?: (object{kana?: (object{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}&\Stripe\StripeObject), kanji?: (object{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject), script_names?: (object{kana?: (object{given_name?: string, surname?: string}&\Stripe\StripeObject), kanji?: (object{given_name?: string, surname?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject), surname?: string, updated: int}&\Stripe\StripeObject)}&\Stripe\StripeObject) $identity Information about the company, individual, and business represented by the Account. * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|(object{entries?: (object{awaiting_action_from: string, description: string, errors: (object{code: string, description: string}&\Stripe\StripeObject)[], impact: (object{restricts_capabilities?: (object{capability: string, configuration: string, deadline: (object{status: string}&\Stripe\StripeObject)}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), minimum_deadline: (object{status: string}&\Stripe\StripeObject), reference?: (object{inquiry?: string, resource?: string, type: string}&\Stripe\StripeObject), requested_reasons: (object{code: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject)[], summary?: (object{minimum_deadline?: (object{status: string, time?: int}&\Stripe\StripeObject)}&\Stripe\StripeObject)}&\Stripe\StripeObject) $requirements Information about the active requirements for the Account, including what information needs to be collected, and by when. @@ -30,6 +29,30 @@ class Account extends \Stripe\ApiResource { const OBJECT_NAME = 'v2.core.account'; + public static function fieldEncodings() + { + return [ + 'identity' => [ + 'kind' => 'object', + 'fields' => [ + 'individual' => [ + 'kind' => 'object', + 'fields' => [ + 'relationship' => [ + 'kind' => 'object', + 'fields' => [ + 'percent_ownership' => [ + 'kind' => 'decimal_string', + ], + ], + ], + ], + ], + ], + ], + ]; + } + const DASHBOARD_EXPRESS = 'express'; const DASHBOARD_FULL = 'full'; const DASHBOARD_NONE = 'none'; diff --git a/libs/stripe-php/lib/V2/Core/AccountLink.php b/libs/stripe-php/lib/V2/Core/AccountLink.php index 4ed024ba6..d70451e09 100644 --- a/libs/stripe-php/lib/V2/Core/AccountLink.php +++ b/libs/stripe-php/lib/V2/Core/AccountLink.php @@ -13,7 +13,7 @@ namespace Stripe\V2\Core; * @property int $expires_at The timestamp at which this Account Link will expire. * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. * @property string $url The URL at which the account can access the Stripe-hosted flow. - * @property (object{type: string, account_onboarding?: (object{collection_options?: (object{fields?: string, future_requirements?: string}&\Stripe\StripeObject), configurations: string[], refresh_url: string, return_url?: string}&\Stripe\StripeObject), account_update?: (object{collection_options?: (object{fields?: string, future_requirements?: string}&\Stripe\StripeObject), configurations: string[], refresh_url: string, return_url?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $use_case Hash containing usage options. + * @property (object{account_onboarding?: (object{collection_options?: (object{fields?: string, future_requirements?: string}&\Stripe\StripeObject), configurations: string[], refresh_url: string, return_url?: string}&\Stripe\StripeObject), account_update?: (object{collection_options?: (object{fields?: string, future_requirements?: string}&\Stripe\StripeObject), configurations: string[], refresh_url: string, return_url?: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject) $use_case Hash containing usage options. */ class AccountLink extends \Stripe\ApiResource { diff --git a/libs/stripe-php/lib/V2/Core/AccountPerson.php b/libs/stripe-php/lib/V2/Core/AccountPerson.php index 0afc0a5b9..b0f4e398e 100644 --- a/libs/stripe-php/lib/V2/Core/AccountPerson.php +++ b/libs/stripe-php/lib/V2/Core/AccountPerson.php @@ -36,6 +36,18 @@ class AccountPerson extends \Stripe\ApiResource { const OBJECT_NAME = 'v2.core.account_person'; + public static function fieldEncodings() + { + return [ + 'relationship' => [ + 'kind' => 'object', + 'fields' => [ + 'percent_ownership' => ['kind' => 'decimal_string'], + ], + ], + ]; + } + const LEGAL_GENDER_FEMALE = 'female'; const LEGAL_GENDER_MALE = 'male'; diff --git a/libs/stripe-php/lib/V2/Core/AccountToken.php b/libs/stripe-php/lib/V2/Core/AccountToken.php index d6c6419a7..0e17e63e0 100644 --- a/libs/stripe-php/lib/V2/Core/AccountToken.php +++ b/libs/stripe-php/lib/V2/Core/AccountToken.php @@ -5,7 +5,7 @@ namespace Stripe\V2\Core; /** - * Account tokens are single-use tokens which tokenize company/individual/business information, and are used for creating or updating an Account. + * Account tokens are single-use tokens which tokenize an account's contact_email, display_name, contact_phone, and identity. * * @property string $id Unique identifier for the token. * @property string $object String representing the object's type. Objects of the same type share the same value of the object field. diff --git a/libs/stripe-php/lib/V2/Core/EventDestination.php b/libs/stripe-php/lib/V2/Core/EventDestination.php index b6b5b2505..9aa106f22 100644 --- a/libs/stripe-php/lib/V2/Core/EventDestination.php +++ b/libs/stripe-php/lib/V2/Core/EventDestination.php @@ -10,11 +10,12 @@ namespace Stripe\V2\Core; * @property string $id Unique identifier for the object. * @property string $object String representing the object's type. Objects of the same type share the same value of the object field. * @property null|(object{aws_account_id: string, aws_event_source_arn: string, aws_event_source_status: string}&\Stripe\StripeObject) $amazon_eventbridge Amazon EventBridge configuration. + * @property null|(object{azure_partner_topic_name: string, azure_partner_topic_status: string, azure_region: string, azure_resource_group_name: string, azure_subscription_id: string}&\Stripe\StripeObject) $azure_event_grid Azure Event Grid configuration. * @property int $created Time at which the object was created. * @property string $description An optional description of what the event destination is used for. * @property string[] $enabled_events The list of events to enable for this endpoint. * @property string $event_payload Payload type of events being subscribed to. - * @property null|string[] $events_from Where events should be routed from. + * @property null|string[] $events_from Specifies which accounts' events route to this destination. @self: Receive events from the account that owns the event destination. @accounts: Receive events emitted from other accounts you manage which includes your v1 and v2 accounts. @organization_members: Receive events from accounts directly linked to the organization. @organization_members/@accounts: Receive events from all accounts connected to any platform accounts in the organization. * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. * @property null|\Stripe\StripeObject $metadata Metadata. * @property string $name Event destination name. @@ -36,5 +37,6 @@ class EventDestination extends \Stripe\ApiResource const STATUS_ENABLED = 'enabled'; const TYPE_AMAZON_EVENTBRIDGE = 'amazon_eventbridge'; + const TYPE_AZURE_EVENT_GRID = 'azure_event_grid'; const TYPE_WEBHOOK_ENDPOINT = 'webhook_endpoint'; } diff --git a/libs/stripe-php/lib/V2/Core/EventNotification.php b/libs/stripe-php/lib/V2/Core/EventNotification.php index 35bc921aa..e285f9d3c 100644 --- a/libs/stripe-php/lib/V2/Core/EventNotification.php +++ b/libs/stripe-php/lib/V2/Core/EventNotification.php @@ -65,7 +65,7 @@ abstract class EventNotification /** * Helper for constructing an Event Notification. Doesn't perform signature validation, so you - * should use \Stripe\BaseStripeClient#parseEventNotification instead for + * should use \Stripe\BaseStripeClient::parseEventNotification instead for * initial handling. This is useful in unit tests and working with EventNotifications that you've * already validated the authenticity of. * @@ -78,6 +78,12 @@ abstract class EventNotification { $json = json_decode($jsonStr, true); + if (isset($json['object']) && 'event' === $json['object']) { + throw new \Stripe\Exception\UnexpectedValueException( + 'You passed a webhook payload to StripeClient::parseEventNotification, which expects an event notification. Use Webhook::constructEvent instead.' + ); + } + $class = UnknownEventNotification::class; $eventNotificationTypes = EventNotificationTypes::v2EventMapping; if (\array_key_exists($json['type'], $eventNotificationTypes)) { diff --git a/libs/stripe-php/lib/Webhook.php b/libs/stripe-php/lib/Webhook.php index 6f4e9c3cc..1a7dbc2cb 100644 --- a/libs/stripe-php/lib/Webhook.php +++ b/libs/stripe-php/lib/Webhook.php @@ -32,11 +32,17 @@ abstract class Webhook $jsonError = \json_last_error(); if (null === $data && \JSON_ERROR_NONE !== $jsonError) { $msg = "Invalid payload: {$payload} " - . "(json_last_error() was {$jsonError})"; + . "(json_last_error() was {$jsonError})"; throw new Exception\UnexpectedValueException($msg); } + if (isset($data['object']) && 'v2.core.event' === $data['object']) { + throw new Exception\UnexpectedValueException( + 'You passed an event notification to Webhook::constructEvent, which expects a webhook payload. Use StripeClient::parseEventNotification instead.' + ); + } + return Event::constructFrom($data); } } diff --git a/libs/stripe-php/lib/WebhookEndpoint.php b/libs/stripe-php/lib/WebhookEndpoint.php index 70753a6c6..d2f6685ba 100644 --- a/libs/stripe-php/lib/WebhookEndpoint.php +++ b/libs/stripe-php/lib/WebhookEndpoint.php @@ -20,7 +20,7 @@ namespace Stripe; * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. * @property null|string $description An optional description of what the webhook is used for. * @property string[] $enabled_events The list of events to enable for this endpoint. ['*'] indicates that all events are enabled, except those that require explicit selection. - * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $livemode If the object exists in live mode, the value is true. If the object exists in test mode, the value is false. * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. * @property null|string $secret The endpoint's secret, used to generate webhook signatures. Only returned at creation. * @property string $status The status of the webhook. It can be enabled or disabled. diff --git a/libs/stripe-php/lib/version_check.php b/libs/stripe-php/lib/version_check.php new file mode 100644 index 000000000..a253e2d9c --- /dev/null +++ b/libs/stripe-php/lib/version_check.php @@ -0,0 +1,9 @@ + 0 ? end($database_updates_applied) : $old_db_version; + fwrite(STDERR, "Error: database update failed at $database_updates_error\n"); + fwrite(STDERR, "The database is at version $stopped_at_version - re-running will resume at the failed update.\n"); + exit(1); + } + + if (count($database_updates_applied) > 0) { + echo "Database updated from version $old_db_version to $latest_db_version.\n"; } else { echo "Database is already at the latest version ($latest_db_version). No updates were applied.\n"; } -} \ No newline at end of file +} From 7ccdc942feed4ac3edd772812f01520c2f76b62d Mon Sep 17 00:00:00 2001 From: johnnyq Date: Thu, 23 Jul 2026 00:59:07 -0400 Subject: [PATCH 092/241] Bump imapEngine from v1.25.2 to v1.25.3 --- functions/app.php | 16 ++++-------- guest/guest_ajax.php | 3 ++- libs/composer.lock | 22 ++++++++-------- libs/vendor/composer/autoload_psr4.php | 2 +- libs/vendor/composer/autoload_static.php | 4 +-- libs/vendor/composer/installed.json | 26 +++++++++---------- libs/vendor/composer/installed.php | 16 ++++++------ .../src/Connection/ImapTokenizer.php | 18 ++++++++++++- .../src/Serializers/Native.php | 8 ++++++ 9 files changed, 67 insertions(+), 48 deletions(-) diff --git a/functions/app.php b/functions/app.php index ce718eed6..a3eb99a5e 100644 --- a/functions/app.php +++ b/functions/app.php @@ -3,9 +3,7 @@ // App/UI helpers - icons, badges, lookups, mail queue, iCal, taxes, update check // Split from the former monolithic functions.php - -function getAssetIcon($asset_type) -{ +function getAssetIcon($asset_type) { if ($asset_type == 'Laptop') { $device_icon = "laptop"; } elseif ($asset_type == 'Desktop') { @@ -39,8 +37,7 @@ function getAssetIcon($asset_type) return $device_icon; } -function getInvoiceBadgeColor($invoice_status) -{ +function getInvoiceBadgeColor($invoice_status) { if ($invoice_status == "Sent") { $invoice_badge_color = "warning text-white"; } elseif ($invoice_status == "Viewed") { @@ -217,8 +214,7 @@ function checkForUpdates() { } -function getMonthlyTax($tax_name, $month, $year, $mysqli) -{ +function getMonthlyTax($tax_name, $month, $year, $mysqli) { // SQL to calculate monthly tax $sql = "SELECT SUM(item_tax) AS monthly_tax FROM invoice_items LEFT JOIN invoices ON invoice_items.item_invoice_id = invoices.invoice_id @@ -230,8 +226,7 @@ function getMonthlyTax($tax_name, $month, $year, $mysqli) return $row['monthly_tax'] ?? 0; } -function getQuarterlyTax($tax_name, $quarter, $year, $mysqli) -{ +function getQuarterlyTax($tax_name, $quarter, $year, $mysqli) { // Calculate start and end months for the quarter $start_month = ($quarter - 1) * 3 + 1; $end_month = $start_month + 2; @@ -278,8 +273,7 @@ function addToMailQueue($data) { return true; } -function createiCalStr($datetime, $title, $description, $location) -{ +function createiCalStr($datetime, $title, $description, $location) { require_once "libs/zapcal/zapcallib.php"; // Create the iCal object diff --git a/guest/guest_ajax.php b/guest/guest_ajax.php index 42adb7f2b..8f268eda2 100644 --- a/guest/guest_ajax.php +++ b/guest/guest_ajax.php @@ -95,8 +95,9 @@ if (isset($_GET['stripe_create_pi'])) { echo json_encode($output); - } catch (Exception $e) { + } catch (\Throwable $e) { http_response_code(500); + error_log("Stripe PI create failed (invoice $invoice_id): " . $e->getMessage()); echo json_encode(['error' => $e->getMessage()]); } diff --git a/libs/composer.lock b/libs/composer.lock index a59767324..9ea9a6f74 100644 --- a/libs/composer.lock +++ b/libs/composer.lock @@ -77,16 +77,16 @@ }, { "name": "directorytree/imapengine", - "version": "v1.25.2", + "version": "v1.25.3", "source": { "type": "git", "url": "https://github.com/DirectoryTree/ImapEngine.git", - "reference": "8d5652bc3fac749cd7cf6240afb594ef018c0069" + "reference": "62d4f4080683b1b1136720bec8c90354709298fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/DirectoryTree/ImapEngine/zipball/8d5652bc3fac749cd7cf6240afb594ef018c0069", - "reference": "8d5652bc3fac749cd7cf6240afb594ef018c0069", + "url": "https://api.github.com/repos/DirectoryTree/ImapEngine/zipball/62d4f4080683b1b1136720bec8c90354709298fe", + "reference": "62d4f4080683b1b1136720bec8c90354709298fe", "shasum": "" }, "require": { @@ -127,7 +127,7 @@ ], "support": { "issues": "https://github.com/DirectoryTree/ImapEngine/issues", - "source": "https://github.com/DirectoryTree/ImapEngine/tree/v1.25.2" + "source": "https://github.com/DirectoryTree/ImapEngine/tree/v1.25.3" }, "funding": [ { @@ -135,7 +135,7 @@ "type": "github" } ], - "time": "2026-07-16T17:59:28+00:00" + "time": "2026-07-20T14:31:20+00:00" }, { "name": "doctrine/lexer", @@ -602,16 +602,16 @@ }, { "name": "laravel/serializable-closure", - "version": "v2.0.13", + "version": "v2.0.15", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "b566ee0dd251f3c4078bed003a7ce015f5ea6dce" + "reference": "dccd8bcb851bb03fcc005df650b708b57cc52661" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/b566ee0dd251f3c4078bed003a7ce015f5ea6dce", - "reference": "b566ee0dd251f3c4078bed003a7ce015f5ea6dce", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/dccd8bcb851bb03fcc005df650b708b57cc52661", + "reference": "dccd8bcb851bb03fcc005df650b708b57cc52661", "shasum": "" }, "require": { @@ -659,7 +659,7 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2026-04-16T14:03:50+00:00" + "time": "2026-07-21T16:49:22+00:00" }, { "name": "nesbot/carbon", diff --git a/libs/vendor/composer/autoload_psr4.php b/libs/vendor/composer/autoload_psr4.php index 59d732316..112ef67a8 100644 --- a/libs/vendor/composer/autoload_psr4.php +++ b/libs/vendor/composer/autoload_psr4.php @@ -28,7 +28,7 @@ return array( 'Psr\\Clock\\' => array($vendorDir . '/psr/clock/src'), 'Laravel\\SerializableClosure\\' => array($vendorDir . '/laravel/serializable-closure/src'), 'Invoker\\' => array($vendorDir . '/php-di/invoker/src'), - 'Illuminate\\Support\\' => array($vendorDir . '/illuminate/macroable', $vendorDir . '/illuminate/conditionable', $vendorDir . '/illuminate/collections'), + 'Illuminate\\Support\\' => array($vendorDir . '/illuminate/collections', $vendorDir . '/illuminate/conditionable', $vendorDir . '/illuminate/macroable'), 'Illuminate\\Contracts\\' => array($vendorDir . '/illuminate/contracts'), 'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'), 'Egulias\\EmailValidator\\' => array($vendorDir . '/egulias/email-validator/src'), diff --git a/libs/vendor/composer/autoload_static.php b/libs/vendor/composer/autoload_static.php index 5c76e3404..9c3def5cd 100644 --- a/libs/vendor/composer/autoload_static.php +++ b/libs/vendor/composer/autoload_static.php @@ -177,9 +177,9 @@ class ComposerStaticInitbadf1d01c367c06fb591106ea3486c30 ), 'Illuminate\\Support\\' => array ( - 0 => __DIR__ . '/..' . '/illuminate/macroable', + 0 => __DIR__ . '/..' . '/illuminate/collections', 1 => __DIR__ . '/..' . '/illuminate/conditionable', - 2 => __DIR__ . '/..' . '/illuminate/collections', + 2 => __DIR__ . '/..' . '/illuminate/macroable', ), 'Illuminate\\Contracts\\' => array ( diff --git a/libs/vendor/composer/installed.json b/libs/vendor/composer/installed.json index 93df7c2fd..ae023cc9e 100644 --- a/libs/vendor/composer/installed.json +++ b/libs/vendor/composer/installed.json @@ -74,17 +74,17 @@ }, { "name": "directorytree/imapengine", - "version": "v1.25.2", - "version_normalized": "1.25.2.0", + "version": "v1.25.3", + "version_normalized": "1.25.3.0", "source": { "type": "git", "url": "https://github.com/DirectoryTree/ImapEngine.git", - "reference": "8d5652bc3fac749cd7cf6240afb594ef018c0069" + "reference": "62d4f4080683b1b1136720bec8c90354709298fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/DirectoryTree/ImapEngine/zipball/8d5652bc3fac749cd7cf6240afb594ef018c0069", - "reference": "8d5652bc3fac749cd7cf6240afb594ef018c0069", + "url": "https://api.github.com/repos/DirectoryTree/ImapEngine/zipball/62d4f4080683b1b1136720bec8c90354709298fe", + "reference": "62d4f4080683b1b1136720bec8c90354709298fe", "shasum": "" }, "require": { @@ -99,7 +99,7 @@ "pestphp/pest": "^2.0|^3.0|^4.0", "spatie/ray": "^1.0" }, - "time": "2026-07-16T17:59:28+00:00", + "time": "2026-07-20T14:31:20+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -127,7 +127,7 @@ ], "support": { "issues": "https://github.com/DirectoryTree/ImapEngine/issues", - "source": "https://github.com/DirectoryTree/ImapEngine/tree/v1.25.2" + "source": "https://github.com/DirectoryTree/ImapEngine/tree/v1.25.3" }, "funding": [ { @@ -623,17 +623,17 @@ }, { "name": "laravel/serializable-closure", - "version": "v2.0.13", - "version_normalized": "2.0.13.0", + "version": "v2.0.15", + "version_normalized": "2.0.15.0", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "b566ee0dd251f3c4078bed003a7ce015f5ea6dce" + "reference": "dccd8bcb851bb03fcc005df650b708b57cc52661" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/b566ee0dd251f3c4078bed003a7ce015f5ea6dce", - "reference": "b566ee0dd251f3c4078bed003a7ce015f5ea6dce", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/dccd8bcb851bb03fcc005df650b708b57cc52661", + "reference": "dccd8bcb851bb03fcc005df650b708b57cc52661", "shasum": "" }, "require": { @@ -646,7 +646,7 @@ "phpstan/phpstan": "^2.0", "symfony/var-dumper": "^6.2.0|^7.0.0|^8.0.0" }, - "time": "2026-04-16T14:03:50+00:00", + "time": "2026-07-21T16:49:22+00:00", "type": "library", "extra": { "branch-alias": { diff --git a/libs/vendor/composer/installed.php b/libs/vendor/composer/installed.php index 06968d79a..a2e6da318 100644 --- a/libs/vendor/composer/installed.php +++ b/libs/vendor/composer/installed.php @@ -5,7 +5,7 @@ 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), - 'reference' => '9cc7e5ff3cdbb40dbee1aedd33418ddb668205fd', + 'reference' => '2b756f6ea4ca540c7f59b332a0168d76a5c8aaa3', 'name' => '__root__', 'dev' => false, ), @@ -16,7 +16,7 @@ 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), - 'reference' => '9cc7e5ff3cdbb40dbee1aedd33418ddb668205fd', + 'reference' => '2b756f6ea4ca540c7f59b332a0168d76a5c8aaa3', 'dev_requirement' => false, ), 'carbonphp/carbon-doctrine-types' => array( @@ -29,12 +29,12 @@ 'dev_requirement' => false, ), 'directorytree/imapengine' => array( - 'pretty_version' => 'v1.25.2', - 'version' => '1.25.2.0', + 'pretty_version' => 'v1.25.3', + 'version' => '1.25.3.0', 'type' => 'library', 'install_path' => __DIR__ . '/../directorytree/imapengine', 'aliases' => array(), - 'reference' => '8d5652bc3fac749cd7cf6240afb594ef018c0069', + 'reference' => '62d4f4080683b1b1136720bec8c90354709298fe', 'dev_requirement' => false, ), 'doctrine/lexer' => array( @@ -101,12 +101,12 @@ 'dev_requirement' => false, ), 'laravel/serializable-closure' => array( - 'pretty_version' => 'v2.0.13', - 'version' => '2.0.13.0', + 'pretty_version' => 'v2.0.15', + 'version' => '2.0.15.0', 'type' => 'library', 'install_path' => __DIR__ . '/../laravel/serializable-closure', 'aliases' => array(), - 'reference' => 'b566ee0dd251f3c4078bed003a7ce015f5ea6dce', + 'reference' => 'dccd8bcb851bb03fcc005df650b708b57cc52661', 'dev_requirement' => false, ), 'nesbot/carbon' => array( diff --git a/libs/vendor/directorytree/imapengine/src/Connection/ImapTokenizer.php b/libs/vendor/directorytree/imapengine/src/Connection/ImapTokenizer.php index 17e83f0a0..2755ba06a 100644 --- a/libs/vendor/directorytree/imapengine/src/Connection/ImapTokenizer.php +++ b/libs/vendor/directorytree/imapengine/src/Connection/ImapTokenizer.php @@ -387,6 +387,20 @@ class ImapTokenizer $this->advance(); } + // If no value was read, we will throw an exception since + // an atom must contain at least one valid character. + if ($value === '') { + if ($char === null) { + throw new ImapStreamException('Unexpected end of stream while reading atom'); + } + + throw new ImapParserException(sprintf( + 'Unexpected byte 0x%02X in response at buffer offset %d', + ord($char), + $this->position + )); + } + if (strcasecmp($value, 'NIL') === 0) { return new Nil($value); } @@ -437,7 +451,9 @@ class ImapTokenizer while ((strlen($this->buffer) - $this->position) < $length) { $data = $this->stream->fgets(); - if ($data === false) { + // If the stream did not return any data, we will stop + // filling the buffer until another read is attempted. + if ($data === false || $data === '') { return; } diff --git a/libs/vendor/laravel/serializable-closure/src/Serializers/Native.php b/libs/vendor/laravel/serializable-closure/src/Serializers/Native.php index 670500ccf..8c608c7e0 100644 --- a/libs/vendor/laravel/serializable-closure/src/Serializers/Native.php +++ b/libs/vendor/laravel/serializable-closure/src/Serializers/Native.php @@ -328,6 +328,10 @@ class Native implements Serializable */ protected function mapPointers(&$data) { + if ($data instanceof SerializableClosure || $data instanceof UnsignedSerializableClosure) { + return; + } + $scope = $this->scope; if ($data instanceof static) { @@ -363,6 +367,8 @@ class Native implements Serializable foreach ($data as $key => &$value) { if ($value instanceof SelfReference && $value->hash === $this->code['self']) { $data->{$key} = &$this->closure; + } elseif ($value instanceof static) { + $data->{$key} = &$value->closure; } elseif (is_array($value) || is_object($value)) { $this->mapPointers($value); } @@ -399,6 +405,8 @@ class Native implements Serializable 'property' => $property, 'object' => $item instanceof SelfReference ? $this : $item, ]; + } elseif ($item instanceof static) { + static::setPropertyValue($property, $data, $item->closure); } elseif (is_array($item) || is_object($item)) { $this->mapPointers($item); static::setPropertyValue($property, $data, $item); From 8f43b92496a34bef1807d756d41c8c64a372cc0a Mon Sep 17 00:00:00 2001 From: johnnyq Date: Thu, 23 Jul 2026 13:00:01 -0400 Subject: [PATCH 093/241] Use stripe_init include to init stripe and updated code everywhere --- admin/post/saved_payment_method.php | 2 +- .../post/settings_online_payment_clients.php | 2 +- agent/client_autopay.php | 2 +- agent/post/payment.php | 2 +- client/post.php | 10 ++++---- client/saved_payment_methods.php | 2 +- cron/cron.php | 4 +-- guest/guest_ajax.php | 2 +- guest/guest_pay_invoice_stripe.php | 2 +- includes/stripe_init.php | 25 +++++++++++++++++++ 10 files changed, 39 insertions(+), 14 deletions(-) create mode 100644 includes/stripe_init.php diff --git a/admin/post/saved_payment_method.php b/admin/post/saved_payment_method.php index 883ae630c..1f071fe05 100644 --- a/admin/post/saved_payment_method.php +++ b/admin/post/saved_payment_method.php @@ -42,7 +42,7 @@ if (isset($_GET['delete_saved_payment'])) { try { // Initialize stripe - require_once '../libs/stripe-php/init.php'; + require_once '../includes/stripe_init.php'; $stripe = new \Stripe\StripeClient($private_key); // Detach PM diff --git a/admin/post/settings_online_payment_clients.php b/admin/post/settings_online_payment_clients.php index bfa609081..23a91bff9 100644 --- a/admin/post/settings_online_payment_clients.php +++ b/admin/post/settings_online_payment_clients.php @@ -16,7 +16,7 @@ if (isset($_GET['stripe_remove_pm'])) { try { // Initialize stripe - require_once '../libs/stripe-php/init.php'; + require_once '../includes/stripe_init.php'; $stripe = new \Stripe\StripeClient($config_stripe_secret); // Detach PM diff --git a/agent/client_autopay.php b/agent/client_autopay.php index ff296f52c..a205ce8a3 100644 --- a/agent/client_autopay.php +++ b/agent/client_autopay.php @@ -6,7 +6,7 @@ require_once "includes/inc_all_client.php"; enforceUserPermission('module_sales'); // Initialize stripe -require_once 'libs/stripe-php/init.php'; +require_once '../includes/stripe_init.php'; // Get Stripe vars $stripe_vars = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT config_stripe_enable, config_stripe_publishable, config_stripe_secret FROM settings WHERE company_id = 1")); diff --git a/agent/post/payment.php b/agent/post/payment.php index e1e0be638..085f4c156 100644 --- a/agent/post/payment.php +++ b/agent/post/payment.php @@ -392,7 +392,7 @@ if (isset($_POST['add_payment_stripe'])) { } // Initialize Stripe - require_once __DIR__ . '/../../libs/stripe-php/init.php'; + require_once __DIR__ . '/../../includes/stripe_init.php'; $stripe = new \Stripe\StripeClient($private_key); $balance_to_pay = round($invoice_amount, 2); diff --git a/client/post.php b/client/post.php index 3923c1ce4..d4adaa6e5 100644 --- a/client/post.php +++ b/client/post.php @@ -573,7 +573,7 @@ if (isset($_GET['add_payment_by_provider'])) { } // Initialize Stripe - require_once __DIR__ . '/../libs/stripe-php/init.php'; + require_once __DIR__ . '/../includes/stripe_init.php'; $stripe = new \Stripe\StripeClient($private_key); $balance_to_pay = round($invoice_amount, 2); @@ -727,7 +727,7 @@ if (isset($_POST['create_stripe_customer'])) { if (!$existing_customer) { try { // Initialize Stripe - require_once '../libs/stripe-php/init.php'; + require_once '../includes/stripe_init.php'; $stripe = new \Stripe\StripeClient($stripe_secret_key); // Create new customer in Stripe @@ -821,7 +821,7 @@ if (isset($_GET['create_stripe_checkout'])) { $return_url = "https://$config_base_url/client/post.php?stripe_save_card&session_id={CHECKOUT_SESSION_ID}"; try { - require_once '../libs/stripe-php/init.php'; + require_once '../includes/stripe_init.php'; $stripe = new \Stripe\StripeClient($stripe_secret_key); // Create checkout session @@ -895,7 +895,7 @@ if (isset($_GET['stripe_save_card'])) { $checkout_session_id = escapeSql($_GET['session_id']); try { - require_once '../libs/stripe-php/init.php'; + require_once '../includes/stripe_init.php'; $stripe = new \Stripe\StripeClient($stripe_secret_key); // Retrieve checkout session & setup intent @@ -1031,7 +1031,7 @@ if (isset($_GET['delete_saved_payment'])) { try { // Initialize Stripe - require_once '../libs/stripe-php/init.php'; + require_once '../includes/stripe_init.php'; $stripe = new \Stripe\StripeClient($stripe_secret_key); // Detach the payment method from Stripe diff --git a/client/saved_payment_methods.php b/client/saved_payment_methods.php index 700a246af..39c543b08 100644 --- a/client/saved_payment_methods.php +++ b/client/saved_payment_methods.php @@ -11,7 +11,7 @@ if ($session_contact_primary == 0 && !$session_contact_is_billing_contact) { } // Initialize Stripe -require_once '../libs/stripe-php/init.php'; +require_once '../includes/stripe_init.php'; // Get Stripe provider info $stripe_provider_query = mysqli_query($mysqli, " diff --git a/cron/cron.php b/cron/cron.php index 0713245a6..04d879d76 100644 --- a/cron/cron.php +++ b/cron/cron.php @@ -834,7 +834,7 @@ while ($row = mysqli_fetch_assoc($sql_recurring_payments)) { // Stripe if ($provider_name === "Stripe") { if ($provider_private_key && $stripe_customer_id && $stripe_payment_method_id) { - require_once __DIR__ . '/../libs/stripe-php/init.php'; + require_once __DIR__ . '/../includes/stripe_init.php'; $stripe = new \Stripe\StripeClient($provider_private_key); $balance_to_pay = round($invoice_amount, 2); @@ -970,7 +970,7 @@ if ($stripe_provider) { if ($sql_missing_fee && mysqli_num_rows($sql_missing_fee) > 0) { - require_once __DIR__ . '/../libs/stripe-php/init.php'; + require_once __DIR__ . '/../includes/stripe_init.php'; $stripe = new \Stripe\StripeClient($provider_private_key); while ($missing = mysqli_fetch_assoc($sql_missing_fee)) { diff --git a/guest/guest_ajax.php b/guest/guest_ajax.php index 8f268eda2..68f9ffaf9 100644 --- a/guest/guest_ajax.php +++ b/guest/guest_ajax.php @@ -69,7 +69,7 @@ if (isset($_GET['stripe_create_pi'])) { } $stripe_secret_key = $stripe_provider['payment_provider_private_key']; - require_once '../libs/stripe-php/init.php'; + require_once '../includes/stripe_init.php'; $pi_description = "ITFlow: $client_name payment of $invoice_currency_code $balance_to_pay for $invoice_prefix$invoice_number"; diff --git a/guest/guest_pay_invoice_stripe.php b/guest/guest_pay_invoice_stripe.php index ab87e053f..d7c8c07bd 100644 --- a/guest/guest_pay_invoice_stripe.php +++ b/guest/guest_pay_invoice_stripe.php @@ -156,7 +156,7 @@ if (isset($_GET['invoice_id'], $_GET['url_key']) && !isset($_GET['payment_intent $pi_id = escapeSql($_GET['payment_intent']); $pi_cs = $_GET['payment_intent_client_secret']; - require_once '../libs/stripe-php/init.php'; + require_once '../includes/stripe_init.php'; \Stripe\Stripe::setApiKey($stripe_secret); $pi_obj = \Stripe\PaymentIntent::retrieve($pi_id); diff --git a/includes/stripe_init.php b/includes/stripe_init.php new file mode 100644 index 000000000..fc994e5c1 --- /dev/null +++ b/includes/stripe_init.php @@ -0,0 +1,25 @@ + Date: Thu, 23 Jul 2026 13:17:41 -0400 Subject: [PATCH 094/241] Update Functions in ticket_edit_vendor and document link vendor and deleted legacy code unused that had legacy functions tied to them --- .../modals/document/document_link_vendor.php | 4 +- agent/modals/ticket/ticket_edit_vendor.php | 4 +- agent/post/vendor_contact.php | 478 ------------------ agent/post/vendor_contact_model.php | 13 - agent/vendor.php | 263 ---------- 5 files changed, 4 insertions(+), 758 deletions(-) delete mode 100644 agent/post/vendor_contact.php delete mode 100644 agent/post/vendor_contact_model.php delete mode 100644 agent/vendor.php diff --git a/agent/modals/document/document_link_vendor.php b/agent/modals/document/document_link_vendor.php index 4d2068734..5301c65a6 100644 --- a/agent/modals/document/document_link_vendor.php +++ b/agent/modals/document/document_link_vendor.php @@ -10,7 +10,7 @@ $sql = mysqli_query($mysqli, "SELECT * FROM documents "); $row = mysqli_fetch_assoc($sql); -$document_name = nullable_htmlentities($row['document_name']); +$document_name = escapeHtml($row['document_name']); $client_id = intval($row['document_client_id']); enforceClientAccess(); @@ -51,7 +51,7 @@ ob_start(); "); while ($row = mysqli_fetch_assoc($sql_vendors_select)) { $vendor_id = intval($row['vendor_id']); - $vendor_name = nullable_htmlentities($row['vendor_name']); + $vendor_name = escapeHtml($row['vendor_name']); ?> diff --git a/agent/modals/ticket/ticket_edit_vendor.php b/agent/modals/ticket/ticket_edit_vendor.php index df44edad9..f9bbc0e1a 100644 --- a/agent/modals/ticket/ticket_edit_vendor.php +++ b/agent/modals/ticket/ticket_edit_vendor.php @@ -9,7 +9,7 @@ $ticket_id = intval($_GET['ticket_id']); $sql = mysqli_query($mysqli, "SELECT * FROM tickets WHERE ticket_id = $ticket_id LIMIT 1"); $row = mysqli_fetch_assoc($sql); -$ticket_prefix = nullable_htmlentities($row['ticket_prefix']); +$ticket_prefix = escapeHtml($row['ticket_prefix']); $ticket_number = intval($row['ticket_number']); $vendor_id = intval($row['ticket_vendor_id']); $client_id = intval($row['ticket_client_id']); @@ -46,7 +46,7 @@ ob_start(); $sql_vendors = mysqli_query($mysqli, "SELECT vendor_id, vendor_name FROM vendors WHERE vendor_client_id = $client_id AND vendor_archived_at IS NULL ORDER BY vendor_name ASC"); while ($row = mysqli_fetch_assoc($sql_vendors)) { $vendor_id_select = intval($row['vendor_id']); - $vendor_name = nullable_htmlentities($row['vendor_name']); + $vendor_name = escapeHtml($row['vendor_name']); ?> diff --git a/agent/post/vendor_contact.php b/agent/post/vendor_contact.php deleted file mode 100644 index 4b70b03c0..000000000 --- a/agent/post/vendor_contact.php +++ /dev/null @@ -1,478 +0,0 @@ -$name created"); - - redirect(); - -} - -if (isset($_POST['edit_vendor_contact'])) { - - validateCSRFToken($_POST['csrf_token']); - - enforceUserPermission('module_client', 2); - - require_once 'post/user/vendor_contact_model.php'; - - $vendor_contact_id = intval($_POST['vendor_contact_id']); - - mysqli_query($mysqli,"UPDATE vendor_contacts SET vendor_contact_name = '$name', vendor_contact_title = '$title', vendor_contact_phone = '$phone', vendor_contact_extension = '$extension', vendor_contact_mobile = '$mobile', vendor_contact_email = '$email', contact_pin = '$pin', vendor_contact_notes = '$notes', vendor_contact_department = '$department' WHERE vendor_contact_id = $vendor_contact_id"); - - logAction("Vendor Contact", "Edit", "$session_name edited vendor contact $name", $client_id, $vendor_contact_id); - - customAction('vendor_contact_update', $vendor_contact_id); - - flash_alert("Vendor Contact $name updated"); - - redirect(); - -} - -if (isset($_POST['bulk_archive_vendor_contacts'])) { - - validateCSRFToken($_POST['csrf_token']); - - enforceUserPermission('module_client', 2); - - if (isset($_POST['vendor_contact_ids'])) { - - $count = 0; // Default 0 - - // Cycle through array and archive each contact - foreach ($_POST['vendor_contact_ids'] as $vendor_contact_id) { - - $vendor_contact_id = intval($vendor_contact_id); - - // Get Contact Name and Client ID for logging and alert message - $sql = mysqli_query($mysqli,"SELECT vendor_contact_name, vendor_contact_client_id FROM vendor_contacts WHERE vendor_contact_id = $vendor_contact_id"); - $row = mysqli_fetch_assoc($sql); - $vendor_contact_name = sanitizeInput($row['vendor_contact_name']); - $client_id = intval($row['contact_client_id']); - - } - - logAction("Vendor Contact", "Bulk Archive", "$session_name archived $count vendor contacts", $client_id); - - flash_alert("Archived $count vendor contact(s)", 'error'); - - } - - redirect(); - -} - -if (isset($_POST['bulk_restore_vendor_contacts'])) { - - validateCSRFToken($_POST['csrf_token']); - - enforceUserPermission('module_client', 2); - - if (isset($_POST['contact_ids'])) { - - // Get Selected Contacts Count - $count = count($_POST['contact_ids']); - - // Cycle through array and unarchive each contact - foreach ($_POST['contact_ids'] as $contact_id) { - - $contact_id = intval($contact_id); - - // Get Contact Name and Client ID for logging and alert message - $sql = mysqli_query($mysqli,"SELECT contact_name, contact_client_id, contact_user_id FROM contacts WHERE contact_id = $contact_id"); - $row = mysqli_fetch_assoc($sql); - $contact_name = sanitizeInput($row['contact_name']); - $client_id = intval($row['contact_client_id']); - $contact_user_id = intval($row['contact_user_id']); - - // unArchive Contact User - if ($contact_user_id > 0) { - mysqli_query($mysqli,"UPDATE users SET user_archived_at = NULL WHERE user_id = $contact_user_id"); - } - - mysqli_query($mysqli,"UPDATE contacts SET contact_archived_at = NULL WHERE contact_id = $contact_id"); - - logAction("Contact", "Restore", "$session_name restored $contact_name", $client_id, $contact_id); - - } - - logAction("Contact", "Bulk Restore", "$session_name restored $count contacts", $client_id); - - flash_alert("Restored $count contact(s)"); - - } - - redirect(); - -} - -if (isset($_POST['bulk_delete_vendor_contacts'])) { - - validateCSRFToken($_POST['csrf_token']); - - enforceUserPermission('module_client', 3); - - if (isset($_POST['contact_ids'])) { - - // Get Selected Contacts Count - $count = count($_POST['contact_ids']); - - // Cycle through array and delete each record - foreach ($_POST['contact_ids'] as $contact_id) { - - $contact_id = intval($contact_id); - - // Get Name and Client ID for logging and alert message - $sql = mysqli_query($mysqli,"SELECT contact_name, contact_client_id, contact_user_id FROM contacts WHERE contact_id = $contact_id"); - $row = mysqli_fetch_assoc($sql); - $contact_name = sanitizeInput($row['contact_name']); - $client_id = intval($row['contact_client_id']); - $contact_user_id = intval($row['contact_user_id']); - - // Delete Contact User - if ($contact_user_id > 0) { - mysqli_query($mysqli,"DELETE FROM users WHERE user_id = $contact_user_id"); - } - - mysqli_query($mysqli, "DELETE FROM contacts WHERE contact_id = $contact_id AND contact_client_id = $client_id"); - - // Remove Relations - mysqli_query($mysqli, "DELETE FROM contact_tags WHERE contact_id = $contact_id"); - mysqli_query($mysqli, "DELETE FROM contact_assets WHERE contact_id = $contact_id"); - mysqli_query($mysqli, "DELETE FROM contact_documents WHERE contact_id = $contact_id"); - mysqli_query($mysqli, "DELETE FROM contact_files WHERE contact_id = $contact_id"); - mysqli_query($mysqli, "DELETE FROM contact_logins WHERE contact_id = $contact_id"); - mysqli_query($mysqli, "DELETE FROM contact_notes WHERE contact_note_contact_id = $contact_id"); - - logAction("Contact", "Delete", "$session_name deleted $contact_name", $client_id); - - } - - logAction("Contact", "Bulk Delete", "$session_name deleted $count contacts", $client_id); - - flash_alert("You deleted $count contact(s)", 'error'); - - } - - redirect(); - -} - - -if (isset($_GET['archive_vendor_contact'])) { - - validateCSRFToken($_GET['csrf_token']); - - enforceUserPermission('module_client', 2); - - $contact_id = intval($_GET['archive_contact']); - - // Get Contact Name and Client ID for logging and alert message - $sql = mysqli_query($mysqli,"SELECT contact_name, contact_client_id, contact_user_id FROM contacts WHERE contact_id = $contact_id"); - $row = mysqli_fetch_assoc($sql); - $contact_name = sanitizeInput($row['contact_name']); - $client_id = intval($row['contact_client_id']); - $contact_user_id = intval($row['contact_user_id']); - - // Archive Contact User - if ($contact_user_id > 0) { - mysqli_query($mysqli,"UPDATE users SET user_archived_at = NOW() WHERE user_id = $contact_user_id"); - } - - mysqli_query($mysqli,"UPDATE contacts SET contact_important = 0, contact_billing = 0, contact_technical = 0, contact_archived_at = NOW() WHERE contact_id = $contact_id"); - - logAction("Contact", "Archive", "$session_name archived contact $contact_name", $client_id, $contact_id); - - flash_alert("Contact $contact_name has been archived", 'alert'); - - redirect(); - -} - -if (isset($_GET['restore_vendor_contact'])) { - - validateCSRFToken($_GET['csrf_token']); - - enforceUserPermission('module_client', 2); - - $contact_id = intval($_GET['restre_contact']); - - // Get Contact Name and Client ID for logging and alert message - $sql = mysqli_query($mysqli,"SELECT contact_name, contact_client_id, contact_user_id FROM contacts WHERE contact_id = $contact_id"); - $row = mysqli_fetch_assoc($sql); - $contact_name = sanitizeInput($row['contact_name']); - $client_id = intval($row['contact_client_id']); - $contact_user_id = intval($row['contact_user_id']); - - // unArchive Contact User - if ($contact_user_id > 0) { - mysqli_query($mysqli,"UPDATE users SET user_archived_at = NULL WHERE user_id = $contact_user_id"); - } - - mysqli_query($mysqli,"UPDATE contacts SET contact_archived_at = NULL WHERE contact_id = $contact_id"); - - logAction("Contact", "Restore", "$session_name restored contact $contact_name", $client_id, $contact_id); - - flash_alert("Contact $contact_name Restored"); - - redirect(); - -} - -if (isset($_GET['delete_vendor_contact'])) { - - validateCSRFToken($_GET['csrf_token']); - - enforceUserPermission('module_client', 3); - - $contact_id = intval($_GET['delete_contact']); - - // Get Contact Name and Client ID for logging and alert message - $sql = mysqli_query($mysqli,"SELECT contact_name, contact_client_id FROM contacts WHERE contact_id = $contact_id"); - $row = mysqli_fetch_assoc($sql); - $contact_name = sanitizeInput($row['contact_name']); - $client_id = intval($row['contact_client_id']); - $contact_user_id = intval($row['contact_user_id']); - - // Delete User - if ($contact_user_id > 0) { - mysqli_query($mysqli,"DELETE FROM users WHERE user_id = $contact_user_id"); - } - - mysqli_query($mysqli,"DELETE FROM contacts WHERE contact_id = $contact_id"); - - // Remove Relations - mysqli_query($mysqli, "DELETE FROM contact_tags WHERE contact_id = $contact_id"); - mysqli_query($mysqli, "DELETE FROM contact_assets WHERE contact_id = $contact_id"); - mysqli_query($mysqli, "DELETE FROM contact_documents WHERE contact_id = $contact_id"); - mysqli_query($mysqli, "DELETE FROM contact_files WHERE contact_id = $contact_id"); - mysqli_query($mysqli, "DELETE FROM contact_logins WHERE contact_id = $contact_id"); - mysqli_query($mysqli, "DELETE FROM contact_notes WHERE contact_note_contact_id = $contact_id"); - - logAction("Contact", "Delete", "$session_name deleted contact $contact_name", $client_id); - - flash_alert("Contact $contact_name has been deleted.", 'error'); - - redirect(); - -} - -if (isset($_POST['export_vendor_contacts_csv'])) { - - validateCSRFToken($_POST['csrf_token']); - - enforceUserPermission('module_client'); - - $client_id = intval($_POST['client_id']); - - //get records from database - $sql = mysqli_query($mysqli,"SELECT client_name FROM clients WHERE client_id = $client_id"); - $row = mysqli_fetch_assoc($sql); - - $client_name = $row['client_name']; - - //Contacts - $sql = mysqli_query($mysqli,"SELECT * FROM contacts LEFT JOIN locations ON location_id = contact_location_id WHERE contact_client_id = $client_id AND contact_archived_at IS NULL ORDER BY contact_name ASC"); - $num_rows = mysqli_num_rows($sql); - - if ($num_rows > 0) { - $delimiter = ","; - $filename = strtoAZaz09($client_name) . "-Contacts-" . date('Y-m-d') . ".csv"; - - //create a file pointer - $f = fopen('php://memory', 'w'); - - //set column headers - $fields = array('Name', 'Title', 'Department', 'Email', 'Phone', 'Ext', 'Mobile', 'Location'); - fputcsv($f, $fields, $delimiter); - - //output each row of the data, format line as csv and write to file pointer - while($row = $sql->fetch_assoc()) { - $lineData = array($row['contact_name'], $row['contact_title'], $row['contact_department'], $row['contact_email'], formatPhoneNumber($row['contact_phone']), $row['contact_extension'], formatPhoneNumber($row['contact_mobile']), $row['location_name']); - fputcsv($f, $lineData, $delimiter); - } - - //move back to beginning of file - fseek($f, 0); - - //set headers to download file rather than displayed - header('Content-Type: text/csv'); - header('Content-Disposition: attachment; filename="' . $filename . '";'); - - //output all remaining data on a file pointer - fpassthru($f); - - } - - logAction("Contact", "Export", "$session_name exported $num_rows contact(s) to a CSV file", $client_id); - - exit; - -} - -if (isset($_POST["import_vendor_contacts_csv"])) { - - validateCSRFToken($_POST['csrf_token']); - - enforceUserPermission('module_client', 2); - - $client_id = intval($_POST['client_id']); - $error = false; - - if (!empty($_FILES["file"]["tmp_name"])) { - $file_name = $_FILES["file"]["tmp_name"]; - } else { - flash_alert("Please select a file to upload.", 'error'); - redirect(); - } - - //Check file is CSV - $file_extension = strtolower(end(explode('.',$_FILES['file']['name']))); - $allowed_file_extensions = array('csv'); - if (in_array($file_extension,$allowed_file_extensions) === false) { - $error = true; - flash_alert("Bad file extension", 'error'); - } - - //Check file isn't empty - elseif ($_FILES["file"]["size"] < 1) { - $error = true; - flash_alert("Bad file size (empty?)", 'error'); - } - - //(Else)Check column count - $f = fopen($file_name, "r"); - $f_columns = fgetcsv($f, 1000, ","); - if (!$error & count($f_columns) != 8) { - $error = true; - flash_alert("Bad column count.", 'error'); - } - - //Else, parse the file - if (!$error) { - $file = fopen($file_name, "r"); - fgetcsv($file, 1000, ","); // Skip first line - $row_count = 0; - $duplicate_count = 0; - while(($column = fgetcsv($file, 1000, ",")) !== false) { - $duplicate_detect = 0; - if (isset($column[0])) { - $name = sanitizeInput($column[0]); - if (mysqli_num_rows(mysqli_query($mysqli,"SELECT * FROM contacts WHERE contact_name = '$name' AND contact_client_id = $client_id")) > 0) { - $duplicate_detect = 1; - } - } - if (isset($column[1])) { - $title = sanitizeInput($column[1]); - } - if (isset($column[2])) { - $department = sanitizeInput($column[2]); - } - if (isset($column[3])) { - $email = sanitizeInput($column[3]); - } - if (isset($column[4])) { - $phone = preg_replace("/[^0-9]/", '',$column[4]); - } - if (isset($column[5])) { - $ext = preg_replace("/[^0-9]/", '',$column[5]); - } - if (isset($column[6])) { - $mobile = preg_replace("/[^0-9]/", '',$column[6]); - } - if (isset($column[7])) { - $location = sanitizeInput($column[7]); - $sql_location = mysqli_query($mysqli,"SELECT * FROM locations WHERE location_name = '$location' AND location_client_id = $client_id"); - $row = mysqli_fetch_assoc($sql_location); - $location_id = intval($row['location_id']); - } - // Potentially import the rest in the future? - - // Check if duplicate was detected - if ($duplicate_detect == 0) { - //Add - mysqli_query($mysqli,"INSERT INTO contacts SET contact_name = '$name', contact_title = '$title', contact_department = '$department', contact_email = '$email', contact_phone = '$phone', contact_extension = '$ext', contact_mobile = '$mobile', contact_location_id = $location_id, contact_client_id = $client_id"); - $row_count = $row_count + 1; - }else{ - $duplicate_count = $duplicate_count + 1; - } - } - fclose($file); - - logAction("Contact", "Import", "$session_name imported $row_count contact(s) via CSV file", $client_id); - - flash_alert("$row_count Contact(s) added, $duplicate_count duplicate(s) detected", 'warning'); - - redirect(); - } - //Check for any errors, if there are notify user and redirect - if ($error) { - redirect(); - } - -} - -if (isset($_GET['download_vendor_contacts_csv_template'])) { - - validateCSRFToken($_GET['csrf_token']); - - $client_id = intval($_GET['download_client_contacts_csv_template']); - - //get records from database - $sql = mysqli_query($mysqli,"SELECT client_name FROM clients WHERE client_id = $client_id"); - $row = mysqli_fetch_assoc($sql); - - $client_name = $row['client_name']; - - $delimiter = ","; - $filename = strtoAZaz09($client_name) . "-Contacts-Template.csv"; - - //create a file pointer - $f = fopen('php://memory', 'w'); - - //set column headers - $fields = array( - 'Full Name ', - 'Job Title ', - 'Department Name ', - 'Email Address ', - 'Office Phone ', - 'Office Extension ', - 'Mobile Phone ', - 'Office Location ' - ); - fputcsv($f, $fields, $delimiter); - - //move back to beginning of file - fseek($f, 0); - - //set headers to download file rather than displayed - header('Content-Type: text/csv'); - header('Content-Disposition: attachment; filename="' . $filename . '";'); - - //output all remaining data on a file pointer - fpassthru($f); - exit; - -} diff --git a/agent/post/vendor_contact_model.php b/agent/post/vendor_contact_model.php deleted file mode 100644 index 7d9ece857..000000000 --- a/agent/post/vendor_contact_model.php +++ /dev/null @@ -1,13 +0,0 @@ - - -
    - -
    - -
    -
    - -

    - -
    - -
    - -
    - - - -
    x
    - -
    - -
    - - - -
    -
    - -
    -
    -
    Notes
    -
    - -
    - -
    - -
    - - - - - - -
    "> -
    -

    Contacts

    -
    -
    -
    - - - - - - - - - - - - - - $vendor_contact_title"; - } - $vendor_contact_department = nullable_htmlentities($row['vendor_contact_department']); - if (empty($vendor_contact_department)) { - $vendor_contact_department_display = "-"; - } else { - $vendor_contact_department_display = $vendor_contact_department; - } - $vendor_contact_extension = nullable_htmlentities($row['vendor_contact_extension']); - if (empty($vendor_contact_extension)) { - $vendor_contact_extension_display = ""; - } else { - $vendor_contact_extension_display = "x$vendor_contact_extension"; - } - $vendor_contact_phone = formatPhoneNumber($row['vendor_contact_phone']); - if (empty($vendor_contact_phone)) { - $vendor_contact_phone_display = ""; - } else { - $vendor_contact_phone_display = ""; - } - - $vendor_contact_mobile = formatPhoneNumber($row['vendor_contact_mobile']); - if (empty($vendor_contact_mobile)) { - $vendor_contact_mobile_display = ""; - } else { - $vendor_contact_mobile_display = ""; - } - $vendor_contact_email = nullable_htmlentities($row['vendor_contact_email']); - if (empty($vendor_contact_email)) { - $vendor_contact_email_display = ""; - } else { - $vendor_contact_email_display = ""; - } - $vendor_contact_info_display = "$vendor_contact_phone_display $vendor_contact_mobile_display $vendor_contact_email_display"; - if (empty($vendor_contact_info_display)) { - $vendor_contact_info_display = "-"; - } - $vendor_contact_notes = nullable_htmlentities($row['vendor_contact_notes']); - $vendor_contact_created_at = nullable_htmlentities($row['vendor_contact_created_at']); - $vendor_contact_archived_at = nullable_htmlentities($row['vendor_contact_archived_at']); - - ?> - - - - - - - - - - - - -
    NameTitleDepartmentPhoneMobileEmailAction
    -
    - -
    -
    -
    - - - - Date: Thu, 23 Jul 2026 13:26:06 -0400 Subject: [PATCH 095/241] Remove a few more unused vendor contact modals and update the escaping in rename modal vendor_details.php to vendor.php --- .../vendor/{vendor_details.php => vendor.php} | 20 ++-- agent/modals/vendor/vendor_contact_add.php | 95 ------------------- agent/modals/vendor/vendor_contact_edit.php | 95 ------------------- 3 files changed, 10 insertions(+), 200 deletions(-) rename agent/modals/vendor/{vendor_details.php => vendor.php} (86%) delete mode 100644 agent/modals/vendor/vendor_contact_add.php delete mode 100644 agent/modals/vendor/vendor_contact_edit.php diff --git a/agent/modals/vendor/vendor_details.php b/agent/modals/vendor/vendor.php similarity index 86% rename from agent/modals/vendor/vendor_details.php rename to agent/modals/vendor/vendor.php index 1f0a86a01..03a59c411 100644 --- a/agent/modals/vendor/vendor_details.php +++ b/agent/modals/vendor/vendor.php @@ -7,18 +7,18 @@ $vendor_id = intval($_GET['id']); $sql = mysqli_query($mysqli, "SELECT * FROM vendors WHERE vendor_id = $vendor_id LIMIT 1"); $row = mysqli_fetch_assoc($sql); -$name = escapeSql($row['vendor_name']); -$description = escapeSql($row['vendor_description']); -$account_number = escapeSql($row['vendor_account_number']); -$contact_name = escapeSql($row['vendor_contact_name']); +$name = escapeHtml($row['vendor_name']); +$description = escapeHtml($row['vendor_description']); +$account_number = escapeHtml($row['vendor_account_number']); +$contact_name = escapeHtml($row['vendor_contact_name']); $phone = preg_replace("/[^0-9]/", '',$row['vendor_phone']); $extension = preg_replace("/[^0-9]/", '',$row['vendor_extension']); -$email = escapeSql($row['vendor_email']); -$website = escapeSql($row['vendor_website']); -$hours = escapeSql($row['vendor_hours']); -$sla = escapeSql($row['vendor_sla']); -$code = escapeSql($row['vendor_code']); -$notes = escapeSql($row['vendor_notes']); +$email = escapeHtml($row['vendor_email']); +$website = escapeHtml($row['vendor_website']); +$hours = escapeHtml($row['vendor_hours']); +$sla = escapeHtml($row['vendor_sla']); +$code = escapeHtml($row['vendor_code']); +$notes = escapeHtml($row['vendor_notes']); $client_id = intval($row['vendor_client_id']); if ($client_id) { diff --git a/agent/modals/vendor/vendor_contact_add.php b/agent/modals/vendor/vendor_contact_add.php deleted file mode 100644 index 52a91237a..000000000 --- a/agent/modals/vendor/vendor_contact_add.php +++ /dev/null @@ -1,95 +0,0 @@ - diff --git a/agent/modals/vendor/vendor_contact_edit.php b/agent/modals/vendor/vendor_contact_edit.php deleted file mode 100644 index a3319cb8f..000000000 --- a/agent/modals/vendor/vendor_contact_edit.php +++ /dev/null @@ -1,95 +0,0 @@ - From 40be80981d2535d168b33230c688e941e94d3b1c Mon Sep 17 00:00:00 2001 From: johnnyq Date: Thu, 23 Jul 2026 13:34:08 -0400 Subject: [PATCH 096/241] Fix vendor modal link in service details --- agent/modals/service/service_details.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agent/modals/service/service_details.php b/agent/modals/service/service_details.php index ba939f472..de21712f0 100644 --- a/agent/modals/service/service_details.php +++ b/agent/modals/service/service_details.php @@ -223,7 +223,7 @@ ob_start(); while ($row = mysqli_fetch_assoc($sql_vendors)) { $vendor_id = intval($row['vendor_id']); $vendor_name = escapeHtml($row['vendor_name']); - echo "
  • $vendor_name
  • "; + echo "
  • $vendor_name
  • "; } echo ""; } From 90bc8ed029a50fa0798561cf4671be611ec81337 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Thu, 23 Jul 2026 13:43:04 -0400 Subject: [PATCH 097/241] Fix broken links to modals and remove _details from service --- agent/modals/asset/asset.php | 2 +- agent/modals/contact/contact.php | 2 +- agent/modals/service/{service_details.php => service.php} | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) rename agent/modals/service/{service_details.php => service.php} (98%) diff --git a/agent/modals/asset/asset.php b/agent/modals/asset/asset.php index 8335b7723..e1751ed97 100644 --- a/agent/modals/asset/asset.php +++ b/agent/modals/asset/asset.php @@ -473,7 +473,7 @@ ob_start(); // Show either "-" or "AssetName - Port" if ($connected_asset_name) { $connected_to_display = " + data-modal-url='modals/asset/asset.php?id=$connected_asset_id'> $connected_asset_name - $connected_interface_name "; diff --git a/agent/modals/contact/contact.php b/agent/modals/contact/contact.php index eef8d87c2..fedfd170a 100644 --- a/agent/modals/contact/contact.php +++ b/agent/modals/contact/contact.php @@ -491,7 +491,7 @@ ob_start(); + data-modal-url="modals/asset/asset.php?id="> "; } ?> diff --git a/agent/modals/service/service_details.php b/agent/modals/service/service.php similarity index 98% rename from agent/modals/service/service_details.php rename to agent/modals/service/service.php index de21712f0..80c2ca574 100644 --- a/agent/modals/service/service_details.php +++ b/agent/modals/service/service.php @@ -123,7 +123,7 @@ ob_start(); $asset_id = intval($row['asset_id']); $asset_name = escapeHtml($row['asset_name']); $ip = !empty($row['interface_ip']) ? '(' . escapeHtml($row['interface_ip']) . ')' : ''; - echo "
  • $asset_name$ip
  • "; + echo "
  • $asset_name$ip
  • "; } echo ""; } @@ -237,7 +237,7 @@ ob_start(); while ($row = mysqli_fetch_assoc($sql_contacts)) { $contact_id = intval($row['contact_id']); $contact_name = escapeHtml($row['contact_name']); - echo "
  • $contact_name
  • "; + echo "
  • $contact_name
  • "; } echo ""; } From 3d94846a6108d495c97176322d028c3d7a345cb1 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Thu, 23 Jul 2026 13:48:00 -0400 Subject: [PATCH 098/241] Fix broken link to service modal in services --- agent/services.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agent/services.php b/agent/services.php index 42f89967b..227419901 100644 --- a/agent/services.php +++ b/agent/services.php @@ -168,7 +168,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); + data-modal-url="modals/service/service.php?id=">
    From 9c65644adc39732632c8f8a4747384c6e1cbd077 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Thu, 23 Jul 2026 17:39:06 -0400 Subject: [PATCH 099/241] Update the rest of the PHP functions to use camelCase --- CONTRIBUTING.md | 2 +- admin/debug.php | 8 +-- admin/includes/side_nav.php | 2 +- admin/post/backup.php | 66 ++++++++++----------- admin/settings_mail.php | 6 +- agent/asset.php | 6 +- agent/assets.php | 6 +- agent/client_overview.php | 4 +- agent/credentials.php | 4 +- agent/files.php | 12 ++-- agent/includes/side_nav.php | 2 +- agent/modals/asset/asset.php | 6 +- agent/modals/client/client_add.php | 4 +- agent/modals/contact/contact_add.php | 4 +- agent/modals/credential/credential_edit.php | 4 +- agent/modals/domain/domain_add.php | 4 +- agent/modals/service/service.php | 4 +- agent/reports/includes/reports_side_nav.php | 2 +- agent/reports/ticket_by_client.php | 40 ------------- agent/reports/tickets_unbilled.php | 38 ------------ agent/reports/time_by_tech.php | 40 ------------- client/assets.php | 2 +- client/index.php | 2 +- functions/format.php | 41 +++++++++++++ functions/sanitize.php | 2 +- includes/top_nav.php | 2 +- setup/index.php | 6 +- 27 files changed, 121 insertions(+), 198 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9d35972a0..0acad1b2b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -128,7 +128,7 @@ That is the whole job. `LATEST_DATABASE_VERSION` is derived from the highest-num A single update run applies every pending migration in order, stopping at the first failure with the version left at the last file that completed, so a re-run resumes at the one that broke. **After acting, log and notify.** State changes call `logAudit($type, $action, $description, $client_id, $entity_id)` for the audit trail. User-facing events may also call `appNotify()`. Fire `triggerCustomAction()` where a site might reasonably want a hook. Then call `flashAlert($message, $type)` and `redirect()` (defaults to the referer) rather than setting session keys or `header()` manually. -**Function names (post-rename).** Helpers were renamed for clarity in 2026; the old names **no longer exist** — code calling them fatals. If you're rebasing an old PR or following an old tutorial, translate: `sanitizeInput` → `escapeSql`, `nullable_htmlentities` → `escapeHtml`, `logAction` → `logAudit`, `flash_alert` → `flashAlert`, `customAction` → `triggerCustomAction`, `encryptLoginEntry`/`decryptLoginEntry` → `encryptCredentialEntry`/`decryptCredentialEntry`, `strtoAZaz09` → `toAlphanumeric`, `fetchUpdates` → `checkForUpdates`. +**Function names (post-rename).** Helpers were renamed for clarity in 2026; the old names **no longer exist** — code calling them fatals. If you're rebasing an old PR or following an old tutorial, translate: `sanitizeInput` → `escapeSql`, `nullable_htmlentities` → `escapeHtml`, `logAction` → `logAudit`, `flash_alert` → `flashAlert`, `customAction` → `triggerCustomAction`, `encryptLoginEntry`/`decryptLoginEntry` → `encryptCredentialEntry`/`decryptCredentialEntry`, `strtoAZaz09` → `toAlphanumeric`, `fetchUpdates` → `checkForUpdates`, `sanitize_url` → `escapeUrl`. **Bulk vs. single actions.** If you change the behavior of a single action (e.g. resolving a ticket), check whether a `bulk_*` counterpart exists and update it too. They are currently parallel implementations and drift between them is a known bug source. diff --git a/admin/debug.php b/admin/debug.php index a0759651c..16a7ef452 100644 --- a/admin/debug.php +++ b/admin/debug.php @@ -79,7 +79,7 @@ $phpConfig[] = [ ]; // Check upload_max_filesize and post_max_size >= 500M -function return_bytes($val) { +function toBytes($val) { $val = trim($val); $unit = strtolower(substr($val, -1)); $num = (float)$val; @@ -99,8 +99,8 @@ $required_bytes = 500 * 1024 * 1024; // 500M in bytes $upload_max_filesize = ini_get('upload_max_filesize'); $post_max_size = ini_get('post_max_size'); -$upload_passed = return_bytes($upload_max_filesize) >= $required_bytes; -$post_passed = return_bytes($post_max_size) >= $required_bytes; +$upload_passed = toBytes($upload_max_filesize) >= $required_bytes; +$post_passed = toBytes($post_max_size) >= $required_bytes; $phpConfig[] = [ 'name' => 'upload_max_filesize >= 500M', @@ -116,7 +116,7 @@ $phpConfig[] = [ // PHP Memory Limit >= 128M $memoryLimit = ini_get('memory_limit'); -$memoryLimitBytes = return_bytes($memoryLimit); +$memoryLimitBytes = toBytes($memoryLimit); $memoryLimitPassed = $memoryLimitBytes >= (128 * 1024 * 1024); $phpConfig[] = [ 'name' => 'PHP Memory Limit >= 128M', diff --git a/admin/includes/side_nav.php b/admin/includes/side_nav.php index 28f5a1bd9..99a2666a2 100644 --- a/admin/includes/side_nav.php +++ b/admin/includes/side_nav.php @@ -301,7 +301,7 @@ while ($row = mysqli_fetch_assoc($sql_custom_links)) { $custom_link_name = escapeHtml($row['custom_link_name']); - $custom_link_uri = sanitize_url($row['custom_link_uri']); + $custom_link_uri = escapeUrl($row['custom_link_uri']); $custom_link_icon = escapeHtml($row['custom_link_icon']); $custom_link_new_tab = intval($row['custom_link_new_tab']); if ($custom_link_new_tab == 1) { diff --git a/admin/post/backup.php b/admin/post/backup.php index b70a6ade7..1635b693a 100644 --- a/admin/post/backup.php +++ b/admin/post/backup.php @@ -18,7 +18,7 @@ if (function_exists('ini_set')) { /** * Write a line to a file handle with newline. */ -function fwrite_ln($fh, string $s): void { +function writeLine($fh, string $s): void { fwrite($fh, $s); fwrite($fh, PHP_EOL); } @@ -31,7 +31,7 @@ function fwrite_ln($fh, string $s): void { * * NOTE: Routines/events are not dumped here. Add if needed. */ -function dump_database_streaming(mysqli $mysqli, string $sqlFile): void { +function dumpDatabase(mysqli $mysqli, string $sqlFile): void { $fh = fopen($sqlFile, 'wb'); if (!$fh) { http_response_code(500); @@ -39,12 +39,12 @@ function dump_database_streaming(mysqli $mysqli, string $sqlFile): void { } // Preamble - fwrite_ln($fh, "-- UTF-8 + Foreign Key Safe Dump"); - fwrite_ln($fh, "SET NAMES 'utf8mb4';"); - fwrite_ln($fh, "SET FOREIGN_KEY_CHECKS = 0;"); - fwrite_ln($fh, "SET UNIQUE_CHECKS = 0;"); - fwrite_ln($fh, "SET AUTOCOMMIT = 0;"); - fwrite_ln($fh, ""); + writeLine($fh, "-- UTF-8 + Foreign Key Safe Dump"); + writeLine($fh, "SET NAMES 'utf8mb4';"); + writeLine($fh, "SET FOREIGN_KEY_CHECKS = 0;"); + writeLine($fh, "SET UNIQUE_CHECKS = 0;"); + writeLine($fh, "SET AUTOCOMMIT = 0;"); + writeLine($fh, ""); // Gather tables and views $tables = []; @@ -80,12 +80,12 @@ function dump_database_streaming(mysqli $mysqli, string $sqlFile): void { $createSQL = array_values($createRow)[1] ?? ''; $createRes->close(); - fwrite_ln($fh, "-- ----------------------------"); - fwrite_ln($fh, "-- Table structure for `{$table}`"); - fwrite_ln($fh, "-- ----------------------------"); - fwrite_ln($fh, "DROP TABLE IF EXISTS `{$table}`;"); - fwrite_ln($fh, $createSQL . ";"); - fwrite_ln($fh, ""); + writeLine($fh, "-- ----------------------------"); + writeLine($fh, "-- Table structure for `{$table}`"); + writeLine($fh, "-- ----------------------------"); + writeLine($fh, "DROP TABLE IF EXISTS `{$table}`;"); + writeLine($fh, $createSQL . ";"); + writeLine($fh, ""); // Dump data in a streaming fashion $dataRes = $mysqli->query("SELECT * FROM `{$mysqli->real_escape_string($table)}`", MYSQLI_USE_RESULT); @@ -93,7 +93,7 @@ function dump_database_streaming(mysqli $mysqli, string $sqlFile): void { $wroteHeader = false; while ($row = $dataRes->fetch_assoc()) { if (!$wroteHeader) { - fwrite_ln($fh, "-- Dumping data for table `{$table}`"); + writeLine($fh, "-- Dumping data for table `{$table}`"); $wroteHeader = true; } $cols = array_map(fn($c) => '`' . $mysqli->real_escape_string($c) . '`', array_keys($row)); @@ -103,10 +103,10 @@ function dump_database_streaming(mysqli $mysqli, string $sqlFile): void { }, array_values($row) ); - fwrite_ln($fh, "INSERT INTO `{$table}` (" . implode(", ", $cols) . ") VALUES (" . implode(", ", $vals) . ");"); + writeLine($fh, "INSERT INTO `{$table}` (" . implode(", ", $cols) . ") VALUES (" . implode(", ", $vals) . ");"); } $dataRes->close(); - if ($wroteHeader) fwrite_ln($fh, ""); + if ($wroteHeader) writeLine($fh, ""); } } @@ -119,14 +119,14 @@ function dump_database_streaming(mysqli $mysqli, string $sqlFile): void { $createView = $row['Create View'] ?? ''; $cRes->close(); - fwrite_ln($fh, "-- ----------------------------"); - fwrite_ln($fh, "-- View structure for `{$view}`"); - fwrite_ln($fh, "-- ----------------------------"); - fwrite_ln($fh, "DROP VIEW IF EXISTS `{$view}`;"); + writeLine($fh, "-- ----------------------------"); + writeLine($fh, "-- View structure for `{$view}`"); + writeLine($fh, "-- ----------------------------"); + writeLine($fh, "DROP VIEW IF EXISTS `{$view}`;"); // Ensure statement ends with semicolon if (!str_ends_with($createView, ';')) $createView .= ';'; - fwrite_ln($fh, $createView); - fwrite_ln($fh, ""); + writeLine($fh, $createView); + writeLine($fh, ""); } } @@ -142,22 +142,22 @@ function dump_database_streaming(mysqli $mysqli, string $sqlFile): void { $createTrig = $row['SQL Original Statement'] ?? ($row['Create Trigger'] ?? ''); $crt->close(); - fwrite_ln($fh, "-- ----------------------------"); - fwrite_ln($fh, "-- Trigger for `{$triggerName}`"); - fwrite_ln($fh, "-- ----------------------------"); - fwrite_ln($fh, "DROP TRIGGER IF EXISTS `{$triggerName}`;"); + writeLine($fh, "-- ----------------------------"); + writeLine($fh, "-- Trigger for `{$triggerName}`"); + writeLine($fh, "-- ----------------------------"); + writeLine($fh, "DROP TRIGGER IF EXISTS `{$triggerName}`;"); if (!str_ends_with($createTrig, ';')) $createTrig .= ';'; - fwrite_ln($fh, $createTrig); - fwrite_ln($fh, ""); + writeLine($fh, $createTrig); + writeLine($fh, ""); } } $tRes->close(); } // Postamble - fwrite_ln($fh, "SET FOREIGN_KEY_CHECKS = 1;"); - fwrite_ln($fh, "SET UNIQUE_CHECKS = 1;"); - fwrite_ln($fh, "COMMIT;"); + writeLine($fh, "SET FOREIGN_KEY_CHECKS = 1;"); + writeLine($fh, "SET UNIQUE_CHECKS = 1;"); + writeLine($fh, "COMMIT;"); fclose($fh); } @@ -235,7 +235,7 @@ if (isset($_GET['download_backup'])) { } // === Generate SQL Dump (streaming) === - dump_database_streaming($mysqli, $sqlFile); + dumpDatabase($mysqli, $sqlFile); // === Zip the uploads folder (strict) === zipFolderStrict("../uploads", $uploadsZip); diff --git a/admin/settings_mail.php b/admin/settings_mail.php index f07f6b710..d36d057dc 100644 --- a/admin/settings_mail.php +++ b/admin/settings_mail.php @@ -2,7 +2,7 @@ require_once "includes/inc_all_admin.php"; // ---- Tiny status dot for tab labels ---------------------------------------- -function mail_status_dot($on) { +function renderMailStatusDot($on) { return $on ? '' : ''; @@ -64,12 +64,12 @@ $imap_ready = $imap_standard_ready || $imap_oauth_ready;
    diff --git a/agent/includes/side_nav.php b/agent/includes/side_nav.php index ccb60cbfc..2680b350f 100644 --- a/agent/includes/side_nav.php +++ b/agent/includes/side_nav.php @@ -212,7 +212,7 @@ while ($row = mysqli_fetch_assoc($sql_custom_links)) { $custom_link_name = escapeHtml($row['custom_link_name']); - $custom_link_uri = sanitize_url($row['custom_link_uri']); + $custom_link_uri = escapeUrl($row['custom_link_uri']); $custom_link_icon = escapeHtml($row['custom_link_icon']); $custom_link_new_tab = intval($row['custom_link_new_tab']); if ($custom_link_new_tab == 1) { diff --git a/agent/modals/asset/asset.php b/agent/modals/asset/asset.php index e1751ed97..929e40944 100644 --- a/agent/modals/asset/asset.php +++ b/agent/modals/asset/asset.php @@ -30,9 +30,9 @@ $asset_make = escapeHtml($row['asset_make']); $asset_model = escapeHtml($row['asset_model']); $asset_serial = escapeHtml($row['asset_serial']); $asset_os = escapeHtml($row['asset_os']); -$asset_uri = sanitize_url($row['asset_uri']); -$asset_uri_2 = sanitize_url($row['asset_uri_2']); -$asset_uri_client = sanitize_url($row['asset_uri_client']); +$asset_uri = escapeUrl($row['asset_uri']); +$asset_uri_2 = escapeUrl($row['asset_uri_2']); +$asset_uri_client = escapeUrl($row['asset_uri_client']); $asset_status = escapeHtml($row['asset_status']); $asset_purchase_reference = escapeHtml($row['asset_purchase_reference']); $asset_purchase_date = escapeHtml($row['asset_purchase_date']); diff --git a/agent/modals/client/client_add.php b/agent/modals/client/client_add.php index 237baad2e..1a9542811 100644 --- a/agent/modals/client/client_add.php +++ b/agent/modals/client/client_add.php @@ -66,7 +66,7 @@ ob_start();
    - +
    > @@ -393,7 +393,7 @@ ob_start(); "; -} +// If the user is just sat on the page, send them back to log in to try again +header("Location: ../login.php"); +exit(); diff --git a/client/login_reset.php b/client/login_reset.php index 3007bb2b9..b69f7720d 100644 --- a/client/login_reset.php +++ b/client/login_reset.php @@ -22,16 +22,7 @@ if($config_client_portal_enable == 0) { exit(); } -if (!isset($_SESSION)) { - // HTTP Only cookies - ini_set("session.cookie_httponly", true); - ini_set("session.cookie_samesite", "Lax"); - if ($config_https_only) { - // Tell client to only send cookie(s) over HTTPS - ini_set("session.cookie_secure", true); - } - session_start(); -} +require_once __DIR__ . "/../includes/session_init.php"; // Set Timezone after session require_once "../includes/inc_set_timezone.php"; diff --git a/guest/guest_post.php b/guest/guest_post.php index 52c854be2..e79818a75 100644 --- a/guest/guest_post.php +++ b/guest/guest_post.php @@ -4,12 +4,7 @@ require_once "../config.php"; require_once "../functions.php"; require_once "../includes/load_global_settings.php"; -ini_set("session.cookie_httponly", true); -ini_set("session.cookie_samesite", "Lax"); -if ($config_https_only) { - ini_set("session.cookie_secure", true); -} -session_start(); +require_once __DIR__ . "/../includes/session_init.php"; require_once "../includes/inc_set_timezone.php"; // Must be included after session_start to work diff --git a/includes/session_init.php b/includes/session_init.php index 35985bcc8..a73d9551c 100644 --- a/includes/session_init.php +++ b/includes/session_init.php @@ -1,11 +1,14 @@

    + +
    + + +

    From 4c65b8c5618fa23968655cb96867d659cc8efd5f Mon Sep 17 00:00:00 2001 From: johnnyq Date: Tue, 28 Jul 2026 00:18:07 -0400 Subject: [PATCH 152/241] Clear mail bodies after successful delivery --- admin/modals/mail_queue/mail_queue_message_view.php | 4 +++- admin/post/mail_queue.php | 8 ++++++++ admin/post/users.php | 8 +++++++- cron/mail_queue.php | 6 ++++-- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/admin/modals/mail_queue/mail_queue_message_view.php b/admin/modals/mail_queue/mail_queue_message_view.php index ab89db7c4..abfc7f9e0 100644 --- a/admin/modals/mail_queue/mail_queue_message_view.php +++ b/admin/modals/mail_queue/mail_queue_message_view.php @@ -65,7 +65,9 @@ ob_start();

    - + + Message content was cleared on delivery. +
    diff --git a/admin/post/mail_queue.php b/admin/post/mail_queue.php index d9e885345..bb601de03 100644 --- a/admin/post/mail_queue.php +++ b/admin/post/mail_queue.php @@ -8,6 +8,14 @@ if (isset($_GET['send_failed_mail'])) { $email_id = intval($_GET['send_failed_mail']); + // Delivered mail has had its body cleared on send, so resending would deliver an empty message + $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT email_status FROM email_queue WHERE email_id = $email_id LIMIT 1")); + + if (!$row || intval($row['email_status']) === 3) { + flashAlert("That email has already been delivered and cannot be resent.", 'error'); + redirect(); + } + mysqli_query($mysqli,"UPDATE email_queue SET email_status = 0, email_attempts = 3 WHERE email_id = $email_id"); logAudit("Email", "Send", "$session_name attempted to force send email id: $email_id in the mail queue", 0, $email_id); diff --git a/admin/post/users.php b/admin/post/users.php index 8e23f137c..3bfa70287 100644 --- a/admin/post/users.php +++ b/admin/post/users.php @@ -70,8 +70,14 @@ if (isset($_POST['add_user'])) { $password = mysqli_real_escape_string($mysqli, $_POST['password']); + // Only hand out the login key when the gate is actually enabled - same test as post/logout.php + $login_url = "https://$config_base_url/login.php"; + if ($config_login_key_required == 1) { + $login_url .= "?key=$config_login_key_secret"; + } + $subject = "Your new $company_name ITFlow account"; - $body = "Hello $name,

    An ITFlow account has been setup for you. Please change your password upon login.

    Username: $email
    Password: $password
    Login URL: https://$config_base_url/login.php?key=$config_login_key_secret

    --
    $company_name - Support
    $config_ticket_from_email"; + $body = "Hello $name,

    An ITFlow account has been setup for you. Please change your password upon login.

    Username: $email
    Password: $password
    Login URL: $login_url

    --
    $company_name - Support
    $config_ticket_from_email"; $data = [ [ diff --git a/cron/mail_queue.php b/cron/mail_queue.php index a3e443d5c..cab72968b 100644 --- a/cron/mail_queue.php +++ b/cron/mail_queue.php @@ -385,7 +385,8 @@ if (mysqli_num_rows($sql_queue) > 0) { (string)$config_mail_oauth_access_token_expires_at ); - mysqli_query($mysqli, "UPDATE email_queue SET email_status = 3, email_sent_at = NOW(), email_attempts = 1 WHERE email_id = $email_id"); + // Scrub the body on delivery - it can carry share decryption keys and temporary passwords + mysqli_query($mysqli, "UPDATE email_queue SET email_status = 3, email_sent_at = NOW(), email_attempts = 1, email_content = '', email_cal_str = '' WHERE email_id = $email_id"); } catch (Exception $e) { mysqli_query($mysqli, "UPDATE email_queue SET email_status = 2, email_failed_at = NOW(), email_attempts = 1 WHERE email_id = $email_id"); @@ -459,7 +460,8 @@ if (mysqli_num_rows($sql_failed_queue) > 0) { (string)$config_mail_oauth_access_token_expires_at ); - mysqli_query($mysqli, "UPDATE email_queue SET email_status = 3, email_sent_at = NOW(), email_attempts = $email_attempts WHERE email_id = $email_id"); + // Scrub the body on delivery - it can carry share decryption keys and temporary passwords + mysqli_query($mysqli, "UPDATE email_queue SET email_status = 3, email_sent_at = NOW(), email_attempts = $email_attempts, email_content = '', email_cal_str = '' WHERE email_id = $email_id"); } catch (Exception $e) { mysqli_query($mysqli, "UPDATE email_queue SET email_status = 2, email_failed_at = NOW(), email_attempts = $email_attempts WHERE email_id = $email_id"); From 2e855f62c9cbcf2f06c7c57123866cb7d02b82e6 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Tue, 28 Jul 2026 00:40:33 -0400 Subject: [PATCH 153/241] Require credential module access to view or share credentials --- agent/ajax.php | 5 ++++ agent/global_search.php | 64 +++++++++++++++++++++++------------------ 2 files changed, 41 insertions(+), 28 deletions(-) diff --git a/agent/ajax.php b/agent/ajax.php index cfbdd6807..5ddc716d6 100644 --- a/agent/ajax.php +++ b/agent/ajax.php @@ -203,6 +203,11 @@ if (isset($_GET['share_generate_link'])) { } if ($item_type == "Credential") { + + // Sharing a credential hands out the plaintext, so it needs the same + // module access as reading one anywhere else in the app + enforceUserPermission('module_credential'); + $credential = mysqli_query($mysqli, "SELECT credential_name, credential_username, credential_password FROM credentials WHERE credential_id = $item_id AND credential_client_id = $client_id LIMIT 1"); $row = mysqli_fetch_assoc($credential); diff --git a/agent/global_search.php b/agent/global_search.php index 38a8aef11..4ea55066e 100644 --- a/agent/global_search.php +++ b/agent/global_search.php @@ -20,7 +20,15 @@ if (isset($_GET['query'])) { $ticket_num_query = str_replace("$config_ticket_prefix", "", "$query"); - $sql_clients = mysqli_query($mysqli, "SELECT * FROM clients + // Every dedicated page gates on its module, so search must too - otherwise this + // page hands a role results it has no access to read anywhere else (see the + // credentials panel, which renders plaintext usernames and passwords) + $can_client = lookupUserPermission('module_client') >= 1; + $can_support = lookupUserPermission('module_support') >= 1; + $can_sales = lookupUserPermission('module_sales') >= 1; + $can_credential = lookupUserPermission('module_credential') >= 1; + + $sql_clients = !$can_client ? false : mysqli_query($mysqli, "SELECT * FROM clients LEFT JOIN locations ON clients.client_id = locations.location_client_id AND location_primary = 1 WHERE client_archived_at IS NULL AND (client_name LIKE '%$query%' OR client_abbreviation LIKE '%$query%') @@ -28,7 +36,7 @@ if (isset($_GET['query'])) { ORDER BY client_id DESC LIMIT 5" ); - $sql_contacts = mysqli_query($mysqli, "SELECT * FROM contacts + $sql_contacts = !$can_client ? false : mysqli_query($mysqli, "SELECT * FROM contacts LEFT JOIN clients ON client_id = contact_client_id WHERE contact_archived_at IS NULL AND (contact_name LIKE '%$query%' @@ -40,7 +48,7 @@ if (isset($_GET['query'])) { ORDER BY contact_id DESC LIMIT 5" ); - $sql_vendors = mysqli_query($mysqli, "SELECT * FROM vendors + $sql_vendors = !$can_client ? false : mysqli_query($mysqli, "SELECT * FROM vendors LEFT JOIN clients ON vendor_client_id = client_id WHERE vendor_archived_at IS NULL AND (vendor_name LIKE '%$query%' OR vendor_phone LIKE '%$phone_query%') @@ -48,7 +56,7 @@ if (isset($_GET['query'])) { ORDER BY vendor_id DESC LIMIT 5" ); - $sql_domains = mysqli_query($mysqli, "SELECT * FROM domains + $sql_domains = !$can_support ? false : mysqli_query($mysqli, "SELECT * FROM domains LEFT JOIN clients ON domain_client_id = client_id WHERE domain_archived_at IS NULL AND domain_name LIKE '%$query%' @@ -56,13 +64,13 @@ if (isset($_GET['query'])) { ORDER BY domain_id DESC LIMIT 5" ); - $sql_products = mysqli_query($mysqli, "SELECT * FROM products + $sql_products = !$can_sales ? false : mysqli_query($mysqli, "SELECT * FROM products WHERE product_archived_at IS NULL AND product_name LIKE '%$query%' ORDER BY product_id DESC LIMIT 5" ); - $sql_documents = mysqli_query($mysqli, "SELECT * FROM documents + $sql_documents = !$can_support ? false : mysqli_query($mysqli, "SELECT * FROM documents LEFT JOIN clients on document_client_id = clients.client_id WHERE document_archived_at IS NULL AND MATCH(document_content_raw) AGAINST ('$query') @@ -70,7 +78,7 @@ if (isset($_GET['query'])) { ORDER BY document_id DESC LIMIT 5" ); - $sql_files = mysqli_query($mysqli, "SELECT * FROM files + $sql_files = !$can_support ? false : mysqli_query($mysqli, "SELECT * FROM files LEFT JOIN clients ON file_client_id = client_id LEFT JOIN folders ON folder_id = file_folder_id WHERE file_archived_at IS NULL @@ -80,7 +88,7 @@ if (isset($_GET['query'])) { ORDER BY file_id DESC LIMIT 5" ); - $sql_tickets = mysqli_query($mysqli, "SELECT * FROM tickets + $sql_tickets = !$can_support ? false : mysqli_query($mysqli, "SELECT * FROM tickets LEFT JOIN clients on tickets.ticket_client_id = clients.client_id LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id WHERE ticket_archived_at IS NULL @@ -92,7 +100,7 @@ if (isset($_GET['query'])) { ORDER BY ticket_id DESC LIMIT 5" ); - $sql_recurring_tickets = mysqli_query($mysqli, "SELECT * FROM recurring_tickets + $sql_recurring_tickets = !$can_support ? false : mysqli_query($mysqli, "SELECT * FROM recurring_tickets LEFT JOIN clients ON recurring_ticket_client_id = client_id WHERE (recurring_ticket_subject LIKE '%$query%' OR recurring_ticket_details LIKE '%$query%') @@ -100,7 +108,7 @@ if (isset($_GET['query'])) { ORDER BY recurring_ticket_id DESC LIMIT 5" ); - $sql_credentials = mysqli_query($mysqli, "SELECT * FROM credentials + $sql_credentials = !$can_credential ? false : mysqli_query($mysqli, "SELECT * FROM credentials LEFT JOIN contacts ON credential_contact_id = contact_id LEFT JOIN clients ON credential_client_id = client_id WHERE credential_archived_at IS NULL @@ -109,7 +117,7 @@ if (isset($_GET['query'])) { ORDER BY credential_id DESC LIMIT 5" ); - $sql_quotes = mysqli_query($mysqli, "SELECT * FROM quotes + $sql_quotes = !$can_sales ? false : mysqli_query($mysqli, "SELECT * FROM quotes LEFT JOIN clients ON quote_client_id = client_id LEFT JOIN categories ON quote_category_id = category_id WHERE quote_archived_at IS NULL @@ -118,7 +126,7 @@ if (isset($_GET['query'])) { ORDER BY quote_number DESC LIMIT 5" ); - $sql_invoices = mysqli_query($mysqli, "SELECT * FROM invoices + $sql_invoices = !$can_sales ? false : mysqli_query($mysqli, "SELECT * FROM invoices LEFT JOIN clients ON invoice_client_id = client_id LEFT JOIN categories ON invoice_category_id = category_id WHERE invoice_archived_at IS NULL @@ -127,7 +135,7 @@ if (isset($_GET['query'])) { ORDER BY invoice_number DESC LIMIT 5" ); - $sql_assets = mysqli_query($mysqli,"SELECT * FROM assets + $sql_assets = !$can_support ? false : mysqli_query($mysqli,"SELECT * FROM assets LEFT JOIN contacts ON asset_contact_id = contact_id LEFT JOIN locations ON asset_location_id = location_id LEFT JOIN clients ON asset_client_id = client_id @@ -138,7 +146,7 @@ if (isset($_GET['query'])) { ORDER BY asset_name DESC LIMIT 5" ); - $sql_ticket_replies = mysqli_query($mysqli,"SELECT * FROM ticket_replies + $sql_ticket_replies = !$can_support ? false : mysqli_query($mysqli,"SELECT * FROM ticket_replies LEFT JOIN tickets ON ticket_reply_ticket_id = ticket_id LEFT JOIN clients ON ticket_client_id = client_id WHERE ticket_reply_archived_at IS NULL @@ -159,7 +167,7 @@ if (isset($_GET['query'])) {
    - 0) { ?> + 0) { ?> @@ -202,7 +210,7 @@ if (isset($_GET['query'])) { - 0) { ?> + 0) { ?> @@ -261,7 +269,7 @@ if (isset($_GET['query'])) { - 0) { ?> + 0) { ?>
    @@ -309,7 +317,7 @@ if (isset($_GET['query'])) { - 0) { ?> + 0) { ?>
    @@ -353,7 +361,7 @@ if (isset($_GET['query'])) { - 0) { ?> + 0) { ?>
    @@ -392,7 +400,7 @@ if (isset($_GET['query'])) { - 0) { ?> + 0) { ?>
    @@ -436,7 +444,7 @@ if (isset($_GET['query'])) { - 0) { ?> + 0) { ?>
    @@ -489,7 +497,7 @@ if (isset($_GET['query'])) { - 0) { ?> + 0) { ?>
    @@ -539,7 +547,7 @@ if (isset($_GET['query'])) { - 0) { ?> + 0) { ?>
    @@ -588,7 +596,7 @@ if (isset($_GET['query'])) { - 0) { ?> + 0) { ?>
    @@ -640,7 +648,7 @@ if (isset($_GET['query'])) { - 0) { ?> + 0) { ?> @@ -691,7 +699,7 @@ if (isset($_GET['query'])) { - 0) { ?> + 0) { ?> @@ -742,7 +750,7 @@ if (isset($_GET['query'])) { - 0) { ?> + 0) { ?> @@ -831,7 +839,7 @@ if (isset($_GET['query'])) { - 0) { ?> + 0) { ?> From 7327ebb37cd085bae362939216aa83acc33ea841 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Tue, 28 Jul 2026 01:01:43 -0400 Subject: [PATCH 154/241] Stop parallel login attempts from bypassing the rate limits --- login.php | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/login.php b/login.php index 8670f85dc..9a6085648 100644 --- a/login.php +++ b/login.php @@ -37,6 +37,22 @@ $session_user_agent = escapeSql($_SERVER['HTTP_USER_AGENT'] ?? ''); // IMPORTANT (Option B support): ensure this exists in this scope so logAudit() can use it $session_user_id = intval($_SESSION['user_id'] ?? 0); +// The count below and the logAudit() failure write that feeds it are far apart, with +// password_verify() in between, so a burst of parallel attempts would all read the +// same sub-threshold count and all pass. Serialize per IP for the whole request. +// Only a POST can write a failure, so only a POST needs the lock. The connection is +// non-persistent (includes/db.php), so it releases at the end of the request - after +// the failure has been recorded. A timeout returns 0 and fails open rather than +// locking anyone out. +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $login_lock_name = 'itflow_login_ip_' . md5($session_ip); + $login_lock = mysqli_fetch_row(mysqli_query($mysqli, "SELECT GET_LOCK('$login_lock_name', 10)")); + + if (empty($login_lock[0])) { + error_log("ITFlow: timed out waiting on the login rate limit lock for $session_ip, proceeding unserialized"); + } +} + $row = mysqli_fetch_assoc(mysqli_query( $mysqli, "SELECT COUNT(log_id) AS failed_login_count @@ -336,6 +352,18 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && (isset($_POST['login']) || isset($_ // counter, so it cannot be used to lock another user out. $mfa_locked = false; if (!empty($current_code)) { + + // This counter needs its own lock. The IP lock above does not + // serialize a burst spread across hosts, and a burst spread + // across hosts is the exact case this per-account limit exists + // for. Keyed on the account, released with the request. + $mfa_lock_name = "itflow_login_mfa_$user_id"; + $mfa_lock = mysqli_fetch_row(mysqli_query($mysqli, "SELECT GET_LOCK('$mfa_lock_name', 10)")); + + if (empty($mfa_lock[0])) { + error_log("ITFlow: timed out waiting on the MFA rate limit lock for user $user_id, proceeding unserialized"); + } + $row_mfa = mysqli_fetch_assoc(mysqli_query( $mysqli, "SELECT COUNT(log_id) AS failed_mfa_count From c3896ba3d63edd7f5db88b698e68e732d90ff65c Mon Sep 17 00:00:00 2001 From: johnnyq Date: Tue, 28 Jul 2026 12:26:50 -0400 Subject: [PATCH 155/241] Add Export CSV to the new combined income page --- agent/income.php | 24 +++- agent/modals/income/income_export.php | 174 +++++++++++++++++++++++++ agent/post/income.php | 175 ++++++++++++++++++++++++++ 3 files changed, 368 insertions(+), 5 deletions(-) create mode 100644 agent/modals/income/income_export.php create mode 100644 agent/post/income.php diff --git a/agent/income.php b/agent/income.php index 183b80977..9f0cd5d83 100644 --- a/agent/income.php +++ b/agent/income.php @@ -146,13 +146,27 @@ $summary_total_income = floatval($row['total_income']);

    Income

    - = 2) { ?>
    - + = 2) { ?> +
    + + + +
    + + +
    -
    diff --git a/agent/modals/income/income_export.php b/agent/modals/income/income_export.php new file mode 100644 index 000000000..2cf2b3c51 --- /dev/null +++ b/agent/modals/income/income_export.php @@ -0,0 +1,174 @@ + + + +
    + + + + + +
    + + 0) { + $delimiter = ","; + $enclosure = '"'; + $escape = '\\'; // backslash + $filename = sanitizeFilename($file_name_prepend . "Income-" . date('Y-m-d_H-i-s') . ".csv"); + + //create a file pointer + $f = fopen('php://memory', 'w'); + + //set column headers + $fields = array('Date', 'Type', 'Source', 'Description', 'Client', 'Amount', 'Currency', 'Payment Method', 'Reference', 'Account'); + fputcsv($f, $fields, $delimiter, $enclosure, $escape); + + //output each row of the data, format line as csv and write to file pointer + while ($row = mysqli_fetch_assoc($sql)) { + $lineData = array($row['income_date'], $row['income_type'], $row['income_source'], $row['income_description'], $row['income_client'], $row['income_amount'], $row['income_currency_code'], $row['income_method'], $row['income_reference'], $row['income_account']); + fputcsv($f, array_map('escapeCsvFormula', $lineData), $delimiter, $enclosure, $escape); + } + + //move back to beginning of file + fseek($f, 0); + + //set headers to download file rather than displayed + header('Content-Type: text/csv'); + header('Content-Disposition: attachment; filename="' . $filename . '";'); + + //output all remaining data on a file pointer + fpassthru($f); + } + + logAudit("Income", "Export", "$session_name exported $num_rows income record(s) to CSV file"); + + exit; + +} From 5f3a0bec46c7cb25d5d2ff57189d26c03ee81d2a Mon Sep 17 00:00:00 2001 From: johnnyq Date: Tue, 28 Jul 2026 12:38:29 -0400 Subject: [PATCH 156/241] Remove old payments and revenues and all ties to the pages as these are combined in income now --- agent/modals/payment/payment_export.php | 31 --- agent/payments.php | 281 ------------------------ agent/post/payment.php | 58 ----- agent/revenues.php | 169 -------------- 4 files changed, 539 deletions(-) delete mode 100644 agent/modals/payment/payment_export.php delete mode 100644 agent/payments.php delete mode 100644 agent/revenues.php diff --git a/agent/modals/payment/payment_export.php b/agent/modals/payment/payment_export.php deleted file mode 100644 index bd861fbdd..000000000 --- a/agent/modals/payment/payment_export.php +++ /dev/null @@ -1,31 +0,0 @@ - - - -
    - - - - - -
    - - - -
    -
    -

    Payments

    - 0) { ?> -
    - -
    - -
    - -
    -
    - - - -
    -
    -
    - -
    - - -
    -
    -
    -
    -
    - -
    -
    - -
    -
    - -
    -
    -
    -
    " id="advancedFilter"> -
    -
    -
    - - - - - -
    -
    -
    -
    -
    -
    -
    - - text-nowrap"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - Payment Date - - - - Invoice Date - - - - Invoice - - - - Client - - - - Invoice Amount - - - - Payment Amount - - - - Payment Method - - - - Reference - - - - Account - -
    - - - - - = 3) { ?> - - -
    -
    - -
    -
    - - 0) { - $delimiter = ","; - $enclosure = '"'; - $escape = '\\'; // backslash - $filename = sanitizeFilename($file_name_prepend . "Payments-" . date('Y-m-d_H-i-s') . ".csv"); - - //create a file pointer - $f = fopen('php://memory', 'w'); - - //set column headers - $fields = array('Payment Date', 'Invoice Date', 'Invoice Number', 'Invoice Amount', 'Payment Amount', 'Payment Method', 'Referrence'); - fputcsv($f, $fields, $delimiter, $enclosure, $escape); - - //output each row of the data, format line as csv and write to file pointer - while($row = $sql->fetch_assoc()){ - $lineData = array($row['payment_date'], $row['invoice_date'], $row['invoice_prefix'] . $row['invoice_number'], $row['invoice_amount'], $row['payment_amount'], $row['payment_method'], $row['payment_reference']); - fputcsv($f, array_map('escapeCsvFormula', $lineData), $delimiter, $enclosure, $escape); - } - - //move back to beginning of file - fseek($f, 0); - - //set headers to download file rather than displayed - header('Content-Type: text/csv'); - header('Content-Disposition: attachment; filename="' . $filename . '";'); - - //output all remaining data on a file pointer - fpassthru($f); - } - - logAudit("Payments", "Export", "$session_name exported $num_rows payments to CSV file"); - - exit; - -} diff --git a/agent/revenues.php b/agent/revenues.php deleted file mode 100644 index a72364998..000000000 --- a/agent/revenues.php +++ /dev/null @@ -1,169 +0,0 @@ - - -
    -
    -

    Revenues

    - = 2) { ?> -
    - -
    - -
    - -
    -
    -
    -
    -
    - -
    - - -
    -
    -
    -
    -
    " id="advancedFilter"> -
    -
    -
    - - - - - -
    -
    -
    -
    -
    -
    -
    - - text-nowrap"> - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - Date - - - - Category - - - - Amount - - - - Method - - - - Reference - - - - Account - - Action
    - - - - - -
    -
    - -
    -
    - - Date: Tue, 28 Jul 2026 12:49:57 -0400 Subject: [PATCH 157/241] Add Quick Payments view modal in Invoices --- agent/invoices.php | 15 ++- agent/modals/invoice/invoice_payments.php | 155 ++++++++++++++++++++++ 2 files changed, 167 insertions(+), 3 deletions(-) create mode 100644 agent/modals/invoice/invoice_payments.php diff --git a/agent/invoices.php b/agent/invoices.php index 4524b1cb0..a1b865f1b 100644 --- a/agent/invoices.php +++ b/agent/invoices.php @@ -391,9 +391,18 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); - - - + + + + + + + + + + + diff --git a/agent/modals/invoice/invoice_payments.php b/agent/modals/invoice/invoice_payments.php new file mode 100644 index 000000000..7f45a8cdf --- /dev/null +++ b/agent/modals/invoice/invoice_payments.php @@ -0,0 +1,155 @@ + + + + + + + Date: Tue, 28 Jul 2026 17:45:52 -0400 Subject: [PATCH 158/241] Normalize line endings to LF; add .gitattributes and .editorconfig --- .editorconfig | 20 + .gitattributes | 44 + admin/oauth_microsoft_mail_callback.php | 206 +- admin/post/settings_mail.php | 1002 ++-- admin/settings_mail.php | 1128 ++--- agent/post/ticket.php | 5952 +++++++++++------------ cron/mail_queue.php | 952 ++-- js/app.js | 824 ++-- normalize_eol.sh | 30 + scripts/normalize_eol.sh | 30 + 10 files changed, 5156 insertions(+), 5032 deletions(-) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 normalize_eol.sh create mode 100755 scripts/normalize_eol.sh diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..735551921 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,20 @@ +# Editor defaults for ITFlow - see CONTRIBUTING.md ("Style") +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +indent_style = space +indent_size = 4 + +[*.md] +trim_trailing_whitespace = false + +# Vendored - do not reformat +[libs/**] +indent_style = unset +indent_size = unset +trim_trailing_whitespace = false +insert_final_newline = false diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..2cc86d975 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,44 @@ +# ITFlow line-ending policy +# +# Everything ITFlow ships is LF in the repository and LF in the working tree. +# Contributors on Windows get LF too - this is deliberate. ITFlow is deployed +# to Linux/Apache and edited over sftp/ssh as often as it is cloned, so a +# checkout must be byte-identical everywhere. + +* text=auto eol=lf + +# Explicit for the file types we author, so nothing depends on git's guess. +*.php text eol=lf +*.js text eol=lf +*.css text eol=lf +*.html text eol=lf +*.sql text eol=lf +*.md text eol=lf +*.json text eol=lf +*.yml text eol=lf +*.xsd text eol=lf +*.svg text eol=lf +*.txt text eol=lf +*.ini text eol=lf +.htaccess text eol=lf + +# Binary assets: never touched, never diffed as text. +*.png binary +*.gif binary +*.jpg binary +*.jpeg binary +*.webp binary +*.ico binary +*.icc binary +*.woff binary +*.woff2 binary +*.ttf binary +*.eot binary +*.crt binary +*.ser binary +*.z binary + +# Vendored third-party code is preserved byte-for-byte as shipped upstream. +# Per CONTRIBUTING.md libs/ is never edited in place - it is replaced wholesale - +# so normalizing it here would create spurious diffs on the next library update. +libs/** -text diff --git a/admin/oauth_microsoft_mail_callback.php b/admin/oauth_microsoft_mail_callback.php index 85ce5f266..52d659a61 100644 --- a/admin/oauth_microsoft_mail_callback.php +++ b/admin/oauth_microsoft_mail_callback.php @@ -1,103 +1,103 @@ - $session_state_expires) { - flashAlert("Microsoft OAuth callback validation failed. Please try connecting again.", 'error'); - redirect($settings_mail_path); -} - -if (empty($config_mail_oauth_client_id) || empty($config_mail_oauth_client_secret) || empty($config_mail_oauth_tenant_id)) { - flashAlert("Microsoft OAuth settings are incomplete. Please fill Client ID, Client Secret, and Tenant ID.", 'error'); - redirect($settings_mail_path); -} - -if (defined('BASE_URL') && !empty(BASE_URL)) { - $base_url = rtrim((string) BASE_URL, '/'); -} else { - $base_url = 'https://' . rtrim((string) $config_base_url, '/'); -} - -$redirect_uri = $base_url . '/admin/oauth_microsoft_mail_callback.php'; -$token_url = 'https://login.microsoftonline.com/' . rawurlencode($config_mail_oauth_tenant_id) . '/oauth2/v2.0/token'; -$scope = 'offline_access openid profile https://outlook.office.com/IMAP.AccessAsUser.All https://outlook.office.com/SMTP.Send'; - -$ch = curl_init($token_url); -curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); -curl_setopt($ch, CURLOPT_POST, true); -curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([ - 'client_id' => $config_mail_oauth_client_id, - 'client_secret' => $config_mail_oauth_client_secret, - 'grant_type' => 'authorization_code', - 'code' => $code, - 'redirect_uri' => $redirect_uri, - 'scope' => $scope, -], '', '&')); -curl_setopt($ch, CURLOPT_TIMEOUT, 20); - -$raw_body = curl_exec($ch); -$curl_err = curl_error($ch); -$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); -curl_close($ch); - -if ($raw_body === false || $http_code < 200 || $http_code >= 300) { - $reason = !empty($curl_err) ? $curl_err : "HTTP $http_code"; - flashAlert("Microsoft OAuth token exchange failed: $reason", 'error'); - redirect($settings_mail_path); -} - -$json = json_decode($raw_body, true); -if (!is_array($json) || empty($json['refresh_token']) || empty($json['access_token'])) { - flashAlert("Microsoft OAuth token exchange failed: refresh token or access token missing.", 'error'); - redirect($settings_mail_path); -} - -$refresh_token = (string) $json['refresh_token']; -$access_token = (string) $json['access_token']; -$expires_at = date('Y-m-d H:i:s', time() + (int)($json['expires_in'] ?? 3600)); - -$refresh_token_esc = mysqli_real_escape_string($mysqli, $refresh_token); -$access_token_esc = mysqli_real_escape_string($mysqli, $access_token); -$expires_at_esc = mysqli_real_escape_string($mysqli, $expires_at); - -mysqli_query($mysqli, "UPDATE settings SET - config_imap_provider = 'microsoft_oauth', - config_smtp_provider = 'microsoft_oauth', - config_mail_oauth_refresh_token = '$refresh_token_esc', - config_mail_oauth_access_token = '$access_token_esc', - config_mail_oauth_access_token_expires_at = '$expires_at_esc' - WHERE company_id = 1 -"); - -logAudit("Settings", "Edit", "$session_name completed Microsoft OAuth connect flow for mail settings"); -flashAlert("Microsoft OAuth connected successfully. Token expires at $expires_at."); -redirect($settings_mail_path); + $session_state_expires) { + flashAlert("Microsoft OAuth callback validation failed. Please try connecting again.", 'error'); + redirect($settings_mail_path); +} + +if (empty($config_mail_oauth_client_id) || empty($config_mail_oauth_client_secret) || empty($config_mail_oauth_tenant_id)) { + flashAlert("Microsoft OAuth settings are incomplete. Please fill Client ID, Client Secret, and Tenant ID.", 'error'); + redirect($settings_mail_path); +} + +if (defined('BASE_URL') && !empty(BASE_URL)) { + $base_url = rtrim((string) BASE_URL, '/'); +} else { + $base_url = 'https://' . rtrim((string) $config_base_url, '/'); +} + +$redirect_uri = $base_url . '/admin/oauth_microsoft_mail_callback.php'; +$token_url = 'https://login.microsoftonline.com/' . rawurlencode($config_mail_oauth_tenant_id) . '/oauth2/v2.0/token'; +$scope = 'offline_access openid profile https://outlook.office.com/IMAP.AccessAsUser.All https://outlook.office.com/SMTP.Send'; + +$ch = curl_init($token_url); +curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); +curl_setopt($ch, CURLOPT_POST, true); +curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([ + 'client_id' => $config_mail_oauth_client_id, + 'client_secret' => $config_mail_oauth_client_secret, + 'grant_type' => 'authorization_code', + 'code' => $code, + 'redirect_uri' => $redirect_uri, + 'scope' => $scope, +], '', '&')); +curl_setopt($ch, CURLOPT_TIMEOUT, 20); + +$raw_body = curl_exec($ch); +$curl_err = curl_error($ch); +$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); +curl_close($ch); + +if ($raw_body === false || $http_code < 200 || $http_code >= 300) { + $reason = !empty($curl_err) ? $curl_err : "HTTP $http_code"; + flashAlert("Microsoft OAuth token exchange failed: $reason", 'error'); + redirect($settings_mail_path); +} + +$json = json_decode($raw_body, true); +if (!is_array($json) || empty($json['refresh_token']) || empty($json['access_token'])) { + flashAlert("Microsoft OAuth token exchange failed: refresh token or access token missing.", 'error'); + redirect($settings_mail_path); +} + +$refresh_token = (string) $json['refresh_token']; +$access_token = (string) $json['access_token']; +$expires_at = date('Y-m-d H:i:s', time() + (int)($json['expires_in'] ?? 3600)); + +$refresh_token_esc = mysqli_real_escape_string($mysqli, $refresh_token); +$access_token_esc = mysqli_real_escape_string($mysqli, $access_token); +$expires_at_esc = mysqli_real_escape_string($mysqli, $expires_at); + +mysqli_query($mysqli, "UPDATE settings SET + config_imap_provider = 'microsoft_oauth', + config_smtp_provider = 'microsoft_oauth', + config_mail_oauth_refresh_token = '$refresh_token_esc', + config_mail_oauth_access_token = '$access_token_esc', + config_mail_oauth_access_token_expires_at = '$expires_at_esc' + WHERE company_id = 1 +"); + +logAudit("Settings", "Edit", "$session_name completed Microsoft OAuth connect flow for mail settings"); +flashAlert("Microsoft OAuth connected successfully. Token expires at $expires_at."); +redirect($settings_mail_path); diff --git a/admin/post/settings_mail.php b/admin/post/settings_mail.php index 237b3ad4d..f22ffd61b 100644 --- a/admin/post/settings_mail.php +++ b/admin/post/settings_mail.php @@ -1,501 +1,501 @@ - $config_mail_oauth_client_id, - 'response_type' => 'code', - 'redirect_uri' => $redirect_uri, - 'response_mode' => 'query', - 'scope' => $scope, - 'state' => $state, - 'prompt' => 'consent', - ], '', '&', PHP_QUERY_RFC3986); - - logAudit("Settings", "Edit", "$session_name started Microsoft OAuth connect flow for mail settings"); - - redirect($authorize_url); -} - -if (isset($_POST['edit_mail_smtp_settings'])) { - - validateCSRFToken(); - - $config_smtp_provider = escapeSql($_POST['config_smtp_provider']); - $config_smtp_host = escapeSql($_POST['config_smtp_host'] ?? $config_smtp_host); - $config_smtp_port = intval($_POST['config_smtp_port'] ?? $config_smtp_port); - $config_smtp_encryption = escapeSql($_POST['config_smtp_encryption'] ?? $config_smtp_encryption); - $config_smtp_username = escapeSql($_POST['config_smtp_username'] ?? $config_smtp_username); - $config_smtp_password = escapeSql($_POST['config_smtp_password'] ?? $config_smtp_password); - - mysqli_query($mysqli, " - UPDATE settings SET - config_smtp_provider = '$config_smtp_provider', - config_smtp_host = '$config_smtp_host', - config_smtp_port = $config_smtp_port, - config_smtp_encryption = '$config_smtp_encryption', - config_smtp_username = '$config_smtp_username', - config_smtp_password = '$config_smtp_password' - WHERE company_id = 1 - "); - - logAudit("Settings", "Edit", "$session_name edited SMTP settings"); - - flashAlert("SMTP Mail Settings updated"); - - redirect($mail_tab_redirect); - -} - -if (isset($_POST['edit_mail_imap_settings'])) { - - validateCSRFToken(); - - $config_imap_provider = escapeSql($_POST['config_imap_provider']); - $config_imap_host = escapeSql($_POST['config_imap_host'] ?? $config_imap_host); - $config_imap_port = intval($_POST['config_imap_port'] ?? $config_imap_port); - $config_imap_encryption = escapeSql($_POST['config_imap_encryption'] ?? $config_imap_encryption); - $config_imap_username = escapeSql($_POST['config_imap_username'] ?? $config_imap_username); - $config_imap_password = escapeSql($_POST['config_imap_password'] ?? $config_imap_password); - - mysqli_query($mysqli, " - UPDATE settings SET - config_imap_provider = '$config_imap_provider', - config_imap_host = '$config_imap_host', - config_imap_port = $config_imap_port, - config_imap_encryption = '$config_imap_encryption', - config_imap_username = '$config_imap_username', - config_imap_password = '$config_imap_password' - WHERE company_id = 1 - "); - - logAudit("Settings", "Edit", "$session_name edited IMAP settings"); - - flashAlert("IMAP Mail Settings updated"); - - redirect($mail_tab_redirect); - -} - -if (isset($_POST['edit_mail_oauth_settings'])) { - - validateCSRFToken(); - - $config_mail_oauth_client_id = escapeSql($_POST['config_mail_oauth_client_id'] ?? ''); - $config_mail_oauth_client_secret = escapeSql($_POST['config_mail_oauth_client_secret'] ?? ''); - $config_mail_oauth_tenant_id = escapeSql($_POST['config_mail_oauth_tenant_id'] ?? $config_mail_oauth_tenant_id); - $config_mail_oauth_refresh_token = escapeSql($_POST['config_mail_oauth_refresh_token'] ?? ''); - $config_mail_oauth_access_token = escapeSql($_POST['config_mail_oauth_access_token'] ?? ''); - - mysqli_query($mysqli, "UPDATE settings SET - config_mail_oauth_client_id = '$config_mail_oauth_client_id', - config_mail_oauth_client_secret = '$config_mail_oauth_client_secret', - config_mail_oauth_tenant_id = '$config_mail_oauth_tenant_id', - config_mail_oauth_refresh_token = '$config_mail_oauth_refresh_token', - config_mail_oauth_access_token = '$config_mail_oauth_access_token' - WHERE company_id = 1 - "); - - logAudit("Settings", "Edit", "$session_name edited mail OAuth settings"); - flashAlert("Mail OAuth Settings updated"); - redirect($mail_tab_redirect); -} - -if (isset($_POST['edit_mail_from_settings'])) { - - validateCSRFToken(); - - $config_mail_from_email = escapeSql(filter_var($_POST['config_mail_from_email'], FILTER_VALIDATE_EMAIL)); - $config_mail_from_name = escapeSql(preg_replace('/[^a-zA-Z0-9\s]/', '', $_POST['config_mail_from_name'])); - - $config_invoice_from_email = escapeSql(filter_var($_POST['config_invoice_from_email'], FILTER_VALIDATE_EMAIL)); - $config_invoice_from_name = escapeSql(preg_replace('/[^a-zA-Z0-9\s]/', '', $_POST['config_invoice_from_name'])); - - $config_quote_from_email = escapeSql(filter_var($_POST['config_quote_from_email'], FILTER_VALIDATE_EMAIL)); - $config_quote_from_name = escapeSql(preg_replace('/[^a-zA-Z0-9\s]/', '', $_POST['config_quote_from_name'])); - - $config_ticket_from_email = escapeSql(filter_var($_POST['config_ticket_from_email'], FILTER_VALIDATE_EMAIL)); - $config_ticket_from_name = escapeSql(preg_replace('/[^a-zA-Z0-9\s]/', '', $_POST['config_ticket_from_name'])); - - mysqli_query($mysqli,"UPDATE settings SET config_mail_from_email = '$config_mail_from_email', config_mail_from_name = '$config_mail_from_name', config_invoice_from_email = '$config_invoice_from_email', config_invoice_from_name = '$config_invoice_from_name', config_quote_from_email = '$config_quote_from_email', config_quote_from_name = '$config_quote_from_name', config_ticket_from_email = '$config_ticket_from_email', config_ticket_from_name = '$config_ticket_from_name' WHERE company_id = 1"); - - logAudit("Settings", "Edit", "$session_name edited mail from settings"); - - flashAlert("Mail From Settings updated"); - - redirect($mail_tab_redirect); - -} - -if (isset($_POST['test_email_smtp'])) { - - validateCSRFToken(); - - $test_email = intval($_POST['test_email']); - - if($test_email == 1) { - $email_from = escapeSql($config_mail_from_email); - $email_from_name = escapeSql($config_mail_from_name); - } elseif ($test_email == 2) { - $email_from = escapeSql($config_invoice_from_email); - $email_from_name = escapeSql($config_invoice_from_name); - } elseif ($test_email == 3) { - $email_from = escapeSql($config_quote_from_email); - $email_from_name = escapeSql($config_quote_from_name); - } else { - $email_from = escapeSql($config_ticket_from_email); - $email_from_name = escapeSql($config_ticket_from_name); - } - - $email_to = escapeSql($_POST['email_to']); - $subject = "Test email from ITFlow"; - $body = "This is a test email from ITFlow. If you are reading this, it worked!"; - - $data = [ - [ - 'from' => $email_from, - 'from_name' => $email_from_name, - 'recipient' => $email_to, - 'recipient_name' => 'Chap', - 'subject' => $subject, - 'body' => $body - ] - ]; - - $mail = addToMailQueue($data); - - if ($mail === true) { - flashAlert("Test email queued! Check Admin > Mail queue"); - } else { - flashAlert("Failed to add test mail to queue", 'error'); - } - - redirect($mail_tab_redirect); - -} - -if (isset($_POST['test_email_imap'])) { - - validateCSRFToken(); - - $provider = escapeSql($config_imap_provider ?? ''); - - $host = $config_imap_host; - $port = (int) $config_imap_port; - $encryption = strtolower(trim($config_imap_encryption)); // e.g. "ssl", "tls", "none" - $username = $config_imap_username; - $password = $config_imap_password; - - // Shared OAuth fields - $config_mail_oauth_client_id = $config_mail_oauth_client_id ?? ''; - $config_mail_oauth_client_secret = $config_mail_oauth_client_secret ?? ''; - $config_mail_oauth_tenant_id = $config_mail_oauth_tenant_id ?? ''; - $config_mail_oauth_refresh_token = $config_mail_oauth_refresh_token ?? ''; - $config_mail_oauth_access_token = $config_mail_oauth_access_token ?? ''; - $config_mail_oauth_access_token_expires_at = $config_mail_oauth_access_token_expires_at ?? ''; - - $is_oauth = ($provider === 'google_oauth' || $provider === 'microsoft_oauth'); - - if ($provider === 'google_oauth') { - if (empty($host)) { - $host = 'imap.gmail.com'; - } - if (empty($port)) { - $port = 993; - } - if (empty($encryption)) { - $encryption = 'ssl'; - } - } elseif ($provider === 'microsoft_oauth') { - if (empty($host)) { - $host = 'outlook.office365.com'; - } - if (empty($port)) { - $port = 993; - } - if (empty($encryption)) { - $encryption = 'ssl'; - } - } - - if (empty($host) || empty($port) || empty($username)) { - flashAlert("IMAP connection failed: Missing host, port, or username.", 'error'); - redirect($mail_tab_redirect); - } - - $token_is_expired = function (?string $expires_at): bool { - if (empty($expires_at)) { - return true; - } - - $ts = strtotime($expires_at); - - if ($ts === false) { - return true; - } - - return ($ts - 60) <= time(); - }; - - $http_form_post = function (string $url, array $fields): array { - $ch = curl_init($url); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_POST, true); - curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields, '', '&')); - curl_setopt($ch, CURLOPT_TIMEOUT, 20); - - $raw = curl_exec($ch); - $err = curl_error($ch); - $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); - - curl_close($ch); - - return [ - 'ok' => ($raw !== false && $code >= 200 && $code < 300), - 'body' => $raw, - 'code' => $code, - 'err' => $err, - ]; - }; - - if ($is_oauth) { - if (!empty($config_mail_oauth_access_token) && !$token_is_expired($config_mail_oauth_access_token_expires_at)) { - $password = $config_mail_oauth_access_token; - } else { - if (empty($config_mail_oauth_client_id) || empty($config_mail_oauth_client_secret) || empty($config_mail_oauth_refresh_token)) { - flashAlert("IMAP OAuth failed: Missing OAuth client credentials or refresh token.", 'error'); - redirect($mail_tab_redirect); - } - - if ($provider === 'google_oauth') { - $response = $http_form_post('https://oauth2.googleapis.com/token', [ - 'client_id' => $config_mail_oauth_client_id, - 'client_secret' => $config_mail_oauth_client_secret, - 'refresh_token' => $config_mail_oauth_refresh_token, - 'grant_type' => 'refresh_token', - ]); - } else { - if (empty($config_mail_oauth_tenant_id)) { - flashAlert("IMAP OAuth failed: Microsoft tenant ID is required.", 'error'); - redirect($mail_tab_redirect); - } - - $token_url = MICROSOFT_OAUTH_BASE_URL . rawurlencode($config_mail_oauth_tenant_id) . "/oauth2/v2.0/token"; - $response = $http_form_post($token_url, [ - 'client_id' => $config_mail_oauth_client_id, - 'client_secret' => $config_mail_oauth_client_secret, - 'refresh_token' => $config_mail_oauth_refresh_token, - 'grant_type' => 'refresh_token', - ]); - } - - if (!$response['ok']) { - flashAlert("IMAP OAuth failed: Could not refresh access token.", 'error'); - redirect($mail_tab_redirect); - } - - $json = json_decode($response['body'], true); - if (!is_array($json) || empty($json['access_token'])) { - flashAlert("IMAP OAuth failed: Token response did not include an access token.", 'error'); - redirect($mail_tab_redirect); - } - - $password = $json['access_token']; - $expires_at = date('Y-m-d H:i:s', time() + (int)($json['expires_in'] ?? 3600)); - $refresh_token_to_save = $json['refresh_token'] ?? null; - - $token_esc = mysqli_real_escape_string($mysqli, $password); - $expires_at_esc = mysqli_real_escape_string($mysqli, $expires_at); - - $refresh_sql = ''; - if (!empty($refresh_token_to_save)) { - $refresh_token_esc = mysqli_real_escape_string($mysqli, $refresh_token_to_save); - $refresh_sql = ", config_mail_oauth_refresh_token = '{$refresh_token_esc}'"; - } - - mysqli_query($mysqli, "UPDATE settings SET config_mail_oauth_access_token = '{$token_esc}', config_mail_oauth_access_token_expires_at = '{$expires_at_esc}'{$refresh_sql} WHERE company_id = 1"); - } - } - - // Build remote socket (implicit SSL vs plain TCP) - require_once $_SERVER['DOCUMENT_ROOT'] . '/libs/vendor/autoload.php'; // ImapEngine (composer) - - // Map the stored encryption value to an ImapEngine transport (matches the cron sync) - $imap_transport = match ($encryption) { - 'ssl' => 'ssl', // implicit TLS (993) - 'tls' => 'starttls', // STARTTLS upgrade (143) - Webklex semantics - 'starttls' => 'starttls', - default => '', // 'none' / plain TCP - }; - - try { - // Same ImapEngine client the cron sync uses, so a passing test predicts a - // working sync. Typed errors instead of raw banners; host validated at save. - $mailbox = new \DirectoryTree\ImapEngine\Mailbox([ - 'host' => $host, - 'port' => $port, - 'encryption' => $imap_transport, - 'validate_cert' => true, - 'username' => $username, - 'password' => $password, // access token when OAuth - 'authentication' => $is_oauth ? 'oauth' : 'plain', - ]); - - $mailbox->connect(); - $mailbox->inbox(); // confirm auth + mailbox access, like the sync does - - flashAlert($is_oauth ? "Connected successfully using OAuth" : "Connected successfully"); - } catch (\Throwable $e) { - flashAlert("IMAP connection failed. Check the host, port, encryption, and credentials.", 'error'); - } - - redirect($mail_tab_redirect); -} - - -if (isset($_POST['test_oauth_token_refresh'])) { - - validateCSRFToken(); - - $provider = escapeSql($_POST['oauth_provider'] ?? ''); - - if ($provider !== 'google_oauth' && $provider !== 'microsoft_oauth') { - flashAlert("OAuth token test failed: unsupported provider.", 'error'); - redirect($mail_tab_redirect); - } - - $oauth_client_id = escapeSql($config_mail_oauth_client_id ?? ''); - $oauth_client_secret = escapeSql($config_mail_oauth_client_secret ?? ''); - $oauth_tenant_id = escapeSql($config_mail_oauth_tenant_id ?? ''); - $oauth_refresh_token = escapeSql($config_mail_oauth_refresh_token ?? ''); - - if (empty($oauth_client_id) || empty($oauth_client_secret) || empty($oauth_refresh_token)) { - flashAlert("OAuth token test failed: missing client ID, client secret, or refresh token.", 'error'); - redirect($mail_tab_redirect); - } - - if ($provider === 'microsoft_oauth' && empty($oauth_tenant_id)) { - flashAlert("OAuth token test failed: Microsoft tenant ID is required.", 'error'); - redirect($mail_tab_redirect); - } - - $token_url = 'https://oauth2.googleapis.com/token'; - if ($provider === 'microsoft_oauth') { - $token_url = MICROSOFT_OAUTH_BASE_URL . rawurlencode($oauth_tenant_id) . "/oauth2/v2.0/token"; - } - - $post_fields = http_build_query([ - 'client_id' => $oauth_client_id, - 'client_secret' => $oauth_client_secret, - 'refresh_token' => $oauth_refresh_token, - 'grant_type' => 'refresh_token', - ]); - - $ch = curl_init($token_url); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_POST, true); - curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields); - curl_setopt($ch, CURLOPT_TIMEOUT, 20); - - $raw_body = curl_exec($ch); - $curl_err = curl_error($ch); - $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); - curl_close($ch); - - if ($raw_body === false || $http_code < 200 || $http_code >= 300) { - $err_msg = !empty($curl_err) ? $curl_err : "HTTP $http_code"; - flashAlert("OAuth token test failed: $err_msg", 'error'); - redirect($mail_tab_redirect); - } - - $json = json_decode($raw_body, true); - - if (!is_array($json) || empty($json['access_token'])) { - flashAlert("OAuth token test failed: access token missing in provider response.", 'error'); - redirect($mail_tab_redirect); - } - - $new_access_token = escapeSql($json['access_token']); - $new_expires_at = date('Y-m-d H:i:s', time() + (int)($json['expires_in'] ?? 3600)); - $new_refresh_token = !empty($json['refresh_token']) ? escapeSql($json['refresh_token']) : ''; - - $new_access_token_esc = mysqli_real_escape_string($mysqli, $new_access_token); - $new_expires_at_esc = mysqli_real_escape_string($mysqli, $new_expires_at); - - $refresh_sql = ''; - if (!empty($new_refresh_token)) { - $new_refresh_token_esc = mysqli_real_escape_string($mysqli, $new_refresh_token); - $refresh_sql = ", config_mail_oauth_refresh_token = '$new_refresh_token_esc'"; - } - - mysqli_query($mysqli, "UPDATE settings SET config_mail_oauth_access_token = '$new_access_token_esc', config_mail_oauth_access_token_expires_at = '$new_expires_at_esc'$refresh_sql WHERE company_id = 1"); - - $provider_label = $provider === 'microsoft_oauth' ? 'Microsoft 365' : 'Google Workspace'; - logAudit("Settings", "Edit", "$session_name tested OAuth token refresh for $provider_label mail settings"); - - flashAlert("OAuth token refresh successful for $provider_label. Access token expires at $new_expires_at."); - redirect($mail_tab_redirect); -} + $config_mail_oauth_client_id, + 'response_type' => 'code', + 'redirect_uri' => $redirect_uri, + 'response_mode' => 'query', + 'scope' => $scope, + 'state' => $state, + 'prompt' => 'consent', + ], '', '&', PHP_QUERY_RFC3986); + + logAudit("Settings", "Edit", "$session_name started Microsoft OAuth connect flow for mail settings"); + + redirect($authorize_url); +} + +if (isset($_POST['edit_mail_smtp_settings'])) { + + validateCSRFToken(); + + $config_smtp_provider = escapeSql($_POST['config_smtp_provider']); + $config_smtp_host = escapeSql($_POST['config_smtp_host'] ?? $config_smtp_host); + $config_smtp_port = intval($_POST['config_smtp_port'] ?? $config_smtp_port); + $config_smtp_encryption = escapeSql($_POST['config_smtp_encryption'] ?? $config_smtp_encryption); + $config_smtp_username = escapeSql($_POST['config_smtp_username'] ?? $config_smtp_username); + $config_smtp_password = escapeSql($_POST['config_smtp_password'] ?? $config_smtp_password); + + mysqli_query($mysqli, " + UPDATE settings SET + config_smtp_provider = '$config_smtp_provider', + config_smtp_host = '$config_smtp_host', + config_smtp_port = $config_smtp_port, + config_smtp_encryption = '$config_smtp_encryption', + config_smtp_username = '$config_smtp_username', + config_smtp_password = '$config_smtp_password' + WHERE company_id = 1 + "); + + logAudit("Settings", "Edit", "$session_name edited SMTP settings"); + + flashAlert("SMTP Mail Settings updated"); + + redirect($mail_tab_redirect); + +} + +if (isset($_POST['edit_mail_imap_settings'])) { + + validateCSRFToken(); + + $config_imap_provider = escapeSql($_POST['config_imap_provider']); + $config_imap_host = escapeSql($_POST['config_imap_host'] ?? $config_imap_host); + $config_imap_port = intval($_POST['config_imap_port'] ?? $config_imap_port); + $config_imap_encryption = escapeSql($_POST['config_imap_encryption'] ?? $config_imap_encryption); + $config_imap_username = escapeSql($_POST['config_imap_username'] ?? $config_imap_username); + $config_imap_password = escapeSql($_POST['config_imap_password'] ?? $config_imap_password); + + mysqli_query($mysqli, " + UPDATE settings SET + config_imap_provider = '$config_imap_provider', + config_imap_host = '$config_imap_host', + config_imap_port = $config_imap_port, + config_imap_encryption = '$config_imap_encryption', + config_imap_username = '$config_imap_username', + config_imap_password = '$config_imap_password' + WHERE company_id = 1 + "); + + logAudit("Settings", "Edit", "$session_name edited IMAP settings"); + + flashAlert("IMAP Mail Settings updated"); + + redirect($mail_tab_redirect); + +} + +if (isset($_POST['edit_mail_oauth_settings'])) { + + validateCSRFToken(); + + $config_mail_oauth_client_id = escapeSql($_POST['config_mail_oauth_client_id'] ?? ''); + $config_mail_oauth_client_secret = escapeSql($_POST['config_mail_oauth_client_secret'] ?? ''); + $config_mail_oauth_tenant_id = escapeSql($_POST['config_mail_oauth_tenant_id'] ?? $config_mail_oauth_tenant_id); + $config_mail_oauth_refresh_token = escapeSql($_POST['config_mail_oauth_refresh_token'] ?? ''); + $config_mail_oauth_access_token = escapeSql($_POST['config_mail_oauth_access_token'] ?? ''); + + mysqli_query($mysqli, "UPDATE settings SET + config_mail_oauth_client_id = '$config_mail_oauth_client_id', + config_mail_oauth_client_secret = '$config_mail_oauth_client_secret', + config_mail_oauth_tenant_id = '$config_mail_oauth_tenant_id', + config_mail_oauth_refresh_token = '$config_mail_oauth_refresh_token', + config_mail_oauth_access_token = '$config_mail_oauth_access_token' + WHERE company_id = 1 + "); + + logAudit("Settings", "Edit", "$session_name edited mail OAuth settings"); + flashAlert("Mail OAuth Settings updated"); + redirect($mail_tab_redirect); +} + +if (isset($_POST['edit_mail_from_settings'])) { + + validateCSRFToken(); + + $config_mail_from_email = escapeSql(filter_var($_POST['config_mail_from_email'], FILTER_VALIDATE_EMAIL)); + $config_mail_from_name = escapeSql(preg_replace('/[^a-zA-Z0-9\s]/', '', $_POST['config_mail_from_name'])); + + $config_invoice_from_email = escapeSql(filter_var($_POST['config_invoice_from_email'], FILTER_VALIDATE_EMAIL)); + $config_invoice_from_name = escapeSql(preg_replace('/[^a-zA-Z0-9\s]/', '', $_POST['config_invoice_from_name'])); + + $config_quote_from_email = escapeSql(filter_var($_POST['config_quote_from_email'], FILTER_VALIDATE_EMAIL)); + $config_quote_from_name = escapeSql(preg_replace('/[^a-zA-Z0-9\s]/', '', $_POST['config_quote_from_name'])); + + $config_ticket_from_email = escapeSql(filter_var($_POST['config_ticket_from_email'], FILTER_VALIDATE_EMAIL)); + $config_ticket_from_name = escapeSql(preg_replace('/[^a-zA-Z0-9\s]/', '', $_POST['config_ticket_from_name'])); + + mysqli_query($mysqli,"UPDATE settings SET config_mail_from_email = '$config_mail_from_email', config_mail_from_name = '$config_mail_from_name', config_invoice_from_email = '$config_invoice_from_email', config_invoice_from_name = '$config_invoice_from_name', config_quote_from_email = '$config_quote_from_email', config_quote_from_name = '$config_quote_from_name', config_ticket_from_email = '$config_ticket_from_email', config_ticket_from_name = '$config_ticket_from_name' WHERE company_id = 1"); + + logAudit("Settings", "Edit", "$session_name edited mail from settings"); + + flashAlert("Mail From Settings updated"); + + redirect($mail_tab_redirect); + +} + +if (isset($_POST['test_email_smtp'])) { + + validateCSRFToken(); + + $test_email = intval($_POST['test_email']); + + if($test_email == 1) { + $email_from = escapeSql($config_mail_from_email); + $email_from_name = escapeSql($config_mail_from_name); + } elseif ($test_email == 2) { + $email_from = escapeSql($config_invoice_from_email); + $email_from_name = escapeSql($config_invoice_from_name); + } elseif ($test_email == 3) { + $email_from = escapeSql($config_quote_from_email); + $email_from_name = escapeSql($config_quote_from_name); + } else { + $email_from = escapeSql($config_ticket_from_email); + $email_from_name = escapeSql($config_ticket_from_name); + } + + $email_to = escapeSql($_POST['email_to']); + $subject = "Test email from ITFlow"; + $body = "This is a test email from ITFlow. If you are reading this, it worked!"; + + $data = [ + [ + 'from' => $email_from, + 'from_name' => $email_from_name, + 'recipient' => $email_to, + 'recipient_name' => 'Chap', + 'subject' => $subject, + 'body' => $body + ] + ]; + + $mail = addToMailQueue($data); + + if ($mail === true) { + flashAlert("Test email queued! Check Admin > Mail queue"); + } else { + flashAlert("Failed to add test mail to queue", 'error'); + } + + redirect($mail_tab_redirect); + +} + +if (isset($_POST['test_email_imap'])) { + + validateCSRFToken(); + + $provider = escapeSql($config_imap_provider ?? ''); + + $host = $config_imap_host; + $port = (int) $config_imap_port; + $encryption = strtolower(trim($config_imap_encryption)); // e.g. "ssl", "tls", "none" + $username = $config_imap_username; + $password = $config_imap_password; + + // Shared OAuth fields + $config_mail_oauth_client_id = $config_mail_oauth_client_id ?? ''; + $config_mail_oauth_client_secret = $config_mail_oauth_client_secret ?? ''; + $config_mail_oauth_tenant_id = $config_mail_oauth_tenant_id ?? ''; + $config_mail_oauth_refresh_token = $config_mail_oauth_refresh_token ?? ''; + $config_mail_oauth_access_token = $config_mail_oauth_access_token ?? ''; + $config_mail_oauth_access_token_expires_at = $config_mail_oauth_access_token_expires_at ?? ''; + + $is_oauth = ($provider === 'google_oauth' || $provider === 'microsoft_oauth'); + + if ($provider === 'google_oauth') { + if (empty($host)) { + $host = 'imap.gmail.com'; + } + if (empty($port)) { + $port = 993; + } + if (empty($encryption)) { + $encryption = 'ssl'; + } + } elseif ($provider === 'microsoft_oauth') { + if (empty($host)) { + $host = 'outlook.office365.com'; + } + if (empty($port)) { + $port = 993; + } + if (empty($encryption)) { + $encryption = 'ssl'; + } + } + + if (empty($host) || empty($port) || empty($username)) { + flashAlert("IMAP connection failed: Missing host, port, or username.", 'error'); + redirect($mail_tab_redirect); + } + + $token_is_expired = function (?string $expires_at): bool { + if (empty($expires_at)) { + return true; + } + + $ts = strtotime($expires_at); + + if ($ts === false) { + return true; + } + + return ($ts - 60) <= time(); + }; + + $http_form_post = function (string $url, array $fields): array { + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields, '', '&')); + curl_setopt($ch, CURLOPT_TIMEOUT, 20); + + $raw = curl_exec($ch); + $err = curl_error($ch); + $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + + curl_close($ch); + + return [ + 'ok' => ($raw !== false && $code >= 200 && $code < 300), + 'body' => $raw, + 'code' => $code, + 'err' => $err, + ]; + }; + + if ($is_oauth) { + if (!empty($config_mail_oauth_access_token) && !$token_is_expired($config_mail_oauth_access_token_expires_at)) { + $password = $config_mail_oauth_access_token; + } else { + if (empty($config_mail_oauth_client_id) || empty($config_mail_oauth_client_secret) || empty($config_mail_oauth_refresh_token)) { + flashAlert("IMAP OAuth failed: Missing OAuth client credentials or refresh token.", 'error'); + redirect($mail_tab_redirect); + } + + if ($provider === 'google_oauth') { + $response = $http_form_post('https://oauth2.googleapis.com/token', [ + 'client_id' => $config_mail_oauth_client_id, + 'client_secret' => $config_mail_oauth_client_secret, + 'refresh_token' => $config_mail_oauth_refresh_token, + 'grant_type' => 'refresh_token', + ]); + } else { + if (empty($config_mail_oauth_tenant_id)) { + flashAlert("IMAP OAuth failed: Microsoft tenant ID is required.", 'error'); + redirect($mail_tab_redirect); + } + + $token_url = MICROSOFT_OAUTH_BASE_URL . rawurlencode($config_mail_oauth_tenant_id) . "/oauth2/v2.0/token"; + $response = $http_form_post($token_url, [ + 'client_id' => $config_mail_oauth_client_id, + 'client_secret' => $config_mail_oauth_client_secret, + 'refresh_token' => $config_mail_oauth_refresh_token, + 'grant_type' => 'refresh_token', + ]); + } + + if (!$response['ok']) { + flashAlert("IMAP OAuth failed: Could not refresh access token.", 'error'); + redirect($mail_tab_redirect); + } + + $json = json_decode($response['body'], true); + if (!is_array($json) || empty($json['access_token'])) { + flashAlert("IMAP OAuth failed: Token response did not include an access token.", 'error'); + redirect($mail_tab_redirect); + } + + $password = $json['access_token']; + $expires_at = date('Y-m-d H:i:s', time() + (int)($json['expires_in'] ?? 3600)); + $refresh_token_to_save = $json['refresh_token'] ?? null; + + $token_esc = mysqli_real_escape_string($mysqli, $password); + $expires_at_esc = mysqli_real_escape_string($mysqli, $expires_at); + + $refresh_sql = ''; + if (!empty($refresh_token_to_save)) { + $refresh_token_esc = mysqli_real_escape_string($mysqli, $refresh_token_to_save); + $refresh_sql = ", config_mail_oauth_refresh_token = '{$refresh_token_esc}'"; + } + + mysqli_query($mysqli, "UPDATE settings SET config_mail_oauth_access_token = '{$token_esc}', config_mail_oauth_access_token_expires_at = '{$expires_at_esc}'{$refresh_sql} WHERE company_id = 1"); + } + } + + // Build remote socket (implicit SSL vs plain TCP) + require_once $_SERVER['DOCUMENT_ROOT'] . '/libs/vendor/autoload.php'; // ImapEngine (composer) + + // Map the stored encryption value to an ImapEngine transport (matches the cron sync) + $imap_transport = match ($encryption) { + 'ssl' => 'ssl', // implicit TLS (993) + 'tls' => 'starttls', // STARTTLS upgrade (143) - Webklex semantics + 'starttls' => 'starttls', + default => '', // 'none' / plain TCP + }; + + try { + // Same ImapEngine client the cron sync uses, so a passing test predicts a + // working sync. Typed errors instead of raw banners; host validated at save. + $mailbox = new \DirectoryTree\ImapEngine\Mailbox([ + 'host' => $host, + 'port' => $port, + 'encryption' => $imap_transport, + 'validate_cert' => true, + 'username' => $username, + 'password' => $password, // access token when OAuth + 'authentication' => $is_oauth ? 'oauth' : 'plain', + ]); + + $mailbox->connect(); + $mailbox->inbox(); // confirm auth + mailbox access, like the sync does + + flashAlert($is_oauth ? "Connected successfully using OAuth" : "Connected successfully"); + } catch (\Throwable $e) { + flashAlert("IMAP connection failed. Check the host, port, encryption, and credentials.", 'error'); + } + + redirect($mail_tab_redirect); +} + + +if (isset($_POST['test_oauth_token_refresh'])) { + + validateCSRFToken(); + + $provider = escapeSql($_POST['oauth_provider'] ?? ''); + + if ($provider !== 'google_oauth' && $provider !== 'microsoft_oauth') { + flashAlert("OAuth token test failed: unsupported provider.", 'error'); + redirect($mail_tab_redirect); + } + + $oauth_client_id = escapeSql($config_mail_oauth_client_id ?? ''); + $oauth_client_secret = escapeSql($config_mail_oauth_client_secret ?? ''); + $oauth_tenant_id = escapeSql($config_mail_oauth_tenant_id ?? ''); + $oauth_refresh_token = escapeSql($config_mail_oauth_refresh_token ?? ''); + + if (empty($oauth_client_id) || empty($oauth_client_secret) || empty($oauth_refresh_token)) { + flashAlert("OAuth token test failed: missing client ID, client secret, or refresh token.", 'error'); + redirect($mail_tab_redirect); + } + + if ($provider === 'microsoft_oauth' && empty($oauth_tenant_id)) { + flashAlert("OAuth token test failed: Microsoft tenant ID is required.", 'error'); + redirect($mail_tab_redirect); + } + + $token_url = 'https://oauth2.googleapis.com/token'; + if ($provider === 'microsoft_oauth') { + $token_url = MICROSOFT_OAUTH_BASE_URL . rawurlencode($oauth_tenant_id) . "/oauth2/v2.0/token"; + } + + $post_fields = http_build_query([ + 'client_id' => $oauth_client_id, + 'client_secret' => $oauth_client_secret, + 'refresh_token' => $oauth_refresh_token, + 'grant_type' => 'refresh_token', + ]); + + $ch = curl_init($token_url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields); + curl_setopt($ch, CURLOPT_TIMEOUT, 20); + + $raw_body = curl_exec($ch); + $curl_err = curl_error($ch); + $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + if ($raw_body === false || $http_code < 200 || $http_code >= 300) { + $err_msg = !empty($curl_err) ? $curl_err : "HTTP $http_code"; + flashAlert("OAuth token test failed: $err_msg", 'error'); + redirect($mail_tab_redirect); + } + + $json = json_decode($raw_body, true); + + if (!is_array($json) || empty($json['access_token'])) { + flashAlert("OAuth token test failed: access token missing in provider response.", 'error'); + redirect($mail_tab_redirect); + } + + $new_access_token = escapeSql($json['access_token']); + $new_expires_at = date('Y-m-d H:i:s', time() + (int)($json['expires_in'] ?? 3600)); + $new_refresh_token = !empty($json['refresh_token']) ? escapeSql($json['refresh_token']) : ''; + + $new_access_token_esc = mysqli_real_escape_string($mysqli, $new_access_token); + $new_expires_at_esc = mysqli_real_escape_string($mysqli, $new_expires_at); + + $refresh_sql = ''; + if (!empty($new_refresh_token)) { + $new_refresh_token_esc = mysqli_real_escape_string($mysqli, $new_refresh_token); + $refresh_sql = ", config_mail_oauth_refresh_token = '$new_refresh_token_esc'"; + } + + mysqli_query($mysqli, "UPDATE settings SET config_mail_oauth_access_token = '$new_access_token_esc', config_mail_oauth_access_token_expires_at = '$new_expires_at_esc'$refresh_sql WHERE company_id = 1"); + + $provider_label = $provider === 'microsoft_oauth' ? 'Microsoft 365' : 'Google Workspace'; + logAudit("Settings", "Edit", "$session_name tested OAuth token refresh for $provider_label mail settings"); + + flashAlert("OAuth token refresh successful for $provider_label. Access token expires at $new_expires_at."); + redirect($mail_tab_redirect); +} diff --git a/admin/settings_mail.php b/admin/settings_mail.php index 05d521f5a..bb1866d71 100644 --- a/admin/settings_mail.php +++ b/admin/settings_mail.php @@ -1,565 +1,565 @@ -' - : ''; -} - -$smtp_on = !empty($config_smtp_provider); -$imap_on = !empty($config_imap_provider); -$oauth_needed = in_array($config_smtp_provider, ['google_oauth', 'microsoft_oauth'], true) - || in_array($config_imap_provider, ['google_oauth', 'microsoft_oauth'], true); - -// ---- Active tab ------------------------------------------------------------- -// The tab lives in the URL (?tab=imap) so it can be linked, bookmarked, survives a -// reload, and lets the POST handlers send you back to the tab you saved from -$mail_tabs = ['smtp', 'imap', 'oauth', 'from', 'tests']; -$active_tab = isset($_GET['tab']) && in_array($_GET['tab'], $mail_tabs, true) ? $_GET['tab'] : 'smtp'; - -// A direct link to the OAuth tab reveals it even when no OAuth provider is selected yet -if ($active_tab === 'oauth') { - $oauth_needed = true; -} - -// ---- OAuth callback URI (for Entra App Registration) ------------------------ -if (defined('BASE_URL') && !empty(BASE_URL)) { - $mail_oauth_callback_uri = rtrim((string) BASE_URL, '/') . '/admin/oauth_microsoft_mail_callback.php'; -} else { - $mail_oauth_callback_uri = 'https://' . rtrim((string) $config_base_url, '/') . '/admin/oauth_microsoft_mail_callback.php'; -} - -// ---- Readiness checks (drive the Tests tab) -------------------------------- -$smtp_standard_ready = !empty($config_smtp_host) && !empty($config_smtp_port) - && !empty($config_mail_from_email) && !empty($config_mail_from_name); - -$smtp_oauth_ready = in_array($config_smtp_provider, ['google_oauth', 'microsoft_oauth'], true) - && !empty($config_mail_from_email) && !empty($config_mail_from_name) - && !empty($config_mail_oauth_client_id) && !empty($config_mail_oauth_client_secret) - && !empty($config_mail_oauth_refresh_token) - && ($config_smtp_provider !== 'microsoft_oauth' || !empty($config_mail_oauth_tenant_id)); - -$imap_standard_ready = !empty($config_imap_username) && !empty($config_imap_password) - && !empty($config_imap_host) && !empty($config_imap_port); - -$imap_oauth_ready = in_array($config_imap_provider, ['google_oauth', 'microsoft_oauth'], true) - && !empty($config_imap_username) - && !empty($config_mail_oauth_client_id) && !empty($config_mail_oauth_client_secret) - && !empty($config_mail_oauth_refresh_token) - && ($config_imap_provider !== 'microsoft_oauth' || !empty($config_mail_oauth_tenant_id)); - -$oauth_provider_for_test = ''; -if (in_array($config_imap_provider, ['google_oauth', 'microsoft_oauth'], true)) { - $oauth_provider_for_test = $config_imap_provider; -} elseif (in_array($config_smtp_provider, ['google_oauth', 'microsoft_oauth'], true)) { - $oauth_provider_for_test = $config_smtp_provider; -} - -$oauth_has_required_fields = !empty($oauth_provider_for_test) - && !empty($config_mail_oauth_client_id) && !empty($config_mail_oauth_client_secret) - && !empty($config_mail_oauth_refresh_token) - && ($oauth_provider_for_test !== 'microsoft_oauth' || !empty($config_mail_oauth_tenant_id)); - -$send_ready = $smtp_standard_ready || $smtp_oauth_ready; -$imap_ready = $imap_standard_ready || $imap_oauth_ready; -?> - -
    -
    -

    Mail Configuration

    -
    -
    - - - -
    - - -
    -
    - - - -
    - -
    -
    - -
    - Choose your outbound mail provider. -
    - -
    -
    -
    - -
    -
    - -
    -
    -
    - -
    -
    - -
    -
    -
    - -
    -
    - -
    -
    -
    -
    - -
    -
    - -
    -
    - -
    - Leave blank if no authentication is required. -
    -
    - -
    -
    - -
    -
    -
    -
    - - - -
    - -
    -
    - - -
    -
    - - - -
    - -
    -
    - -
    - Select your mailbox provider. -
    - -
    -
    -
    - -
    -
    - -
    -
    -
    - -
    -
    - -
    -
    -
    - -
    -
    - -
    -
    -
    -
    - -
    -
    - -
    -
    - -
    - The mailbox address to monitor for incoming tickets. -
    -
    - -
    -
    - -
    -
    -
    -
    - - - -
    - -
    -
    - - -
    -
    - - - -
    - These credentials are shared by any Sending or Receiving provider set to Google / Microsoft OAuth. -
    - -
    -
    - -
    -
    - -
    -
    -
    - -
    -
    - -
    -
    -
    -
    - - - -
    -
    - - -
    -
    - - - Expires at: -
    -
    - - - -
    - -
    -
    - - -
    -
    - - - -

    Each From address must be allowed to send on behalf of the SMTP user.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PurposeFrom EmailFrom Name
    System Default
    share links & system tasks
    Invoices
    sent when emailing invoices
    Quotes
    sent when emailing quotes
    Tickets
    ticket creation & client replies
    - - -
    -
    - - -
    - - -
    - Finish configuring Sending, Receiving, or OAuth (plus at least one From address) to unlock the tests. -
    - - - -
    -
    Send a Test Email
    -
    - - -
    - - -
    - -
    -
    -
    -
    - - - -
    -
    Test IMAP Connection
    -
    - - - -
    -
    - - - -
    -
    Test OAuth Token Refresh
    -
    - - - -

    Validates the refresh token and stores a new access token for .

    - -
    -
    - - -
    - -
    -
    -
    - - - +' + : ''; +} + +$smtp_on = !empty($config_smtp_provider); +$imap_on = !empty($config_imap_provider); +$oauth_needed = in_array($config_smtp_provider, ['google_oauth', 'microsoft_oauth'], true) + || in_array($config_imap_provider, ['google_oauth', 'microsoft_oauth'], true); + +// ---- Active tab ------------------------------------------------------------- +// The tab lives in the URL (?tab=imap) so it can be linked, bookmarked, survives a +// reload, and lets the POST handlers send you back to the tab you saved from +$mail_tabs = ['smtp', 'imap', 'oauth', 'from', 'tests']; +$active_tab = isset($_GET['tab']) && in_array($_GET['tab'], $mail_tabs, true) ? $_GET['tab'] : 'smtp'; + +// A direct link to the OAuth tab reveals it even when no OAuth provider is selected yet +if ($active_tab === 'oauth') { + $oauth_needed = true; +} + +// ---- OAuth callback URI (for Entra App Registration) ------------------------ +if (defined('BASE_URL') && !empty(BASE_URL)) { + $mail_oauth_callback_uri = rtrim((string) BASE_URL, '/') . '/admin/oauth_microsoft_mail_callback.php'; +} else { + $mail_oauth_callback_uri = 'https://' . rtrim((string) $config_base_url, '/') . '/admin/oauth_microsoft_mail_callback.php'; +} + +// ---- Readiness checks (drive the Tests tab) -------------------------------- +$smtp_standard_ready = !empty($config_smtp_host) && !empty($config_smtp_port) + && !empty($config_mail_from_email) && !empty($config_mail_from_name); + +$smtp_oauth_ready = in_array($config_smtp_provider, ['google_oauth', 'microsoft_oauth'], true) + && !empty($config_mail_from_email) && !empty($config_mail_from_name) + && !empty($config_mail_oauth_client_id) && !empty($config_mail_oauth_client_secret) + && !empty($config_mail_oauth_refresh_token) + && ($config_smtp_provider !== 'microsoft_oauth' || !empty($config_mail_oauth_tenant_id)); + +$imap_standard_ready = !empty($config_imap_username) && !empty($config_imap_password) + && !empty($config_imap_host) && !empty($config_imap_port); + +$imap_oauth_ready = in_array($config_imap_provider, ['google_oauth', 'microsoft_oauth'], true) + && !empty($config_imap_username) + && !empty($config_mail_oauth_client_id) && !empty($config_mail_oauth_client_secret) + && !empty($config_mail_oauth_refresh_token) + && ($config_imap_provider !== 'microsoft_oauth' || !empty($config_mail_oauth_tenant_id)); + +$oauth_provider_for_test = ''; +if (in_array($config_imap_provider, ['google_oauth', 'microsoft_oauth'], true)) { + $oauth_provider_for_test = $config_imap_provider; +} elseif (in_array($config_smtp_provider, ['google_oauth', 'microsoft_oauth'], true)) { + $oauth_provider_for_test = $config_smtp_provider; +} + +$oauth_has_required_fields = !empty($oauth_provider_for_test) + && !empty($config_mail_oauth_client_id) && !empty($config_mail_oauth_client_secret) + && !empty($config_mail_oauth_refresh_token) + && ($oauth_provider_for_test !== 'microsoft_oauth' || !empty($config_mail_oauth_tenant_id)); + +$send_ready = $smtp_standard_ready || $smtp_oauth_ready; +$imap_ready = $imap_standard_ready || $imap_oauth_ready; +?> + +
    +
    +

    Mail Configuration

    +
    +
    + + + +
    + + +
    +
    + + + +
    + +
    +
    + +
    + Choose your outbound mail provider. +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    + Leave blank if no authentication is required. +
    +
    + +
    +
    + +
    +
    +
    +
    + + + +
    + +
    +
    + + +
    +
    + + + +
    + +
    +
    + +
    + Select your mailbox provider. +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    + +
    + The mailbox address to monitor for incoming tickets. +
    +
    + +
    +
    + +
    +
    +
    +
    + + + +
    + +
    +
    + + +
    +
    + + + +
    + These credentials are shared by any Sending or Receiving provider set to Google / Microsoft OAuth. +
    + +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + + + +
    +
    + + +
    +
    + + + Expires at: +
    +
    + + + +
    + +
    +
    + + +
    +
    + + + +

    Each From address must be allowed to send on behalf of the SMTP user.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PurposeFrom EmailFrom Name
    System Default
    share links & system tasks
    Invoices
    sent when emailing invoices
    Quotes
    sent when emailing quotes
    Tickets
    ticket creation & client replies
    + + +
    +
    + + +
    + + +
    + Finish configuring Sending, Receiving, or OAuth (plus at least one From address) to unlock the tests. +
    + + + +
    +
    Send a Test Email
    +
    + + +
    + + +
    + +
    +
    +
    +
    + + + +
    +
    Test IMAP Connection
    +
    + + + +
    +
    + + + +
    +
    Test OAuth Token Refresh
    +
    + + + +

    Validates the refresh token and stores a new access token for .

    + +
    +
    + + +
    + +
    +
    +
    + + + \ No newline at end of file diff --git a/agent/post/ticket.php b/agent/post/ticket.php index 33834d082..16fcd5b9d 100644 --- a/agent/post/ticket.php +++ b/agent/post/ticket.php @@ -1,2976 +1,2976 @@ - - if ($d !== false) { - $due = "'" . $d->format('Y-m-d H:i:s') . "'"; // wrap in quotes for SQL - } else { - $due = 'NULL'; // fallback if invalid - } - } - - enforceClientAccess(); - - // Add the primary contact as the ticket contact if "Use primary contact" is checked - if ($use_primary_contact == 1) { - $sql = mysqli_query($mysqli, "SELECT contact_id FROM contacts WHERE contact_client_id = $client_id AND contact_primary = 1"); - $row = mysqli_fetch_assoc($sql); - $contact_id = intval($row['contact_id']); - } - - // Atomically increment and get the new ticket number - mysqli_query($mysqli, " - UPDATE settings - SET - config_ticket_next_number = LAST_INSERT_ID(config_ticket_next_number), - config_ticket_next_number = config_ticket_next_number + 1 - WHERE company_id = 1 - "); - - $ticket_number = mysqli_insert_id($mysqli); - - // Sanitize Config Vars from get_settings.php and Session Vars from check_login.php - $config_ticket_prefix = escapeSql($config_ticket_prefix); - $config_ticket_from_name = escapeSql($config_ticket_from_name); - $config_ticket_from_email = escapeSql($config_ticket_from_email); - $config_base_url = escapeSql($config_base_url); - - //Generate a unique URL key for clients to access - $url_key = randomString(32); - - mysqli_query($mysqli, "INSERT INTO tickets SET ticket_prefix = '$config_ticket_prefix', ticket_number = $ticket_number, ticket_source = 'Agent', ticket_category = $category_id, ticket_subject = '$subject', ticket_details = '$details', ticket_priority = '$priority', ticket_billable = '$billable', ticket_status = '$ticket_status', ticket_vendor_ticket_number = '$vendor_ticket_number', ticket_vendor_id = $vendor_id, ticket_location_id = $location_id, ticket_asset_id = $asset_id, ticket_created_by = $session_user_id, ticket_assigned_to = $assigned_to, ticket_contact_id = $contact_id, ticket_url_key = '$url_key', ticket_due_at = $due, ticket_client_id = $client_id, ticket_invoice_id = 0, ticket_project_id = $project_id"); - - $ticket_id = mysqli_insert_id($mysqli); - - // Add Tasks from Template if Template was selected - if($ticket_template_id) { - // Get Associated Tasks from the ticket template - $sql_task_templates = mysqli_query($mysqli, "SELECT * FROM task_templates WHERE task_template_ticket_template_id = $ticket_template_id"); - - if (mysqli_num_rows($sql_task_templates) > 0) { - while ($row = mysqli_fetch_assoc($sql_task_templates)) { - $task_order = intval($row['task_template_order']); - $task_name = escapeSql($row['task_template_name']); - $task_completion_estimate = intval($row['task_template_completion_estimate']); - - mysqli_query($mysqli,"INSERT INTO tasks SET task_name = '$task_name', task_order = $task_order, task_completion_estimate = $task_completion_estimate, task_ticket_id = $ticket_id"); - } - } - } - - // Add Watchers - if (isset($_POST['watchers'])) { - foreach ($_POST['watchers'] as $watcher) { - $watcher_email = escapeSql($watcher); - mysqli_query($mysqli, "INSERT INTO ticket_watchers SET watcher_email = '$watcher_email', watcher_ticket_id = $ticket_id"); - } - } - - // Add Additional Assets - if (isset($_POST['additional_assets'])) { - foreach ($_POST['additional_assets'] as $additional_asset) { - $additional_asset_id = intval($additional_asset); - mysqli_query($mysqli, "INSERT INTO ticket_assets SET ticket_id = $ticket_id, asset_id = $additional_asset_id"); - } - } - - // E-mail client - if ((!empty($config_smtp_provider) || !empty($config_smtp_provider)) && $config_ticket_client_general_notifications == 1) { - - // Get contact/ticket details - $sql = mysqli_query($mysqli, "SELECT contact_name, contact_email, ticket_prefix, ticket_number, ticket_category, ticket_subject, ticket_details, ticket_priority, ticket_status, ticket_created_by, ticket_assigned_to, ticket_client_id FROM tickets - LEFT JOIN clients ON ticket_client_id = client_id - LEFT JOIN contacts ON ticket_contact_id = contact_id - WHERE ticket_id = $ticket_id"); - $row = mysqli_fetch_assoc($sql); - - $contact_name = escapeSql($row['contact_name']); - $contact_email = escapeSql($row['contact_email']); - $ticket_prefix = escapeSql($row['ticket_prefix']); - $ticket_number = intval($row['ticket_number']); - $ticket_category = escapeSql($row['ticket_category']); - $ticket_subject = escapeSql($row['ticket_subject']); - $ticket_details = mysqli_escape_string($mysqli, $row['ticket_details']); - $ticket_priority = escapeSql($row['ticket_priority']); - $ticket_status = escapeSql($row['ticket_status']); - $ticket_status_name = escapeSql(getTicketStatusName($row['ticket_status'])); - $client_id = intval($row['ticket_client_id']); - $ticket_created_by = intval($row['ticket_created_by']); - $ticket_assigned_to = intval($row['ticket_assigned_to']); - - // Get Company Phone Number - $sql = mysqli_query($mysqli, "SELECT company_name, company_phone, company_phone_country_code FROM companies WHERE company_id = 1"); - $row = mysqli_fetch_assoc($sql); - $company_name = escapeSql($row['company_name']); - $company_phone = escapeSql(formatPhoneNumber($row['company_phone'], $row['company_phone_country_code'])); - - // EMAILING - - $subject = "Ticket Created [$ticket_prefix$ticket_number] - $ticket_subject"; - $body = "##- Please type your reply above this line -##

    Hello $contact_name,

    A ticket regarding \"$ticket_subject\" has been created for you.

    --------------------------------
    $ticket_details--------------------------------

    Ticket: $ticket_prefix$ticket_number
    Subject: $ticket_subject
    Status: Open
    Portal: View ticket

    --
    $company_name - Support
    $config_ticket_from_email
    $company_phone"; - - // Verify contact email is valid - if (filter_var($contact_email, FILTER_VALIDATE_EMAIL)) { - - - // Email Ticket Contact - // Queue Mail - $data = []; - - $data[] = [ - 'from' => $config_ticket_from_email, - 'from_name' => $config_ticket_from_name, - 'recipient' => $contact_email, - 'recipient_name' => $contact_name, - 'subject' => $subject, - 'body' => $body - ]; - } - - // Also Email all the watchers - $sql_watchers = mysqli_query($mysqli, "SELECT watcher_email FROM ticket_watchers WHERE watcher_ticket_id = $ticket_id"); - $body .= "

    ----------------------------------------
    YOU HAVE BEEN ADDED AS A COLLABORATOR FOR THIS TICKET"; - while ($row = mysqli_fetch_assoc($sql_watchers)) { - $watcher_email = escapeSql($row['watcher_email']); - - // Queue Mail - $data[] = [ - 'from' => $config_ticket_from_email, - 'from_name' => $config_ticket_from_name, - 'recipient' => $watcher_email, - 'recipient_name' => $watcher_email, - 'subject' => $subject, - 'body' => $body - ]; - } - addToMailQueue($data); - - // END EMAILING - - } - - // Custom action/notif handler - triggerCustomAction('ticket_create', $ticket_id); - - logAudit("Ticket", "Create", "$session_name created ticket $config_ticket_prefix$ticket_number - $ticket_subject", $client_id, $ticket_id); - - flashAlert("Ticket $config_ticket_prefix$ticket_number created"); - - redirect("ticket.php?client_id=$client_id&ticket_id=$ticket_id"); - -} - -if (isset($_POST['edit_ticket'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - $ticket_id = intval($_POST['ticket_id']); - $contact_id = intval($_POST['contact_id']); - $assigned_to = intval($_POST['assigned_to']); - $notify = intval($_POST['contact_notify'] ?? 0); - $category_id = intval($_POST['category_id']); - $ticket_subject = escapeSql($_POST['subject']); - $billable = intval($_POST['billable'] ?? 0); - $ticket_priority = escapeSql($_POST['priority']); - $details = mysqli_real_escape_string($mysqli, $_POST['details']); - $vendor_ticket_number = escapeSql($_POST['vendor_ticket_number']); - $vendor_id = intval($_POST['vendor_id']); - $asset_id = intval($_POST['asset_id']); - $location_id = intval($_POST['location_id']); - $project_id = intval($_POST['project_id']); - // Validate/clean due field - $dueInput = $_POST['due'] ?? null; - if ($dueInput === null || trim($dueInput) === '') { - $due = 'NULL'; // prepare as SQL-safe string - } else { - $d = DateTime::createFromFormat('Y-m-d\TH:i', $dueInput); // for - if ($d !== false) { - $due = "'" . $d->format('Y-m-d H:i:s') . "'"; // wrap in quotes for SQL - } else { - $due = 'NULL'; // fallback if invalid - } - } - - $client_id = intval(getFieldById('tickets', $ticket_id, 'ticket_client_id')); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - mysqli_query($mysqli, "UPDATE tickets SET ticket_category = $category_id, ticket_subject = '$ticket_subject', ticket_priority = '$ticket_priority', ticket_billable = $billable, ticket_details = '$details', ticket_due_at = $due, ticket_vendor_ticket_number = '$vendor_ticket_number', ticket_contact_id = $contact_id, ticket_assigned_to = $assigned_to, ticket_vendor_id = $vendor_id, ticket_location_id = $location_id, ticket_asset_id = $asset_id, ticket_project_id = $project_id WHERE ticket_id = $ticket_id"); - - // Add Additional Assets - if (isset($_POST['additional_assets'])) { - mysqli_query($mysqli, "DELETE FROM ticket_assets WHERE ticket_id = $ticket_id"); - foreach ($_POST['additional_assets'] as $additional_asset) { - $additional_asset_id = intval($additional_asset); - mysqli_query($mysqli, "INSERT INTO ticket_assets SET ticket_id = $ticket_id, asset_id = $additional_asset_id"); - } - } else { - // If no additional assets are provided, delete them all - // This handles cases where the assets input might be cleared or not set at all. - mysqli_query($mysqli, "DELETE FROM ticket_assets WHERE ticket_id = $ticket_id"); - } - - // Get contact/ticket details after update for logging / email purposes - $sql = mysqli_query($mysqli, "SELECT contact_name, contact_email, ticket_prefix, ticket_number, ticket_category, ticket_details, ticket_status_name, ticket_created_by, ticket_assigned_to, ticket_url_key, ticket_client_id FROM tickets - LEFT JOIN clients ON ticket_client_id = client_id - LEFT JOIN contacts ON ticket_contact_id = contact_id - LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id - WHERE ticket_id = $ticket_id - AND ticket_closed_at IS NULL"); - $row = mysqli_fetch_assoc($sql); - - $contact_name = escapeSql($row['contact_name']); - $contact_email = escapeSql($row['contact_email']); - $ticket_prefix = escapeSql($row['ticket_prefix']); - $ticket_number = intval($row['ticket_number']); - $ticket_category = escapeSql($row['ticket_category']); - $ticket_details = mysqli_escape_string($mysqli, $row['ticket_details']); - $ticket_status = escapeSql($row['ticket_status_name']); - $ticket_created_by = intval($row['ticket_created_by']); - $ticket_assigned_to = intval($row['ticket_assigned_to']); - $url_key = escapeSql($row['ticket_url_key']); - $client_id = intval($row['ticket_client_id']); - - // Notify new contact if selected - if ($notify && (!empty($config_smtp_provider) || !empty($config_smtp_provider))) { - - // Get Company Name Phone Number and Sanitize for Email Sending - $sql = mysqli_query($mysqli, "SELECT company_name, company_phone, company_phone_country_code FROM companies WHERE company_id = 1"); - $row = mysqli_fetch_assoc($sql); - $company_name = escapeSql($row['company_name']); - $company_phone = escapeSql(formatPhoneNumber($row['company_phone'], $row['company_phone_country_code'])); - - // Email content - $data = []; // Queue array - - $subject = "Ticket Created - [$ticket_prefix$ticket_number] - $ticket_subject"; - $body = "##- Please type your reply above this line -##

    Hello $contact_name,

    A ticket regarding \"$ticket_subject\" has been created for you.

    --------------------------------
    $ticket_details--------------------------------

    Ticket: $ticket_prefix$ticket_number
    Subject: $ticket_subject
    Status: $ticket_status
    Portal: View ticket

    --
    $company_name - Support
    $config_ticket_from_email
    $company_phone"; - - - // Only add contact to email queue if email is valid - if (filter_var($contact_email, FILTER_VALIDATE_EMAIL)) { - $data[] = [ - 'from' => $config_ticket_from_email, - 'from_name' => $config_ticket_from_name, - 'recipient' => $contact_email, - 'recipient_name' => $contact_name, - 'subject' => $subject, - 'body' => $body - ]; - } - - addToMailQueue($data); - } - - // Custom action/notif handler - triggerCustomAction('ticket_update', $ticket_id); - - logAudit("Ticket", "Edit", "$session_name edited ticket $ticket_prefix$ticket_number", $client_id, $ticket_id); - - flashAlert("Ticket $ticket_prefix$ticket_number updated"); - - redirect(); - -} - -if (isset($_POST['edit_ticket_priority'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - $ticket_id = intval($_POST['ticket_id']); - $priority = escapeSql($_POST['priority']); - - // Get ticket details before updating - $sql = mysqli_query($mysqli, "SELECT - ticket_prefix, ticket_number, ticket_priority, ticket_status_name, ticket_client_id - FROM tickets - LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id - WHERE ticket_id = $ticket_id" - ); - $row = mysqli_fetch_assoc($sql); - $ticket_prefix = escapeSql($row['ticket_prefix']); - $ticket_number = intval($row['ticket_number']); - $original_priority = escapeSql($row['ticket_priority']); - $ticket_status = escapeSql($row['ticket_status_name']); - $client_id = intval($row['ticket_client_id']); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - mysqli_query($mysqli, "UPDATE tickets SET ticket_priority = '$priority' WHERE ticket_id = $ticket_id"); - - // Update Ticket History - mysqli_query($mysqli, "INSERT INTO ticket_history SET ticket_history_status = '$ticket_status', ticket_history_description = '$session_name changed priority from $original_priority to $priority', ticket_history_ticket_id = $ticket_id"); - - logAudit("Ticket", "Edit", "$session_name changed priority from $original_priority to $priority for ticket $ticket_prefix$ticket_number", $client_id, $ticket_id); - - triggerCustomAction('ticket_update', $ticket_id); - - flashAlert("Priority updated from $original_priority to $priority"); - - redirect(); - -} - -if (isset($_POST['edit_ticket_contact'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - $ticket_id = intval($_POST['ticket_id']); - $contact_id = intval($_POST['contact']); - $notify = intval($_POST['contact_notify']) ?? 0; - - // Get Original contact, and ticket details - $sql = mysqli_query($mysqli, "SELECT - contact_name, ticket_prefix, ticket_number, ticket_status_name, ticket_subject, ticket_details, ticket_url_key, ticket_client_id - FROM tickets - LEFT JOIN contacts ON ticket_contact_id = contact_id - LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id - WHERE ticket_id = $ticket_id" - ); - $row = mysqli_fetch_assoc($sql); - - // Original contact - $original_contact_name = !empty($row['contact_name']) ? escapeSql($row['contact_name']) : 'No one'; - - // Ticket details - $ticket_prefix = escapeSql($row['ticket_prefix']); - $ticket_number = intval($row['ticket_number']); - $ticket_status = escapeSql($row['ticket_status_name']); - $ticket_subject = escapeSql($row['ticket_subject']); - $ticket_details = mysqli_escape_string($mysqli, $row['ticket_details']); - $url_key = escapeSql($row['ticket_url_key']); - $client_id = intval($row['ticket_client_id']); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - // Update the contact - mysqli_query($mysqli, "UPDATE tickets SET ticket_contact_id = $contact_id WHERE ticket_id = $ticket_id"); - - // Get New contact details - $sql = mysqli_query($mysqli, "SELECT contact_name, contact_email FROM contacts WHERE contact_id = $contact_id"); - $row = mysqli_fetch_assoc($sql); - - $contact_name = !empty($row['contact_name']) ? escapeSql($row['contact_name']) : 'No one'; - $contact_email = escapeSql($row['contact_email']); - - // Notify new contact (if selected, valid & configured) - if ($notify && filter_var($contact_email, FILTER_VALIDATE_EMAIL) && (!empty($config_smtp_provider) || !empty($config_smtp_provider))) { - - // Get Company Phone Number - $sql = mysqli_query($mysqli, "SELECT company_name, company_phone, company_phone_country_code FROM companies WHERE company_id = 1"); - $row = mysqli_fetch_assoc($sql); - $company_name = escapeSql($row['company_name']); - $company_phone = escapeSql(formatPhoneNumber($row['company_phone'], $row['company_phone_country_code'])); - - $config_ticket_from_email = escapeSql($config_ticket_from_email); - $config_ticket_from_name = escapeSql($config_ticket_from_name); - - // Email content - $data = []; // Queue array - - $subject = "Ticket Created - [$ticket_prefix$ticket_number] - $ticket_subject"; - $body = "##- Please type your reply above this line -##

    Hello $contact_name,

    A ticket regarding \"$ticket_subject\" has been created for you.

    --------------------------------
    $ticket_details--------------------------------

    Ticket: $ticket_prefix$ticket_number
    Subject: $ticket_subject
    Status: $ticket_status
    Portal: View ticket

    --
    $company_name - Support
    $config_ticket_from_email
    $company_phone"; - - $data[] = [ - 'from' => $config_ticket_from_email, - 'from_name' => $config_ticket_from_name, - 'recipient' => $contact_email, - 'recipient_name' => $contact_name, - 'subject' => $subject, - 'body' => $body - ]; - - addToMailQueue($data); - } - - // Custom action/notif handler - triggerCustomAction('ticket_update', $ticket_id); - - // Update Ticket History - mysqli_query($mysqli, "INSERT INTO ticket_history SET ticket_history_status = '$ticket_status', ticket_history_description = '$session_name changed the contact from $original_contact_name to $contact_name', ticket_history_ticket_id = $ticket_id"); - - logAudit("Ticket", "Edit", "$session_name changed the contact from $original_contact_name to $contact_name for ticket $ticket_prefix$ticket_number", $client_id, $ticket_id); - - flashAlert("Contact changed from $original_contact_name to $contact_name"); - - redirect(); - -} - -if (isset($_POST['edit_ticket_project'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - $ticket_id = intval($_POST['ticket_id']); - $project_id = intval($_POST['project']); - - $project_name = escapeSql(getFieldById('projects', $project_id, 'project_name')); - $client_id = intval(getFieldById('tickets', $ticket_id, 'ticket_client_id')); - $ticket_prefix = escapeSql(getFieldById('tickets', $ticket_id, 'ticket_prefix')); - $ticket_number = escapeSql(getFieldById('tickets', $ticket_id, 'ticket_number')); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - mysqli_query($mysqli, "UPDATE tickets SET ticket_project_id = $project_id WHERE ticket_id = $ticket_id"); - - logAudit("Ticket", "Edit", "$session_name set ticket $ticket_prefix$ticket_number project to $project_name", $client_id, $ticket_id); - - flashAlert("Project changed to $project_name for Ticket $ticket_prefix$ticket_number"); - - redirect(); - -} - -if (isset($_POST['add_ticket_watcher'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - $ticket_id = intval($_POST['ticket_id']); - $watcher_emails = preg_split("/,| |;/", $_POST['watcher_email']); // Split on comma, semicolon or space, we sanitize later - $notify = intval($_POST['watcher_notify'] ?? 0); - - // Get contact/ticket details - $sql = mysqli_query($mysqli, "SELECT ticket_prefix, ticket_number, ticket_category, ticket_subject, ticket_details, ticket_priority, ticket_status_name, ticket_url_key, ticket_created_by, ticket_assigned_to, ticket_client_id FROM tickets - LEFT JOIN clients ON ticket_client_id = client_id - LEFT JOIN contacts ON ticket_contact_id = contact_id - LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id - WHERE ticket_id = $ticket_id - AND ticket_closed_at IS NULL"); - $row = mysqli_fetch_assoc($sql); - - $ticket_prefix = escapeSql($row['ticket_prefix']); - $ticket_number = intval($row['ticket_number']); - $ticket_category = escapeSql($row['ticket_category']); - $ticket_subject = escapeSql($row['ticket_subject']); - $ticket_details = mysqli_escape_string($mysqli, $row['ticket_details']); - $ticket_priority = escapeSql($row['ticket_priority']); - $ticket_status = escapeSql($row['ticket_status_name']); - $url_key = escapeSql($row['ticket_url_key']); - $client_id = intval($row['ticket_client_id']); - $ticket_created_by = intval($row['ticket_created_by']); - $ticket_assigned_to = intval($row['ticket_assigned_to']); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - // Get Company Phone Number - $sql = mysqli_query($mysqli, "SELECT company_name, company_phone, company_phone_country_code FROM companies WHERE company_id = 1"); - $row = mysqli_fetch_assoc($sql); - $company_name = escapeSql($row['company_name']); - $company_phone = escapeSql(formatPhoneNumber($row['company_phone'], $row['company_phone_country_code'])); - - // Process each watcher in list - foreach ($watcher_emails as $watcher_email) { - - if (filter_var($watcher_email, FILTER_VALIDATE_EMAIL)) { - - $watcher_email = escapeSql($watcher_email); - - mysqli_query($mysqli, "INSERT INTO ticket_watchers SET watcher_email = '$watcher_email', watcher_ticket_id = $ticket_id"); - - // Notify watcher - if ($notify && (!empty($config_smtp_provider))) { - - - - // Email content - $data = []; // Queue array - - $subject = "Ticket Notification - [$ticket_prefix$ticket_number] - $ticket_subject"; - $body = "##- Please type your reply above this line -##

    Hello,

    You have been added as a collaborator on this ticket regarding \"$ticket_subject\".

    --------------------------------
    $ticket_details--------------------------------

    Ticket: $ticket_prefix$ticket_number
    Subject: $ticket_subject
    Status: $ticket_status
    Guest link: https://$config_base_url/guest/guest_view_ticket.php?ticket_id=$ticket_id&url_key=$url_key

    --
    $company_name - Support
    $config_ticket_from_email
    $company_phone"; - - $data[] = [ - 'from' => $config_ticket_from_email, - 'from_name' => $config_ticket_from_name, - 'recipient' => $watcher_email, - 'recipient_name' => $watcher_email, - 'subject' => $subject, - 'body' => $body - ]; - - addToMailQueue($data); - } - - logAudit("Ticket", "Edit", "$session_name added $watcher_email as a watcher for ticket $ticket_prefix$ticket_number", $client_id, $ticket_id); - } - - } - - flashAlert("Added watcher(s)"); - - redirect(); - -} - -if (isset($_GET['delete_ticket_watcher'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - $watcher_id = intval($_GET['delete_ticket_watcher']); - - // Get ticket / watcher details for logging - $sql = mysqli_query($mysqli, "SELECT watcher_email, ticket_prefix, ticket_number, ticket_status_name, ticket_client_id, ticket_id FROM ticket_watchers - LEFT JOIN tickets ON watcher_ticket_id = ticket_id - LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id - WHERE watcher_id = $watcher_id" - ); - $row = mysqli_fetch_assoc($sql); - - $ticket_prefix = escapeSql($row['ticket_prefix']); - $ticket_number = intval($row['ticket_number']); - $ticket_status_name = escapeSql($row['ticket_status_name']); - $watcher_email = escapeSql($row['watcher_email']); - $client_id = intval($row['ticket_client_id']); - $ticket_id = intval($row['ticket_id']); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - mysqli_query($mysqli, "DELETE FROM ticket_watchers WHERE watcher_id = $watcher_id"); - - // History - mysqli_query($mysqli, "INSERT INTO ticket_history SET ticket_history_status = '$ticket_status_name', ticket_history_description = '$session_name removed ticket $watcher_email as a watcher', ticket_history_ticket_id = $ticket_id"); - - logAudit("Ticket", "Edit", "$session_name removed $watcher_email as a watcher for ticket $ticket_prefix$ticket_number", $client_id, $ticket_id); - - flashAlert("Removed ticket watcher $watcher_email", 'error'); - - redirect(); - -} - -if (isset($_GET['delete_ticket_additional_asset'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - $asset_id = intval($_GET['delete_ticket_additional_asset']); - $ticket_id = intval($_GET['ticket_id']); - - // Get ticket / asset details for logging - $sql = mysqli_query($mysqli, "SELECT asset_name, ticket_prefix, ticket_number, ticket_status_name, ticket_client_id FROM assets - JOIN tickets ON ticket_id = $ticket_id - JOIN ticket_statuses ON ticket_status = ticket_status_id - WHERE asset_id = $asset_id" - ); - $row = mysqli_fetch_assoc($sql); - - $ticket_prefix = escapeSql($row['ticket_prefix']); - $ticket_number = intval($row['ticket_number']); - $ticket_status_name = escapeSql($row['ticket_status_name']); - $asset_name = escapeSql($row['asset_name']); - $client_id = intval($row['ticket_client_id']); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - mysqli_query($mysqli, "DELETE FROM ticket_assets WHERE ticket_id = $ticket_id AND asset_id = $asset_id"); - - // History - mysqli_query($mysqli, "INSERT INTO ticket_history SET ticket_history_status = '$ticket_status_name', ticket_history_description = '$session_name removed additional asset $asset_name', ticket_history_ticket_id = $ticket_id"); - - logAudit("Ticket", "Edit", "$session_name removed asset $asset_name from ticket $ticket_prefix$ticket_number", $client_id, $ticket_id); - - flashAlert("Removed asset $asset_name from ticket.", 'error'); - - redirect(); - -} - -if (isset($_POST['edit_ticket_asset'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - $ticket_id = intval($_POST['ticket_id']); - $asset_id = intval($_POST['asset']); - - $client_id = intval(getFieldById('tickets', $ticket_id, 'ticket_client_id')); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - mysqli_query($mysqli, "UPDATE tickets SET ticket_asset_id = $asset_id WHERE ticket_id = $ticket_id"); - - // Add Additional Assets - if (isset($_POST['additional_assets'])) { - mysqli_query($mysqli, "DELETE FROM ticket_assets WHERE ticket_id = $ticket_id"); - foreach ($_POST['additional_assets'] as $additional_asset) { - $additional_asset_id = intval($additional_asset); - mysqli_query($mysqli, "INSERT INTO ticket_assets SET ticket_id = $ticket_id, asset_id = $additional_asset_id"); - } - } else { - // If no additional assets are provided, delete them all - // This handles cases where the assets input might be cleared or not set at all. - mysqli_query($mysqli, "DELETE FROM ticket_assets WHERE ticket_id = $ticket_id"); - } - - // Get ticket / asset details for logging - $sql = mysqli_query($mysqli, "SELECT asset_name, ticket_prefix, ticket_number, ticket_status_name, ticket_client_id FROM assets - LEFT JOIN tickets ON ticket_asset_id = asset_id - LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id - WHERE ticket_id = $ticket_id" - ); - $row = mysqli_fetch_assoc($sql); - - $ticket_prefix = escapeSql($row['ticket_prefix']); - $ticket_number = intval($row['ticket_number']); - $ticket_status_name = escapeSql($row['ticket_status_name']); - $asset_name = escapeSql($row['asset_name']); - $client_id = intval($row['ticket_client_id']); - - logAudit("Ticket", "Edit", "$session_name changed asset to $asset_name for ticket $ticket_prefix$ticket_number", $client_id, $ticket_id); - - flashAlert("Ticket $ticket_prefix$ticket_number asset updated to $asset_name"); - - redirect(); - -} - -if (isset($_POST['edit_ticket_vendor'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - $ticket_id = intval($_POST['ticket_id']); - $vendor_id = intval($_POST['vendor']); - - $client_id = intval(getFieldById('tickets', $ticket_id, 'ticket_client_id')); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - mysqli_query($mysqli, "UPDATE tickets SET ticket_vendor_id = $vendor_id WHERE ticket_id = $ticket_id"); - - // Get ticket / vendor details for logging - $sql = mysqli_query($mysqli, "SELECT vendor_name, ticket_prefix, ticket_number, ticket_status_name, ticket_client_id FROM vendors - LEFT JOIN tickets ON ticket_vendor_id = $vendor_id - LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id - WHERE ticket_id = $ticket_id" - ); - $row = mysqli_fetch_assoc($sql); - - $ticket_prefix = escapeSql($row['ticket_prefix']); - $ticket_number = intval($row['ticket_number']); - $ticket_status_name = escapeSql($row['ticket_status_name']); - $vendor_name = escapeSql($row['vendor_name']); - $client_id = intval($row['ticket_client_id']); - - logAudit("Ticket", "Edit", "$session_name set vendor to $vendor_name for ticket $ticket_prefix$ticket_number", $client_id, $ticket_id); - - flashAlert("Set vendor to $vendor_name for ticket $ticket_prefix$ticket_number"); - - redirect(); - -} - -if (isset($_POST['assign_ticket'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - // POST variables - $ticket_id = intval($_POST['ticket_id']); - $assigned_to = intval($_POST['assigned_to']); - $ticket_status = intval($_POST['ticket_status']); - - // New > Open as assigned - if ($ticket_status == 1 && $assigned_to !== 0) { - $ticket_status = 2; - } - - // Allow for un-assigning tickets - if ($assigned_to == 0) { - $ticket_reply = "Ticket unassigned."; - $agent_name = "No One"; - } else { - // Get & verify assigned agent details - $agent_details_sql = mysqli_query($mysqli, "SELECT user_name, user_email FROM users WHERE users.user_id = $assigned_to"); - $agent_details = mysqli_fetch_assoc($agent_details_sql); - - $agent_name = escapeSql($agent_details['user_name']); - $agent_email = escapeSql($agent_details['user_email']); - $ticket_reply = "Ticket re-assigned to $agent_name."; - - if (!$agent_name) { - flashAlert("Invalid agent!", 'error'); - redirect(); - } - } - - // Get & verify ticket details - $ticket_details_sql = mysqli_query($mysqli, "SELECT ticket_prefix, ticket_number, ticket_subject, ticket_client_id, client_name FROM tickets LEFT JOIN clients ON ticket_client_id = client_id WHERE ticket_id = '$ticket_id' AND ticket_status != 5"); - $ticket_details = mysqli_fetch_assoc($ticket_details_sql); - - $ticket_prefix = escapeSql($ticket_details['ticket_prefix']); - $ticket_number = intval($ticket_details['ticket_number']); - $ticket_subject = escapeSql($ticket_details['ticket_subject']); - $client_id = intval($ticket_details['ticket_client_id']); - $client_name = escapeSql($ticket_details['client_name']); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - if (!$ticket_subject) { - flashAlert("Invalid ticket!", 'error'); - redirect(); - } - - if ($client_id) { - $client_uri = "&client_id=$client_id"; - } else { - $client_uri = ''; - } - - // Update ticket & insert reply - mysqli_query($mysqli, "UPDATE tickets SET ticket_assigned_to = $assigned_to, ticket_status = '$ticket_status' WHERE ticket_id = $ticket_id"); - - mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = '$ticket_reply', ticket_reply_type = 'Internal', ticket_reply_time_worked = '00:01:00', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); - - logAudit("Ticket", "Edit", "$session_name reassigned $ticket_prefix$ticket_number to $agent_name", $client_id, $ticket_id); - - // Notification - if ($session_user_id != $assigned_to && $assigned_to != 0) { - - // App Notification - mysqli_query($mysqli, "INSERT INTO notifications SET notification_type = 'Ticket', notification = 'Ticket $ticket_prefix$ticket_number - Subject: $ticket_subject has been assigned to you by $session_name', notification_action = '/agent/ticket.php?ticket_id=$ticket_id$client_uri', notification_client_id = $client_id, notification_user_id = $assigned_to"); - - // Email Notification - if (!empty($config_smtp_provider)) { - - // Sanitize Config vars from get_settings.php - $config_ticket_from_name = escapeSql($config_ticket_from_name); - $config_ticket_from_email = escapeSql($config_ticket_from_email); - $company_name = escapeSql($session_company_name); - - $subject = "$config_app_name - Ticket $ticket_prefix$ticket_number assigned to you - $ticket_subject"; - $body = "Hi $agent_name,

    A ticket has been assigned to you!

    Client: $client_name
    Ticket Number: $ticket_prefix$ticket_number
    Subject: $ticket_subject

    https://$config_base_url/agent/ticket.php?ticket_id=$ticket_id$client_uri

    Thanks,
    $session_name
    $company_name"; - - // Email Ticket Agent - // Queue Mail - $data = [ - [ - 'from' => $config_ticket_from_email, - 'from_name' => $config_ticket_from_name, - 'recipient' => $agent_email, - 'recipient_name' => $agent_name, - 'subject' => $subject, - 'body' => $body, - ] - ]; - addToMailQueue($data); - } - } - - triggerCustomAction('ticket_assign', $ticket_id); - - flashAlert("Ticket $ticket_prefix$ticket_number assigned to $agent_name"); - - redirect(); - -} - -if (isset($_GET['delete_ticket'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 3); - - $ticket_id = intval($_GET['delete_ticket']); - - // Get Ticket and Client ID for logging and alert message - $sql = mysqli_query($mysqli, "SELECT ticket_prefix, ticket_number, ticket_subject, ticket_status, ticket_closed_at, ticket_client_id FROM tickets WHERE ticket_id = $ticket_id"); - $row = mysqli_fetch_assoc($sql); - $ticket_prefix = escapeSql($row['ticket_prefix']); - $ticket_number = escapeSql($row['ticket_number']); - $ticket_subject = escapeSql($row['ticket_subject']); - $ticket_status = escapeSql($row['ticket_status']); - $ticket_closed_at = escapeSql($row['ticket_closed_at']); - $client_id = intval($row['ticket_client_id']); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - if (empty($ticket_closed_at)) { - mysqli_query($mysqli, "DELETE FROM tickets WHERE ticket_id = $ticket_id"); - - // Delete all ticket replies - mysqli_query($mysqli, "DELETE FROM ticket_replies WHERE ticket_reply_ticket_id = $ticket_id"); - - // Delete all ticket views - mysqli_query($mysqli, "DELETE FROM ticket_views WHERE view_ticket_id = $ticket_id"); - - // Delete ticket watchers - mysqli_query($mysqli, "DELETE FROM ticket_watchers WHERE watcher_ticket_id = $ticket_id"); - - // Delete Ticket Attachements - mysqli_query($mysqli, "DELETE FROM ticket_attachments WHERE ticket_attachment_ticket_id = $ticket_id"); - removeDirectory("../uploads/tickets/$ticket_id"); - - // No Need to delete ticket assets as this is cascadely deleted via the database. - - logAudit("Ticket", "Delete", "$session_name deleted $ticket_prefix$ticket_number along with all replies", $client_id); - - flashAlert("Ticket $ticket_prefix$ticket_number along with all replies deleted", 'error'); - - triggerCustomAction('ticket_delete', $ticket_id); - - redirect("tickets.php"); - } - -} - -if (isset($_POST['bulk_delete_tickets'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 3); - - if (isset($_POST['ticket_ids'])) { - - $count = count($_POST['ticket_ids']); - - // Cycle through array and delete each recurring scheduled ticket - foreach ($_POST['ticket_ids'] as $ticket_id) { - - $ticket_id = intval($ticket_id); - - $client_id = intval(getFieldById('tickets', $ticket_id, 'ticket_client_id')); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - mysqli_query($mysqli, "DELETE FROM tickets WHERE ticket_id = $ticket_id"); - - // Delete all ticket replies - mysqli_query($mysqli, "DELETE FROM ticket_replies WHERE ticket_reply_ticket_id = $ticket_id"); - - // Delete all ticket views - mysqli_query($mysqli, "DELETE FROM ticket_views WHERE view_ticket_id = $ticket_id"); - - // Delete ticket watchers - mysqli_query($mysqli, "DELETE FROM ticket_watchers WHERE watcher_ticket_id = $ticket_id"); - - // Delete Ticket Attachements - mysqli_query($mysqli, "DELETE FROM ticket_attachments WHERE ticket_attachment_ticket_id = $ticket_id"); - removeDirectory("../uploads/tickets/$ticket_id"); - - // No Need to delete ticket assets as this is cascadely deleted via the database. - - logAudit("Ticket", "Delete", "$session_name deleted ticket", 0, $ticket_id); - - } - - logAudit("Ticket", "Bulk Delete", "$session_name deleted $count ticket(s)"); - - flashAlert("Deleted $count ticket(s)", 'error'); - } - - redirect(); - -} - -if (isset($_POST['bulk_assign_ticket'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - // POST variables - $assign_to = intval($_POST['assign_to']); - - // Get a Ticket Count - $ticket_count = count($_POST['ticket_ids']); - - // Assign Tech to Selected Tickets - if (!empty($_POST['ticket_ids'])) { - foreach ($_POST['ticket_ids'] as $ticket_id) { - $ticket_id = intval($ticket_id); - - $sql = mysqli_query($mysqli, "SELECT * FROM tickets LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id WHERE ticket_id = $ticket_id"); - $row = mysqli_fetch_assoc($sql); - - $ticket_prefix = escapeSql($row['ticket_prefix']); - $ticket_number = intval($row['ticket_number']); - $ticket_status = intval($row['ticket_status']); - $ticket_name = escapeSql($row['ticket_name']); - $ticket_subject = escapeSql($row['ticket_subject']); - $client_id = intval($row['ticket_client_id']); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - if ($ticket_status == 1 && $assigned_to !== 0) { - $ticket_status = 2; - } - - // Allow for un-assigning tickets - if ($assign_to == 0) { - $ticket_reply = "Ticket unassigned, pending re-assignment."; - $agent_name = "No One"; - } else { - // Get & verify assigned agent details - $agent_details_sql = mysqli_query($mysqli, "SELECT user_name, user_email FROM users LEFT JOIN user_settings ON users.user_id = user_settings.user_id WHERE users.user_id = $assign_to"); - $agent_details = mysqli_fetch_assoc($agent_details_sql); - - $agent_name = escapeSql($agent_details['user_name']); - $agent_email = escapeSql($agent_details['user_email']); - $ticket_reply = "Ticket re-assigned to $agent_name."; - - if (!$agent_name) { - flashAlert("Invalid agent!", 'error'); - redirect(); - } - } - - // Update ticket & insert reply - mysqli_query($mysqli, "UPDATE tickets SET ticket_assigned_to = $assign_to, ticket_status = $ticket_status WHERE ticket_id = $ticket_id"); - - mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = '$ticket_reply', ticket_reply_type = 'Internal', ticket_reply_time_worked = '00:01:00', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); - - logAudit("Ticket", "Edit", "$session_name reassigned ticket $ticket_prefix$ticket_number to $agent_name", $client_id, $ticket_id); - - triggerCustomAction('ticket_assign', $ticket_id); - - $tickets_assigned_body .= "$ticket_prefix$ticket_number - $ticket_subject
    "; - } // End For Each Ticket ID Loop - - // Notification - if ($session_user_id != $assign_to && $assign_to != 0) { - - // App Notification - mysqli_query($mysqli, "INSERT INTO notifications SET notification_type = 'Ticket', notification = '$ticket_count Tickets have been assigned to you by $session_name', notification_action = 'tickets.php?status=Open&assigned=$assign_to', notification_client_id = $client_id, notification_user_id = $assign_to"); - - // Agent Email Notification - if (!empty($config_smtp_provider)) { - - // Sanitize Config vars from get_settings.php - $config_ticket_from_name = escapeSql($config_ticket_from_name); - $config_ticket_from_email = escapeSql($config_ticket_from_email); - $company_name = escapeSql($session_company_name); - - $subject = "$config_app_name - $ticket_count tickets have been assigned to you"; - $body = "Hi $agent_name,

    $session_name assigned $ticket_count tickets to you!

    $tickets_assigned_body
    Thanks,
    $session_name
    $company_name"; - - // Email Ticket Agent - // Queue Mail - $data = [ - [ - 'from' => $config_ticket_from_email, - 'from_name' => $config_ticket_from_name, - 'recipient' => $agent_email, - 'recipient_name' => $agent_name, - 'subject' => $subject, - 'body' => $body, - ] - ]; - addToMailQueue($data); - } - } - } - - flashAlert("You assigned $ticket_count Tickets to $agent_name"); - - redirect(); - -} - -if (isset($_POST['bulk_edit_ticket_priority'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - // POST variables - $priority = escapeSql($_POST['bulk_priority']); - - // Assign Tech to Selected Tickets - if (isset($_POST['ticket_ids'])) { - - // Get a Ticket Count - $ticket_count = count($_POST['ticket_ids']); - - foreach ($_POST['ticket_ids'] as $ticket_id) { - $ticket_id = intval($ticket_id); - - $sql = mysqli_query($mysqli, "SELECT * FROM tickets WHERE ticket_id = $ticket_id"); - $row = mysqli_fetch_assoc($sql); - - $ticket_prefix = escapeSql($row['ticket_prefix']); - $ticket_number = intval($row['ticket_number']); - $ticket_subject = escapeSql($row['ticket_subject']); - $original_ticket_priority = escapeSql($row['ticket_priority']); - $client_id = intval($row['ticket_client_id']); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - // Update ticket & insert reply - mysqli_query($mysqli, "UPDATE tickets SET ticket_priority = '$priority' WHERE ticket_id = $ticket_id"); - - mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = '$session_name updated the priority from $current_ticket_priority to $priority', ticket_reply_type = 'Internal', ticket_reply_time_worked = '00:01:00', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); - - logAudit("Ticket", "Edit", "$session_name updated the priority on ticket $ticket_prefix$ticket_number - $ticket_subject from $original_ticket_priority to $priority", $client_id, $ticket_id); - - triggerCustomAction('ticket_update', $ticket_id); - } // End For Each Ticket ID Loop - - logAudit("Ticket", " Bulk Edit", "$session_name updated the priority on $ticket_count"); - - flashAlert("You updated the priority for $ticket_count Tickets to $priority"); - } - - redirect(); - -} - -if (isset($_POST['bulk_edit_ticket_category'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - // POST variables - $category_id = intval($_POST['bulk_category']); - - // Assign Tech to Selected Tickets - if (isset($_POST['ticket_ids'])) { - - // Get a Ticket Count - $ticket_count = count($_POST['ticket_ids']); - - foreach ($_POST['ticket_ids'] as $ticket_id) { - $ticket_id = intval($ticket_id); - - $sql = mysqli_query($mysqli, "SELECT ticket_prefix, ticket_number, ticket_subject, category_name, ticket_client_id FROM tickets LEFT JOIN categories ON ticket_category = category_id WHERE ticket_id = $ticket_id"); - $row = mysqli_fetch_assoc($sql); - - $ticket_prefix = escapeSql($row['ticket_prefix']); - $ticket_number = intval($row['ticket_number']); - $ticket_subject = escapeSql($row['ticket_subject']); - $previous_ticket_category_name = escapeSql($row['category_name']); - $client_id = intval($row['ticket_client_id']); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - // Get Category Name - $category_name = escapeSql(getFieldById('categories', $category_id, 'category_name')); - - // Update ticket - mysqli_query($mysqli, "UPDATE tickets SET ticket_category = '$category_id' WHERE ticket_id = $ticket_id"); - - logAudit("Ticket", "Edit", "$session_name updated the category on ticket $ticket_prefix$ticket_number - $ticket_subject from $previous_category_name to $category_name", $client_id, $ticket_id); - - triggerCustomAction('ticket_update', $ticket_id); - } // End For Each Ticket ID Loop - - logAudit("Ticket", " Bulk Edit", "$session_name updated the category to $category_name on $ticket_count"); - - flashAlert("Category set to $category_name for $ticket_count Tickets"); - } - - redirect(); - -} - -if (isset($_POST['bulk_merge_tickets'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - $merge_into_ticket_id = intval($_POST['merge_into_ticket_id']); // Parent ticket id - $merge_comment = escapeSql($_POST['merge_comment']); // Merge comment - $ticket_reply_type = 'Internal'; // Default all replies to internal - - // NEW PARENT ticket details - // Get merge into ticket id (as it may differ from the number) - $sql = mysqli_query($mysqli, "SELECT ticket_id, ticket_number FROM tickets WHERE ticket_id = $merge_into_ticket_id"); - if (mysqli_num_rows($sql) == 0) { - flashAlert("Cannot merge into that ticket.", 'error'); - redirect(); - } - $merge_row = mysqli_fetch_assoc($sql); - $merge_into_ticket_number = intval($merge_row['ticket_number']); // Parent ticket Number - - // Update & Close the selected tickets - if (isset($_POST['ticket_ids'])) { - - $ticket_count = count($_POST['ticket_ids']); // Get a ticket count - - foreach ($_POST['ticket_ids'] as $ticket_id) { - $ticket_id = intval($ticket_id); - - if ($ticket_id !== $merge_into_ticket_id) { - - $sql = mysqli_query($mysqli, "SELECT * FROM tickets WHERE ticket_id = $ticket_id"); - $row = mysqli_fetch_assoc($sql); - - $ticket_prefix = escapeSql($row['ticket_prefix']); - $ticket_number = intval($row['ticket_number']); - $ticket_subject = escapeSql($row['ticket_subject']); - $ticket_details = mysqli_escape_string($mysqli, $row['ticket_details']); - $current_ticket_priority = escapeSql($row['ticket_priority']); - $ticket_first_response_at = escapeSql($row['ticket_first_response_at']); - $client_id = intval($row['ticket_client_id']); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - // Update current ticket - if (empty($ticket_first_response_at)) { - mysqli_query($mysqli, "UPDATE tickets SET ticket_first_response_at = NOW() WHERE ticket_id = $ticket_id"); - } - mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = 'Ticket $ticket_prefix$ticket_number bulk merged into $ticket_prefix$merge_into_ticket_number. Comment: $merge_comment', ticket_reply_time_worked = '00:01:00', ticket_reply_type = '$ticket_reply_type', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); - mysqli_query($mysqli, "UPDATE tickets SET ticket_status = '5', ticket_resolved_at = NOW(), ticket_closed_at = NOW(), ticket_closed_by = $session_user_id WHERE ticket_id = $ticket_id") or die(mysqli_error($mysqli)); - - // Update new parent ticket - mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = 'Ticket $ticket_prefix$ticket_number was bulk merged into this ticket with comment: $merge_comment.

    $ticket_subject
    $ticket_details', ticket_reply_time_worked = '00:01:00', ticket_reply_type = 'Internal', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $merge_into_ticket_id"); - - logAudit("Ticket", "Merged", "$session_name Merged ticket $ticket_prefix$ticket_number into $ticket_prefix$merge_into_ticket_number", $client_id, $ticket_id); - - // Custom action/notif handler - triggerCustomAction('ticket_merge', $ticket_id); - - } - } // End For Each Ticket ID Loop - - mysqli_query($mysqli, "UPDATE tickets SET ticket_updated_at = NOW() WHERE ticket_id = $merge_into_ticket_id"); - - flashAlert("$ticket_count tickets merged into $ticket_prefix$merge_into_ticket_number"); - - } - - redirect(); - -} - -if (isset($_POST['bulk_resolve_tickets'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - // POST variables - $details = mysqli_escape_string($mysqli, $_POST['bulk_details']); - $ticket_reply_time_worked = escapeSql($_POST['time']); - $private_note = intval($_POST['bulk_private_note']); - if ($private_note == 1) { - $ticket_reply_type = 'Internal'; - } else { - $ticket_reply_type = 'Public'; - } - - // Resolve Selected Tickets - if (isset($_POST['ticket_ids'])) { - - // Intitialze the counts before the loop - $ticket_count = 0; - $skipped_count = 0; - - foreach ($_POST['ticket_ids'] as $ticket_id) { - $ticket_id = intval($ticket_id); - - // Check to make sure Tasks are complete before resolving - $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('task_id') AS num FROM tasks WHERE task_completed_at IS NULL AND task_ticket_id = $ticket_id")); - $num_of_open_tasks = $row['num']; - - if ($num_of_open_tasks == 0) { - // Count the Ticket Loop - $ticket_count++; - - $sql = mysqli_query($mysqli, "SELECT * FROM tickets WHERE ticket_id = $ticket_id"); - $row = mysqli_fetch_assoc($sql); - - $ticket_prefix = escapeSql($row['ticket_prefix']); - $ticket_number = intval($row['ticket_number']); - $ticket_subject = escapeSql($row['ticket_subject']); - $current_ticket_priority = escapeSql($row['ticket_priority']); - $url_key = escapeSql($row['ticket_url_key']); - $ticket_first_response_at = escapeSql($row['ticket_first_response_at']); - $client_id = intval($row['ticket_client_id']); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - // Mark FR time if required - if (empty($ticket_first_response_at)) { - mysqli_query($mysqli, "UPDATE tickets SET ticket_first_response_at = NOW() WHERE ticket_id = $ticket_id"); - } - - // Update ticket & insert reply - mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 4, ticket_resolved_at = NOW() WHERE ticket_id = $ticket_id"); - - mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = '$details', ticket_reply_type = '$ticket_reply_type', ticket_reply_time_worked = '$ticket_reply_time_worked', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); - - logAudit("Ticket", "Resolve", "$session_name resolved $ticket_prefix$ticket_number - $ticket_subject", $client_id, $ticket_id); - - triggerCustomAction('ticket_resolve', $ticket_id); - - // Client notification email - if ((!empty($config_smtp_provider)) && $config_ticket_client_general_notifications == 1 && $private_note == 0) { - - // Get Contact details - $ticket_sql = mysqli_query($mysqli, "SELECT contact_name, contact_email FROM tickets - LEFT JOIN contacts ON ticket_contact_id = contact_id - WHERE ticket_id = $ticket_id - "); - $row = mysqli_fetch_assoc($ticket_sql); - - $contact_name = escapeSql($row['contact_name']); - $contact_email = escapeSql($row['contact_email']); - - // Sanitize Config vars from get_settings.php - $from_name = escapeSql($config_ticket_from_name); - $from_email = escapeSql($config_ticket_from_email); - $base_url = escapeSql($config_base_url); - - // Get Company Info - $sql = mysqli_query($mysqli, "SELECT company_name, company_phone, company_phone_country_code FROM companies WHERE company_id = 1"); - $row = mysqli_fetch_assoc($sql); - $company_name = escapeSql($row['company_name']); - $company_phone = escapeSql(formatPhoneNumber($row['company_phone'], $row['company_phone_country_code'])); - - // EMAIL - $subject = "Ticket resolved - [$ticket_prefix$ticket_number] - $ticket_subject | (pending closure)"; - $body = "##- Please type your reply above this line -##

    Hello $contact_name,

    Your ticket regarding \"$ticket_subject\" has been marked as solved and is pending closure.

    $details

    If your request/issue is resolved, you can simply ignore this email. If you need further assistance, please reply or re-open to let us know!

    Ticket: $ticket_prefix$ticket_number
    Subject: $ticket_subject
    Portal: https://$base_url/client/ticket.php?id=$ticket_id

    --
    $company_name - Support
    $config_ticket_from_email
    $company_phone"; - - // Check email valid - if (filter_var($contact_email, FILTER_VALIDATE_EMAIL)) { - - $data = []; - - // Email Ticket Contact - // Queue Mail - - $data[] = [ - 'from' => $from_email, - 'from_name' => $from_name, - 'recipient' => $contact_email, - 'recipient_name' => $contact_name, - 'subject' => $subject, - 'body' => $body - ]; - } - - // Also Email all the watchers - $sql_watchers = mysqli_query($mysqli, "SELECT watcher_email FROM ticket_watchers WHERE watcher_ticket_id = $ticket_id"); - $body .= "

    ----------------------------------------
    YOU ARE A COLLABORATOR ON THIS TICKET"; - while ($row = mysqli_fetch_assoc($sql_watchers)) { - $watcher_email = escapeSql($row['watcher_email']); - - // Queue Mail - $data[] = [ - 'from' => $from_email, - 'from_name' => $from_name, - 'recipient' => $watcher_email, - 'recipient_name' => $watcher_email, - 'subject' => $subject, - 'body' => $body - ]; - } - addToMailQueue($data); - } // End Mail IF - } else { - $skipped_count++; - } // End Task Check - } // End Loop - } // End Array Empty Check - - flashAlert("Resolved $ticket_count Tickets"); - - if ($skipped_count > 0) { - flashAlert("Resolved $ticket_count Tickets $skipped_count ticket(s) could not be resolved because they have open tasks.", 'info'); - } - - redirect(); - -} - -if (isset($_POST['bulk_ticket_reply'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - // POST variables - $ticket_reply = mysqli_escape_string($mysqli, $_POST['bulk_reply_details']); - $ticket_status = intval($_POST['bulk_status']); - $ticket_reply_time_worked = escapeSql($_POST['time']); - $private_note = intval($_POST['bulk_private_reply']); - if ($private_note == 1) { - $ticket_reply_type = 'Internal'; - } else { - $ticket_reply_type = 'Public'; - } - - // Loop Through Tickets and Add Reply along with Email notifications - if (isset($_POST['ticket_ids'])) { - - // Get a Ticket Count - $ticket_count = count($_POST['ticket_ids']); - - foreach ($_POST['ticket_ids'] as $ticket_id) { - $ticket_id = intval($ticket_id); - - $sql = mysqli_query($mysqli, "SELECT * FROM tickets WHERE ticket_id = $ticket_id"); - $row = mysqli_fetch_assoc($sql); - - $ticket_prefix = escapeSql($row['ticket_prefix']); - $ticket_number = intval($row['ticket_number']); - $ticket_subject = escapeSql($row['ticket_subject']); - $current_ticket_priority = escapeSql($row['ticket_priority']); - $url_key = escapeSql($row['ticket_url_key']); - $ticket_first_response_at = escapeSql($row['ticket_first_response_at']); - $client_id = intval($row['ticket_client_id']); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - if ($client_id) { - $client_uri = "&client_id=$client_id"; - } else { - $client_uri = ''; - } - - // Mark FR time if required - if (empty($ticket_first_response_at)) { - mysqli_query($mysqli, "UPDATE tickets SET ticket_first_response_at = NOW() WHERE ticket_id = $ticket_id"); - } - - // Add reply - mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = '$ticket_reply', ticket_reply_time_worked = '$ticket_reply_time_worked', ticket_reply_type = '$ticket_reply_type', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); - - $ticket_reply_id = mysqli_insert_id($mysqli); - - // Update Ticket Status - mysqli_query($mysqli, "UPDATE tickets SET ticket_status = '$ticket_status' WHERE ticket_id = $ticket_id"); - - logAudit("Ticket", "Reply", "$session_name replied to ticket $ticket_prefix$ticket_number - $ticket_subject and was a $ticket_reply_type reply", $client_id, $ticket_id); - - // Custom action/notif handler - if ($ticket_reply_type == 'Internal') { - triggerCustomAction('ticket_reply_agent_internal', $ticket_id); - } else { - triggerCustomAction('reply_reply_agent_public', $ticket_id); - } - - // Resolve the ticket, if set - if ($ticket_status == 4) { - mysqli_query($mysqli, "UPDATE tickets SET ticket_resolved_at = NOW() WHERE ticket_id = $ticket_id"); - - // Logging - logAudit("Ticket", "Resolved", "$session_name resolved Ticket $ticket_prefix$ticket_number", $client_id, $ticket_id); - - triggerCustomAction('ticket_resolve', $ticket_id); - } - - // Get Contact Details - $sql = mysqli_query( - $mysqli, - "SELECT contact_name, contact_email, ticket_created_by, ticket_assigned_to - FROM tickets - LEFT JOIN contacts ON ticket_contact_id = contact_id - WHERE ticket_id = $ticket_id" - ); - - $row = mysqli_fetch_assoc($sql); - - $contact_name = escapeSql($row['contact_name']); - $contact_email = escapeSql($row['contact_email']); - $ticket_created_by = intval($row['ticket_created_by']); - $ticket_assigned_to = intval($row['ticket_assigned_to']); - - // Sanitize Config vars from get_settings.php - $from_name = escapeSql($config_ticket_from_name); - $from_email = escapeSql($config_ticket_from_email); - $base_url = escapeSql($config_base_url); - - $sql = mysqli_query($mysqli, "SELECT company_name, company_phone, company_phone_country_code FROM companies WHERE company_id = 1"); - $row = mysqli_fetch_assoc($sql); - $company_name = escapeSql($row['company_name']); - $company_phone = escapeSql(formatPhoneNumber($row['company_phone'], $row['company_phone_country_code'])); - - // Send e-mail to client if public update & email is set up - if ($private_note == 0 && (!empty($config_smtp_provider))) { - - $subject = "Ticket update - [$ticket_prefix$ticket_number] - $ticket_subject"; - $body = "##- Please type your reply above this line -##

    Hello $contact_name,

    Your ticket regarding $ticket_subject has been updated.

    --------------------------------
    $ticket_reply
    --------------------------------

    Ticket: $ticket_prefix$ticket_number
    Subject: $ticket_subject
    Status: $ticket_status_name
    Portal: View ticket

    --
    $company_name - Support
    $from_email
    $company_phone"; - - if (filter_var($contact_email, FILTER_VALIDATE_EMAIL)) { - - $data = []; - - // Email Ticket Contact - // Queue Mail - $data[] = [ - 'from' => $from_email, - 'from_name' => $from_name, - 'recipient' => $contact_email, - 'recipient_name' => $contact_name, - 'subject' => $subject, - 'body' => $body - ]; - - } - - // Also Email all the watchers - $sql_watchers = mysqli_query($mysqli, "SELECT watcher_email FROM ticket_watchers WHERE watcher_ticket_id = $ticket_id"); - $body .= "

    ----------------------------------------
    YOU ARE A COLLABORATOR ON THIS TICKET"; - while ($row = mysqli_fetch_assoc($sql_watchers)) { - $watcher_email = escapeSql($row['watcher_email']); - - // Queue Mail - $data[] = [ - 'from' => $from_email, - 'from_name' => $from_name, - 'recipient' => $watcher_email, - 'recipient_name' => $watcher_email, - 'subject' => $subject, - 'body' => $body - ]; - } - addToMailQueue($data); - } //End Mail IF - - // Notification for assigned ticket user - if ($session_user_id != $ticket_assigned_to && $ticket_assigned_to != 0) { - - mysqli_query($mysqli, "INSERT INTO notifications SET notification_type = 'Ticket', notification = '$session_name updated Ticket $ticket_prefix$ticket_number - Subject: $ticket_subject that is assigned to you', notification_action = '/agent/ticket.php?ticket_id=$ticket_id$client_uri', notification_client_id = $client_id, notification_user_id = $ticket_assigned_to"); - } - - // Notification for user that opened the ticket - if ($session_user_id != $ticket_created_by && $ticket_created_by != 0) { - - mysqli_query($mysqli, "INSERT INTO notifications SET notification_type = 'Ticket', notification = '$session_name updated Ticket $ticket_prefix$ticket_number - Subject: $ticket_subject that you opened', notification_action = '/agent/ticket.php?ticket_id=$ticket_id$client_uri', notification_client_id = $client_id, notification_user_id = $ticket_created_by"); - } - } // End Ticket Lopp - - } - - flashAlert("Updated $ticket_count tickets"); - - redirect(); - -} - - -// Currently not UI Frontend for this -if (isset($_POST['bulk_add_ticket_project'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - // POST variables - $project_id = intval($_POST['project_id']); - - // Get Project Name - $sql = mysqli_query($mysqli, "SELECT project_name FROM projects WHERE project_id = $project_id"); - $row = mysqli_fetch_assoc($sql); - $project_name = escapeSql($row['project_name']); - - // Assign Project to Selected Tickets - if (isset($_POST['ticket_ids'])) { - - // Get a Ticket Count - $ticket_count = count($_POST['ticket_ids']); - - foreach ($_POST['ticket_ids'] as $ticket_id) { - $ticket_id = intval($ticket_id); - - $sql = mysqli_query($mysqli, "SELECT * FROM tickets WHERE ticket_id = $ticket_id"); - $row = mysqli_fetch_assoc($sql); - - $ticket_prefix = escapeSql($row['ticket_prefix']); - $ticket_number = intval($row['ticket_number']); - $ticket_subject = escapeSql($row['ticket_subject']); - $current_ticket_priority = escapeSql($row['ticket_priority']); - $client_id = intval($row['ticket_client_id']); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - // Update ticket & insert reply - mysqli_query($mysqli, "UPDATE tickets SET ticket_project_id = $project_id WHERE ticket_id = $ticket_id"); - - logAudit("Ticket", "Reply", "$session_name added ticket $ticket_prefix$ticket_number - $ticket_subject to project $project_name", $client_id, $ticket_id); - - - } // End For Each Ticket ID Loop - - flashAlert("$ticket_count Tickets added to Project $project_name"); - - } - - redirect(); - -} - -if (isset($_POST['bulk_add_asset_ticket'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - $assigned_to = intval($_POST['bulk_assigned_to']); - if ($assigned_to == 0) { - $ticket_status = 1; - } else { - $ticket_status = 2; - } - $subject = escapeSql($_POST['bulk_subject']); - $priority = escapeSql($_POST['bulk_priority']); - $category_id = intval($_POST['bulk_category']); - $details = mysqli_real_escape_string($mysqli, $_POST['bulk_details']); - $project_id = intval($_POST['bulk_project']); - $use_primary_contact = intval($_POST['use_primary_contact']); - $ticket_template_id = intval($_POST['bulk_ticket_template_id']); - $billable = intval($_POST['bulk_billable'] ?? 0); - - // Check to see if adding a ticket by template - if($ticket_template_id) { - $sql = mysqli_query($mysqli, "SELECT * FROM ticket_templates WHERE ticket_template_id = $ticket_template_id"); - $row = mysqli_fetch_assoc($sql); - - // Override Template Subject - if(empty($subject)) { - $subject = escapeSql($row['ticket_template_subject']); - } - $details = mysqli_escape_string($mysqli, $row['ticket_template_details']); - - // Get Associated Tasks from the ticket template - $sql_task_templates = mysqli_query($mysqli, "SELECT * FROM task_templates WHERE task_template_ticket_template_id = $ticket_template_id"); - - } - - // Create ticket for each selected asset - if (isset($_POST['asset_ids'])) { - - // Get a Asset Count - $asset_count = count($_POST['asset_ids']); - - foreach ($_POST['asset_ids'] as $asset_id) { - $asset_id = intval($asset_id); - - $sql = mysqli_query($mysqli, "SELECT * FROM assets WHERE asset_id = $asset_id"); - $row = mysqli_fetch_assoc($sql); - - $asset_name = escapeSql($row['asset_name']); - $client_id = intval($row['asset_client_id']); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - $subject_asset_prepended = "$asset_name - $subject"; - - // Atomically increment and get the new ticket number - mysqli_query($mysqli, " - UPDATE settings - SET - config_ticket_next_number = LAST_INSERT_ID(config_ticket_next_number), - config_ticket_next_number = config_ticket_next_number + 1 - WHERE company_id = 1 - "); - - $ticket_number = mysqli_insert_id($mysqli); - - // Sanitize Config Vars from get_settings.php and Session Vars from check_login.php - $config_ticket_prefix = escapeSql($config_ticket_prefix); - $config_ticket_from_name = escapeSql($config_ticket_from_name); - $config_ticket_from_email = escapeSql($config_ticket_from_email); - $config_base_url = escapeSql($config_base_url); - - //Generate a unique URL key for clients to access - $url_key = randomString(32); - - mysqli_query($mysqli, "INSERT INTO tickets SET ticket_prefix = '$config_ticket_prefix', ticket_number = $ticket_number, ticket_category = $category_id, ticket_subject = '$subject_asset_prepended', ticket_details = '$details', ticket_priority = '$priority', ticket_billable = $billable, ticket_status = $ticket_status, ticket_asset_id = $asset_id, ticket_created_by = $session_user_id, ticket_assigned_to = $assigned_to, ticket_url_key = '$url_key', ticket_client_id = $client_id, ticket_project_id = $project_id"); - - $ticket_id = mysqli_insert_id($mysqli); - - // Add Tasks - if (!empty($_POST['tasks'])) { - foreach ($_POST['tasks'] as $task) { - $task_name = escapeSql($task); - // Check that task_name is not-empty (For some reason the !empty on the array doesnt work here like in watchers) - if (!empty($task_name)) { - mysqli_query($mysqli,"INSERT INTO tasks SET task_name = '$task_name', task_ticket_id = $ticket_id"); - } - } - } - - // Add Tasks from Template if Template was selected - if($ticket_template_id) { - if (mysqli_num_rows($sql_task_templates) > 0) { - while ($row = mysqli_fetch_assoc($sql_task_templates)) { - $task_order = intval($row['task_template_order']); - $task_name = escapeSql($row['task_template_name']); - - mysqli_query($mysqli,"INSERT INTO tasks SET task_name = '$task_name', task_order = $task_order, task_ticket_id = $ticket_id"); - } - } - } - - // Custom action/notif handler - triggerCustomAction('ticket_create', $ticket_id); - } - - logAudit("Ticket", "Bulk Create", "$session_name created $asset_count tickets for $asset_count"); - - flashAlert("You created $asset_count tickets for the selected assets"); - - } - - redirect(); - -} - -if (isset($_POST['add_ticket_reply'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - $ticket_id = intval($_POST['ticket_id']); - $ticket_reply = $_POST['ticket_reply']; // Reply is SQL escaped below - $ticket_status = intval($_POST['status']); - - $client_id = intval(getFieldById('tickets', $ticket_id, 'ticket_client_id')); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - // Time tracking, inputs & combine into string - $hours = intval($_POST['hours']); - $minutes = intval($_POST['minutes']); - $seconds = intval($_POST['seconds']); - $ticket_reply_time_worked = escapeSql(sprintf("%02d:%02d:%02d", $hours, $minutes, $seconds)); - - // Defaults - $send_email = 0; - $ticket_reply_id = 0; - if ($_POST['public_reply_type'] == 1 ){ - $ticket_reply_type = 'Public'; - } elseif ($_POST['public_reply_type'] == 2 ) { - $ticket_reply_type = 'Public'; - $send_email = 1; - } else { - $ticket_reply_type = 'Internal'; - } - // Add Signature to the end of the ticket reply if not Internal and if there is reply - if ($ticket_reply !== '' && $ticket_reply_type !== 'Internal' && $send_email == 1) { - $ticket_reply .= getFieldById('user_settings',$session_user_id,'user_config_signature', 'raw'); - } - - $ticket_reply = mysqli_escape_string($mysqli, $ticket_reply); // SQL Escape Ticket Reply - - // Update Ticket Status & updated at (in case status didn't change) - mysqli_query($mysqli, "UPDATE tickets SET ticket_status = $ticket_status, ticket_updated_at = NOW() WHERE ticket_id = $ticket_id"); - - // Resolve the ticket, if set - if ($ticket_status == 4) { - mysqli_query($mysqli, "UPDATE tickets SET ticket_resolved_at = NOW() WHERE ticket_id = $ticket_id"); - - logAudit("Ticket", "Resolved", "$session_name resolved Ticket ticket ID $ticket_id", $client_id, $ticket_id); - } - - // Process reply actions, if we have a reply to work with (e.g. we're not just editing the status) - if (!empty($ticket_reply)) { - - // Add reply - mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = '$ticket_reply', ticket_reply_time_worked = '$ticket_reply_time_worked', ticket_reply_type = '$ticket_reply_type', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); - - $ticket_reply_id = mysqli_insert_id($mysqli); - - // Get Ticket Details - $ticket_sql = mysqli_query($mysqli, "SELECT contact_name, contact_email, ticket_prefix, ticket_number, ticket_subject, ticket_status, ticket_status_name, ticket_url_key, ticket_first_response_at, ticket_created_by, ticket_assigned_to, ticket_client_id - FROM tickets - LEFT JOIN clients ON ticket_client_id = client_id - LEFT JOIN contacts ON ticket_contact_id = contact_id - LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id - WHERE ticket_id = $ticket_id - "); - - $row = mysqli_fetch_assoc($ticket_sql); - - $contact_name = escapeSql($row['contact_name']); - $contact_email = escapeSql($row['contact_email']); - $ticket_prefix = escapeSql($row['ticket_prefix']); - $ticket_number = intval($row['ticket_number']); - $ticket_subject = escapeSql($row['ticket_subject']); - $ticket_status = intval($row['ticket_status']); - $ticket_status_name = escapeSql($row['ticket_status_name']); - $url_key = escapeSql($row['ticket_url_key']); - $ticket_first_response_at = escapeSql($row['ticket_first_response_at']); - $ticket_created_by = intval($row['ticket_created_by']); - $ticket_assigned_to = intval($row['ticket_assigned_to']); - $client_id = intval($row['ticket_client_id']); - - if ($client_id) { - $client_uri = "&client_id=$client_id"; - } else { - $client_uri = ''; - } - - // Sanitize Config vars from get_settings.php - $config_ticket_from_name = escapeSql($config_ticket_from_name); - $config_ticket_from_email = escapeSql($config_ticket_from_email); - $config_base_url = escapeSql($config_base_url); - - $sql = mysqli_query($mysqli, "SELECT company_name, company_phone, company_phone_country_code FROM companies WHERE company_id = 1"); - $row = mysqli_fetch_assoc($sql); - $company_name = escapeSql($row['company_name']); - $company_phone = escapeSql(formatPhoneNumber($row['company_phone'], $row['company_phone_country_code'])); - - // Send e-mail to client if public update & email is set up - if ($ticket_reply_type == 'Public' && $send_email == 1 && (!empty($config_smtp_provider))) { - - // Slightly different email subject/text depending on if this update set auto-close - - if ($ticket_status == 4) { - // Resolved - $subject = "Ticket resolved - [$ticket_prefix$ticket_number] - $ticket_subject | (pending closure)"; - $body = "##- Please type your reply above this line -##

    Hello $contact_name,

    Your ticket regarding $ticket_subject has been marked as solved and is pending closure.

    --------------------------------
    $ticket_reply
    --------------------------------

    If your request/issue is resolved, you can simply ignore this email. If you need further assistance, please reply or re-open to let us know!

    Ticket: $ticket_prefix$ticket_number
    Subject: $ticket_subject
    Status: $ticket_status_name
    Portal: View ticket

    --
    $company_name - Support
    $config_ticket_from_email
    $company_phone"; - } else { - // Anything else - $subject = "Ticket update - [$ticket_prefix$ticket_number] - $ticket_subject"; - $body = "##- Please type your reply above this line -##

    Hello $contact_name,

    Your ticket regarding $ticket_subject has been updated.

    --------------------------------
    $ticket_reply
    --------------------------------

    Ticket: $ticket_prefix$ticket_number
    Subject: $ticket_subject
    Status: $ticket_status_name
    Portal: View ticket

    --
    $company_name - Support
    $config_ticket_from_email
    $company_phone"; - } - - if (filter_var($contact_email, FILTER_VALIDATE_EMAIL)) { - - $data = []; - - // Email Ticket Contact - // Queue Mail - $data[] = [ - 'from' => $config_ticket_from_email, - 'from_name' => $config_ticket_from_name, - 'recipient' => $contact_email, - 'recipient_name' => $contact_name, - 'subject' => $subject, - 'body' => $body - ]; - } - - // Also Email all the watchers - $sql_watchers = mysqli_query($mysqli, "SELECT watcher_email FROM ticket_watchers WHERE watcher_ticket_id = $ticket_id"); - $body .= "

    ----------------------------------------
    YOU ARE A COLLABORATOR ON THIS TICKET"; - while ($row = mysqli_fetch_assoc($sql_watchers)) { - $watcher_email = escapeSql($row['watcher_email']); - - // Queue Mail - $data[] = [ - 'from' => $config_ticket_from_email, - 'from_name' => $config_ticket_from_name, - 'recipient' => $watcher_email, - 'recipient_name' => $watcher_email, - 'subject' => $subject, - 'body' => $body - ]; - } - addToMailQueue($data); - - } - //End Mail IF - - // Notification for assigned ticket user - if ($session_user_id != $ticket_assigned_to && $ticket_assigned_to != 0) { - mysqli_query($mysqli, "INSERT INTO notifications SET notification_type = 'Ticket', notification = '$session_name updated Ticket $ticket_prefix$ticket_number - Subject: $ticket_subject that is assigned to you', notification_action = '/agent/ticket.php?ticket_id=$ticket_id$client_uri', notification_client_id = $client_id, notification_user_id = $ticket_assigned_to"); - } - - // Notification for user that opened the ticket - if ($session_user_id != $ticket_created_by && $ticket_created_by != 0) { - mysqli_query($mysqli, "INSERT INTO notifications SET notification_type = 'Ticket', notification = '$session_name updated Ticket $ticket_prefix$ticket_number - Subject: $ticket_subject that you opened', notification_action = '/agent/ticket.php?ticket_id=$ticket_id$client_uri', notification_client_id = $client_id, notification_user_id = $ticket_created_by"); - } - - // Handle first response - if (empty($ticket_first_response_at) && $ticket_reply_type == 'Public') { - mysqli_query($mysqli, "UPDATE tickets SET ticket_first_response_at = NOW() WHERE ticket_id = $ticket_id"); - } - - // Custom action/notif handler - if ($ticket_reply_type == 'Internal') { - triggerCustomAction('ticket_reply_agent_internal', $ticket_id); - } else { - triggerCustomAction('reply_reply_agent_public', $ticket_id); - } - - flashAlert("Ticket $ticket_prefix$ticket_number has been updated with your reply and was $ticket_reply_type"); - - } else { - flashAlert("Ticket updated"); - } - - logAudit("Ticket", "Reply", "$session_name replied to ticket $ticket_prefix$ticket_number - $ticket_subject and was a $ticket_reply_type reply", $client_id, $ticket_id); - - redirect(); - -} - -if (isset($_POST['edit_ticket_reply'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - $ticket_reply_id = intval($_POST['ticket_reply_id']); - $ticket_reply = mysqli_real_escape_string($mysqli, $_POST['ticket_reply']); - $ticket_reply_type = escapeSql($_POST['ticket_reply_type']); - $ticket_reply_time_worked = escapeSql($_POST['time']); - - $sql = mysqli_query($mysqli, "SELECT ticket_client_id FROM ticket_replies - LEFT JOIN tickets ON ticket_id = ticket_reply_ticket_id - WHERE ticket_reply_id = $ticket_reply_id - LIMIT 1" - ); - - $row = mysqli_fetch_assoc($sql); - $client_id = intval($row['ticket_client_id']); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - mysqli_query($mysqli, "UPDATE ticket_replies SET ticket_reply = '$ticket_reply', ticket_reply_type = '$ticket_reply_type', ticket_reply_time_worked = '$ticket_reply_time_worked' WHERE ticket_reply_id = $ticket_reply_id AND ticket_reply_type != 'Client'") or die(mysqli_error($mysqli)); - - logAudit("Ticket", "Reply", "$session_name edited ticket_reply", $client_id, $ticket_reply_id); - - flashAlert("Ticket reply updated"); - - redirect(); - -} - -if (isset($_POST['redact_ticket_reply'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - $ticket_reply_id = intval($_POST['ticket_reply_id']); - $ticket_reply = mysqli_real_escape_string($mysqli, $_POST['ticket_reply']); - - $sql = mysqli_query($mysqli, "SELECT ticket_client_id FROM ticket_replies - LEFT JOIN tickets ON ticket_id = ticket_reply_ticket_id - WHERE ticket_reply_id = $ticket_reply_id - LIMIT 1" - ); - - $row = mysqli_fetch_assoc($sql); - $client_id = intval($row['ticket_client_id']); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - mysqli_query($mysqli, "UPDATE ticket_replies SET ticket_reply = '$ticket_reply' WHERE ticket_reply_id = $ticket_reply_id"); - - logAudit("Ticket", "Reply", "$session_name redacted ticket_reply", $client_id, $ticket_reply_id); - - flashAlert("Ticket reply redacted"); - - redirect(); - -} - -if (isset($_GET['archive_ticket_reply'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - $ticket_reply_id = intval($_GET['archive_ticket_reply']); - - $ticket_id = intval(getFieldById('ticket_replies', $ticket_reply_id, 'ticket_reply_ticket_id')); - $client_id = intval(getFieldById('tickets', $ticket_id, 'ticket_client_id')); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - mysqli_query($mysqli, "UPDATE ticket_replies SET ticket_reply_archived_at = NOW() WHERE ticket_reply_id = $ticket_reply_id"); - - logAudit("Ticket Reply", "Archive", "$session_name archived ticket_reply", $client_id, $ticket_reply_id); - - flashAlert("Ticket reply archived", 'error'); - - redirect(); - -} - -if (isset($_POST['merge_ticket'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - $ticket_id = intval($_POST['ticket_id']); // Child ticket ID to be closed - $merge_into_ticket_id = intval($_POST['merge_into_ticket_id']); // Parent ticket id - $merge_comment = escapeSql($_POST['merge_comment']); // Merge comment - $move_replies = intval($_POST['merge_move_replies']); // Whether to move replies to the new parent ticket - $ticket_reply_type = 'Internal'; // Default all replies to internal - - // Get current ticket details - $sql = mysqli_query($mysqli, "SELECT ticket_prefix, ticket_number, ticket_subject, ticket_details FROM tickets WHERE ticket_id = $ticket_id"); - if (mysqli_num_rows($sql) == 0) { - flashAlert("No ticket with that ID found.", 'error'); - redirect(); - } - // CURRENT ticket details - $row = mysqli_fetch_assoc($sql); - $ticket_prefix = escapeSql($row['ticket_prefix']); - $ticket_number = intval($row['ticket_number']); - $ticket_subject = escapeSql($row['ticket_subject']); - $ticket_details = mysqli_escape_string($mysqli, $row['ticket_details']); - $ticket_first_response_at = escapeSql($row['ticket_first_response_at']); - - // NEW PARENT ticket details - // Get merge into ticket id (as it may differ from the number) - $sql = mysqli_query($mysqli, "SELECT ticket_id, ticket_number, ticket_client_id FROM tickets WHERE ticket_id = $merge_into_ticket_id"); - if (mysqli_num_rows($sql) == 0) { - flashAlert("Cannot merge into that ticket.", 'error'); - redirect(); - } - $merge_row = mysqli_fetch_assoc($sql); - $client_id = intval($merge_row['ticket_client_id']); - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - $merge_into_ticket_number = intval($merge_row['ticket_number']); - if ($client_id) { - $has_client = "&client_id=$client_id"; - } else { - $has_client = ""; - } - // Sanity check - if ($ticket_id == $merge_into_ticket_id) { - flashAlert("Cannot merge into the same ticket.", 'error'); - redirect(); - } - - // Move ticket replies from child > parent - if ($move_replies) { - mysqli_query($mysqli, "UPDATE ticket_replies SET ticket_reply_ticket_id = $merge_into_ticket_id WHERE ticket_reply_ticket_id = $ticket_id"); - } - - // Update current ticket - if (empty($ticket_first_response_at)) { - mysqli_query($mysqli, "UPDATE tickets SET ticket_first_response_at = NOW() WHERE ticket_id = $ticket_id"); - } - - mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = 'Ticket $ticket_prefix$ticket_number merged into $ticket_prefix$merge_into_ticket_number. Comment: $merge_comment', ticket_reply_time_worked = '00:01:00', ticket_reply_type = '$ticket_reply_type', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); - - mysqli_query($mysqli, "UPDATE tickets SET ticket_status = '5', ticket_resolved_at = NOW(), ticket_closed_at = NOW(), ticket_closed_by = $session_user_id WHERE ticket_id = $ticket_id") or die(mysqli_error($mysqli)); - - //Update new parent ticket - mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = 'Ticket $ticket_prefix$ticket_number was merged into this ticket with comment: $merge_comment.

    $ticket_subject
    $ticket_details', ticket_reply_time_worked = '00:01:00', ticket_reply_type = '$ticket_reply_type', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $merge_into_ticket_id"); - - mysqli_query($mysqli, "UPDATE tickets SET ticket_updated_at = NOW() WHERE ticket_id = $merge_into_ticket_id"); - - logAudit("Ticket", "Merged", "$session_name Merged ticket $ticket_prefix$ticket_number into $ticket_prefix$merge_into_ticket_number"); - - triggerCustomAction('ticket_merge', $ticket_id); - - flashAlert("Ticket merged into $ticket_prefix$merge_into_ticket_number"); - - redirect("ticket.php?ticket_id=$merge_into_ticket_id$has_client"); - -} - -if (isset($_POST['change_client_ticket'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - $ticket_id = intval($_POST['ticket_id']); - $client_id = intval($_POST['new_client_id']); - $contact_id = intval($_POST['new_contact_id']); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - // Set any/all existing replies to internal - mysqli_query($mysqli, "UPDATE ticket_replies SET ticket_reply_type = 'Internal' WHERE ticket_reply_ticket_id = $ticket_id"); - - // Update ticket client & contact - mysqli_query($mysqli, "UPDATE tickets SET ticket_client_id = $client_id, ticket_contact_id = $contact_id WHERE ticket_id = $ticket_id LIMIT 1"); - - logAudit("Ticket", "Change", "$session_name changed ticket client", $client_id, $ticket_id); - - triggerCustomAction('ticket_update', $ticket_id); - - flashAlert("Ticket client updated"); - - redirect(); - -} - -if (isset($_GET['resolve_ticket'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - $ticket_id = intval($_GET['resolve_ticket']); - - $sql = mysqli_query($mysqli, "SELECT * FROM tickets WHERE ticket_id = $ticket_id"); - $row = mysqli_fetch_assoc($sql); - $ticket_prefix = escapeSql($row['ticket_prefix']); - $ticket_number = intval($row['ticket_number']); - $ticket_first_response_at = escapeSql($row['ticket_first_response_at']); - $client_id = intval($row['ticket_client_id']); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - // Mark FR - if (empty($ticket_first_response_at)) { - mysqli_query($mysqli, "UPDATE tickets SET ticket_first_response_at = NOW() WHERE ticket_id = $ticket_id"); - } - - // Resolve - mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 4, ticket_resolved_at = NOW() WHERE ticket_id = $ticket_id"); - - logAudit("Ticket", "Resolved", "$session_name resolved ticket $ticket_prefix$ticket_number (ID: $ticket_id)", $client_id, $ticket_id); - - triggerCustomAction('ticket_resolve', $ticket_id); - - // Client notification email - if ((!empty($config_smtp_provider)) && $config_ticket_client_general_notifications == 1) { - - // Get details - $ticket_sql = mysqli_query($mysqli, "SELECT contact_name, contact_email, ticket_prefix, ticket_number, ticket_subject, ticket_status_name, ticket_assigned_to, ticket_url_key FROM tickets - LEFT JOIN clients ON ticket_client_id = client_id - LEFT JOIN contacts ON ticket_contact_id = contact_id - LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id - WHERE ticket_id = $ticket_id - "); - $row = mysqli_fetch_assoc($ticket_sql); - - $contact_name = escapeSql($row['contact_name']); - $contact_email = escapeSql($row['contact_email']); - $ticket_prefix = escapeSql($row['ticket_prefix']); - $ticket_number = intval($row['ticket_number']); - $ticket_subject = escapeSql($row['ticket_subject']); - $ticket_assigned_to = intval($row['ticket_assigned_to']); - $ticket_status = escapeSql($row['ticket_status_name']); - $url_key = escapeSql($row['ticket_url_key']); - - // Sanitize Config vars from get_settings.php - $config_ticket_from_name = escapeSql($config_ticket_from_name); - $config_ticket_from_email = escapeSql($config_ticket_from_email); - $config_base_url = escapeSql($config_base_url); - - // Get Company Info - $sql = mysqli_query($mysqli, "SELECT company_name, company_phone, company_phone_country_code FROM companies WHERE company_id = 1"); - $row = mysqli_fetch_assoc($sql); - $company_name = escapeSql($row['company_name']); - $company_phone = escapeSql(formatPhoneNumber($row['company_phone'], $row['company_phone_country_code'])); - - // EMAIL - $subject = "Ticket resolved - [$ticket_prefix$ticket_number] - $ticket_subject | (pending closure)"; - $body = "##- Please type your reply above this line -##

    Hello $contact_name,

    Your ticket regarding $ticket_subject has been marked as solved and is pending closure.

    If your request/issue is resolved, you can simply ignore this email. If you need further assistance, please reply or re-open to let us know!

    Ticket: $ticket_prefix$ticket_number
    Subject: $ticket_subject
    Status: $ticket_status
    Portal: View ticket

    --
    $company_name - Support
    $config_ticket_from_email
    $company_phone"; - - // Check email valid - if (filter_var($contact_email, FILTER_VALIDATE_EMAIL)) { - - $data = []; - - // Email Ticket Contact - // Queue Mail - - $data[] = [ - 'from' => $config_ticket_from_email, - 'from_name' => $config_ticket_from_name, - 'recipient' => $contact_email, - 'recipient_name' => $contact_name, - 'subject' => $subject, - 'body' => $body - ]; - } - - // Also Email all the watchers - $sql_watchers = mysqli_query($mysqli, "SELECT watcher_email FROM ticket_watchers WHERE watcher_ticket_id = $ticket_id"); - $body .= "

    ----------------------------------------
    YOU ARE A COLLABORATOR ON THIS TICKET"; - while ($row = mysqli_fetch_assoc($sql_watchers)) { - $watcher_email = escapeSql($row['watcher_email']); - - // Queue Mail - $data[] = [ - 'from' => $config_ticket_from_email, - 'from_name' => $config_ticket_from_name, - 'recipient' => $watcher_email, - 'recipient_name' => $watcher_email, - 'subject' => $subject, - 'body' => $body - ]; - } - addToMailQueue($data); - } - //End Mail IF - - flashAlert("Ticket resolved"); - - redirect(); - -} - -if (isset($_GET['close_ticket'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - $ticket_id = intval($_GET['close_ticket']); - $client_id = intval(getFieldById('tickets', $ticket_id, 'ticket_client_id')); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 5, ticket_closed_at = NOW(), ticket_closed_by = $session_user_id WHERE ticket_id = $ticket_id") or die(mysqli_error($mysqli)); - - mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = 'Ticket closed.', ticket_reply_type = 'Internal', ticket_reply_time_worked = '00:01:00', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); - - logAudit("Ticket", "Closed", "$session_name closed ticket ID $ticket_id", $client_id, $ticket_id); - - triggerCustomAction('ticket_close', $ticket_id); - - // Client notification email - if ((!empty($config_smtp_provider)) && $config_ticket_client_general_notifications == 1) { - - // Get details - $ticket_sql = mysqli_query($mysqli, "SELECT contact_name, contact_email, ticket_prefix, ticket_number, ticket_subject, ticket_url_key FROM tickets - LEFT JOIN clients ON ticket_client_id = client_id - LEFT JOIN contacts ON ticket_contact_id = contact_id - WHERE ticket_id = $ticket_id - "); - $row = mysqli_fetch_assoc($ticket_sql); - - $contact_name = escapeSql($row['contact_name']); - $contact_email = escapeSql($row['contact_email']); - $ticket_prefix = escapeSql($row['ticket_prefix']); - $ticket_number = intval($row['ticket_number']); - $ticket_subject = escapeSql($row['ticket_subject']); - $url_key = escapeSql($row['ticket_url_key']); - - // Sanitize Config vars from get_settings.php - $config_ticket_from_name = escapeSql($config_ticket_from_name); - $config_ticket_from_email = escapeSql($config_ticket_from_email); - $config_base_url = escapeSql($config_base_url); - - // Get Company Info - $sql = mysqli_query($mysqli, "SELECT company_name, company_phone, company_phone_country_code FROM companies WHERE company_id = 1"); - $row = mysqli_fetch_assoc($sql); - $company_name = escapeSql($row['company_name']); - $company_phone = escapeSql(formatPhoneNumber($row['company_phone'], $row['company_phone_country_code'])); - - // EMAIL - $subject = "Ticket closed - [$ticket_prefix$ticket_number] - $ticket_subject | (do not reply)"; - $body = "Hello $contact_name,

    Your ticket regarding \"$ticket_subject\" has been closed.

    We hope the request/issue was resolved to your satisfaction, please provide your feedback here.
    If you need further assistance, please raise a new ticket using the below details. Please do not reply to this email.

    Ticket: $ticket_prefix$ticket_number
    Subject: $ticket_subject
    Portal: https://$config_base_url/client/ticket.php?id=$ticket_id

    --
    $company_name - Support
    $config_ticket_from_email
    $company_phone"; - - // Check email valid - if (filter_var($contact_email, FILTER_VALIDATE_EMAIL)) { - - $data = []; - - // Email Ticket Contact - // Queue Mail - - $data[] = [ - 'from' => $config_ticket_from_email, - 'from_name' => $config_ticket_from_name, - 'recipient' => $contact_email, - 'recipient_name' => $contact_name, - 'subject' => $subject, - 'body' => $body - ]; - } - - // Also Email all the watchers - $sql_watchers = mysqli_query($mysqli, "SELECT watcher_email FROM ticket_watchers WHERE watcher_ticket_id = $ticket_id"); - $body .= "

    ----------------------------------------
    YOU ARE A COLLABORATOR ON THIS TICKET"; - while ($row = mysqli_fetch_assoc($sql_watchers)) { - $watcher_email = escapeSql($row['watcher_email']); - - // Queue Mail - $data[] = [ - 'from' => $config_ticket_from_email, - 'from_name' => $config_ticket_from_name, - 'recipient' => $watcher_email, - 'recipient_name' => $watcher_email, - 'subject' => $subject, - 'body' => $body - ]; - } - addToMailQueue($data); - } - //End Mail IF - - flashAlert("Ticket Closed, this cannot not be reopened but you may start another one"); - - redirect(); - -} - -if (isset($_GET['reopen_ticket'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - $ticket_id = intval($_GET['reopen_ticket']); - - $client_id = intval(getFieldById('tickets', $ticket_id, 'ticket_client_id')); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 2, ticket_resolved_at = NULL WHERE ticket_id = $ticket_id"); - - logAudit("Ticket", "Reopened", "$session_name reopened ticket ID $ticket_id", $client_id, $ticket_id); - - triggerCustomAction('ticket_update', $ticket_id); - - flashAlert("Ticket re-opened"); - - redirect(); - -} - -if (isset($_POST['add_invoice_from_ticket'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - enforceUserPermission('module_sales', 2); - - $invoice_id = intval($_POST['invoice_id']); - $ticket_id = intval($_POST['ticket_id']); - $date = escapeSql($_POST['date']); - $category = intval($_POST['category']); - $scope = escapeSql($_POST['scope']); - - $sql = mysqli_query( - $mysqli, - "SELECT * FROM tickets - LEFT JOIN clients ON ticket_client_id = client_id - LEFT JOIN contacts ON ticket_contact_id = contact_id - LEFT JOIN assets ON ticket_asset_id = asset_id - LEFT JOIN locations ON ticket_location_id = location_id - WHERE ticket_id = $ticket_id" - ); - - $row = mysqli_fetch_assoc($sql); - $client_id = intval($row['client_id']); - $client_net_terms = intval($row['client_net_terms']); - if ($client_net_terms == 0) { - $client_net_terms = $config_default_net_terms; - } - - $ticket_prefix = escapeSql($row['ticket_prefix']); - $ticket_number = intval($row['ticket_number']); - $ticket_category = escapeSql($row['ticket_category']); - $ticket_subject = escapeSql($row['ticket_subject']); - $ticket_created_at = escapeSql($row['ticket_created_at']); - $ticket_updated_at = escapeSql($row['ticket_updated_at']); - $ticket_closed_at = escapeSql($row['ticket_closed_at']); - - $contact_id = intval($row['contact_id']); - $contact_name = escapeSql($row['contact_name']); - $contact_email = escapeSql($row['contact_email']); - - $asset_id = intval($row['asset_id']); - - $location_name = escapeSql($row['location_name']); - - enforceClientAccess(); - - if ($invoice_id == 0) { - - $invoice_prefix = escapeSql($config_invoice_prefix); - - // Atomically increment and get the new invoice number - mysqli_query($mysqli, " - UPDATE settings - SET - config_invoice_next_number = LAST_INSERT_ID(config_invoice_next_number), - config_invoice_next_number = config_invoice_next_number + 1 - WHERE company_id = 1 - "); - - $invoice_number = mysqli_insert_id($mysqli); - - //Generate a unique URL key for clients to access - $url_key = randomString(32); - - mysqli_query($mysqli, "INSERT INTO invoices SET invoice_prefix = '$config_invoice_prefix', invoice_number = $invoice_number, invoice_scope = '$scope', invoice_date = '$date', invoice_due = DATE_ADD('$date', INTERVAL $client_net_terms day), invoice_currency_code = '$session_company_currency', invoice_category_id = $category, invoice_status = 'Draft', invoice_url_key = '$url_key', invoice_client_id = $client_id"); - $invoice_id = mysqli_insert_id($mysqli); - } else { - $sql_invoice = mysqli_query($mysqli, "SELECT invoice_prefix, invoice_number FROM invoices WHERE invoice_id = $invoice_id"); - $row = mysqli_fetch_assoc($sql_invoice); - $invoice_prefix = escapeSql($row['invoice_prefix']); - $invoice_number = intval($row['invoice_number']); - } - - //Add Item - $item_name = escapeSql($_POST['item_name']); - $item_description = escapeSql($_POST['item_description']); - $qty = floatval($_POST['qty']); - $price = floatval($_POST['price']); - $tax_id = intval($_POST['tax_id']); - - $subtotal = $price * $qty; - - if ($tax_id > 0) { - $sql = mysqli_query($mysqli, "SELECT * FROM taxes WHERE tax_id = $tax_id"); - $row = mysqli_fetch_assoc($sql); - $tax_percent = floatval($row['tax_percent']); - $tax_amount = $subtotal * $tax_percent / 100; - } else { - $tax_amount = 0; - } - - $total = $subtotal + $tax_amount; - - mysqli_query($mysqli, "INSERT INTO invoice_items SET item_name = '$item_name', item_description = '$item_description', item_quantity = $qty, item_price = $price, item_subtotal = $subtotal, item_tax = $tax_amount, item_total = $total, item_order = 1, item_tax_id = $tax_id, item_invoice_id = $invoice_id"); - - //Update Invoice Balances - - $sql = mysqli_query($mysqli, "SELECT * FROM invoices WHERE invoice_id = $invoice_id"); - $row = mysqli_fetch_assoc($sql); - - $new_invoice_amount = floatval($row['invoice_amount']) + $total; - - mysqli_query($mysqli, "UPDATE invoices SET invoice_amount = $new_invoice_amount WHERE invoice_id = $invoice_id"); - - mysqli_query($mysqli, "INSERT INTO history SET history_status = 'Draft', history_description = 'Invoice created from Ticket $ticket_prefix$ticket_number', history_invoice_id = $invoice_id"); - - // Add internal note to ticket, and link to invoice in database - mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = 'Created invoice $config_invoice_prefix$invoice_number for this ticket.', ticket_reply_type = 'Internal', ticket_reply_time_worked = '00:01:00', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); - - mysqli_query($mysqli, "UPDATE tickets SET ticket_invoice_id = $invoice_id WHERE ticket_id = $ticket_id"); - - logAudit("Invoice", "Create", "$session_name created invoice $invoice_prefix$invoice_number from Ticket $ticket_prefix$ticket_number", $client_id, $invoice_id); - - flashAlert("Invoice $invoice_prefix$invoice_number created from ticket"); - - redirect("invoice.php?invoice_id=$invoice_id"); - -} - -if (isset($_POST['add_quote_from_ticket'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - enforceUserPermission('module_sales', 2); - - require_once 'quote_model.php'; - - $ticket_id = intval($_POST['ticket_id']); - $item_name = escapeSql($_POST['item_name']); - $item_description = escapeSql($_POST['item_description']); - $qty = floatval($_POST['qty']); - $price = floatval($_POST['price']); - $tax_id = intval($_POST['tax_id']); - - // Totals - $subtotal = $price * $qty; - $tax_amount = 0; - if ($tax_id > 0) { - $sql = mysqli_query($mysqli, "SELECT * FROM taxes WHERE tax_id = $tax_id"); - $row = mysqli_fetch_assoc($sql); - $tax_percent = floatval($row['tax_percent']); - $tax_amount = $subtotal * $tax_percent / 100; - } - $total = floatval($subtotal + $tax_amount); - - // Ticket info - $sql = mysqli_query( - $mysqli, - "SELECT ticket_prefix, ticket_number, ticket_client_id FROM tickets WHERE ticket_id = $ticket_id LIMIT 1" - ); - $row = mysqli_fetch_assoc($sql); - $ticket_prefix = escapeSql($row['ticket_prefix']); - $ticket_number = intval($row['ticket_number']); - $client_id = intval($row['ticket_client_id']); - - enforceClientAccess(); - - // Atomically increment and get the new quote number - mysqli_query($mysqli, " - UPDATE settings - SET - config_quote_next_number = LAST_INSERT_ID(config_quote_next_number), - config_quote_next_number = config_quote_next_number + 1 - WHERE company_id = 1 - "); - - $quote_number = mysqli_insert_id($mysqli); - - //Generate a unique URL key for clients to access - $quote_url_key = randomString(32); - - mysqli_query($mysqli,"INSERT INTO quotes SET quote_prefix = '$config_quote_prefix', quote_number = $quote_number, quote_scope = '$scope', quote_date = '$date', quote_expire = '$expire', quote_amount = $total, quote_currency_code = '$session_company_currency', quote_category_id = $category, quote_status = 'Draft', quote_url_key = '$quote_url_key', quote_client_id = $client_id"); - - $quote_id = mysqli_insert_id($mysqli); - - // Add line item - mysqli_query($mysqli, "INSERT INTO quote_items SET item_name = '$item_name', item_description = '$item_description', item_quantity = $qty, item_price = $price, item_subtotal = $subtotal, item_tax = $tax_amount, item_total = $total, item_order = 1, item_tax_id = $tax_id, item_quote_id = $quote_id"); - - // Add internal note to ticket, and link to invoice in database - mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = 'Created quote $config_quote_prefix$quote_number for this ticket.', ticket_reply_type = 'Internal', ticket_reply_time_worked = '00:01:00', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); - mysqli_query($mysqli, "UPDATE tickets SET ticket_quote_id = $quote_id WHERE ticket_id = $ticket_id LIMIT 1"); - - // Logging + redirects - mysqli_query($mysqli,"INSERT INTO history SET history_status = 'Draft', history_description = 'Quote created from Ticket $ticket_prefix$ticket_number!', history_quote_id = $quote_id"); - logAudit("Quote", "Create", "$session_name created quote $config_quote_prefix$quote_number from ticket $ticket_prefix$ticket_number", $client_id, $quote_id); - - triggerCustomAction('quote_create', $quote_id); - - flashAlert("Quote $config_quote_prefix$quote_number created"); - redirect("quote.php?quote_id=$quote_id"); - -} - -if (isset($_POST['export_tickets_csv'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - if ($_POST['client_id']) { - $client_id = intval($_POST['client_id']); - $client_query = "WHERE ticket_client_id = $client_id"; - $client_name = getFieldById('clients', $client_id, 'client_name'); - $file_name_prepend = "$client_name-"; - } else { - $client_query = ''; - $client_name = ''; - $file_name_prepend = "$session_company_name-"; - } - - $sql = mysqli_query( - $mysqli, - "SELECT * FROM tickets - LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id - $client_query ORDER BY ticket_number ASC" - ); - - if ($sql->num_rows > 0) { - $delimiter = ","; - $enclosure = '"'; - $escape = '\\'; // backslash - $filename = sanitizeFilename($file_name_prepend . "Tickets-" . date('Y-m-d_H-i-s') . ".csv"); - - //create a file pointer - $f = fopen('php://memory', 'w'); - - //set column headers - $fields = array('Ticket Number', 'Priority', 'Status', 'Subject', 'Date Opened', 'Date Resolved', 'Date Closed'); - fputcsv($f, $fields, $delimiter, $enclosure, $escape); - - //output each row of the data, format line as csv and write to file pointer - while ($row = $sql->fetch_assoc()) { - $lineData = array($config_ticket_prefix . $row['ticket_number'], $row['ticket_priority'], $row['ticket_status_name'], $row['ticket_subject'], $row['ticket_created_at'], $row['ticket_resolved_at'], $row['ticket_closed_at']); - fputcsv($f, array_map('escapeCsvFormula', $lineData), $delimiter, $enclosure, $escape); - } - - //move back to beginning of file - fseek($f, 0); - - //set headers to download file rather than displayed - header('Content-Type: text/csv'); - header('Content-Disposition: attachment; filename="' . $filename . '";'); - - //output all remaining data on a file pointer - fpassthru($f); - } - exit; - -} - -if (isset($_POST['edit_ticket_billable_status'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - enforceUserPermission('module_sales', 2); - - $ticket_id = intval($_POST['ticket_id']); - $billable_status = intval($_POST['billable_status']); - if ($billable_status == 0 ) { - $billable_wording = "Not"; - } - - // Get ticket details for logging - $sql = mysqli_query($mysqli, "SELECT ticket_prefix, ticket_number, ticket_client_id FROM tickets WHERE ticket_id = $ticket_id"); - $row = mysqli_fetch_assoc($sql); - $ticket_prefix = escapeSql($row['ticket_prefix']); - $ticket_number = intval($row['ticket_number']); - $client_id = intval($row['ticket_client_id']); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - mysqli_query($mysqli,"UPDATE tickets SET ticket_billable = $billable_status WHERE ticket_id = $ticket_id"); - - logAudit("Ticket", "Edit", "$session_name marked ticket $ticket_prefix$ticket_number as $billable_wording Billable", $client_id, $ticket_id); - - flashAlert("Ticket marked $billable_wording Billable"); - - redirect(); - -} - -if (isset($_POST['edit_ticket_schedule'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - $ticket_id = intval($_POST['ticket_id']); - $onsite = intval($_POST['onsite']); - $schedule = escapeSql($_POST['scheduled_date_time']); - $ticket_link = "client/ticket.php?id=$ticket_id"; - $full_ticket_url = "https://$config_base_url/client/ticket.php?id=$ticket_id"; - $ticket_link_html = "$ticket_link"; - - $client_id = intval(getFieldById('tickets', $ticket_id, 'ticket_client_id')); - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - mysqli_query($mysqli,"UPDATE tickets - SET ticket_schedule = '$schedule', ticket_onsite = $onsite - WHERE ticket_id = $ticket_id" - ); - - // Check for other conflicting scheduled items based on 2 hr window - //TODO make this configurable - $start = date('Y-m-d H:i:s', strtotime($schedule) - 7200); - $end = date('Y-m-d H:i:s', strtotime($schedule) + 7200); - $sql = mysqli_query($mysqli, "SELECT * FROM tickets WHERE ticket_schedule BETWEEN '$start' AND '$end' AND ticket_id != $ticket_id"); - if (mysqli_num_rows($sql) > 0) { - $conflicting_tickets = []; - while ($row = mysqli_fetch_assoc($sql)) { - $conflicting_tickets[] = $row['ticket_id'] . " - " . $row['ticket_subject'] . " @ " . $row['ticket_schedule']; - } - } - $sql = mysqli_query($mysqli, "SELECT * FROM tickets - LEFT JOIN clients ON ticket_client_id = client_id - LEFT JOIN contacts ON ticket_contact_id = contact_id - LEFT JOIN locations on contact_location_id = location_id - LEFT JOIN users ON ticket_assigned_to = user_id - WHERE ticket_id = $ticket_id - "); - - $row = mysqli_fetch_assoc($sql); - - $client_name = escapeSql($row['client_name']); - $ticket_details = escapeSql($row['ticket_details']); - $contact_name = escapeSql($row['contact_name']); - $contact_email = escapeSql($row['contact_email']); - $ticket_prefix = escapeSql($row['ticket_prefix']); - $ticket_number = intval($row['ticket_number']); - $ticket_subject = escapeSql($row['ticket_subject']); - $user_name = escapeSql($row['user_name']); - $user_email = escapeSql($row['user_email']); - $cal_subject = $ticket_number . ": " . $client_name . " - " . $ticket_subject; - $ticket_details_truncated = substr($ticket_details, 0, 100); - $cal_description = $ticket_details_truncated . " - " . $full_ticket_url; - $cal_location = escapeSql($row["location_address"]); - $email_datetime = date('l, F j, Y \a\t g:ia', strtotime($schedule)); - - if ($client_id) { - $client_uri = "&client_id=$client_id"; - } else { - $client_uri = ''; - } - - // Sanitize Config Vars - $config_ticket_from_email = escapeSql($config_ticket_from_email); - $config_ticket_from_name = escapeSql($config_ticket_from_name); - $session_company_name = escapeSql($session_company_name); - - - /// Create iCal event - $cal_str = createiCalStr($schedule, $cal_subject, $cal_description, $cal_location); - - // Notify the agent of the scheduled work - $data[] = [ - 'from' => $config_ticket_from_email, - 'from_name' => $config_ticket_from_name, - 'recipient' => $user_email, - 'recipient_name' => $user_name, - 'subject' => "Ticket Scheduled - [$ticket_prefix$ticket_number] - $ticket_subject", - 'body' => "Hello, " . $user_name . "

    The ticket regarding $ticket_subject has been scheduled for $email_datetime.

    --------------------------------
    $ticket_link
    --------------------------------

    Please do not reply to this email.

    Ticket: $ticket_prefix$ticket_number
    Subject: $ticket_subject
    Portal: https://$config_base_url/agent/ticket.php?ticket_id=$ticket_id$client_uri

    ~
    $session_company_name
    Support Department
    $config_ticket_from_email", - 'cal_str' => $cal_str - ]; - - if ($config_ticket_client_general_notifications) { - // Notify the ticket contact of the scheduled work - $data[] = [ - 'from' => $config_ticket_from_email, - 'from_name' => $config_ticket_from_name, - 'recipient' => $contact_email, - 'recipient_name' => $contact_name, - 'subject' => "Ticket Scheduled - [$ticket_prefix$ticket_number] - $ticket_subject", - 'body' => mysqli_escape_string($mysqli, "
    - Hello, $contact_name -
    - Your ticket regarding $ticket_subject has been scheduled for $email_datetime. -

    - Access your ticket here -

    - Please do not reply to this email. -

    - Ticket: $ticket_prefix$ticket_number
    - Subject: $ticket_subject
    -

    - -
    - This is an automated message. Please do not reply directly to this email. -
    "), - 'cal_str' => $cal_str - ]; - - // Notify the watchers of the scheduled work - $sql_watchers = mysqli_query($mysqli, "SELECT watcher_email FROM ticket_watchers WHERE watcher_ticket_id = $ticket_id"); - - while ($row = mysqli_fetch_assoc($sql_watchers)) { - $watcher_email = escapeSql($row['watcher_email']); - $data[] = [ - 'from' => $config_ticket_from_email, - 'from_name' => $config_ticket_from_name, - 'recipient' => $watcher_email, - 'recipient_name' => $watcher_email, - 'subject' => "Ticket Scheduled - [$ticket_prefix$ticket_number] - $ticket_subject", - 'body' => mysqli_escape_string($mysqli, escapeHtml("
    - Hello, -
    - The ticket regarding $ticket_subject has been scheduled for $email_datetime. -

    - $ticket_link -

    - Please do not reply to this email. -

    - Ticket: $ticket_prefix$ticket_number
    - Subject: $ticket_subject
    - Portal: Access the ticket here -

    - -
    - This is an automated message. Please do not reply directly to this email. -
    ")), - 'cal_str' => $cal_str - ]; - } - } - - // Send - $response = addToMailQueue($data); - - // Update ticket reply - $ticket_reply_note = "Ticket scheduled for $email_datetime " . (boolval($onsite) ? '(onsite).' : '(remote).'); - mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = '$ticket_reply_note', ticket_reply_type = 'Internal', ticket_reply_time_worked = '00:01:00', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); - - logAudit("Ticket", "Edit", "$session_name edited ticket schedule", $client_id, $ticket_id); - - triggerCustomAction('ticket_schedule', $ticket_id); - - if (empty($conflicting_tickets)) { - flashAlert("Ticket scheduled for $email_datetime"); - redirect(); - } else { - $_SESSION['alert_type'] = "error"; - flashAlert("Ticket scheduled for $email_datetime. Yet there are conflicting tickets scheduled for the same time:
    " . implode(",
    ", $conflicting_tickets), 'error'); - redirect("calendar.php"); - } - -} - -if (isset($_GET['cancel_ticket_schedule'])) { - - validateCSRFToken(); - - enforceUserPermission('module_support', 2); - - $ticket_id = intval($_GET['cancel_ticket_schedule']); - - $sql = mysqli_query($mysqli, "SELECT * FROM tickets WHERE ticket_id = $ticket_id"); - $row = mysqli_fetch_assoc($sql); - - $client_id = intval($row['ticket_client_id']); - $ticket_prefix = escapeSql($row['ticket_prefix']); - $ticket_number = intval($row['ticket_number']); - $ticket_subject = escapeSql($row['ticket_subject']); - $ticket_schedule = escapeSql($row['ticket_schedule']); - $ticket_cal_str = escapeSql($row['ticket_cal_str']); - - // Don't Enforce Client Access if Ticket doesn't have an assigned client - if ($client_id) { - enforceClientAccess(); - } - - if ($client_id) { - $client_uri = "&client_id=$client_id"; - } else { - $client_uri = ''; - } - - mysqli_query($mysqli, "UPDATE tickets SET ticket_schedule = NULL WHERE ticket_id = $ticket_id"); - - // Sanitize Config Vars - $config_ticket_from_email = escapeSql($config_ticket_from_email); - $config_ticket_from_name = escapeSql($config_ticket_from_name); - $session_company_name = escapeSql($session_company_name); - - //Create iCal event - $cal_str = createiCalStrCancel($ticket_cal_str); - - //Send emails - - $sql = mysqli_query($mysqli, "SELECT * FROM tickets - LEFT JOIN clients ON ticket_client_id = client_id - LEFT JOIN contacts ON ticket_contact_id = contact_id - LEFT JOIN locations on contact_location_id = location_id - LEFT JOIN users ON ticket_assigned_to = user_id - WHERE ticket_id = $ticket_id - "); - $row = mysqli_fetch_assoc($sql); - - $client_id = intval($row['ticket_client_id']); - $client_name = escapeSql($row['client_name']); - $ticket_details = escapeSql($row['ticket_details']); - $contact_name = escapeSql($row['contact_name']); - $contact_email = escapeSql($row['contact_email']); - $ticket_prefix = escapeSql($row['ticket_prefix']); - $ticket_number = intval($row['ticket_number']); - $ticket_subject = escapeSql($row['ticket_subject']); - $user_name = escapeSql($row['user_name']); - $user_email = escapeSql($row['user_email']); - - // Notify the agent of the cancellation - $data[] = [ - // User Email - 'from' => $config_ticket_from_email, - 'from_name' => $config_ticket_from_name, - 'recipient' => $user_email, - 'recipient_name' => $user_name, - 'subject' => "Ticket Schedule Cancelled - [$ticket_prefix$ticket_number] - $ticket_subject", - 'body' => "Hello, " . $user_name . "

    Scheduled work for the ticket regarding $ticket_subject has been cancelled.

    --------------------------------
    $ticket_link
    --------------------------------

    Please do not reply to this email.

    Ticket: $ticket_prefix$ticket_number
    Subject: $ticket_subject
    Portal: https://$config_base_url/agent/ticket.php?id=$ticket_id&client_id=$client_id

    ~
    $session_company_name
    Support Department
    $config_ticket_from_email", - 'cal_str' => $cal_str - ]; - - if ($config_ticket_client_general_notifications) { - // Notify the ticket contact of the cancellation - $data[] = [ - 'from' => $config_ticket_from_email, - 'from_name' => $config_ticket_from_name, - 'recipient' => $contact_email, - 'recipient_name' => $contact_name, - 'subject' => "Ticket Schedule Cancelled - [$ticket_prefix$ticket_number] - $ticket_subject", - 'body' => mysqli_escape_string($mysqli, "
    - Hello, $contact_name -
    - Scheduled work for your ticket regarding $ticket_subject has been cancelled. -

    - Access your ticket here -

    - Please do not reply to this email. -

    - Ticket: $ticket_prefix$ticket_number
    - Subject: $ticket_subject
    -

    - -
    - This is an automated message. Please do not reply directly to this email. -
    "), - 'cal_str' => $cal_str - ]; - - // Notify the watchers of the cancellation - $sql_watchers = mysqli_query($mysqli, "SELECT watcher_email FROM ticket_watchers WHERE watcher_ticket_id = $ticket_id"); - while ($row = mysqli_fetch_assoc($sql_watchers)) { - $watcher_email = escapeSql($row['watcher_email']); - $data[] = [ - 'from' => $config_ticket_from_email, - 'from_name' => $config_ticket_from_name, - 'recipient' => $watcher_email, - 'recipient_name' => $watcher_email, - 'subject' => "Ticket Schedule Cancelled - [$ticket_prefix$ticket_number] - $ticket_subject", - 'body' => mysqli_escape_string($mysqli, escapeHtml("
    - Hello, -
    - Scheduled work for the ticket regarding $ticket_subject has been cancelled. -

    - $ticket_link -

    - Please do not reply to this email. -

    - Ticket: $ticket_prefix$ticket_number
    - Subject: $ticket_subject
    - Portal: Access the ticket here -

    - -
    - This is an automated message. Please do not reply directly to this email. -
    ")), - 'cal_str' => $cal_str - ]; - } - } - - // Send email(s) - addToMailQueue($data); - - // Update ticket reply - $ticket_reply_note = "Ticket schedule cancelled."; - mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = '$ticket_reply_note', ticket_reply_type = 'Internal', ticket_reply_time_worked = '00:01:00', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); - - logAudit("Ticket", "Edit", "$session_name cancelled ticket schedule", $client_id, $ticket_id); - - triggerCustomAction('ticket_unschedule', $ticket_id); - - flashAlert("Ticket schedule cancelled", 'error'); - - redirect(); - -} + + if ($d !== false) { + $due = "'" . $d->format('Y-m-d H:i:s') . "'"; // wrap in quotes for SQL + } else { + $due = 'NULL'; // fallback if invalid + } + } + + enforceClientAccess(); + + // Add the primary contact as the ticket contact if "Use primary contact" is checked + if ($use_primary_contact == 1) { + $sql = mysqli_query($mysqli, "SELECT contact_id FROM contacts WHERE contact_client_id = $client_id AND contact_primary = 1"); + $row = mysqli_fetch_assoc($sql); + $contact_id = intval($row['contact_id']); + } + + // Atomically increment and get the new ticket number + mysqli_query($mysqli, " + UPDATE settings + SET + config_ticket_next_number = LAST_INSERT_ID(config_ticket_next_number), + config_ticket_next_number = config_ticket_next_number + 1 + WHERE company_id = 1 + "); + + $ticket_number = mysqli_insert_id($mysqli); + + // Sanitize Config Vars from get_settings.php and Session Vars from check_login.php + $config_ticket_prefix = escapeSql($config_ticket_prefix); + $config_ticket_from_name = escapeSql($config_ticket_from_name); + $config_ticket_from_email = escapeSql($config_ticket_from_email); + $config_base_url = escapeSql($config_base_url); + + //Generate a unique URL key for clients to access + $url_key = randomString(32); + + mysqli_query($mysqli, "INSERT INTO tickets SET ticket_prefix = '$config_ticket_prefix', ticket_number = $ticket_number, ticket_source = 'Agent', ticket_category = $category_id, ticket_subject = '$subject', ticket_details = '$details', ticket_priority = '$priority', ticket_billable = '$billable', ticket_status = '$ticket_status', ticket_vendor_ticket_number = '$vendor_ticket_number', ticket_vendor_id = $vendor_id, ticket_location_id = $location_id, ticket_asset_id = $asset_id, ticket_created_by = $session_user_id, ticket_assigned_to = $assigned_to, ticket_contact_id = $contact_id, ticket_url_key = '$url_key', ticket_due_at = $due, ticket_client_id = $client_id, ticket_invoice_id = 0, ticket_project_id = $project_id"); + + $ticket_id = mysqli_insert_id($mysqli); + + // Add Tasks from Template if Template was selected + if($ticket_template_id) { + // Get Associated Tasks from the ticket template + $sql_task_templates = mysqli_query($mysqli, "SELECT * FROM task_templates WHERE task_template_ticket_template_id = $ticket_template_id"); + + if (mysqli_num_rows($sql_task_templates) > 0) { + while ($row = mysqli_fetch_assoc($sql_task_templates)) { + $task_order = intval($row['task_template_order']); + $task_name = escapeSql($row['task_template_name']); + $task_completion_estimate = intval($row['task_template_completion_estimate']); + + mysqli_query($mysqli,"INSERT INTO tasks SET task_name = '$task_name', task_order = $task_order, task_completion_estimate = $task_completion_estimate, task_ticket_id = $ticket_id"); + } + } + } + + // Add Watchers + if (isset($_POST['watchers'])) { + foreach ($_POST['watchers'] as $watcher) { + $watcher_email = escapeSql($watcher); + mysqli_query($mysqli, "INSERT INTO ticket_watchers SET watcher_email = '$watcher_email', watcher_ticket_id = $ticket_id"); + } + } + + // Add Additional Assets + if (isset($_POST['additional_assets'])) { + foreach ($_POST['additional_assets'] as $additional_asset) { + $additional_asset_id = intval($additional_asset); + mysqli_query($mysqli, "INSERT INTO ticket_assets SET ticket_id = $ticket_id, asset_id = $additional_asset_id"); + } + } + + // E-mail client + if ((!empty($config_smtp_provider) || !empty($config_smtp_provider)) && $config_ticket_client_general_notifications == 1) { + + // Get contact/ticket details + $sql = mysqli_query($mysqli, "SELECT contact_name, contact_email, ticket_prefix, ticket_number, ticket_category, ticket_subject, ticket_details, ticket_priority, ticket_status, ticket_created_by, ticket_assigned_to, ticket_client_id FROM tickets + LEFT JOIN clients ON ticket_client_id = client_id + LEFT JOIN contacts ON ticket_contact_id = contact_id + WHERE ticket_id = $ticket_id"); + $row = mysqli_fetch_assoc($sql); + + $contact_name = escapeSql($row['contact_name']); + $contact_email = escapeSql($row['contact_email']); + $ticket_prefix = escapeSql($row['ticket_prefix']); + $ticket_number = intval($row['ticket_number']); + $ticket_category = escapeSql($row['ticket_category']); + $ticket_subject = escapeSql($row['ticket_subject']); + $ticket_details = mysqli_escape_string($mysqli, $row['ticket_details']); + $ticket_priority = escapeSql($row['ticket_priority']); + $ticket_status = escapeSql($row['ticket_status']); + $ticket_status_name = escapeSql(getTicketStatusName($row['ticket_status'])); + $client_id = intval($row['ticket_client_id']); + $ticket_created_by = intval($row['ticket_created_by']); + $ticket_assigned_to = intval($row['ticket_assigned_to']); + + // Get Company Phone Number + $sql = mysqli_query($mysqli, "SELECT company_name, company_phone, company_phone_country_code FROM companies WHERE company_id = 1"); + $row = mysqli_fetch_assoc($sql); + $company_name = escapeSql($row['company_name']); + $company_phone = escapeSql(formatPhoneNumber($row['company_phone'], $row['company_phone_country_code'])); + + // EMAILING + + $subject = "Ticket Created [$ticket_prefix$ticket_number] - $ticket_subject"; + $body = "##- Please type your reply above this line -##

    Hello $contact_name,

    A ticket regarding \"$ticket_subject\" has been created for you.

    --------------------------------
    $ticket_details--------------------------------

    Ticket: $ticket_prefix$ticket_number
    Subject: $ticket_subject
    Status: Open
    Portal: View ticket

    --
    $company_name - Support
    $config_ticket_from_email
    $company_phone"; + + // Verify contact email is valid + if (filter_var($contact_email, FILTER_VALIDATE_EMAIL)) { + + + // Email Ticket Contact + // Queue Mail + $data = []; + + $data[] = [ + 'from' => $config_ticket_from_email, + 'from_name' => $config_ticket_from_name, + 'recipient' => $contact_email, + 'recipient_name' => $contact_name, + 'subject' => $subject, + 'body' => $body + ]; + } + + // Also Email all the watchers + $sql_watchers = mysqli_query($mysqli, "SELECT watcher_email FROM ticket_watchers WHERE watcher_ticket_id = $ticket_id"); + $body .= "

    ----------------------------------------
    YOU HAVE BEEN ADDED AS A COLLABORATOR FOR THIS TICKET"; + while ($row = mysqli_fetch_assoc($sql_watchers)) { + $watcher_email = escapeSql($row['watcher_email']); + + // Queue Mail + $data[] = [ + 'from' => $config_ticket_from_email, + 'from_name' => $config_ticket_from_name, + 'recipient' => $watcher_email, + 'recipient_name' => $watcher_email, + 'subject' => $subject, + 'body' => $body + ]; + } + addToMailQueue($data); + + // END EMAILING + + } + + // Custom action/notif handler + triggerCustomAction('ticket_create', $ticket_id); + + logAudit("Ticket", "Create", "$session_name created ticket $config_ticket_prefix$ticket_number - $ticket_subject", $client_id, $ticket_id); + + flashAlert("Ticket $config_ticket_prefix$ticket_number created"); + + redirect("ticket.php?client_id=$client_id&ticket_id=$ticket_id"); + +} + +if (isset($_POST['edit_ticket'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + $ticket_id = intval($_POST['ticket_id']); + $contact_id = intval($_POST['contact_id']); + $assigned_to = intval($_POST['assigned_to']); + $notify = intval($_POST['contact_notify'] ?? 0); + $category_id = intval($_POST['category_id']); + $ticket_subject = escapeSql($_POST['subject']); + $billable = intval($_POST['billable'] ?? 0); + $ticket_priority = escapeSql($_POST['priority']); + $details = mysqli_real_escape_string($mysqli, $_POST['details']); + $vendor_ticket_number = escapeSql($_POST['vendor_ticket_number']); + $vendor_id = intval($_POST['vendor_id']); + $asset_id = intval($_POST['asset_id']); + $location_id = intval($_POST['location_id']); + $project_id = intval($_POST['project_id']); + // Validate/clean due field + $dueInput = $_POST['due'] ?? null; + if ($dueInput === null || trim($dueInput) === '') { + $due = 'NULL'; // prepare as SQL-safe string + } else { + $d = DateTime::createFromFormat('Y-m-d\TH:i', $dueInput); // for + if ($d !== false) { + $due = "'" . $d->format('Y-m-d H:i:s') . "'"; // wrap in quotes for SQL + } else { + $due = 'NULL'; // fallback if invalid + } + } + + $client_id = intval(getFieldById('tickets', $ticket_id, 'ticket_client_id')); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + mysqli_query($mysqli, "UPDATE tickets SET ticket_category = $category_id, ticket_subject = '$ticket_subject', ticket_priority = '$ticket_priority', ticket_billable = $billable, ticket_details = '$details', ticket_due_at = $due, ticket_vendor_ticket_number = '$vendor_ticket_number', ticket_contact_id = $contact_id, ticket_assigned_to = $assigned_to, ticket_vendor_id = $vendor_id, ticket_location_id = $location_id, ticket_asset_id = $asset_id, ticket_project_id = $project_id WHERE ticket_id = $ticket_id"); + + // Add Additional Assets + if (isset($_POST['additional_assets'])) { + mysqli_query($mysqli, "DELETE FROM ticket_assets WHERE ticket_id = $ticket_id"); + foreach ($_POST['additional_assets'] as $additional_asset) { + $additional_asset_id = intval($additional_asset); + mysqli_query($mysqli, "INSERT INTO ticket_assets SET ticket_id = $ticket_id, asset_id = $additional_asset_id"); + } + } else { + // If no additional assets are provided, delete them all + // This handles cases where the assets input might be cleared or not set at all. + mysqli_query($mysqli, "DELETE FROM ticket_assets WHERE ticket_id = $ticket_id"); + } + + // Get contact/ticket details after update for logging / email purposes + $sql = mysqli_query($mysqli, "SELECT contact_name, contact_email, ticket_prefix, ticket_number, ticket_category, ticket_details, ticket_status_name, ticket_created_by, ticket_assigned_to, ticket_url_key, ticket_client_id FROM tickets + LEFT JOIN clients ON ticket_client_id = client_id + LEFT JOIN contacts ON ticket_contact_id = contact_id + LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id + WHERE ticket_id = $ticket_id + AND ticket_closed_at IS NULL"); + $row = mysqli_fetch_assoc($sql); + + $contact_name = escapeSql($row['contact_name']); + $contact_email = escapeSql($row['contact_email']); + $ticket_prefix = escapeSql($row['ticket_prefix']); + $ticket_number = intval($row['ticket_number']); + $ticket_category = escapeSql($row['ticket_category']); + $ticket_details = mysqli_escape_string($mysqli, $row['ticket_details']); + $ticket_status = escapeSql($row['ticket_status_name']); + $ticket_created_by = intval($row['ticket_created_by']); + $ticket_assigned_to = intval($row['ticket_assigned_to']); + $url_key = escapeSql($row['ticket_url_key']); + $client_id = intval($row['ticket_client_id']); + + // Notify new contact if selected + if ($notify && (!empty($config_smtp_provider) || !empty($config_smtp_provider))) { + + // Get Company Name Phone Number and Sanitize for Email Sending + $sql = mysqli_query($mysqli, "SELECT company_name, company_phone, company_phone_country_code FROM companies WHERE company_id = 1"); + $row = mysqli_fetch_assoc($sql); + $company_name = escapeSql($row['company_name']); + $company_phone = escapeSql(formatPhoneNumber($row['company_phone'], $row['company_phone_country_code'])); + + // Email content + $data = []; // Queue array + + $subject = "Ticket Created - [$ticket_prefix$ticket_number] - $ticket_subject"; + $body = "##- Please type your reply above this line -##

    Hello $contact_name,

    A ticket regarding \"$ticket_subject\" has been created for you.

    --------------------------------
    $ticket_details--------------------------------

    Ticket: $ticket_prefix$ticket_number
    Subject: $ticket_subject
    Status: $ticket_status
    Portal: View ticket

    --
    $company_name - Support
    $config_ticket_from_email
    $company_phone"; + + + // Only add contact to email queue if email is valid + if (filter_var($contact_email, FILTER_VALIDATE_EMAIL)) { + $data[] = [ + 'from' => $config_ticket_from_email, + 'from_name' => $config_ticket_from_name, + 'recipient' => $contact_email, + 'recipient_name' => $contact_name, + 'subject' => $subject, + 'body' => $body + ]; + } + + addToMailQueue($data); + } + + // Custom action/notif handler + triggerCustomAction('ticket_update', $ticket_id); + + logAudit("Ticket", "Edit", "$session_name edited ticket $ticket_prefix$ticket_number", $client_id, $ticket_id); + + flashAlert("Ticket $ticket_prefix$ticket_number updated"); + + redirect(); + +} + +if (isset($_POST['edit_ticket_priority'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + $ticket_id = intval($_POST['ticket_id']); + $priority = escapeSql($_POST['priority']); + + // Get ticket details before updating + $sql = mysqli_query($mysqli, "SELECT + ticket_prefix, ticket_number, ticket_priority, ticket_status_name, ticket_client_id + FROM tickets + LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id + WHERE ticket_id = $ticket_id" + ); + $row = mysqli_fetch_assoc($sql); + $ticket_prefix = escapeSql($row['ticket_prefix']); + $ticket_number = intval($row['ticket_number']); + $original_priority = escapeSql($row['ticket_priority']); + $ticket_status = escapeSql($row['ticket_status_name']); + $client_id = intval($row['ticket_client_id']); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + mysqli_query($mysqli, "UPDATE tickets SET ticket_priority = '$priority' WHERE ticket_id = $ticket_id"); + + // Update Ticket History + mysqli_query($mysqli, "INSERT INTO ticket_history SET ticket_history_status = '$ticket_status', ticket_history_description = '$session_name changed priority from $original_priority to $priority', ticket_history_ticket_id = $ticket_id"); + + logAudit("Ticket", "Edit", "$session_name changed priority from $original_priority to $priority for ticket $ticket_prefix$ticket_number", $client_id, $ticket_id); + + triggerCustomAction('ticket_update', $ticket_id); + + flashAlert("Priority updated from $original_priority to $priority"); + + redirect(); + +} + +if (isset($_POST['edit_ticket_contact'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + $ticket_id = intval($_POST['ticket_id']); + $contact_id = intval($_POST['contact']); + $notify = intval($_POST['contact_notify']) ?? 0; + + // Get Original contact, and ticket details + $sql = mysqli_query($mysqli, "SELECT + contact_name, ticket_prefix, ticket_number, ticket_status_name, ticket_subject, ticket_details, ticket_url_key, ticket_client_id + FROM tickets + LEFT JOIN contacts ON ticket_contact_id = contact_id + LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id + WHERE ticket_id = $ticket_id" + ); + $row = mysqli_fetch_assoc($sql); + + // Original contact + $original_contact_name = !empty($row['contact_name']) ? escapeSql($row['contact_name']) : 'No one'; + + // Ticket details + $ticket_prefix = escapeSql($row['ticket_prefix']); + $ticket_number = intval($row['ticket_number']); + $ticket_status = escapeSql($row['ticket_status_name']); + $ticket_subject = escapeSql($row['ticket_subject']); + $ticket_details = mysqli_escape_string($mysqli, $row['ticket_details']); + $url_key = escapeSql($row['ticket_url_key']); + $client_id = intval($row['ticket_client_id']); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + // Update the contact + mysqli_query($mysqli, "UPDATE tickets SET ticket_contact_id = $contact_id WHERE ticket_id = $ticket_id"); + + // Get New contact details + $sql = mysqli_query($mysqli, "SELECT contact_name, contact_email FROM contacts WHERE contact_id = $contact_id"); + $row = mysqli_fetch_assoc($sql); + + $contact_name = !empty($row['contact_name']) ? escapeSql($row['contact_name']) : 'No one'; + $contact_email = escapeSql($row['contact_email']); + + // Notify new contact (if selected, valid & configured) + if ($notify && filter_var($contact_email, FILTER_VALIDATE_EMAIL) && (!empty($config_smtp_provider) || !empty($config_smtp_provider))) { + + // Get Company Phone Number + $sql = mysqli_query($mysqli, "SELECT company_name, company_phone, company_phone_country_code FROM companies WHERE company_id = 1"); + $row = mysqli_fetch_assoc($sql); + $company_name = escapeSql($row['company_name']); + $company_phone = escapeSql(formatPhoneNumber($row['company_phone'], $row['company_phone_country_code'])); + + $config_ticket_from_email = escapeSql($config_ticket_from_email); + $config_ticket_from_name = escapeSql($config_ticket_from_name); + + // Email content + $data = []; // Queue array + + $subject = "Ticket Created - [$ticket_prefix$ticket_number] - $ticket_subject"; + $body = "##- Please type your reply above this line -##

    Hello $contact_name,

    A ticket regarding \"$ticket_subject\" has been created for you.

    --------------------------------
    $ticket_details--------------------------------

    Ticket: $ticket_prefix$ticket_number
    Subject: $ticket_subject
    Status: $ticket_status
    Portal: View ticket

    --
    $company_name - Support
    $config_ticket_from_email
    $company_phone"; + + $data[] = [ + 'from' => $config_ticket_from_email, + 'from_name' => $config_ticket_from_name, + 'recipient' => $contact_email, + 'recipient_name' => $contact_name, + 'subject' => $subject, + 'body' => $body + ]; + + addToMailQueue($data); + } + + // Custom action/notif handler + triggerCustomAction('ticket_update', $ticket_id); + + // Update Ticket History + mysqli_query($mysqli, "INSERT INTO ticket_history SET ticket_history_status = '$ticket_status', ticket_history_description = '$session_name changed the contact from $original_contact_name to $contact_name', ticket_history_ticket_id = $ticket_id"); + + logAudit("Ticket", "Edit", "$session_name changed the contact from $original_contact_name to $contact_name for ticket $ticket_prefix$ticket_number", $client_id, $ticket_id); + + flashAlert("Contact changed from $original_contact_name to $contact_name"); + + redirect(); + +} + +if (isset($_POST['edit_ticket_project'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + $ticket_id = intval($_POST['ticket_id']); + $project_id = intval($_POST['project']); + + $project_name = escapeSql(getFieldById('projects', $project_id, 'project_name')); + $client_id = intval(getFieldById('tickets', $ticket_id, 'ticket_client_id')); + $ticket_prefix = escapeSql(getFieldById('tickets', $ticket_id, 'ticket_prefix')); + $ticket_number = escapeSql(getFieldById('tickets', $ticket_id, 'ticket_number')); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + mysqli_query($mysqli, "UPDATE tickets SET ticket_project_id = $project_id WHERE ticket_id = $ticket_id"); + + logAudit("Ticket", "Edit", "$session_name set ticket $ticket_prefix$ticket_number project to $project_name", $client_id, $ticket_id); + + flashAlert("Project changed to $project_name for Ticket $ticket_prefix$ticket_number"); + + redirect(); + +} + +if (isset($_POST['add_ticket_watcher'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + $ticket_id = intval($_POST['ticket_id']); + $watcher_emails = preg_split("/,| |;/", $_POST['watcher_email']); // Split on comma, semicolon or space, we sanitize later + $notify = intval($_POST['watcher_notify'] ?? 0); + + // Get contact/ticket details + $sql = mysqli_query($mysqli, "SELECT ticket_prefix, ticket_number, ticket_category, ticket_subject, ticket_details, ticket_priority, ticket_status_name, ticket_url_key, ticket_created_by, ticket_assigned_to, ticket_client_id FROM tickets + LEFT JOIN clients ON ticket_client_id = client_id + LEFT JOIN contacts ON ticket_contact_id = contact_id + LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id + WHERE ticket_id = $ticket_id + AND ticket_closed_at IS NULL"); + $row = mysqli_fetch_assoc($sql); + + $ticket_prefix = escapeSql($row['ticket_prefix']); + $ticket_number = intval($row['ticket_number']); + $ticket_category = escapeSql($row['ticket_category']); + $ticket_subject = escapeSql($row['ticket_subject']); + $ticket_details = mysqli_escape_string($mysqli, $row['ticket_details']); + $ticket_priority = escapeSql($row['ticket_priority']); + $ticket_status = escapeSql($row['ticket_status_name']); + $url_key = escapeSql($row['ticket_url_key']); + $client_id = intval($row['ticket_client_id']); + $ticket_created_by = intval($row['ticket_created_by']); + $ticket_assigned_to = intval($row['ticket_assigned_to']); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + // Get Company Phone Number + $sql = mysqli_query($mysqli, "SELECT company_name, company_phone, company_phone_country_code FROM companies WHERE company_id = 1"); + $row = mysqli_fetch_assoc($sql); + $company_name = escapeSql($row['company_name']); + $company_phone = escapeSql(formatPhoneNumber($row['company_phone'], $row['company_phone_country_code'])); + + // Process each watcher in list + foreach ($watcher_emails as $watcher_email) { + + if (filter_var($watcher_email, FILTER_VALIDATE_EMAIL)) { + + $watcher_email = escapeSql($watcher_email); + + mysqli_query($mysqli, "INSERT INTO ticket_watchers SET watcher_email = '$watcher_email', watcher_ticket_id = $ticket_id"); + + // Notify watcher + if ($notify && (!empty($config_smtp_provider))) { + + + + // Email content + $data = []; // Queue array + + $subject = "Ticket Notification - [$ticket_prefix$ticket_number] - $ticket_subject"; + $body = "##- Please type your reply above this line -##

    Hello,

    You have been added as a collaborator on this ticket regarding \"$ticket_subject\".

    --------------------------------
    $ticket_details--------------------------------

    Ticket: $ticket_prefix$ticket_number
    Subject: $ticket_subject
    Status: $ticket_status
    Guest link: https://$config_base_url/guest/guest_view_ticket.php?ticket_id=$ticket_id&url_key=$url_key

    --
    $company_name - Support
    $config_ticket_from_email
    $company_phone"; + + $data[] = [ + 'from' => $config_ticket_from_email, + 'from_name' => $config_ticket_from_name, + 'recipient' => $watcher_email, + 'recipient_name' => $watcher_email, + 'subject' => $subject, + 'body' => $body + ]; + + addToMailQueue($data); + } + + logAudit("Ticket", "Edit", "$session_name added $watcher_email as a watcher for ticket $ticket_prefix$ticket_number", $client_id, $ticket_id); + } + + } + + flashAlert("Added watcher(s)"); + + redirect(); + +} + +if (isset($_GET['delete_ticket_watcher'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + $watcher_id = intval($_GET['delete_ticket_watcher']); + + // Get ticket / watcher details for logging + $sql = mysqli_query($mysqli, "SELECT watcher_email, ticket_prefix, ticket_number, ticket_status_name, ticket_client_id, ticket_id FROM ticket_watchers + LEFT JOIN tickets ON watcher_ticket_id = ticket_id + LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id + WHERE watcher_id = $watcher_id" + ); + $row = mysqli_fetch_assoc($sql); + + $ticket_prefix = escapeSql($row['ticket_prefix']); + $ticket_number = intval($row['ticket_number']); + $ticket_status_name = escapeSql($row['ticket_status_name']); + $watcher_email = escapeSql($row['watcher_email']); + $client_id = intval($row['ticket_client_id']); + $ticket_id = intval($row['ticket_id']); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + mysqli_query($mysqli, "DELETE FROM ticket_watchers WHERE watcher_id = $watcher_id"); + + // History + mysqli_query($mysqli, "INSERT INTO ticket_history SET ticket_history_status = '$ticket_status_name', ticket_history_description = '$session_name removed ticket $watcher_email as a watcher', ticket_history_ticket_id = $ticket_id"); + + logAudit("Ticket", "Edit", "$session_name removed $watcher_email as a watcher for ticket $ticket_prefix$ticket_number", $client_id, $ticket_id); + + flashAlert("Removed ticket watcher $watcher_email", 'error'); + + redirect(); + +} + +if (isset($_GET['delete_ticket_additional_asset'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + $asset_id = intval($_GET['delete_ticket_additional_asset']); + $ticket_id = intval($_GET['ticket_id']); + + // Get ticket / asset details for logging + $sql = mysqli_query($mysqli, "SELECT asset_name, ticket_prefix, ticket_number, ticket_status_name, ticket_client_id FROM assets + JOIN tickets ON ticket_id = $ticket_id + JOIN ticket_statuses ON ticket_status = ticket_status_id + WHERE asset_id = $asset_id" + ); + $row = mysqli_fetch_assoc($sql); + + $ticket_prefix = escapeSql($row['ticket_prefix']); + $ticket_number = intval($row['ticket_number']); + $ticket_status_name = escapeSql($row['ticket_status_name']); + $asset_name = escapeSql($row['asset_name']); + $client_id = intval($row['ticket_client_id']); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + mysqli_query($mysqli, "DELETE FROM ticket_assets WHERE ticket_id = $ticket_id AND asset_id = $asset_id"); + + // History + mysqli_query($mysqli, "INSERT INTO ticket_history SET ticket_history_status = '$ticket_status_name', ticket_history_description = '$session_name removed additional asset $asset_name', ticket_history_ticket_id = $ticket_id"); + + logAudit("Ticket", "Edit", "$session_name removed asset $asset_name from ticket $ticket_prefix$ticket_number", $client_id, $ticket_id); + + flashAlert("Removed asset $asset_name from ticket.", 'error'); + + redirect(); + +} + +if (isset($_POST['edit_ticket_asset'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + $ticket_id = intval($_POST['ticket_id']); + $asset_id = intval($_POST['asset']); + + $client_id = intval(getFieldById('tickets', $ticket_id, 'ticket_client_id')); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + mysqli_query($mysqli, "UPDATE tickets SET ticket_asset_id = $asset_id WHERE ticket_id = $ticket_id"); + + // Add Additional Assets + if (isset($_POST['additional_assets'])) { + mysqli_query($mysqli, "DELETE FROM ticket_assets WHERE ticket_id = $ticket_id"); + foreach ($_POST['additional_assets'] as $additional_asset) { + $additional_asset_id = intval($additional_asset); + mysqli_query($mysqli, "INSERT INTO ticket_assets SET ticket_id = $ticket_id, asset_id = $additional_asset_id"); + } + } else { + // If no additional assets are provided, delete them all + // This handles cases where the assets input might be cleared or not set at all. + mysqli_query($mysqli, "DELETE FROM ticket_assets WHERE ticket_id = $ticket_id"); + } + + // Get ticket / asset details for logging + $sql = mysqli_query($mysqli, "SELECT asset_name, ticket_prefix, ticket_number, ticket_status_name, ticket_client_id FROM assets + LEFT JOIN tickets ON ticket_asset_id = asset_id + LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id + WHERE ticket_id = $ticket_id" + ); + $row = mysqli_fetch_assoc($sql); + + $ticket_prefix = escapeSql($row['ticket_prefix']); + $ticket_number = intval($row['ticket_number']); + $ticket_status_name = escapeSql($row['ticket_status_name']); + $asset_name = escapeSql($row['asset_name']); + $client_id = intval($row['ticket_client_id']); + + logAudit("Ticket", "Edit", "$session_name changed asset to $asset_name for ticket $ticket_prefix$ticket_number", $client_id, $ticket_id); + + flashAlert("Ticket $ticket_prefix$ticket_number asset updated to $asset_name"); + + redirect(); + +} + +if (isset($_POST['edit_ticket_vendor'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + $ticket_id = intval($_POST['ticket_id']); + $vendor_id = intval($_POST['vendor']); + + $client_id = intval(getFieldById('tickets', $ticket_id, 'ticket_client_id')); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + mysqli_query($mysqli, "UPDATE tickets SET ticket_vendor_id = $vendor_id WHERE ticket_id = $ticket_id"); + + // Get ticket / vendor details for logging + $sql = mysqli_query($mysqli, "SELECT vendor_name, ticket_prefix, ticket_number, ticket_status_name, ticket_client_id FROM vendors + LEFT JOIN tickets ON ticket_vendor_id = $vendor_id + LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id + WHERE ticket_id = $ticket_id" + ); + $row = mysqli_fetch_assoc($sql); + + $ticket_prefix = escapeSql($row['ticket_prefix']); + $ticket_number = intval($row['ticket_number']); + $ticket_status_name = escapeSql($row['ticket_status_name']); + $vendor_name = escapeSql($row['vendor_name']); + $client_id = intval($row['ticket_client_id']); + + logAudit("Ticket", "Edit", "$session_name set vendor to $vendor_name for ticket $ticket_prefix$ticket_number", $client_id, $ticket_id); + + flashAlert("Set vendor to $vendor_name for ticket $ticket_prefix$ticket_number"); + + redirect(); + +} + +if (isset($_POST['assign_ticket'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + // POST variables + $ticket_id = intval($_POST['ticket_id']); + $assigned_to = intval($_POST['assigned_to']); + $ticket_status = intval($_POST['ticket_status']); + + // New > Open as assigned + if ($ticket_status == 1 && $assigned_to !== 0) { + $ticket_status = 2; + } + + // Allow for un-assigning tickets + if ($assigned_to == 0) { + $ticket_reply = "Ticket unassigned."; + $agent_name = "No One"; + } else { + // Get & verify assigned agent details + $agent_details_sql = mysqli_query($mysqli, "SELECT user_name, user_email FROM users WHERE users.user_id = $assigned_to"); + $agent_details = mysqli_fetch_assoc($agent_details_sql); + + $agent_name = escapeSql($agent_details['user_name']); + $agent_email = escapeSql($agent_details['user_email']); + $ticket_reply = "Ticket re-assigned to $agent_name."; + + if (!$agent_name) { + flashAlert("Invalid agent!", 'error'); + redirect(); + } + } + + // Get & verify ticket details + $ticket_details_sql = mysqli_query($mysqli, "SELECT ticket_prefix, ticket_number, ticket_subject, ticket_client_id, client_name FROM tickets LEFT JOIN clients ON ticket_client_id = client_id WHERE ticket_id = '$ticket_id' AND ticket_status != 5"); + $ticket_details = mysqli_fetch_assoc($ticket_details_sql); + + $ticket_prefix = escapeSql($ticket_details['ticket_prefix']); + $ticket_number = intval($ticket_details['ticket_number']); + $ticket_subject = escapeSql($ticket_details['ticket_subject']); + $client_id = intval($ticket_details['ticket_client_id']); + $client_name = escapeSql($ticket_details['client_name']); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + if (!$ticket_subject) { + flashAlert("Invalid ticket!", 'error'); + redirect(); + } + + if ($client_id) { + $client_uri = "&client_id=$client_id"; + } else { + $client_uri = ''; + } + + // Update ticket & insert reply + mysqli_query($mysqli, "UPDATE tickets SET ticket_assigned_to = $assigned_to, ticket_status = '$ticket_status' WHERE ticket_id = $ticket_id"); + + mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = '$ticket_reply', ticket_reply_type = 'Internal', ticket_reply_time_worked = '00:01:00', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); + + logAudit("Ticket", "Edit", "$session_name reassigned $ticket_prefix$ticket_number to $agent_name", $client_id, $ticket_id); + + // Notification + if ($session_user_id != $assigned_to && $assigned_to != 0) { + + // App Notification + mysqli_query($mysqli, "INSERT INTO notifications SET notification_type = 'Ticket', notification = 'Ticket $ticket_prefix$ticket_number - Subject: $ticket_subject has been assigned to you by $session_name', notification_action = '/agent/ticket.php?ticket_id=$ticket_id$client_uri', notification_client_id = $client_id, notification_user_id = $assigned_to"); + + // Email Notification + if (!empty($config_smtp_provider)) { + + // Sanitize Config vars from get_settings.php + $config_ticket_from_name = escapeSql($config_ticket_from_name); + $config_ticket_from_email = escapeSql($config_ticket_from_email); + $company_name = escapeSql($session_company_name); + + $subject = "$config_app_name - Ticket $ticket_prefix$ticket_number assigned to you - $ticket_subject"; + $body = "Hi $agent_name,

    A ticket has been assigned to you!

    Client: $client_name
    Ticket Number: $ticket_prefix$ticket_number
    Subject: $ticket_subject

    https://$config_base_url/agent/ticket.php?ticket_id=$ticket_id$client_uri

    Thanks,
    $session_name
    $company_name"; + + // Email Ticket Agent + // Queue Mail + $data = [ + [ + 'from' => $config_ticket_from_email, + 'from_name' => $config_ticket_from_name, + 'recipient' => $agent_email, + 'recipient_name' => $agent_name, + 'subject' => $subject, + 'body' => $body, + ] + ]; + addToMailQueue($data); + } + } + + triggerCustomAction('ticket_assign', $ticket_id); + + flashAlert("Ticket $ticket_prefix$ticket_number assigned to $agent_name"); + + redirect(); + +} + +if (isset($_GET['delete_ticket'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 3); + + $ticket_id = intval($_GET['delete_ticket']); + + // Get Ticket and Client ID for logging and alert message + $sql = mysqli_query($mysqli, "SELECT ticket_prefix, ticket_number, ticket_subject, ticket_status, ticket_closed_at, ticket_client_id FROM tickets WHERE ticket_id = $ticket_id"); + $row = mysqli_fetch_assoc($sql); + $ticket_prefix = escapeSql($row['ticket_prefix']); + $ticket_number = escapeSql($row['ticket_number']); + $ticket_subject = escapeSql($row['ticket_subject']); + $ticket_status = escapeSql($row['ticket_status']); + $ticket_closed_at = escapeSql($row['ticket_closed_at']); + $client_id = intval($row['ticket_client_id']); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + if (empty($ticket_closed_at)) { + mysqli_query($mysqli, "DELETE FROM tickets WHERE ticket_id = $ticket_id"); + + // Delete all ticket replies + mysqli_query($mysqli, "DELETE FROM ticket_replies WHERE ticket_reply_ticket_id = $ticket_id"); + + // Delete all ticket views + mysqli_query($mysqli, "DELETE FROM ticket_views WHERE view_ticket_id = $ticket_id"); + + // Delete ticket watchers + mysqli_query($mysqli, "DELETE FROM ticket_watchers WHERE watcher_ticket_id = $ticket_id"); + + // Delete Ticket Attachements + mysqli_query($mysqli, "DELETE FROM ticket_attachments WHERE ticket_attachment_ticket_id = $ticket_id"); + removeDirectory("../uploads/tickets/$ticket_id"); + + // No Need to delete ticket assets as this is cascadely deleted via the database. + + logAudit("Ticket", "Delete", "$session_name deleted $ticket_prefix$ticket_number along with all replies", $client_id); + + flashAlert("Ticket $ticket_prefix$ticket_number along with all replies deleted", 'error'); + + triggerCustomAction('ticket_delete', $ticket_id); + + redirect("tickets.php"); + } + +} + +if (isset($_POST['bulk_delete_tickets'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 3); + + if (isset($_POST['ticket_ids'])) { + + $count = count($_POST['ticket_ids']); + + // Cycle through array and delete each recurring scheduled ticket + foreach ($_POST['ticket_ids'] as $ticket_id) { + + $ticket_id = intval($ticket_id); + + $client_id = intval(getFieldById('tickets', $ticket_id, 'ticket_client_id')); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + mysqli_query($mysqli, "DELETE FROM tickets WHERE ticket_id = $ticket_id"); + + // Delete all ticket replies + mysqli_query($mysqli, "DELETE FROM ticket_replies WHERE ticket_reply_ticket_id = $ticket_id"); + + // Delete all ticket views + mysqli_query($mysqli, "DELETE FROM ticket_views WHERE view_ticket_id = $ticket_id"); + + // Delete ticket watchers + mysqli_query($mysqli, "DELETE FROM ticket_watchers WHERE watcher_ticket_id = $ticket_id"); + + // Delete Ticket Attachements + mysqli_query($mysqli, "DELETE FROM ticket_attachments WHERE ticket_attachment_ticket_id = $ticket_id"); + removeDirectory("../uploads/tickets/$ticket_id"); + + // No Need to delete ticket assets as this is cascadely deleted via the database. + + logAudit("Ticket", "Delete", "$session_name deleted ticket", 0, $ticket_id); + + } + + logAudit("Ticket", "Bulk Delete", "$session_name deleted $count ticket(s)"); + + flashAlert("Deleted $count ticket(s)", 'error'); + } + + redirect(); + +} + +if (isset($_POST['bulk_assign_ticket'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + // POST variables + $assign_to = intval($_POST['assign_to']); + + // Get a Ticket Count + $ticket_count = count($_POST['ticket_ids']); + + // Assign Tech to Selected Tickets + if (!empty($_POST['ticket_ids'])) { + foreach ($_POST['ticket_ids'] as $ticket_id) { + $ticket_id = intval($ticket_id); + + $sql = mysqli_query($mysqli, "SELECT * FROM tickets LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id WHERE ticket_id = $ticket_id"); + $row = mysqli_fetch_assoc($sql); + + $ticket_prefix = escapeSql($row['ticket_prefix']); + $ticket_number = intval($row['ticket_number']); + $ticket_status = intval($row['ticket_status']); + $ticket_name = escapeSql($row['ticket_name']); + $ticket_subject = escapeSql($row['ticket_subject']); + $client_id = intval($row['ticket_client_id']); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + if ($ticket_status == 1 && $assigned_to !== 0) { + $ticket_status = 2; + } + + // Allow for un-assigning tickets + if ($assign_to == 0) { + $ticket_reply = "Ticket unassigned, pending re-assignment."; + $agent_name = "No One"; + } else { + // Get & verify assigned agent details + $agent_details_sql = mysqli_query($mysqli, "SELECT user_name, user_email FROM users LEFT JOIN user_settings ON users.user_id = user_settings.user_id WHERE users.user_id = $assign_to"); + $agent_details = mysqli_fetch_assoc($agent_details_sql); + + $agent_name = escapeSql($agent_details['user_name']); + $agent_email = escapeSql($agent_details['user_email']); + $ticket_reply = "Ticket re-assigned to $agent_name."; + + if (!$agent_name) { + flashAlert("Invalid agent!", 'error'); + redirect(); + } + } + + // Update ticket & insert reply + mysqli_query($mysqli, "UPDATE tickets SET ticket_assigned_to = $assign_to, ticket_status = $ticket_status WHERE ticket_id = $ticket_id"); + + mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = '$ticket_reply', ticket_reply_type = 'Internal', ticket_reply_time_worked = '00:01:00', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); + + logAudit("Ticket", "Edit", "$session_name reassigned ticket $ticket_prefix$ticket_number to $agent_name", $client_id, $ticket_id); + + triggerCustomAction('ticket_assign', $ticket_id); + + $tickets_assigned_body .= "$ticket_prefix$ticket_number - $ticket_subject
    "; + } // End For Each Ticket ID Loop + + // Notification + if ($session_user_id != $assign_to && $assign_to != 0) { + + // App Notification + mysqli_query($mysqli, "INSERT INTO notifications SET notification_type = 'Ticket', notification = '$ticket_count Tickets have been assigned to you by $session_name', notification_action = 'tickets.php?status=Open&assigned=$assign_to', notification_client_id = $client_id, notification_user_id = $assign_to"); + + // Agent Email Notification + if (!empty($config_smtp_provider)) { + + // Sanitize Config vars from get_settings.php + $config_ticket_from_name = escapeSql($config_ticket_from_name); + $config_ticket_from_email = escapeSql($config_ticket_from_email); + $company_name = escapeSql($session_company_name); + + $subject = "$config_app_name - $ticket_count tickets have been assigned to you"; + $body = "Hi $agent_name,

    $session_name assigned $ticket_count tickets to you!

    $tickets_assigned_body
    Thanks,
    $session_name
    $company_name"; + + // Email Ticket Agent + // Queue Mail + $data = [ + [ + 'from' => $config_ticket_from_email, + 'from_name' => $config_ticket_from_name, + 'recipient' => $agent_email, + 'recipient_name' => $agent_name, + 'subject' => $subject, + 'body' => $body, + ] + ]; + addToMailQueue($data); + } + } + } + + flashAlert("You assigned $ticket_count Tickets to $agent_name"); + + redirect(); + +} + +if (isset($_POST['bulk_edit_ticket_priority'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + // POST variables + $priority = escapeSql($_POST['bulk_priority']); + + // Assign Tech to Selected Tickets + if (isset($_POST['ticket_ids'])) { + + // Get a Ticket Count + $ticket_count = count($_POST['ticket_ids']); + + foreach ($_POST['ticket_ids'] as $ticket_id) { + $ticket_id = intval($ticket_id); + + $sql = mysqli_query($mysqli, "SELECT * FROM tickets WHERE ticket_id = $ticket_id"); + $row = mysqli_fetch_assoc($sql); + + $ticket_prefix = escapeSql($row['ticket_prefix']); + $ticket_number = intval($row['ticket_number']); + $ticket_subject = escapeSql($row['ticket_subject']); + $original_ticket_priority = escapeSql($row['ticket_priority']); + $client_id = intval($row['ticket_client_id']); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + // Update ticket & insert reply + mysqli_query($mysqli, "UPDATE tickets SET ticket_priority = '$priority' WHERE ticket_id = $ticket_id"); + + mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = '$session_name updated the priority from $current_ticket_priority to $priority', ticket_reply_type = 'Internal', ticket_reply_time_worked = '00:01:00', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); + + logAudit("Ticket", "Edit", "$session_name updated the priority on ticket $ticket_prefix$ticket_number - $ticket_subject from $original_ticket_priority to $priority", $client_id, $ticket_id); + + triggerCustomAction('ticket_update', $ticket_id); + } // End For Each Ticket ID Loop + + logAudit("Ticket", " Bulk Edit", "$session_name updated the priority on $ticket_count"); + + flashAlert("You updated the priority for $ticket_count Tickets to $priority"); + } + + redirect(); + +} + +if (isset($_POST['bulk_edit_ticket_category'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + // POST variables + $category_id = intval($_POST['bulk_category']); + + // Assign Tech to Selected Tickets + if (isset($_POST['ticket_ids'])) { + + // Get a Ticket Count + $ticket_count = count($_POST['ticket_ids']); + + foreach ($_POST['ticket_ids'] as $ticket_id) { + $ticket_id = intval($ticket_id); + + $sql = mysqli_query($mysqli, "SELECT ticket_prefix, ticket_number, ticket_subject, category_name, ticket_client_id FROM tickets LEFT JOIN categories ON ticket_category = category_id WHERE ticket_id = $ticket_id"); + $row = mysqli_fetch_assoc($sql); + + $ticket_prefix = escapeSql($row['ticket_prefix']); + $ticket_number = intval($row['ticket_number']); + $ticket_subject = escapeSql($row['ticket_subject']); + $previous_ticket_category_name = escapeSql($row['category_name']); + $client_id = intval($row['ticket_client_id']); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + // Get Category Name + $category_name = escapeSql(getFieldById('categories', $category_id, 'category_name')); + + // Update ticket + mysqli_query($mysqli, "UPDATE tickets SET ticket_category = '$category_id' WHERE ticket_id = $ticket_id"); + + logAudit("Ticket", "Edit", "$session_name updated the category on ticket $ticket_prefix$ticket_number - $ticket_subject from $previous_category_name to $category_name", $client_id, $ticket_id); + + triggerCustomAction('ticket_update', $ticket_id); + } // End For Each Ticket ID Loop + + logAudit("Ticket", " Bulk Edit", "$session_name updated the category to $category_name on $ticket_count"); + + flashAlert("Category set to $category_name for $ticket_count Tickets"); + } + + redirect(); + +} + +if (isset($_POST['bulk_merge_tickets'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + $merge_into_ticket_id = intval($_POST['merge_into_ticket_id']); // Parent ticket id + $merge_comment = escapeSql($_POST['merge_comment']); // Merge comment + $ticket_reply_type = 'Internal'; // Default all replies to internal + + // NEW PARENT ticket details + // Get merge into ticket id (as it may differ from the number) + $sql = mysqli_query($mysqli, "SELECT ticket_id, ticket_number FROM tickets WHERE ticket_id = $merge_into_ticket_id"); + if (mysqli_num_rows($sql) == 0) { + flashAlert("Cannot merge into that ticket.", 'error'); + redirect(); + } + $merge_row = mysqli_fetch_assoc($sql); + $merge_into_ticket_number = intval($merge_row['ticket_number']); // Parent ticket Number + + // Update & Close the selected tickets + if (isset($_POST['ticket_ids'])) { + + $ticket_count = count($_POST['ticket_ids']); // Get a ticket count + + foreach ($_POST['ticket_ids'] as $ticket_id) { + $ticket_id = intval($ticket_id); + + if ($ticket_id !== $merge_into_ticket_id) { + + $sql = mysqli_query($mysqli, "SELECT * FROM tickets WHERE ticket_id = $ticket_id"); + $row = mysqli_fetch_assoc($sql); + + $ticket_prefix = escapeSql($row['ticket_prefix']); + $ticket_number = intval($row['ticket_number']); + $ticket_subject = escapeSql($row['ticket_subject']); + $ticket_details = mysqli_escape_string($mysqli, $row['ticket_details']); + $current_ticket_priority = escapeSql($row['ticket_priority']); + $ticket_first_response_at = escapeSql($row['ticket_first_response_at']); + $client_id = intval($row['ticket_client_id']); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + // Update current ticket + if (empty($ticket_first_response_at)) { + mysqli_query($mysqli, "UPDATE tickets SET ticket_first_response_at = NOW() WHERE ticket_id = $ticket_id"); + } + mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = 'Ticket $ticket_prefix$ticket_number bulk merged into $ticket_prefix$merge_into_ticket_number. Comment: $merge_comment', ticket_reply_time_worked = '00:01:00', ticket_reply_type = '$ticket_reply_type', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); + mysqli_query($mysqli, "UPDATE tickets SET ticket_status = '5', ticket_resolved_at = NOW(), ticket_closed_at = NOW(), ticket_closed_by = $session_user_id WHERE ticket_id = $ticket_id") or die(mysqli_error($mysqli)); + + // Update new parent ticket + mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = 'Ticket $ticket_prefix$ticket_number was bulk merged into this ticket with comment: $merge_comment.

    $ticket_subject
    $ticket_details', ticket_reply_time_worked = '00:01:00', ticket_reply_type = 'Internal', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $merge_into_ticket_id"); + + logAudit("Ticket", "Merged", "$session_name Merged ticket $ticket_prefix$ticket_number into $ticket_prefix$merge_into_ticket_number", $client_id, $ticket_id); + + // Custom action/notif handler + triggerCustomAction('ticket_merge', $ticket_id); + + } + } // End For Each Ticket ID Loop + + mysqli_query($mysqli, "UPDATE tickets SET ticket_updated_at = NOW() WHERE ticket_id = $merge_into_ticket_id"); + + flashAlert("$ticket_count tickets merged into $ticket_prefix$merge_into_ticket_number"); + + } + + redirect(); + +} + +if (isset($_POST['bulk_resolve_tickets'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + // POST variables + $details = mysqli_escape_string($mysqli, $_POST['bulk_details']); + $ticket_reply_time_worked = escapeSql($_POST['time']); + $private_note = intval($_POST['bulk_private_note']); + if ($private_note == 1) { + $ticket_reply_type = 'Internal'; + } else { + $ticket_reply_type = 'Public'; + } + + // Resolve Selected Tickets + if (isset($_POST['ticket_ids'])) { + + // Intitialze the counts before the loop + $ticket_count = 0; + $skipped_count = 0; + + foreach ($_POST['ticket_ids'] as $ticket_id) { + $ticket_id = intval($ticket_id); + + // Check to make sure Tasks are complete before resolving + $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('task_id') AS num FROM tasks WHERE task_completed_at IS NULL AND task_ticket_id = $ticket_id")); + $num_of_open_tasks = $row['num']; + + if ($num_of_open_tasks == 0) { + // Count the Ticket Loop + $ticket_count++; + + $sql = mysqli_query($mysqli, "SELECT * FROM tickets WHERE ticket_id = $ticket_id"); + $row = mysqli_fetch_assoc($sql); + + $ticket_prefix = escapeSql($row['ticket_prefix']); + $ticket_number = intval($row['ticket_number']); + $ticket_subject = escapeSql($row['ticket_subject']); + $current_ticket_priority = escapeSql($row['ticket_priority']); + $url_key = escapeSql($row['ticket_url_key']); + $ticket_first_response_at = escapeSql($row['ticket_first_response_at']); + $client_id = intval($row['ticket_client_id']); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + // Mark FR time if required + if (empty($ticket_first_response_at)) { + mysqli_query($mysqli, "UPDATE tickets SET ticket_first_response_at = NOW() WHERE ticket_id = $ticket_id"); + } + + // Update ticket & insert reply + mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 4, ticket_resolved_at = NOW() WHERE ticket_id = $ticket_id"); + + mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = '$details', ticket_reply_type = '$ticket_reply_type', ticket_reply_time_worked = '$ticket_reply_time_worked', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); + + logAudit("Ticket", "Resolve", "$session_name resolved $ticket_prefix$ticket_number - $ticket_subject", $client_id, $ticket_id); + + triggerCustomAction('ticket_resolve', $ticket_id); + + // Client notification email + if ((!empty($config_smtp_provider)) && $config_ticket_client_general_notifications == 1 && $private_note == 0) { + + // Get Contact details + $ticket_sql = mysqli_query($mysqli, "SELECT contact_name, contact_email FROM tickets + LEFT JOIN contacts ON ticket_contact_id = contact_id + WHERE ticket_id = $ticket_id + "); + $row = mysqli_fetch_assoc($ticket_sql); + + $contact_name = escapeSql($row['contact_name']); + $contact_email = escapeSql($row['contact_email']); + + // Sanitize Config vars from get_settings.php + $from_name = escapeSql($config_ticket_from_name); + $from_email = escapeSql($config_ticket_from_email); + $base_url = escapeSql($config_base_url); + + // Get Company Info + $sql = mysqli_query($mysqli, "SELECT company_name, company_phone, company_phone_country_code FROM companies WHERE company_id = 1"); + $row = mysqli_fetch_assoc($sql); + $company_name = escapeSql($row['company_name']); + $company_phone = escapeSql(formatPhoneNumber($row['company_phone'], $row['company_phone_country_code'])); + + // EMAIL + $subject = "Ticket resolved - [$ticket_prefix$ticket_number] - $ticket_subject | (pending closure)"; + $body = "##- Please type your reply above this line -##

    Hello $contact_name,

    Your ticket regarding \"$ticket_subject\" has been marked as solved and is pending closure.

    $details

    If your request/issue is resolved, you can simply ignore this email. If you need further assistance, please reply or re-open to let us know!

    Ticket: $ticket_prefix$ticket_number
    Subject: $ticket_subject
    Portal: https://$base_url/client/ticket.php?id=$ticket_id

    --
    $company_name - Support
    $config_ticket_from_email
    $company_phone"; + + // Check email valid + if (filter_var($contact_email, FILTER_VALIDATE_EMAIL)) { + + $data = []; + + // Email Ticket Contact + // Queue Mail + + $data[] = [ + 'from' => $from_email, + 'from_name' => $from_name, + 'recipient' => $contact_email, + 'recipient_name' => $contact_name, + 'subject' => $subject, + 'body' => $body + ]; + } + + // Also Email all the watchers + $sql_watchers = mysqli_query($mysqli, "SELECT watcher_email FROM ticket_watchers WHERE watcher_ticket_id = $ticket_id"); + $body .= "

    ----------------------------------------
    YOU ARE A COLLABORATOR ON THIS TICKET"; + while ($row = mysqli_fetch_assoc($sql_watchers)) { + $watcher_email = escapeSql($row['watcher_email']); + + // Queue Mail + $data[] = [ + 'from' => $from_email, + 'from_name' => $from_name, + 'recipient' => $watcher_email, + 'recipient_name' => $watcher_email, + 'subject' => $subject, + 'body' => $body + ]; + } + addToMailQueue($data); + } // End Mail IF + } else { + $skipped_count++; + } // End Task Check + } // End Loop + } // End Array Empty Check + + flashAlert("Resolved $ticket_count Tickets"); + + if ($skipped_count > 0) { + flashAlert("Resolved $ticket_count Tickets $skipped_count ticket(s) could not be resolved because they have open tasks.", 'info'); + } + + redirect(); + +} + +if (isset($_POST['bulk_ticket_reply'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + // POST variables + $ticket_reply = mysqli_escape_string($mysqli, $_POST['bulk_reply_details']); + $ticket_status = intval($_POST['bulk_status']); + $ticket_reply_time_worked = escapeSql($_POST['time']); + $private_note = intval($_POST['bulk_private_reply']); + if ($private_note == 1) { + $ticket_reply_type = 'Internal'; + } else { + $ticket_reply_type = 'Public'; + } + + // Loop Through Tickets and Add Reply along with Email notifications + if (isset($_POST['ticket_ids'])) { + + // Get a Ticket Count + $ticket_count = count($_POST['ticket_ids']); + + foreach ($_POST['ticket_ids'] as $ticket_id) { + $ticket_id = intval($ticket_id); + + $sql = mysqli_query($mysqli, "SELECT * FROM tickets WHERE ticket_id = $ticket_id"); + $row = mysqli_fetch_assoc($sql); + + $ticket_prefix = escapeSql($row['ticket_prefix']); + $ticket_number = intval($row['ticket_number']); + $ticket_subject = escapeSql($row['ticket_subject']); + $current_ticket_priority = escapeSql($row['ticket_priority']); + $url_key = escapeSql($row['ticket_url_key']); + $ticket_first_response_at = escapeSql($row['ticket_first_response_at']); + $client_id = intval($row['ticket_client_id']); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + if ($client_id) { + $client_uri = "&client_id=$client_id"; + } else { + $client_uri = ''; + } + + // Mark FR time if required + if (empty($ticket_first_response_at)) { + mysqli_query($mysqli, "UPDATE tickets SET ticket_first_response_at = NOW() WHERE ticket_id = $ticket_id"); + } + + // Add reply + mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = '$ticket_reply', ticket_reply_time_worked = '$ticket_reply_time_worked', ticket_reply_type = '$ticket_reply_type', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); + + $ticket_reply_id = mysqli_insert_id($mysqli); + + // Update Ticket Status + mysqli_query($mysqli, "UPDATE tickets SET ticket_status = '$ticket_status' WHERE ticket_id = $ticket_id"); + + logAudit("Ticket", "Reply", "$session_name replied to ticket $ticket_prefix$ticket_number - $ticket_subject and was a $ticket_reply_type reply", $client_id, $ticket_id); + + // Custom action/notif handler + if ($ticket_reply_type == 'Internal') { + triggerCustomAction('ticket_reply_agent_internal', $ticket_id); + } else { + triggerCustomAction('reply_reply_agent_public', $ticket_id); + } + + // Resolve the ticket, if set + if ($ticket_status == 4) { + mysqli_query($mysqli, "UPDATE tickets SET ticket_resolved_at = NOW() WHERE ticket_id = $ticket_id"); + + // Logging + logAudit("Ticket", "Resolved", "$session_name resolved Ticket $ticket_prefix$ticket_number", $client_id, $ticket_id); + + triggerCustomAction('ticket_resolve', $ticket_id); + } + + // Get Contact Details + $sql = mysqli_query( + $mysqli, + "SELECT contact_name, contact_email, ticket_created_by, ticket_assigned_to + FROM tickets + LEFT JOIN contacts ON ticket_contact_id = contact_id + WHERE ticket_id = $ticket_id" + ); + + $row = mysqli_fetch_assoc($sql); + + $contact_name = escapeSql($row['contact_name']); + $contact_email = escapeSql($row['contact_email']); + $ticket_created_by = intval($row['ticket_created_by']); + $ticket_assigned_to = intval($row['ticket_assigned_to']); + + // Sanitize Config vars from get_settings.php + $from_name = escapeSql($config_ticket_from_name); + $from_email = escapeSql($config_ticket_from_email); + $base_url = escapeSql($config_base_url); + + $sql = mysqli_query($mysqli, "SELECT company_name, company_phone, company_phone_country_code FROM companies WHERE company_id = 1"); + $row = mysqli_fetch_assoc($sql); + $company_name = escapeSql($row['company_name']); + $company_phone = escapeSql(formatPhoneNumber($row['company_phone'], $row['company_phone_country_code'])); + + // Send e-mail to client if public update & email is set up + if ($private_note == 0 && (!empty($config_smtp_provider))) { + + $subject = "Ticket update - [$ticket_prefix$ticket_number] - $ticket_subject"; + $body = "##- Please type your reply above this line -##

    Hello $contact_name,

    Your ticket regarding $ticket_subject has been updated.

    --------------------------------
    $ticket_reply
    --------------------------------

    Ticket: $ticket_prefix$ticket_number
    Subject: $ticket_subject
    Status: $ticket_status_name
    Portal: View ticket

    --
    $company_name - Support
    $from_email
    $company_phone"; + + if (filter_var($contact_email, FILTER_VALIDATE_EMAIL)) { + + $data = []; + + // Email Ticket Contact + // Queue Mail + $data[] = [ + 'from' => $from_email, + 'from_name' => $from_name, + 'recipient' => $contact_email, + 'recipient_name' => $contact_name, + 'subject' => $subject, + 'body' => $body + ]; + + } + + // Also Email all the watchers + $sql_watchers = mysqli_query($mysqli, "SELECT watcher_email FROM ticket_watchers WHERE watcher_ticket_id = $ticket_id"); + $body .= "

    ----------------------------------------
    YOU ARE A COLLABORATOR ON THIS TICKET"; + while ($row = mysqli_fetch_assoc($sql_watchers)) { + $watcher_email = escapeSql($row['watcher_email']); + + // Queue Mail + $data[] = [ + 'from' => $from_email, + 'from_name' => $from_name, + 'recipient' => $watcher_email, + 'recipient_name' => $watcher_email, + 'subject' => $subject, + 'body' => $body + ]; + } + addToMailQueue($data); + } //End Mail IF + + // Notification for assigned ticket user + if ($session_user_id != $ticket_assigned_to && $ticket_assigned_to != 0) { + + mysqli_query($mysqli, "INSERT INTO notifications SET notification_type = 'Ticket', notification = '$session_name updated Ticket $ticket_prefix$ticket_number - Subject: $ticket_subject that is assigned to you', notification_action = '/agent/ticket.php?ticket_id=$ticket_id$client_uri', notification_client_id = $client_id, notification_user_id = $ticket_assigned_to"); + } + + // Notification for user that opened the ticket + if ($session_user_id != $ticket_created_by && $ticket_created_by != 0) { + + mysqli_query($mysqli, "INSERT INTO notifications SET notification_type = 'Ticket', notification = '$session_name updated Ticket $ticket_prefix$ticket_number - Subject: $ticket_subject that you opened', notification_action = '/agent/ticket.php?ticket_id=$ticket_id$client_uri', notification_client_id = $client_id, notification_user_id = $ticket_created_by"); + } + } // End Ticket Lopp + + } + + flashAlert("Updated $ticket_count tickets"); + + redirect(); + +} + + +// Currently not UI Frontend for this +if (isset($_POST['bulk_add_ticket_project'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + // POST variables + $project_id = intval($_POST['project_id']); + + // Get Project Name + $sql = mysqli_query($mysqli, "SELECT project_name FROM projects WHERE project_id = $project_id"); + $row = mysqli_fetch_assoc($sql); + $project_name = escapeSql($row['project_name']); + + // Assign Project to Selected Tickets + if (isset($_POST['ticket_ids'])) { + + // Get a Ticket Count + $ticket_count = count($_POST['ticket_ids']); + + foreach ($_POST['ticket_ids'] as $ticket_id) { + $ticket_id = intval($ticket_id); + + $sql = mysqli_query($mysqli, "SELECT * FROM tickets WHERE ticket_id = $ticket_id"); + $row = mysqli_fetch_assoc($sql); + + $ticket_prefix = escapeSql($row['ticket_prefix']); + $ticket_number = intval($row['ticket_number']); + $ticket_subject = escapeSql($row['ticket_subject']); + $current_ticket_priority = escapeSql($row['ticket_priority']); + $client_id = intval($row['ticket_client_id']); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + // Update ticket & insert reply + mysqli_query($mysqli, "UPDATE tickets SET ticket_project_id = $project_id WHERE ticket_id = $ticket_id"); + + logAudit("Ticket", "Reply", "$session_name added ticket $ticket_prefix$ticket_number - $ticket_subject to project $project_name", $client_id, $ticket_id); + + + } // End For Each Ticket ID Loop + + flashAlert("$ticket_count Tickets added to Project $project_name"); + + } + + redirect(); + +} + +if (isset($_POST['bulk_add_asset_ticket'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + $assigned_to = intval($_POST['bulk_assigned_to']); + if ($assigned_to == 0) { + $ticket_status = 1; + } else { + $ticket_status = 2; + } + $subject = escapeSql($_POST['bulk_subject']); + $priority = escapeSql($_POST['bulk_priority']); + $category_id = intval($_POST['bulk_category']); + $details = mysqli_real_escape_string($mysqli, $_POST['bulk_details']); + $project_id = intval($_POST['bulk_project']); + $use_primary_contact = intval($_POST['use_primary_contact']); + $ticket_template_id = intval($_POST['bulk_ticket_template_id']); + $billable = intval($_POST['bulk_billable'] ?? 0); + + // Check to see if adding a ticket by template + if($ticket_template_id) { + $sql = mysqli_query($mysqli, "SELECT * FROM ticket_templates WHERE ticket_template_id = $ticket_template_id"); + $row = mysqli_fetch_assoc($sql); + + // Override Template Subject + if(empty($subject)) { + $subject = escapeSql($row['ticket_template_subject']); + } + $details = mysqli_escape_string($mysqli, $row['ticket_template_details']); + + // Get Associated Tasks from the ticket template + $sql_task_templates = mysqli_query($mysqli, "SELECT * FROM task_templates WHERE task_template_ticket_template_id = $ticket_template_id"); + + } + + // Create ticket for each selected asset + if (isset($_POST['asset_ids'])) { + + // Get a Asset Count + $asset_count = count($_POST['asset_ids']); + + foreach ($_POST['asset_ids'] as $asset_id) { + $asset_id = intval($asset_id); + + $sql = mysqli_query($mysqli, "SELECT * FROM assets WHERE asset_id = $asset_id"); + $row = mysqli_fetch_assoc($sql); + + $asset_name = escapeSql($row['asset_name']); + $client_id = intval($row['asset_client_id']); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + $subject_asset_prepended = "$asset_name - $subject"; + + // Atomically increment and get the new ticket number + mysqli_query($mysqli, " + UPDATE settings + SET + config_ticket_next_number = LAST_INSERT_ID(config_ticket_next_number), + config_ticket_next_number = config_ticket_next_number + 1 + WHERE company_id = 1 + "); + + $ticket_number = mysqli_insert_id($mysqli); + + // Sanitize Config Vars from get_settings.php and Session Vars from check_login.php + $config_ticket_prefix = escapeSql($config_ticket_prefix); + $config_ticket_from_name = escapeSql($config_ticket_from_name); + $config_ticket_from_email = escapeSql($config_ticket_from_email); + $config_base_url = escapeSql($config_base_url); + + //Generate a unique URL key for clients to access + $url_key = randomString(32); + + mysqli_query($mysqli, "INSERT INTO tickets SET ticket_prefix = '$config_ticket_prefix', ticket_number = $ticket_number, ticket_category = $category_id, ticket_subject = '$subject_asset_prepended', ticket_details = '$details', ticket_priority = '$priority', ticket_billable = $billable, ticket_status = $ticket_status, ticket_asset_id = $asset_id, ticket_created_by = $session_user_id, ticket_assigned_to = $assigned_to, ticket_url_key = '$url_key', ticket_client_id = $client_id, ticket_project_id = $project_id"); + + $ticket_id = mysqli_insert_id($mysqli); + + // Add Tasks + if (!empty($_POST['tasks'])) { + foreach ($_POST['tasks'] as $task) { + $task_name = escapeSql($task); + // Check that task_name is not-empty (For some reason the !empty on the array doesnt work here like in watchers) + if (!empty($task_name)) { + mysqli_query($mysqli,"INSERT INTO tasks SET task_name = '$task_name', task_ticket_id = $ticket_id"); + } + } + } + + // Add Tasks from Template if Template was selected + if($ticket_template_id) { + if (mysqli_num_rows($sql_task_templates) > 0) { + while ($row = mysqli_fetch_assoc($sql_task_templates)) { + $task_order = intval($row['task_template_order']); + $task_name = escapeSql($row['task_template_name']); + + mysqli_query($mysqli,"INSERT INTO tasks SET task_name = '$task_name', task_order = $task_order, task_ticket_id = $ticket_id"); + } + } + } + + // Custom action/notif handler + triggerCustomAction('ticket_create', $ticket_id); + } + + logAudit("Ticket", "Bulk Create", "$session_name created $asset_count tickets for $asset_count"); + + flashAlert("You created $asset_count tickets for the selected assets"); + + } + + redirect(); + +} + +if (isset($_POST['add_ticket_reply'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + $ticket_id = intval($_POST['ticket_id']); + $ticket_reply = $_POST['ticket_reply']; // Reply is SQL escaped below + $ticket_status = intval($_POST['status']); + + $client_id = intval(getFieldById('tickets', $ticket_id, 'ticket_client_id')); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + // Time tracking, inputs & combine into string + $hours = intval($_POST['hours']); + $minutes = intval($_POST['minutes']); + $seconds = intval($_POST['seconds']); + $ticket_reply_time_worked = escapeSql(sprintf("%02d:%02d:%02d", $hours, $minutes, $seconds)); + + // Defaults + $send_email = 0; + $ticket_reply_id = 0; + if ($_POST['public_reply_type'] == 1 ){ + $ticket_reply_type = 'Public'; + } elseif ($_POST['public_reply_type'] == 2 ) { + $ticket_reply_type = 'Public'; + $send_email = 1; + } else { + $ticket_reply_type = 'Internal'; + } + // Add Signature to the end of the ticket reply if not Internal and if there is reply + if ($ticket_reply !== '' && $ticket_reply_type !== 'Internal' && $send_email == 1) { + $ticket_reply .= getFieldById('user_settings',$session_user_id,'user_config_signature', 'raw'); + } + + $ticket_reply = mysqli_escape_string($mysqli, $ticket_reply); // SQL Escape Ticket Reply + + // Update Ticket Status & updated at (in case status didn't change) + mysqli_query($mysqli, "UPDATE tickets SET ticket_status = $ticket_status, ticket_updated_at = NOW() WHERE ticket_id = $ticket_id"); + + // Resolve the ticket, if set + if ($ticket_status == 4) { + mysqli_query($mysqli, "UPDATE tickets SET ticket_resolved_at = NOW() WHERE ticket_id = $ticket_id"); + + logAudit("Ticket", "Resolved", "$session_name resolved Ticket ticket ID $ticket_id", $client_id, $ticket_id); + } + + // Process reply actions, if we have a reply to work with (e.g. we're not just editing the status) + if (!empty($ticket_reply)) { + + // Add reply + mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = '$ticket_reply', ticket_reply_time_worked = '$ticket_reply_time_worked', ticket_reply_type = '$ticket_reply_type', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); + + $ticket_reply_id = mysqli_insert_id($mysqli); + + // Get Ticket Details + $ticket_sql = mysqli_query($mysqli, "SELECT contact_name, contact_email, ticket_prefix, ticket_number, ticket_subject, ticket_status, ticket_status_name, ticket_url_key, ticket_first_response_at, ticket_created_by, ticket_assigned_to, ticket_client_id + FROM tickets + LEFT JOIN clients ON ticket_client_id = client_id + LEFT JOIN contacts ON ticket_contact_id = contact_id + LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id + WHERE ticket_id = $ticket_id + "); + + $row = mysqli_fetch_assoc($ticket_sql); + + $contact_name = escapeSql($row['contact_name']); + $contact_email = escapeSql($row['contact_email']); + $ticket_prefix = escapeSql($row['ticket_prefix']); + $ticket_number = intval($row['ticket_number']); + $ticket_subject = escapeSql($row['ticket_subject']); + $ticket_status = intval($row['ticket_status']); + $ticket_status_name = escapeSql($row['ticket_status_name']); + $url_key = escapeSql($row['ticket_url_key']); + $ticket_first_response_at = escapeSql($row['ticket_first_response_at']); + $ticket_created_by = intval($row['ticket_created_by']); + $ticket_assigned_to = intval($row['ticket_assigned_to']); + $client_id = intval($row['ticket_client_id']); + + if ($client_id) { + $client_uri = "&client_id=$client_id"; + } else { + $client_uri = ''; + } + + // Sanitize Config vars from get_settings.php + $config_ticket_from_name = escapeSql($config_ticket_from_name); + $config_ticket_from_email = escapeSql($config_ticket_from_email); + $config_base_url = escapeSql($config_base_url); + + $sql = mysqli_query($mysqli, "SELECT company_name, company_phone, company_phone_country_code FROM companies WHERE company_id = 1"); + $row = mysqli_fetch_assoc($sql); + $company_name = escapeSql($row['company_name']); + $company_phone = escapeSql(formatPhoneNumber($row['company_phone'], $row['company_phone_country_code'])); + + // Send e-mail to client if public update & email is set up + if ($ticket_reply_type == 'Public' && $send_email == 1 && (!empty($config_smtp_provider))) { + + // Slightly different email subject/text depending on if this update set auto-close + + if ($ticket_status == 4) { + // Resolved + $subject = "Ticket resolved - [$ticket_prefix$ticket_number] - $ticket_subject | (pending closure)"; + $body = "##- Please type your reply above this line -##

    Hello $contact_name,

    Your ticket regarding $ticket_subject has been marked as solved and is pending closure.

    --------------------------------
    $ticket_reply
    --------------------------------

    If your request/issue is resolved, you can simply ignore this email. If you need further assistance, please reply or re-open to let us know!

    Ticket: $ticket_prefix$ticket_number
    Subject: $ticket_subject
    Status: $ticket_status_name
    Portal: View ticket

    --
    $company_name - Support
    $config_ticket_from_email
    $company_phone"; + } else { + // Anything else + $subject = "Ticket update - [$ticket_prefix$ticket_number] - $ticket_subject"; + $body = "##- Please type your reply above this line -##

    Hello $contact_name,

    Your ticket regarding $ticket_subject has been updated.

    --------------------------------
    $ticket_reply
    --------------------------------

    Ticket: $ticket_prefix$ticket_number
    Subject: $ticket_subject
    Status: $ticket_status_name
    Portal: View ticket

    --
    $company_name - Support
    $config_ticket_from_email
    $company_phone"; + } + + if (filter_var($contact_email, FILTER_VALIDATE_EMAIL)) { + + $data = []; + + // Email Ticket Contact + // Queue Mail + $data[] = [ + 'from' => $config_ticket_from_email, + 'from_name' => $config_ticket_from_name, + 'recipient' => $contact_email, + 'recipient_name' => $contact_name, + 'subject' => $subject, + 'body' => $body + ]; + } + + // Also Email all the watchers + $sql_watchers = mysqli_query($mysqli, "SELECT watcher_email FROM ticket_watchers WHERE watcher_ticket_id = $ticket_id"); + $body .= "

    ----------------------------------------
    YOU ARE A COLLABORATOR ON THIS TICKET"; + while ($row = mysqli_fetch_assoc($sql_watchers)) { + $watcher_email = escapeSql($row['watcher_email']); + + // Queue Mail + $data[] = [ + 'from' => $config_ticket_from_email, + 'from_name' => $config_ticket_from_name, + 'recipient' => $watcher_email, + 'recipient_name' => $watcher_email, + 'subject' => $subject, + 'body' => $body + ]; + } + addToMailQueue($data); + + } + //End Mail IF + + // Notification for assigned ticket user + if ($session_user_id != $ticket_assigned_to && $ticket_assigned_to != 0) { + mysqli_query($mysqli, "INSERT INTO notifications SET notification_type = 'Ticket', notification = '$session_name updated Ticket $ticket_prefix$ticket_number - Subject: $ticket_subject that is assigned to you', notification_action = '/agent/ticket.php?ticket_id=$ticket_id$client_uri', notification_client_id = $client_id, notification_user_id = $ticket_assigned_to"); + } + + // Notification for user that opened the ticket + if ($session_user_id != $ticket_created_by && $ticket_created_by != 0) { + mysqli_query($mysqli, "INSERT INTO notifications SET notification_type = 'Ticket', notification = '$session_name updated Ticket $ticket_prefix$ticket_number - Subject: $ticket_subject that you opened', notification_action = '/agent/ticket.php?ticket_id=$ticket_id$client_uri', notification_client_id = $client_id, notification_user_id = $ticket_created_by"); + } + + // Handle first response + if (empty($ticket_first_response_at) && $ticket_reply_type == 'Public') { + mysqli_query($mysqli, "UPDATE tickets SET ticket_first_response_at = NOW() WHERE ticket_id = $ticket_id"); + } + + // Custom action/notif handler + if ($ticket_reply_type == 'Internal') { + triggerCustomAction('ticket_reply_agent_internal', $ticket_id); + } else { + triggerCustomAction('reply_reply_agent_public', $ticket_id); + } + + flashAlert("Ticket $ticket_prefix$ticket_number has been updated with your reply and was $ticket_reply_type"); + + } else { + flashAlert("Ticket updated"); + } + + logAudit("Ticket", "Reply", "$session_name replied to ticket $ticket_prefix$ticket_number - $ticket_subject and was a $ticket_reply_type reply", $client_id, $ticket_id); + + redirect(); + +} + +if (isset($_POST['edit_ticket_reply'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + $ticket_reply_id = intval($_POST['ticket_reply_id']); + $ticket_reply = mysqli_real_escape_string($mysqli, $_POST['ticket_reply']); + $ticket_reply_type = escapeSql($_POST['ticket_reply_type']); + $ticket_reply_time_worked = escapeSql($_POST['time']); + + $sql = mysqli_query($mysqli, "SELECT ticket_client_id FROM ticket_replies + LEFT JOIN tickets ON ticket_id = ticket_reply_ticket_id + WHERE ticket_reply_id = $ticket_reply_id + LIMIT 1" + ); + + $row = mysqli_fetch_assoc($sql); + $client_id = intval($row['ticket_client_id']); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + mysqli_query($mysqli, "UPDATE ticket_replies SET ticket_reply = '$ticket_reply', ticket_reply_type = '$ticket_reply_type', ticket_reply_time_worked = '$ticket_reply_time_worked' WHERE ticket_reply_id = $ticket_reply_id AND ticket_reply_type != 'Client'") or die(mysqli_error($mysqli)); + + logAudit("Ticket", "Reply", "$session_name edited ticket_reply", $client_id, $ticket_reply_id); + + flashAlert("Ticket reply updated"); + + redirect(); + +} + +if (isset($_POST['redact_ticket_reply'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + $ticket_reply_id = intval($_POST['ticket_reply_id']); + $ticket_reply = mysqli_real_escape_string($mysqli, $_POST['ticket_reply']); + + $sql = mysqli_query($mysqli, "SELECT ticket_client_id FROM ticket_replies + LEFT JOIN tickets ON ticket_id = ticket_reply_ticket_id + WHERE ticket_reply_id = $ticket_reply_id + LIMIT 1" + ); + + $row = mysqli_fetch_assoc($sql); + $client_id = intval($row['ticket_client_id']); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + mysqli_query($mysqli, "UPDATE ticket_replies SET ticket_reply = '$ticket_reply' WHERE ticket_reply_id = $ticket_reply_id"); + + logAudit("Ticket", "Reply", "$session_name redacted ticket_reply", $client_id, $ticket_reply_id); + + flashAlert("Ticket reply redacted"); + + redirect(); + +} + +if (isset($_GET['archive_ticket_reply'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + $ticket_reply_id = intval($_GET['archive_ticket_reply']); + + $ticket_id = intval(getFieldById('ticket_replies', $ticket_reply_id, 'ticket_reply_ticket_id')); + $client_id = intval(getFieldById('tickets', $ticket_id, 'ticket_client_id')); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + mysqli_query($mysqli, "UPDATE ticket_replies SET ticket_reply_archived_at = NOW() WHERE ticket_reply_id = $ticket_reply_id"); + + logAudit("Ticket Reply", "Archive", "$session_name archived ticket_reply", $client_id, $ticket_reply_id); + + flashAlert("Ticket reply archived", 'error'); + + redirect(); + +} + +if (isset($_POST['merge_ticket'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + $ticket_id = intval($_POST['ticket_id']); // Child ticket ID to be closed + $merge_into_ticket_id = intval($_POST['merge_into_ticket_id']); // Parent ticket id + $merge_comment = escapeSql($_POST['merge_comment']); // Merge comment + $move_replies = intval($_POST['merge_move_replies']); // Whether to move replies to the new parent ticket + $ticket_reply_type = 'Internal'; // Default all replies to internal + + // Get current ticket details + $sql = mysqli_query($mysqli, "SELECT ticket_prefix, ticket_number, ticket_subject, ticket_details FROM tickets WHERE ticket_id = $ticket_id"); + if (mysqli_num_rows($sql) == 0) { + flashAlert("No ticket with that ID found.", 'error'); + redirect(); + } + // CURRENT ticket details + $row = mysqli_fetch_assoc($sql); + $ticket_prefix = escapeSql($row['ticket_prefix']); + $ticket_number = intval($row['ticket_number']); + $ticket_subject = escapeSql($row['ticket_subject']); + $ticket_details = mysqli_escape_string($mysqli, $row['ticket_details']); + $ticket_first_response_at = escapeSql($row['ticket_first_response_at']); + + // NEW PARENT ticket details + // Get merge into ticket id (as it may differ from the number) + $sql = mysqli_query($mysqli, "SELECT ticket_id, ticket_number, ticket_client_id FROM tickets WHERE ticket_id = $merge_into_ticket_id"); + if (mysqli_num_rows($sql) == 0) { + flashAlert("Cannot merge into that ticket.", 'error'); + redirect(); + } + $merge_row = mysqli_fetch_assoc($sql); + $client_id = intval($merge_row['ticket_client_id']); + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + $merge_into_ticket_number = intval($merge_row['ticket_number']); + if ($client_id) { + $has_client = "&client_id=$client_id"; + } else { + $has_client = ""; + } + // Sanity check + if ($ticket_id == $merge_into_ticket_id) { + flashAlert("Cannot merge into the same ticket.", 'error'); + redirect(); + } + + // Move ticket replies from child > parent + if ($move_replies) { + mysqli_query($mysqli, "UPDATE ticket_replies SET ticket_reply_ticket_id = $merge_into_ticket_id WHERE ticket_reply_ticket_id = $ticket_id"); + } + + // Update current ticket + if (empty($ticket_first_response_at)) { + mysqli_query($mysqli, "UPDATE tickets SET ticket_first_response_at = NOW() WHERE ticket_id = $ticket_id"); + } + + mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = 'Ticket $ticket_prefix$ticket_number merged into $ticket_prefix$merge_into_ticket_number. Comment: $merge_comment', ticket_reply_time_worked = '00:01:00', ticket_reply_type = '$ticket_reply_type', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); + + mysqli_query($mysqli, "UPDATE tickets SET ticket_status = '5', ticket_resolved_at = NOW(), ticket_closed_at = NOW(), ticket_closed_by = $session_user_id WHERE ticket_id = $ticket_id") or die(mysqli_error($mysqli)); + + //Update new parent ticket + mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = 'Ticket $ticket_prefix$ticket_number was merged into this ticket with comment: $merge_comment.

    $ticket_subject
    $ticket_details', ticket_reply_time_worked = '00:01:00', ticket_reply_type = '$ticket_reply_type', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $merge_into_ticket_id"); + + mysqli_query($mysqli, "UPDATE tickets SET ticket_updated_at = NOW() WHERE ticket_id = $merge_into_ticket_id"); + + logAudit("Ticket", "Merged", "$session_name Merged ticket $ticket_prefix$ticket_number into $ticket_prefix$merge_into_ticket_number"); + + triggerCustomAction('ticket_merge', $ticket_id); + + flashAlert("Ticket merged into $ticket_prefix$merge_into_ticket_number"); + + redirect("ticket.php?ticket_id=$merge_into_ticket_id$has_client"); + +} + +if (isset($_POST['change_client_ticket'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + $ticket_id = intval($_POST['ticket_id']); + $client_id = intval($_POST['new_client_id']); + $contact_id = intval($_POST['new_contact_id']); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + // Set any/all existing replies to internal + mysqli_query($mysqli, "UPDATE ticket_replies SET ticket_reply_type = 'Internal' WHERE ticket_reply_ticket_id = $ticket_id"); + + // Update ticket client & contact + mysqli_query($mysqli, "UPDATE tickets SET ticket_client_id = $client_id, ticket_contact_id = $contact_id WHERE ticket_id = $ticket_id LIMIT 1"); + + logAudit("Ticket", "Change", "$session_name changed ticket client", $client_id, $ticket_id); + + triggerCustomAction('ticket_update', $ticket_id); + + flashAlert("Ticket client updated"); + + redirect(); + +} + +if (isset($_GET['resolve_ticket'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + $ticket_id = intval($_GET['resolve_ticket']); + + $sql = mysqli_query($mysqli, "SELECT * FROM tickets WHERE ticket_id = $ticket_id"); + $row = mysqli_fetch_assoc($sql); + $ticket_prefix = escapeSql($row['ticket_prefix']); + $ticket_number = intval($row['ticket_number']); + $ticket_first_response_at = escapeSql($row['ticket_first_response_at']); + $client_id = intval($row['ticket_client_id']); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + // Mark FR + if (empty($ticket_first_response_at)) { + mysqli_query($mysqli, "UPDATE tickets SET ticket_first_response_at = NOW() WHERE ticket_id = $ticket_id"); + } + + // Resolve + mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 4, ticket_resolved_at = NOW() WHERE ticket_id = $ticket_id"); + + logAudit("Ticket", "Resolved", "$session_name resolved ticket $ticket_prefix$ticket_number (ID: $ticket_id)", $client_id, $ticket_id); + + triggerCustomAction('ticket_resolve', $ticket_id); + + // Client notification email + if ((!empty($config_smtp_provider)) && $config_ticket_client_general_notifications == 1) { + + // Get details + $ticket_sql = mysqli_query($mysqli, "SELECT contact_name, contact_email, ticket_prefix, ticket_number, ticket_subject, ticket_status_name, ticket_assigned_to, ticket_url_key FROM tickets + LEFT JOIN clients ON ticket_client_id = client_id + LEFT JOIN contacts ON ticket_contact_id = contact_id + LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id + WHERE ticket_id = $ticket_id + "); + $row = mysqli_fetch_assoc($ticket_sql); + + $contact_name = escapeSql($row['contact_name']); + $contact_email = escapeSql($row['contact_email']); + $ticket_prefix = escapeSql($row['ticket_prefix']); + $ticket_number = intval($row['ticket_number']); + $ticket_subject = escapeSql($row['ticket_subject']); + $ticket_assigned_to = intval($row['ticket_assigned_to']); + $ticket_status = escapeSql($row['ticket_status_name']); + $url_key = escapeSql($row['ticket_url_key']); + + // Sanitize Config vars from get_settings.php + $config_ticket_from_name = escapeSql($config_ticket_from_name); + $config_ticket_from_email = escapeSql($config_ticket_from_email); + $config_base_url = escapeSql($config_base_url); + + // Get Company Info + $sql = mysqli_query($mysqli, "SELECT company_name, company_phone, company_phone_country_code FROM companies WHERE company_id = 1"); + $row = mysqli_fetch_assoc($sql); + $company_name = escapeSql($row['company_name']); + $company_phone = escapeSql(formatPhoneNumber($row['company_phone'], $row['company_phone_country_code'])); + + // EMAIL + $subject = "Ticket resolved - [$ticket_prefix$ticket_number] - $ticket_subject | (pending closure)"; + $body = "##- Please type your reply above this line -##

    Hello $contact_name,

    Your ticket regarding $ticket_subject has been marked as solved and is pending closure.

    If your request/issue is resolved, you can simply ignore this email. If you need further assistance, please reply or re-open to let us know!

    Ticket: $ticket_prefix$ticket_number
    Subject: $ticket_subject
    Status: $ticket_status
    Portal: View ticket

    --
    $company_name - Support
    $config_ticket_from_email
    $company_phone"; + + // Check email valid + if (filter_var($contact_email, FILTER_VALIDATE_EMAIL)) { + + $data = []; + + // Email Ticket Contact + // Queue Mail + + $data[] = [ + 'from' => $config_ticket_from_email, + 'from_name' => $config_ticket_from_name, + 'recipient' => $contact_email, + 'recipient_name' => $contact_name, + 'subject' => $subject, + 'body' => $body + ]; + } + + // Also Email all the watchers + $sql_watchers = mysqli_query($mysqli, "SELECT watcher_email FROM ticket_watchers WHERE watcher_ticket_id = $ticket_id"); + $body .= "

    ----------------------------------------
    YOU ARE A COLLABORATOR ON THIS TICKET"; + while ($row = mysqli_fetch_assoc($sql_watchers)) { + $watcher_email = escapeSql($row['watcher_email']); + + // Queue Mail + $data[] = [ + 'from' => $config_ticket_from_email, + 'from_name' => $config_ticket_from_name, + 'recipient' => $watcher_email, + 'recipient_name' => $watcher_email, + 'subject' => $subject, + 'body' => $body + ]; + } + addToMailQueue($data); + } + //End Mail IF + + flashAlert("Ticket resolved"); + + redirect(); + +} + +if (isset($_GET['close_ticket'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + $ticket_id = intval($_GET['close_ticket']); + $client_id = intval(getFieldById('tickets', $ticket_id, 'ticket_client_id')); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 5, ticket_closed_at = NOW(), ticket_closed_by = $session_user_id WHERE ticket_id = $ticket_id") or die(mysqli_error($mysqli)); + + mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = 'Ticket closed.', ticket_reply_type = 'Internal', ticket_reply_time_worked = '00:01:00', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); + + logAudit("Ticket", "Closed", "$session_name closed ticket ID $ticket_id", $client_id, $ticket_id); + + triggerCustomAction('ticket_close', $ticket_id); + + // Client notification email + if ((!empty($config_smtp_provider)) && $config_ticket_client_general_notifications == 1) { + + // Get details + $ticket_sql = mysqli_query($mysqli, "SELECT contact_name, contact_email, ticket_prefix, ticket_number, ticket_subject, ticket_url_key FROM tickets + LEFT JOIN clients ON ticket_client_id = client_id + LEFT JOIN contacts ON ticket_contact_id = contact_id + WHERE ticket_id = $ticket_id + "); + $row = mysqli_fetch_assoc($ticket_sql); + + $contact_name = escapeSql($row['contact_name']); + $contact_email = escapeSql($row['contact_email']); + $ticket_prefix = escapeSql($row['ticket_prefix']); + $ticket_number = intval($row['ticket_number']); + $ticket_subject = escapeSql($row['ticket_subject']); + $url_key = escapeSql($row['ticket_url_key']); + + // Sanitize Config vars from get_settings.php + $config_ticket_from_name = escapeSql($config_ticket_from_name); + $config_ticket_from_email = escapeSql($config_ticket_from_email); + $config_base_url = escapeSql($config_base_url); + + // Get Company Info + $sql = mysqli_query($mysqli, "SELECT company_name, company_phone, company_phone_country_code FROM companies WHERE company_id = 1"); + $row = mysqli_fetch_assoc($sql); + $company_name = escapeSql($row['company_name']); + $company_phone = escapeSql(formatPhoneNumber($row['company_phone'], $row['company_phone_country_code'])); + + // EMAIL + $subject = "Ticket closed - [$ticket_prefix$ticket_number] - $ticket_subject | (do not reply)"; + $body = "Hello $contact_name,

    Your ticket regarding \"$ticket_subject\" has been closed.

    We hope the request/issue was resolved to your satisfaction, please provide your feedback here.
    If you need further assistance, please raise a new ticket using the below details. Please do not reply to this email.

    Ticket: $ticket_prefix$ticket_number
    Subject: $ticket_subject
    Portal: https://$config_base_url/client/ticket.php?id=$ticket_id

    --
    $company_name - Support
    $config_ticket_from_email
    $company_phone"; + + // Check email valid + if (filter_var($contact_email, FILTER_VALIDATE_EMAIL)) { + + $data = []; + + // Email Ticket Contact + // Queue Mail + + $data[] = [ + 'from' => $config_ticket_from_email, + 'from_name' => $config_ticket_from_name, + 'recipient' => $contact_email, + 'recipient_name' => $contact_name, + 'subject' => $subject, + 'body' => $body + ]; + } + + // Also Email all the watchers + $sql_watchers = mysqli_query($mysqli, "SELECT watcher_email FROM ticket_watchers WHERE watcher_ticket_id = $ticket_id"); + $body .= "

    ----------------------------------------
    YOU ARE A COLLABORATOR ON THIS TICKET"; + while ($row = mysqli_fetch_assoc($sql_watchers)) { + $watcher_email = escapeSql($row['watcher_email']); + + // Queue Mail + $data[] = [ + 'from' => $config_ticket_from_email, + 'from_name' => $config_ticket_from_name, + 'recipient' => $watcher_email, + 'recipient_name' => $watcher_email, + 'subject' => $subject, + 'body' => $body + ]; + } + addToMailQueue($data); + } + //End Mail IF + + flashAlert("Ticket Closed, this cannot not be reopened but you may start another one"); + + redirect(); + +} + +if (isset($_GET['reopen_ticket'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + $ticket_id = intval($_GET['reopen_ticket']); + + $client_id = intval(getFieldById('tickets', $ticket_id, 'ticket_client_id')); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 2, ticket_resolved_at = NULL WHERE ticket_id = $ticket_id"); + + logAudit("Ticket", "Reopened", "$session_name reopened ticket ID $ticket_id", $client_id, $ticket_id); + + triggerCustomAction('ticket_update', $ticket_id); + + flashAlert("Ticket re-opened"); + + redirect(); + +} + +if (isset($_POST['add_invoice_from_ticket'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + enforceUserPermission('module_sales', 2); + + $invoice_id = intval($_POST['invoice_id']); + $ticket_id = intval($_POST['ticket_id']); + $date = escapeSql($_POST['date']); + $category = intval($_POST['category']); + $scope = escapeSql($_POST['scope']); + + $sql = mysqli_query( + $mysqli, + "SELECT * FROM tickets + LEFT JOIN clients ON ticket_client_id = client_id + LEFT JOIN contacts ON ticket_contact_id = contact_id + LEFT JOIN assets ON ticket_asset_id = asset_id + LEFT JOIN locations ON ticket_location_id = location_id + WHERE ticket_id = $ticket_id" + ); + + $row = mysqli_fetch_assoc($sql); + $client_id = intval($row['client_id']); + $client_net_terms = intval($row['client_net_terms']); + if ($client_net_terms == 0) { + $client_net_terms = $config_default_net_terms; + } + + $ticket_prefix = escapeSql($row['ticket_prefix']); + $ticket_number = intval($row['ticket_number']); + $ticket_category = escapeSql($row['ticket_category']); + $ticket_subject = escapeSql($row['ticket_subject']); + $ticket_created_at = escapeSql($row['ticket_created_at']); + $ticket_updated_at = escapeSql($row['ticket_updated_at']); + $ticket_closed_at = escapeSql($row['ticket_closed_at']); + + $contact_id = intval($row['contact_id']); + $contact_name = escapeSql($row['contact_name']); + $contact_email = escapeSql($row['contact_email']); + + $asset_id = intval($row['asset_id']); + + $location_name = escapeSql($row['location_name']); + + enforceClientAccess(); + + if ($invoice_id == 0) { + + $invoice_prefix = escapeSql($config_invoice_prefix); + + // Atomically increment and get the new invoice number + mysqli_query($mysqli, " + UPDATE settings + SET + config_invoice_next_number = LAST_INSERT_ID(config_invoice_next_number), + config_invoice_next_number = config_invoice_next_number + 1 + WHERE company_id = 1 + "); + + $invoice_number = mysqli_insert_id($mysqli); + + //Generate a unique URL key for clients to access + $url_key = randomString(32); + + mysqli_query($mysqli, "INSERT INTO invoices SET invoice_prefix = '$config_invoice_prefix', invoice_number = $invoice_number, invoice_scope = '$scope', invoice_date = '$date', invoice_due = DATE_ADD('$date', INTERVAL $client_net_terms day), invoice_currency_code = '$session_company_currency', invoice_category_id = $category, invoice_status = 'Draft', invoice_url_key = '$url_key', invoice_client_id = $client_id"); + $invoice_id = mysqli_insert_id($mysqli); + } else { + $sql_invoice = mysqli_query($mysqli, "SELECT invoice_prefix, invoice_number FROM invoices WHERE invoice_id = $invoice_id"); + $row = mysqli_fetch_assoc($sql_invoice); + $invoice_prefix = escapeSql($row['invoice_prefix']); + $invoice_number = intval($row['invoice_number']); + } + + //Add Item + $item_name = escapeSql($_POST['item_name']); + $item_description = escapeSql($_POST['item_description']); + $qty = floatval($_POST['qty']); + $price = floatval($_POST['price']); + $tax_id = intval($_POST['tax_id']); + + $subtotal = $price * $qty; + + if ($tax_id > 0) { + $sql = mysqli_query($mysqli, "SELECT * FROM taxes WHERE tax_id = $tax_id"); + $row = mysqli_fetch_assoc($sql); + $tax_percent = floatval($row['tax_percent']); + $tax_amount = $subtotal * $tax_percent / 100; + } else { + $tax_amount = 0; + } + + $total = $subtotal + $tax_amount; + + mysqli_query($mysqli, "INSERT INTO invoice_items SET item_name = '$item_name', item_description = '$item_description', item_quantity = $qty, item_price = $price, item_subtotal = $subtotal, item_tax = $tax_amount, item_total = $total, item_order = 1, item_tax_id = $tax_id, item_invoice_id = $invoice_id"); + + //Update Invoice Balances + + $sql = mysqli_query($mysqli, "SELECT * FROM invoices WHERE invoice_id = $invoice_id"); + $row = mysqli_fetch_assoc($sql); + + $new_invoice_amount = floatval($row['invoice_amount']) + $total; + + mysqli_query($mysqli, "UPDATE invoices SET invoice_amount = $new_invoice_amount WHERE invoice_id = $invoice_id"); + + mysqli_query($mysqli, "INSERT INTO history SET history_status = 'Draft', history_description = 'Invoice created from Ticket $ticket_prefix$ticket_number', history_invoice_id = $invoice_id"); + + // Add internal note to ticket, and link to invoice in database + mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = 'Created invoice $config_invoice_prefix$invoice_number for this ticket.', ticket_reply_type = 'Internal', ticket_reply_time_worked = '00:01:00', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); + + mysqli_query($mysqli, "UPDATE tickets SET ticket_invoice_id = $invoice_id WHERE ticket_id = $ticket_id"); + + logAudit("Invoice", "Create", "$session_name created invoice $invoice_prefix$invoice_number from Ticket $ticket_prefix$ticket_number", $client_id, $invoice_id); + + flashAlert("Invoice $invoice_prefix$invoice_number created from ticket"); + + redirect("invoice.php?invoice_id=$invoice_id"); + +} + +if (isset($_POST['add_quote_from_ticket'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + enforceUserPermission('module_sales', 2); + + require_once 'quote_model.php'; + + $ticket_id = intval($_POST['ticket_id']); + $item_name = escapeSql($_POST['item_name']); + $item_description = escapeSql($_POST['item_description']); + $qty = floatval($_POST['qty']); + $price = floatval($_POST['price']); + $tax_id = intval($_POST['tax_id']); + + // Totals + $subtotal = $price * $qty; + $tax_amount = 0; + if ($tax_id > 0) { + $sql = mysqli_query($mysqli, "SELECT * FROM taxes WHERE tax_id = $tax_id"); + $row = mysqli_fetch_assoc($sql); + $tax_percent = floatval($row['tax_percent']); + $tax_amount = $subtotal * $tax_percent / 100; + } + $total = floatval($subtotal + $tax_amount); + + // Ticket info + $sql = mysqli_query( + $mysqli, + "SELECT ticket_prefix, ticket_number, ticket_client_id FROM tickets WHERE ticket_id = $ticket_id LIMIT 1" + ); + $row = mysqli_fetch_assoc($sql); + $ticket_prefix = escapeSql($row['ticket_prefix']); + $ticket_number = intval($row['ticket_number']); + $client_id = intval($row['ticket_client_id']); + + enforceClientAccess(); + + // Atomically increment and get the new quote number + mysqli_query($mysqli, " + UPDATE settings + SET + config_quote_next_number = LAST_INSERT_ID(config_quote_next_number), + config_quote_next_number = config_quote_next_number + 1 + WHERE company_id = 1 + "); + + $quote_number = mysqli_insert_id($mysqli); + + //Generate a unique URL key for clients to access + $quote_url_key = randomString(32); + + mysqli_query($mysqli,"INSERT INTO quotes SET quote_prefix = '$config_quote_prefix', quote_number = $quote_number, quote_scope = '$scope', quote_date = '$date', quote_expire = '$expire', quote_amount = $total, quote_currency_code = '$session_company_currency', quote_category_id = $category, quote_status = 'Draft', quote_url_key = '$quote_url_key', quote_client_id = $client_id"); + + $quote_id = mysqli_insert_id($mysqli); + + // Add line item + mysqli_query($mysqli, "INSERT INTO quote_items SET item_name = '$item_name', item_description = '$item_description', item_quantity = $qty, item_price = $price, item_subtotal = $subtotal, item_tax = $tax_amount, item_total = $total, item_order = 1, item_tax_id = $tax_id, item_quote_id = $quote_id"); + + // Add internal note to ticket, and link to invoice in database + mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = 'Created quote $config_quote_prefix$quote_number for this ticket.', ticket_reply_type = 'Internal', ticket_reply_time_worked = '00:01:00', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); + mysqli_query($mysqli, "UPDATE tickets SET ticket_quote_id = $quote_id WHERE ticket_id = $ticket_id LIMIT 1"); + + // Logging + redirects + mysqli_query($mysqli,"INSERT INTO history SET history_status = 'Draft', history_description = 'Quote created from Ticket $ticket_prefix$ticket_number!', history_quote_id = $quote_id"); + logAudit("Quote", "Create", "$session_name created quote $config_quote_prefix$quote_number from ticket $ticket_prefix$ticket_number", $client_id, $quote_id); + + triggerCustomAction('quote_create', $quote_id); + + flashAlert("Quote $config_quote_prefix$quote_number created"); + redirect("quote.php?quote_id=$quote_id"); + +} + +if (isset($_POST['export_tickets_csv'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + if ($_POST['client_id']) { + $client_id = intval($_POST['client_id']); + $client_query = "WHERE ticket_client_id = $client_id"; + $client_name = getFieldById('clients', $client_id, 'client_name'); + $file_name_prepend = "$client_name-"; + } else { + $client_query = ''; + $client_name = ''; + $file_name_prepend = "$session_company_name-"; + } + + $sql = mysqli_query( + $mysqli, + "SELECT * FROM tickets + LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id + $client_query ORDER BY ticket_number ASC" + ); + + if ($sql->num_rows > 0) { + $delimiter = ","; + $enclosure = '"'; + $escape = '\\'; // backslash + $filename = sanitizeFilename($file_name_prepend . "Tickets-" . date('Y-m-d_H-i-s') . ".csv"); + + //create a file pointer + $f = fopen('php://memory', 'w'); + + //set column headers + $fields = array('Ticket Number', 'Priority', 'Status', 'Subject', 'Date Opened', 'Date Resolved', 'Date Closed'); + fputcsv($f, $fields, $delimiter, $enclosure, $escape); + + //output each row of the data, format line as csv and write to file pointer + while ($row = $sql->fetch_assoc()) { + $lineData = array($config_ticket_prefix . $row['ticket_number'], $row['ticket_priority'], $row['ticket_status_name'], $row['ticket_subject'], $row['ticket_created_at'], $row['ticket_resolved_at'], $row['ticket_closed_at']); + fputcsv($f, array_map('escapeCsvFormula', $lineData), $delimiter, $enclosure, $escape); + } + + //move back to beginning of file + fseek($f, 0); + + //set headers to download file rather than displayed + header('Content-Type: text/csv'); + header('Content-Disposition: attachment; filename="' . $filename . '";'); + + //output all remaining data on a file pointer + fpassthru($f); + } + exit; + +} + +if (isset($_POST['edit_ticket_billable_status'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + enforceUserPermission('module_sales', 2); + + $ticket_id = intval($_POST['ticket_id']); + $billable_status = intval($_POST['billable_status']); + if ($billable_status == 0 ) { + $billable_wording = "Not"; + } + + // Get ticket details for logging + $sql = mysqli_query($mysqli, "SELECT ticket_prefix, ticket_number, ticket_client_id FROM tickets WHERE ticket_id = $ticket_id"); + $row = mysqli_fetch_assoc($sql); + $ticket_prefix = escapeSql($row['ticket_prefix']); + $ticket_number = intval($row['ticket_number']); + $client_id = intval($row['ticket_client_id']); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + mysqli_query($mysqli,"UPDATE tickets SET ticket_billable = $billable_status WHERE ticket_id = $ticket_id"); + + logAudit("Ticket", "Edit", "$session_name marked ticket $ticket_prefix$ticket_number as $billable_wording Billable", $client_id, $ticket_id); + + flashAlert("Ticket marked $billable_wording Billable"); + + redirect(); + +} + +if (isset($_POST['edit_ticket_schedule'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + $ticket_id = intval($_POST['ticket_id']); + $onsite = intval($_POST['onsite']); + $schedule = escapeSql($_POST['scheduled_date_time']); + $ticket_link = "client/ticket.php?id=$ticket_id"; + $full_ticket_url = "https://$config_base_url/client/ticket.php?id=$ticket_id"; + $ticket_link_html = "$ticket_link"; + + $client_id = intval(getFieldById('tickets', $ticket_id, 'ticket_client_id')); + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + mysqli_query($mysqli,"UPDATE tickets + SET ticket_schedule = '$schedule', ticket_onsite = $onsite + WHERE ticket_id = $ticket_id" + ); + + // Check for other conflicting scheduled items based on 2 hr window + //TODO make this configurable + $start = date('Y-m-d H:i:s', strtotime($schedule) - 7200); + $end = date('Y-m-d H:i:s', strtotime($schedule) + 7200); + $sql = mysqli_query($mysqli, "SELECT * FROM tickets WHERE ticket_schedule BETWEEN '$start' AND '$end' AND ticket_id != $ticket_id"); + if (mysqli_num_rows($sql) > 0) { + $conflicting_tickets = []; + while ($row = mysqli_fetch_assoc($sql)) { + $conflicting_tickets[] = $row['ticket_id'] . " - " . $row['ticket_subject'] . " @ " . $row['ticket_schedule']; + } + } + $sql = mysqli_query($mysqli, "SELECT * FROM tickets + LEFT JOIN clients ON ticket_client_id = client_id + LEFT JOIN contacts ON ticket_contact_id = contact_id + LEFT JOIN locations on contact_location_id = location_id + LEFT JOIN users ON ticket_assigned_to = user_id + WHERE ticket_id = $ticket_id + "); + + $row = mysqli_fetch_assoc($sql); + + $client_name = escapeSql($row['client_name']); + $ticket_details = escapeSql($row['ticket_details']); + $contact_name = escapeSql($row['contact_name']); + $contact_email = escapeSql($row['contact_email']); + $ticket_prefix = escapeSql($row['ticket_prefix']); + $ticket_number = intval($row['ticket_number']); + $ticket_subject = escapeSql($row['ticket_subject']); + $user_name = escapeSql($row['user_name']); + $user_email = escapeSql($row['user_email']); + $cal_subject = $ticket_number . ": " . $client_name . " - " . $ticket_subject; + $ticket_details_truncated = substr($ticket_details, 0, 100); + $cal_description = $ticket_details_truncated . " - " . $full_ticket_url; + $cal_location = escapeSql($row["location_address"]); + $email_datetime = date('l, F j, Y \a\t g:ia', strtotime($schedule)); + + if ($client_id) { + $client_uri = "&client_id=$client_id"; + } else { + $client_uri = ''; + } + + // Sanitize Config Vars + $config_ticket_from_email = escapeSql($config_ticket_from_email); + $config_ticket_from_name = escapeSql($config_ticket_from_name); + $session_company_name = escapeSql($session_company_name); + + + /// Create iCal event + $cal_str = createiCalStr($schedule, $cal_subject, $cal_description, $cal_location); + + // Notify the agent of the scheduled work + $data[] = [ + 'from' => $config_ticket_from_email, + 'from_name' => $config_ticket_from_name, + 'recipient' => $user_email, + 'recipient_name' => $user_name, + 'subject' => "Ticket Scheduled - [$ticket_prefix$ticket_number] - $ticket_subject", + 'body' => "Hello, " . $user_name . "

    The ticket regarding $ticket_subject has been scheduled for $email_datetime.

    --------------------------------
    $ticket_link
    --------------------------------

    Please do not reply to this email.

    Ticket: $ticket_prefix$ticket_number
    Subject: $ticket_subject
    Portal: https://$config_base_url/agent/ticket.php?ticket_id=$ticket_id$client_uri

    ~
    $session_company_name
    Support Department
    $config_ticket_from_email", + 'cal_str' => $cal_str + ]; + + if ($config_ticket_client_general_notifications) { + // Notify the ticket contact of the scheduled work + $data[] = [ + 'from' => $config_ticket_from_email, + 'from_name' => $config_ticket_from_name, + 'recipient' => $contact_email, + 'recipient_name' => $contact_name, + 'subject' => "Ticket Scheduled - [$ticket_prefix$ticket_number] - $ticket_subject", + 'body' => mysqli_escape_string($mysqli, "
    + Hello, $contact_name +
    + Your ticket regarding $ticket_subject has been scheduled for $email_datetime. +

    + Access your ticket here +

    + Please do not reply to this email. +

    + Ticket: $ticket_prefix$ticket_number
    + Subject: $ticket_subject
    +

    + +
    + This is an automated message. Please do not reply directly to this email. +
    "), + 'cal_str' => $cal_str + ]; + + // Notify the watchers of the scheduled work + $sql_watchers = mysqli_query($mysqli, "SELECT watcher_email FROM ticket_watchers WHERE watcher_ticket_id = $ticket_id"); + + while ($row = mysqli_fetch_assoc($sql_watchers)) { + $watcher_email = escapeSql($row['watcher_email']); + $data[] = [ + 'from' => $config_ticket_from_email, + 'from_name' => $config_ticket_from_name, + 'recipient' => $watcher_email, + 'recipient_name' => $watcher_email, + 'subject' => "Ticket Scheduled - [$ticket_prefix$ticket_number] - $ticket_subject", + 'body' => mysqli_escape_string($mysqli, escapeHtml("
    + Hello, +
    + The ticket regarding $ticket_subject has been scheduled for $email_datetime. +

    + $ticket_link +

    + Please do not reply to this email. +

    + Ticket: $ticket_prefix$ticket_number
    + Subject: $ticket_subject
    + Portal: Access the ticket here +

    + +
    + This is an automated message. Please do not reply directly to this email. +
    ")), + 'cal_str' => $cal_str + ]; + } + } + + // Send + $response = addToMailQueue($data); + + // Update ticket reply + $ticket_reply_note = "Ticket scheduled for $email_datetime " . (boolval($onsite) ? '(onsite).' : '(remote).'); + mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = '$ticket_reply_note', ticket_reply_type = 'Internal', ticket_reply_time_worked = '00:01:00', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); + + logAudit("Ticket", "Edit", "$session_name edited ticket schedule", $client_id, $ticket_id); + + triggerCustomAction('ticket_schedule', $ticket_id); + + if (empty($conflicting_tickets)) { + flashAlert("Ticket scheduled for $email_datetime"); + redirect(); + } else { + $_SESSION['alert_type'] = "error"; + flashAlert("Ticket scheduled for $email_datetime. Yet there are conflicting tickets scheduled for the same time:
    " . implode(",
    ", $conflicting_tickets), 'error'); + redirect("calendar.php"); + } + +} + +if (isset($_GET['cancel_ticket_schedule'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + $ticket_id = intval($_GET['cancel_ticket_schedule']); + + $sql = mysqli_query($mysqli, "SELECT * FROM tickets WHERE ticket_id = $ticket_id"); + $row = mysqli_fetch_assoc($sql); + + $client_id = intval($row['ticket_client_id']); + $ticket_prefix = escapeSql($row['ticket_prefix']); + $ticket_number = intval($row['ticket_number']); + $ticket_subject = escapeSql($row['ticket_subject']); + $ticket_schedule = escapeSql($row['ticket_schedule']); + $ticket_cal_str = escapeSql($row['ticket_cal_str']); + + // Don't Enforce Client Access if Ticket doesn't have an assigned client + if ($client_id) { + enforceClientAccess(); + } + + if ($client_id) { + $client_uri = "&client_id=$client_id"; + } else { + $client_uri = ''; + } + + mysqli_query($mysqli, "UPDATE tickets SET ticket_schedule = NULL WHERE ticket_id = $ticket_id"); + + // Sanitize Config Vars + $config_ticket_from_email = escapeSql($config_ticket_from_email); + $config_ticket_from_name = escapeSql($config_ticket_from_name); + $session_company_name = escapeSql($session_company_name); + + //Create iCal event + $cal_str = createiCalStrCancel($ticket_cal_str); + + //Send emails + + $sql = mysqli_query($mysqli, "SELECT * FROM tickets + LEFT JOIN clients ON ticket_client_id = client_id + LEFT JOIN contacts ON ticket_contact_id = contact_id + LEFT JOIN locations on contact_location_id = location_id + LEFT JOIN users ON ticket_assigned_to = user_id + WHERE ticket_id = $ticket_id + "); + $row = mysqli_fetch_assoc($sql); + + $client_id = intval($row['ticket_client_id']); + $client_name = escapeSql($row['client_name']); + $ticket_details = escapeSql($row['ticket_details']); + $contact_name = escapeSql($row['contact_name']); + $contact_email = escapeSql($row['contact_email']); + $ticket_prefix = escapeSql($row['ticket_prefix']); + $ticket_number = intval($row['ticket_number']); + $ticket_subject = escapeSql($row['ticket_subject']); + $user_name = escapeSql($row['user_name']); + $user_email = escapeSql($row['user_email']); + + // Notify the agent of the cancellation + $data[] = [ + // User Email + 'from' => $config_ticket_from_email, + 'from_name' => $config_ticket_from_name, + 'recipient' => $user_email, + 'recipient_name' => $user_name, + 'subject' => "Ticket Schedule Cancelled - [$ticket_prefix$ticket_number] - $ticket_subject", + 'body' => "Hello, " . $user_name . "

    Scheduled work for the ticket regarding $ticket_subject has been cancelled.

    --------------------------------
    $ticket_link
    --------------------------------

    Please do not reply to this email.

    Ticket: $ticket_prefix$ticket_number
    Subject: $ticket_subject
    Portal: https://$config_base_url/agent/ticket.php?id=$ticket_id&client_id=$client_id

    ~
    $session_company_name
    Support Department
    $config_ticket_from_email", + 'cal_str' => $cal_str + ]; + + if ($config_ticket_client_general_notifications) { + // Notify the ticket contact of the cancellation + $data[] = [ + 'from' => $config_ticket_from_email, + 'from_name' => $config_ticket_from_name, + 'recipient' => $contact_email, + 'recipient_name' => $contact_name, + 'subject' => "Ticket Schedule Cancelled - [$ticket_prefix$ticket_number] - $ticket_subject", + 'body' => mysqli_escape_string($mysqli, "
    + Hello, $contact_name +
    + Scheduled work for your ticket regarding $ticket_subject has been cancelled. +

    + Access your ticket here +

    + Please do not reply to this email. +

    + Ticket: $ticket_prefix$ticket_number
    + Subject: $ticket_subject
    +

    + +
    + This is an automated message. Please do not reply directly to this email. +
    "), + 'cal_str' => $cal_str + ]; + + // Notify the watchers of the cancellation + $sql_watchers = mysqli_query($mysqli, "SELECT watcher_email FROM ticket_watchers WHERE watcher_ticket_id = $ticket_id"); + while ($row = mysqli_fetch_assoc($sql_watchers)) { + $watcher_email = escapeSql($row['watcher_email']); + $data[] = [ + 'from' => $config_ticket_from_email, + 'from_name' => $config_ticket_from_name, + 'recipient' => $watcher_email, + 'recipient_name' => $watcher_email, + 'subject' => "Ticket Schedule Cancelled - [$ticket_prefix$ticket_number] - $ticket_subject", + 'body' => mysqli_escape_string($mysqli, escapeHtml("
    + Hello, +
    + Scheduled work for the ticket regarding $ticket_subject has been cancelled. +

    + $ticket_link +

    + Please do not reply to this email. +

    + Ticket: $ticket_prefix$ticket_number
    + Subject: $ticket_subject
    + Portal: Access the ticket here +

    + +
    + This is an automated message. Please do not reply directly to this email. +
    ")), + 'cal_str' => $cal_str + ]; + } + } + + // Send email(s) + addToMailQueue($data); + + // Update ticket reply + $ticket_reply_note = "Ticket schedule cancelled."; + mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = '$ticket_reply_note', ticket_reply_type = 'Internal', ticket_reply_time_worked = '00:01:00', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); + + logAudit("Ticket", "Edit", "$session_name cancelled ticket schedule", $client_id, $ticket_id); + + triggerCustomAction('ticket_unschedule', $ticket_id); + + flashAlert("Ticket schedule cancelled", 'error'); + + redirect(); + +} diff --git a/cron/mail_queue.php b/cron/mail_queue.php index cab72968b..a0a0fc216 100644 --- a/cron/mail_queue.php +++ b/cron/mail_queue.php @@ -1,476 +1,476 @@ -email = $email; - $this->accessToken = $accessToken; - } - public function getOauth64(): string { - $auth = "user={$this->email}\x01auth=Bearer {$this->accessToken}\x01\x01"; - return base64_encode($auth); - } -} - -/** ======================================================================= - * Load settings - * ======================================================================= */ -$sql_settings = mysqli_query($mysqli, "SELECT * FROM settings WHERE company_id = 1"); -$row = mysqli_fetch_assoc($sql_settings); - -$config_enable_cron = intval($row['config_enable_cron']); - -// SMTP baseline -$config_smtp_host = $row['config_smtp_host']; -$config_smtp_username = $row['config_smtp_username']; -$config_smtp_password = $row['config_smtp_password']; -$config_smtp_port = intval($row['config_smtp_port']); -$config_smtp_encryption = $row['config_smtp_encryption']; - -// SMTP provider + shared OAuth fields -$config_smtp_provider = $row['config_smtp_provider']; // 'standard_smtp' | 'google_oauth' | 'microsoft_oauth' -$config_mail_oauth_client_id = $row['config_mail_oauth_client_id'] ?? ''; -$config_mail_oauth_client_secret = $row['config_mail_oauth_client_secret'] ?? ''; -$config_mail_oauth_tenant_id = $row['config_mail_oauth_tenant_id'] ?? ''; -$config_mail_oauth_refresh_token = $row['config_mail_oauth_refresh_token'] ?? ''; -$config_mail_oauth_access_token = $row['config_mail_oauth_access_token'] ?? ''; -$config_mail_oauth_access_token_expires_at = $row['config_mail_oauth_access_token_expires_at'] ?? ''; - -if ($config_enable_cron == 0) { - logApp("Cron-Mail-Queue", "error", "Cron Mail Queue unable to run - cron not enabled in admin settings."); - exit("Cron: is not enabled -- Quitting.."); -} - -if (empty($config_smtp_provider)) { - logApp("Cron-Mail-Queue", "info", "SMTP sending skipped: provider not configured."); - exit(0); -} - -/** ======================================================================= - * Mail OAuth helpers + sender function - * ======================================================================= */ -function tokenIsExpired(?string $expires_at): bool { - if (empty($expires_at)) { - return true; - } - - $ts = strtotime($expires_at); - - if ($ts === false) { - return true; - } - - return ($ts - 60) <= time(); -} - -function httpFormPost(string $url, array $fields): array { - $ch = curl_init($url); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_POST, true); - curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields, '', '&')); - curl_setopt($ch, CURLOPT_TIMEOUT, 20); - - $raw = curl_exec($ch); - $err = curl_error($ch); - $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); - - curl_close($ch); - - return [ - 'ok' => ($raw !== false && $code >= 200 && $code < 300), - 'body' => $raw, - 'code' => $code, - 'err' => $err, - ]; -} - -function persistMailOauthTokens(string $access_token, string $expires_at, ?string $refresh_token = null): void { - global $mysqli; - - $access_token_esc = mysqli_real_escape_string($mysqli, $access_token); - $expires_at_esc = mysqli_real_escape_string($mysqli, $expires_at); - - $refresh_sql = ''; - if (!empty($refresh_token)) { - $refresh_token_esc = mysqli_real_escape_string($mysqli, $refresh_token); - $refresh_sql = ", config_mail_oauth_refresh_token = '{$refresh_token_esc}'"; - } - - mysqli_query($mysqli, "UPDATE settings SET config_mail_oauth_access_token = '{$access_token_esc}', config_mail_oauth_access_token_expires_at = '{$expires_at_esc}'{$refresh_sql} WHERE company_id = 1"); -} - -function refreshMailOauthAccessToken(string $provider, string $oauth_client_id, string $oauth_client_secret, string $oauth_tenant_id, string $oauth_refresh_token): ?array { - $result = null; - $response = null; - - if (!empty($oauth_client_id) && !empty($oauth_client_secret) && !empty($oauth_refresh_token)) { - if ($provider === 'google_oauth') { - $response = httpFormPost(GOOGLE_OAUTH_TOKEN_URL, [ - 'client_id' => $oauth_client_id, - 'client_secret' => $oauth_client_secret, - 'refresh_token' => $oauth_refresh_token, - 'grant_type' => 'refresh_token', - ]); - } elseif ($provider === 'microsoft_oauth' && !empty($oauth_tenant_id)) { - $token_url = MICROSOFT_OAUTH_BASE_URL . rawurlencode($oauth_tenant_id) . "/oauth2/v2.0/token"; - $response = httpFormPost($token_url, [ - 'client_id' => $oauth_client_id, - 'client_secret' => $oauth_client_secret, - 'refresh_token' => $oauth_refresh_token, - 'grant_type' => 'refresh_token', - ]); - } - } - - if (is_array($response) && !empty($response['ok'])) { - $json = json_decode($response['body'], true); - - if (is_array($json) && !empty($json['access_token'])) { - $expires_at = date('Y-m-d H:i:s', time() + (int)($json['expires_in'] ?? 3600)); - $result = [ - 'access_token' => $json['access_token'], - 'expires_at' => $expires_at, - 'refresh_token' => $json['refresh_token'] ?? null, - ]; - } - } - - return $result; -} - -function resolveMailOauthAccessToken(string $provider, string $oauth_client_id, string $oauth_client_secret, string $oauth_tenant_id, string $oauth_refresh_token, string $oauth_access_token, string $oauth_access_token_expires_at): ?string { - if (!empty($oauth_access_token) && !tokenIsExpired($oauth_access_token_expires_at)) { - return $oauth_access_token; - } - - $tokens = refreshMailOauthAccessToken($provider, $oauth_client_id, $oauth_client_secret, $oauth_tenant_id, $oauth_refresh_token); - - if (!is_array($tokens) || empty($tokens['access_token']) || empty($tokens['expires_at'])) { - return null; - } - - persistMailOauthTokens($tokens['access_token'], $tokens['expires_at'], $tokens['refresh_token'] ?? null); - - return $tokens['access_token']; -} - -function sendQueueEmail( - string $provider, - string $host, - int $port, - string $encryption, - string $username, - string $password, - string $from_email, - string $from_name, - string $to_email, - string $to_name, - string $subject, - string $html_body, - string $ics_str, - string $oauth_client_id, - string $oauth_client_secret, - string $oauth_tenant_id, - string $oauth_refresh_token, - string $oauth_access_token, - string $oauth_access_token_expires_at -) { - // Sensible defaults for OAuth providers if fields were left blank - if ($provider === 'google_oauth') { - if (!$host) $host = 'smtp.gmail.com'; - if (!$port) $port = 587; - if (!$encryption) $encryption = 'tls'; - if (!$username) $username = $from_email; - } elseif ($provider === 'microsoft_oauth') { - if (!$host) $host = 'smtp.office365.com'; - if (!$port) $port = 587; - if (!$encryption) $encryption = 'tls'; - if (!$username) $username = $from_email; - } - - $mail = new PHPMailer(true); - $mail->CharSet = "UTF-8"; - $mail->SMTPDebug = 0; - $mail->isSMTP(); - $mail->Host = $host; - $mail->Port = $port; - // Bound the SMTP conversation. Without this an unresponsive mail server can - // hold the cron lock open indefinitely and stall the whole queue. - $mail->Timeout = 30; - - $enc = strtolower($encryption); - if ($enc === '' || $enc === 'none') { - $mail->SMTPAutoTLS = false; - $mail->SMTPSecure = false; - $mail->SMTPOptions = ['ssl' => ['verify_peer' => false, 'verify_peer_name' => false]]; - } else { - $mail->SMTPSecure = $enc; // 'tls' | 'ssl' - } - - if ($provider === 'google_oauth' || $provider === 'microsoft_oauth') { - // XOAUTH2 - $mail->SMTPAuth = true; - $mail->AuthType = 'XOAUTH2'; - $mail->Username = $username; - - $access_token = resolveMailOauthAccessToken( - $provider, - trim($oauth_client_id), - trim($oauth_client_secret), - trim($oauth_tenant_id), - trim($oauth_refresh_token), - trim($oauth_access_token), - trim($oauth_access_token_expires_at) - ); - - if (empty($access_token)) { - throw new Exception("Missing OAuth access token for XOAUTH2 SMTP."); - } - - $mail->setOAuth(new StaticTokenProvider($username, $access_token)); - } else { - // Standard SMTP (with or without auth) - $mail->SMTPAuth = !empty($username); - $mail->Username = $username ?: ''; - $mail->Password = $password ?: ''; - } - - // Recipients & content - $mail->setFrom($from_email, $from_name); - $mail->addAddress($to_email, $to_name); - $mail->isHTML(true); - $mail->Subject = $subject; - $mail->Body = $html_body; - - if (!empty($ics_str)) { - $mail->addStringAttachment($ics_str, 'Scheduled_ticket.ics', 'base64', 'text/calendar'); - } - - $mail->send(); - return true; -} - -/** ======================================================================= - * RECOVER: status = 1 (Sending) left behind by a run that died - * - * Nothing else in the codebase ever selects status 1, so without this a row - * claimed by a run that was killed mid-send stays 'Sending' forever and is never - * delivered. The cron lock above guarantees no other run of this script is in - * progress, so any row still sitting at status 1 is by definition orphaned and - * safe to reclaim. It is moved to failed rather than queued so it inherits the - * retry pass's 30 minute backoff and attempt cap instead of retrying instantly. - * - * This can re-send a message that did go out but died before being marked sent. - * That trade is deliberate: a duplicate is recoverable, an invoice that silently - * never arrives is not. - * ======================================================================= */ -mysqli_query($mysqli, "UPDATE email_queue SET email_status = 2, email_failed_at = NOW(), email_attempts = email_attempts + 1 WHERE email_status = 1"); -$orphaned_emails = mysqli_affected_rows($mysqli); -if ($orphaned_emails > 0) { - logApp("Cron-Mail-Queue", "warning", "Recovered $orphaned_emails email(s) left in a sending state by a previous run - queued for retry."); -} - -/** ======================================================================= - * SEND: status = 0 (Queued) - * ======================================================================= */ -$sql_queue = mysqli_query($mysqli, "SELECT * FROM email_queue WHERE email_status = 0 AND email_queued_at <= NOW()"); - -if (mysqli_num_rows($sql_queue) > 0) { - while ($rowq = mysqli_fetch_assoc($sql_queue)) { - $email_id = (int)$rowq['email_id']; - $email_from = $rowq['email_from']; - $email_from_name = $rowq['email_from_name']; - $email_recipient = $rowq['email_recipient']; - $email_recipient_name = $rowq['email_recipient_name']; - $email_subject = $rowq['email_subject']; - $email_content = $rowq['email_content']; - $email_ics_str = $rowq['email_cal_str']; - - // Check sender - if (!filter_var($email_from, FILTER_VALIDATE_EMAIL)) { - $email_from_logging = escapeSql($rowq['email_from']); - mysqli_query($mysqli, "UPDATE email_queue SET email_status = 2, email_attempts = 99 WHERE email_id = $email_id"); - logApp("Cron-Mail-Queue", "Error", "Failed to send email #$email_id due to invalid sender address: $email_from_logging - check configuration in settings."); - appNotify("Mail", "Failed to send email #$email_id due to invalid sender address"); - continue; - } - - // Claim the row - the conditional UPDATE is the lock. If another run already took - // this email, skip it rather than sending the client a second copy. - mysqli_query($mysqli, "UPDATE email_queue SET email_status = 1 WHERE email_id = $email_id AND email_status = 0"); - if (mysqli_affected_rows($mysqli) !== 1) { - continue; - } - - // Basic recipient syntax check - if (!filter_var($email_recipient, FILTER_VALIDATE_EMAIL)) { - mysqli_query($mysqli, "UPDATE email_queue SET email_status = 2, email_attempts = 99 WHERE email_id = $email_id"); - $email_to_logging = escapeSql($email_recipient); - $email_subject_logging = escapeSql($rowq['email_subject']); - logApp("Cron-Mail-Queue", "Error", "Failed to send email: $email_id to $email_to_logging due to invalid recipient address. Email subject was: $email_subject_logging"); - appNotify("Mail", "Failed to send email #$email_id to $email_to_logging due to invalid recipient address: Email subject was: $email_subject_logging"); - continue; - } - - // More intelligent recipient MX check (if not disabled with --no-mx-validation) - $domain = escapeSql(substr($email_recipient, strpos($email_recipient, '@') + 1)); - if (!in_array('--no-mx-validation', $argv) && !checkdnsrr($domain, 'MX')) { - mysqli_query($mysqli, "UPDATE email_queue SET email_status = 2, email_attempts = 99 WHERE email_id = $email_id"); - $email_to_logging = escapeSql($email_recipient); - $email_subject_logging = escapeSql($rowq['email_subject']); - logApp("Cron-Mail-Queue", "Error", "Failed to send email: $email_id to $email_to_logging due to invalid recipient domain (no MX). Email subject was: $email_subject_logging"); - appNotify("Mail", "Failed to send email #$email_id to $email_to_logging due to invalid recipient domain (no MX): Email subject was: $email_subject_logging"); - continue; - } - - try { - sendQueueEmail( - ($config_smtp_provider ?: 'standard_smtp'), - $config_smtp_host, - (int)$config_smtp_port, - (string)$config_smtp_encryption, - (string)$config_smtp_username, - (string)$config_smtp_password, - (string)$email_from, - (string)$email_from_name, - (string)$email_recipient, - (string)$email_recipient_name, - (string)$email_subject, - (string)$email_content, - (string)$email_ics_str, - (string)$config_mail_oauth_client_id, - (string)$config_mail_oauth_client_secret, - (string)$config_mail_oauth_tenant_id, - (string)$config_mail_oauth_refresh_token, - (string)$config_mail_oauth_access_token, - (string)$config_mail_oauth_access_token_expires_at - ); - - // Scrub the body on delivery - it can carry share decryption keys and temporary passwords - mysqli_query($mysqli, "UPDATE email_queue SET email_status = 3, email_sent_at = NOW(), email_attempts = 1, email_content = '', email_cal_str = '' WHERE email_id = $email_id"); - - } catch (Exception $e) { - mysqli_query($mysqli, "UPDATE email_queue SET email_status = 2, email_failed_at = NOW(), email_attempts = 1 WHERE email_id = $email_id"); - - $email_recipient_logging = escapeSql($rowq['email_recipient']); - $email_subject_logging = escapeSql($rowq['email_subject']); - $err = substr("Mailer Error: " . $e->getMessage(), 0, 100) . "..."; - - appNotify("Cron-Mail-Queue", "Failed to send email #$email_id to $email_recipient_logging"); - logApp("Cron-Mail-Queue", "Error", "Failed to send email: $email_id to $email_recipient_logging regarding $email_subject_logging. $err"); - } - } -} - -/** ======================================================================= - * RETRIES: status = 2 (Failed), attempts < 4, wait 30 min - * NOTE: Backoff is `email_failed_at <= NOW() - INTERVAL 30 MINUTE` - * ======================================================================= - */ -$sql_failed_queue = mysqli_query( - $mysqli, - "SELECT * FROM email_queue - WHERE email_status = 2 - AND email_attempts < 4 - AND email_failed_at <= NOW() - INTERVAL 30 MINUTE" -); - -if (mysqli_num_rows($sql_failed_queue) > 0) { - while ($rowf = mysqli_fetch_assoc($sql_failed_queue)) { - $email_id = (int)$rowf['email_id']; - $email_from = $rowf['email_from']; - $email_from_name = $rowf['email_from_name']; - $email_recipient = $rowf['email_recipient']; - $email_recipient_name = $rowf['email_recipient_name']; - $email_subject = $rowf['email_subject']; - $email_content = $rowf['email_content']; - $email_ics_str = $rowf['email_cal_str']; - $email_attempts = (int)$rowf['email_attempts'] + 1; - - // Claim the row - same lock as the send path, from the failed state this time. - mysqli_query($mysqli, "UPDATE email_queue SET email_status = 1 WHERE email_id = $email_id AND email_status = 2"); - if (mysqli_affected_rows($mysqli) !== 1) { - continue; - } - - if (!filter_var($email_recipient, FILTER_VALIDATE_EMAIL)) { - mysqli_query($mysqli, "UPDATE email_queue SET email_status = 2, email_attempts = $email_attempts WHERE email_id = $email_id"); - continue; - } - - try { - sendQueueEmail( - ($config_smtp_provider ?: 'standard_smtp'), - $config_smtp_host, - (int)$config_smtp_port, - (string)$config_smtp_encryption, - (string)$config_smtp_username, - (string)$config_smtp_password, - (string)$email_from, - (string)$email_from_name, - (string)$email_recipient, - (string)$email_recipient_name, - (string)$email_subject, - (string)$email_content, - (string)$email_ics_str, - (string)$config_mail_oauth_client_id, - (string)$config_mail_oauth_client_secret, - (string)$config_mail_oauth_tenant_id, - (string)$config_mail_oauth_refresh_token, - (string)$config_mail_oauth_access_token, - (string)$config_mail_oauth_access_token_expires_at - ); - - // Scrub the body on delivery - it can carry share decryption keys and temporary passwords - mysqli_query($mysqli, "UPDATE email_queue SET email_status = 3, email_sent_at = NOW(), email_attempts = $email_attempts, email_content = '', email_cal_str = '' WHERE email_id = $email_id"); - - } catch (Exception $e) { - mysqli_query($mysqli, "UPDATE email_queue SET email_status = 2, email_failed_at = NOW(), email_attempts = $email_attempts WHERE email_id = $email_id"); - - $email_recipient_logging = escapeSql($rowf['email_recipient']); - $email_subject_logging = escapeSql($rowf['email_subject']); - $err = substr("Mailer Error: " . $e->getMessage(), 0, 100) . "..."; - - logApp("Cron-Mail-Queue", "Error", "Failed to re-send email #$email_id to $email_recipient_logging regarding $email_subject_logging. $err"); - } - } -} +email = $email; + $this->accessToken = $accessToken; + } + public function getOauth64(): string { + $auth = "user={$this->email}\x01auth=Bearer {$this->accessToken}\x01\x01"; + return base64_encode($auth); + } +} + +/** ======================================================================= + * Load settings + * ======================================================================= */ +$sql_settings = mysqli_query($mysqli, "SELECT * FROM settings WHERE company_id = 1"); +$row = mysqli_fetch_assoc($sql_settings); + +$config_enable_cron = intval($row['config_enable_cron']); + +// SMTP baseline +$config_smtp_host = $row['config_smtp_host']; +$config_smtp_username = $row['config_smtp_username']; +$config_smtp_password = $row['config_smtp_password']; +$config_smtp_port = intval($row['config_smtp_port']); +$config_smtp_encryption = $row['config_smtp_encryption']; + +// SMTP provider + shared OAuth fields +$config_smtp_provider = $row['config_smtp_provider']; // 'standard_smtp' | 'google_oauth' | 'microsoft_oauth' +$config_mail_oauth_client_id = $row['config_mail_oauth_client_id'] ?? ''; +$config_mail_oauth_client_secret = $row['config_mail_oauth_client_secret'] ?? ''; +$config_mail_oauth_tenant_id = $row['config_mail_oauth_tenant_id'] ?? ''; +$config_mail_oauth_refresh_token = $row['config_mail_oauth_refresh_token'] ?? ''; +$config_mail_oauth_access_token = $row['config_mail_oauth_access_token'] ?? ''; +$config_mail_oauth_access_token_expires_at = $row['config_mail_oauth_access_token_expires_at'] ?? ''; + +if ($config_enable_cron == 0) { + logApp("Cron-Mail-Queue", "error", "Cron Mail Queue unable to run - cron not enabled in admin settings."); + exit("Cron: is not enabled -- Quitting.."); +} + +if (empty($config_smtp_provider)) { + logApp("Cron-Mail-Queue", "info", "SMTP sending skipped: provider not configured."); + exit(0); +} + +/** ======================================================================= + * Mail OAuth helpers + sender function + * ======================================================================= */ +function tokenIsExpired(?string $expires_at): bool { + if (empty($expires_at)) { + return true; + } + + $ts = strtotime($expires_at); + + if ($ts === false) { + return true; + } + + return ($ts - 60) <= time(); +} + +function httpFormPost(string $url, array $fields): array { + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields, '', '&')); + curl_setopt($ch, CURLOPT_TIMEOUT, 20); + + $raw = curl_exec($ch); + $err = curl_error($ch); + $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + + curl_close($ch); + + return [ + 'ok' => ($raw !== false && $code >= 200 && $code < 300), + 'body' => $raw, + 'code' => $code, + 'err' => $err, + ]; +} + +function persistMailOauthTokens(string $access_token, string $expires_at, ?string $refresh_token = null): void { + global $mysqli; + + $access_token_esc = mysqli_real_escape_string($mysqli, $access_token); + $expires_at_esc = mysqli_real_escape_string($mysqli, $expires_at); + + $refresh_sql = ''; + if (!empty($refresh_token)) { + $refresh_token_esc = mysqli_real_escape_string($mysqli, $refresh_token); + $refresh_sql = ", config_mail_oauth_refresh_token = '{$refresh_token_esc}'"; + } + + mysqli_query($mysqli, "UPDATE settings SET config_mail_oauth_access_token = '{$access_token_esc}', config_mail_oauth_access_token_expires_at = '{$expires_at_esc}'{$refresh_sql} WHERE company_id = 1"); +} + +function refreshMailOauthAccessToken(string $provider, string $oauth_client_id, string $oauth_client_secret, string $oauth_tenant_id, string $oauth_refresh_token): ?array { + $result = null; + $response = null; + + if (!empty($oauth_client_id) && !empty($oauth_client_secret) && !empty($oauth_refresh_token)) { + if ($provider === 'google_oauth') { + $response = httpFormPost(GOOGLE_OAUTH_TOKEN_URL, [ + 'client_id' => $oauth_client_id, + 'client_secret' => $oauth_client_secret, + 'refresh_token' => $oauth_refresh_token, + 'grant_type' => 'refresh_token', + ]); + } elseif ($provider === 'microsoft_oauth' && !empty($oauth_tenant_id)) { + $token_url = MICROSOFT_OAUTH_BASE_URL . rawurlencode($oauth_tenant_id) . "/oauth2/v2.0/token"; + $response = httpFormPost($token_url, [ + 'client_id' => $oauth_client_id, + 'client_secret' => $oauth_client_secret, + 'refresh_token' => $oauth_refresh_token, + 'grant_type' => 'refresh_token', + ]); + } + } + + if (is_array($response) && !empty($response['ok'])) { + $json = json_decode($response['body'], true); + + if (is_array($json) && !empty($json['access_token'])) { + $expires_at = date('Y-m-d H:i:s', time() + (int)($json['expires_in'] ?? 3600)); + $result = [ + 'access_token' => $json['access_token'], + 'expires_at' => $expires_at, + 'refresh_token' => $json['refresh_token'] ?? null, + ]; + } + } + + return $result; +} + +function resolveMailOauthAccessToken(string $provider, string $oauth_client_id, string $oauth_client_secret, string $oauth_tenant_id, string $oauth_refresh_token, string $oauth_access_token, string $oauth_access_token_expires_at): ?string { + if (!empty($oauth_access_token) && !tokenIsExpired($oauth_access_token_expires_at)) { + return $oauth_access_token; + } + + $tokens = refreshMailOauthAccessToken($provider, $oauth_client_id, $oauth_client_secret, $oauth_tenant_id, $oauth_refresh_token); + + if (!is_array($tokens) || empty($tokens['access_token']) || empty($tokens['expires_at'])) { + return null; + } + + persistMailOauthTokens($tokens['access_token'], $tokens['expires_at'], $tokens['refresh_token'] ?? null); + + return $tokens['access_token']; +} + +function sendQueueEmail( + string $provider, + string $host, + int $port, + string $encryption, + string $username, + string $password, + string $from_email, + string $from_name, + string $to_email, + string $to_name, + string $subject, + string $html_body, + string $ics_str, + string $oauth_client_id, + string $oauth_client_secret, + string $oauth_tenant_id, + string $oauth_refresh_token, + string $oauth_access_token, + string $oauth_access_token_expires_at +) { + // Sensible defaults for OAuth providers if fields were left blank + if ($provider === 'google_oauth') { + if (!$host) $host = 'smtp.gmail.com'; + if (!$port) $port = 587; + if (!$encryption) $encryption = 'tls'; + if (!$username) $username = $from_email; + } elseif ($provider === 'microsoft_oauth') { + if (!$host) $host = 'smtp.office365.com'; + if (!$port) $port = 587; + if (!$encryption) $encryption = 'tls'; + if (!$username) $username = $from_email; + } + + $mail = new PHPMailer(true); + $mail->CharSet = "UTF-8"; + $mail->SMTPDebug = 0; + $mail->isSMTP(); + $mail->Host = $host; + $mail->Port = $port; + // Bound the SMTP conversation. Without this an unresponsive mail server can + // hold the cron lock open indefinitely and stall the whole queue. + $mail->Timeout = 30; + + $enc = strtolower($encryption); + if ($enc === '' || $enc === 'none') { + $mail->SMTPAutoTLS = false; + $mail->SMTPSecure = false; + $mail->SMTPOptions = ['ssl' => ['verify_peer' => false, 'verify_peer_name' => false]]; + } else { + $mail->SMTPSecure = $enc; // 'tls' | 'ssl' + } + + if ($provider === 'google_oauth' || $provider === 'microsoft_oauth') { + // XOAUTH2 + $mail->SMTPAuth = true; + $mail->AuthType = 'XOAUTH2'; + $mail->Username = $username; + + $access_token = resolveMailOauthAccessToken( + $provider, + trim($oauth_client_id), + trim($oauth_client_secret), + trim($oauth_tenant_id), + trim($oauth_refresh_token), + trim($oauth_access_token), + trim($oauth_access_token_expires_at) + ); + + if (empty($access_token)) { + throw new Exception("Missing OAuth access token for XOAUTH2 SMTP."); + } + + $mail->setOAuth(new StaticTokenProvider($username, $access_token)); + } else { + // Standard SMTP (with or without auth) + $mail->SMTPAuth = !empty($username); + $mail->Username = $username ?: ''; + $mail->Password = $password ?: ''; + } + + // Recipients & content + $mail->setFrom($from_email, $from_name); + $mail->addAddress($to_email, $to_name); + $mail->isHTML(true); + $mail->Subject = $subject; + $mail->Body = $html_body; + + if (!empty($ics_str)) { + $mail->addStringAttachment($ics_str, 'Scheduled_ticket.ics', 'base64', 'text/calendar'); + } + + $mail->send(); + return true; +} + +/** ======================================================================= + * RECOVER: status = 1 (Sending) left behind by a run that died + * + * Nothing else in the codebase ever selects status 1, so without this a row + * claimed by a run that was killed mid-send stays 'Sending' forever and is never + * delivered. The cron lock above guarantees no other run of this script is in + * progress, so any row still sitting at status 1 is by definition orphaned and + * safe to reclaim. It is moved to failed rather than queued so it inherits the + * retry pass's 30 minute backoff and attempt cap instead of retrying instantly. + * + * This can re-send a message that did go out but died before being marked sent. + * That trade is deliberate: a duplicate is recoverable, an invoice that silently + * never arrives is not. + * ======================================================================= */ +mysqli_query($mysqli, "UPDATE email_queue SET email_status = 2, email_failed_at = NOW(), email_attempts = email_attempts + 1 WHERE email_status = 1"); +$orphaned_emails = mysqli_affected_rows($mysqli); +if ($orphaned_emails > 0) { + logApp("Cron-Mail-Queue", "warning", "Recovered $orphaned_emails email(s) left in a sending state by a previous run - queued for retry."); +} + +/** ======================================================================= + * SEND: status = 0 (Queued) + * ======================================================================= */ +$sql_queue = mysqli_query($mysqli, "SELECT * FROM email_queue WHERE email_status = 0 AND email_queued_at <= NOW()"); + +if (mysqli_num_rows($sql_queue) > 0) { + while ($rowq = mysqli_fetch_assoc($sql_queue)) { + $email_id = (int)$rowq['email_id']; + $email_from = $rowq['email_from']; + $email_from_name = $rowq['email_from_name']; + $email_recipient = $rowq['email_recipient']; + $email_recipient_name = $rowq['email_recipient_name']; + $email_subject = $rowq['email_subject']; + $email_content = $rowq['email_content']; + $email_ics_str = $rowq['email_cal_str']; + + // Check sender + if (!filter_var($email_from, FILTER_VALIDATE_EMAIL)) { + $email_from_logging = escapeSql($rowq['email_from']); + mysqli_query($mysqli, "UPDATE email_queue SET email_status = 2, email_attempts = 99 WHERE email_id = $email_id"); + logApp("Cron-Mail-Queue", "Error", "Failed to send email #$email_id due to invalid sender address: $email_from_logging - check configuration in settings."); + appNotify("Mail", "Failed to send email #$email_id due to invalid sender address"); + continue; + } + + // Claim the row - the conditional UPDATE is the lock. If another run already took + // this email, skip it rather than sending the client a second copy. + mysqli_query($mysqli, "UPDATE email_queue SET email_status = 1 WHERE email_id = $email_id AND email_status = 0"); + if (mysqli_affected_rows($mysqli) !== 1) { + continue; + } + + // Basic recipient syntax check + if (!filter_var($email_recipient, FILTER_VALIDATE_EMAIL)) { + mysqli_query($mysqli, "UPDATE email_queue SET email_status = 2, email_attempts = 99 WHERE email_id = $email_id"); + $email_to_logging = escapeSql($email_recipient); + $email_subject_logging = escapeSql($rowq['email_subject']); + logApp("Cron-Mail-Queue", "Error", "Failed to send email: $email_id to $email_to_logging due to invalid recipient address. Email subject was: $email_subject_logging"); + appNotify("Mail", "Failed to send email #$email_id to $email_to_logging due to invalid recipient address: Email subject was: $email_subject_logging"); + continue; + } + + // More intelligent recipient MX check (if not disabled with --no-mx-validation) + $domain = escapeSql(substr($email_recipient, strpos($email_recipient, '@') + 1)); + if (!in_array('--no-mx-validation', $argv) && !checkdnsrr($domain, 'MX')) { + mysqli_query($mysqli, "UPDATE email_queue SET email_status = 2, email_attempts = 99 WHERE email_id = $email_id"); + $email_to_logging = escapeSql($email_recipient); + $email_subject_logging = escapeSql($rowq['email_subject']); + logApp("Cron-Mail-Queue", "Error", "Failed to send email: $email_id to $email_to_logging due to invalid recipient domain (no MX). Email subject was: $email_subject_logging"); + appNotify("Mail", "Failed to send email #$email_id to $email_to_logging due to invalid recipient domain (no MX): Email subject was: $email_subject_logging"); + continue; + } + + try { + sendQueueEmail( + ($config_smtp_provider ?: 'standard_smtp'), + $config_smtp_host, + (int)$config_smtp_port, + (string)$config_smtp_encryption, + (string)$config_smtp_username, + (string)$config_smtp_password, + (string)$email_from, + (string)$email_from_name, + (string)$email_recipient, + (string)$email_recipient_name, + (string)$email_subject, + (string)$email_content, + (string)$email_ics_str, + (string)$config_mail_oauth_client_id, + (string)$config_mail_oauth_client_secret, + (string)$config_mail_oauth_tenant_id, + (string)$config_mail_oauth_refresh_token, + (string)$config_mail_oauth_access_token, + (string)$config_mail_oauth_access_token_expires_at + ); + + // Scrub the body on delivery - it can carry share decryption keys and temporary passwords + mysqli_query($mysqli, "UPDATE email_queue SET email_status = 3, email_sent_at = NOW(), email_attempts = 1, email_content = '', email_cal_str = '' WHERE email_id = $email_id"); + + } catch (Exception $e) { + mysqli_query($mysqli, "UPDATE email_queue SET email_status = 2, email_failed_at = NOW(), email_attempts = 1 WHERE email_id = $email_id"); + + $email_recipient_logging = escapeSql($rowq['email_recipient']); + $email_subject_logging = escapeSql($rowq['email_subject']); + $err = substr("Mailer Error: " . $e->getMessage(), 0, 100) . "..."; + + appNotify("Cron-Mail-Queue", "Failed to send email #$email_id to $email_recipient_logging"); + logApp("Cron-Mail-Queue", "Error", "Failed to send email: $email_id to $email_recipient_logging regarding $email_subject_logging. $err"); + } + } +} + +/** ======================================================================= + * RETRIES: status = 2 (Failed), attempts < 4, wait 30 min + * NOTE: Backoff is `email_failed_at <= NOW() - INTERVAL 30 MINUTE` + * ======================================================================= + */ +$sql_failed_queue = mysqli_query( + $mysqli, + "SELECT * FROM email_queue + WHERE email_status = 2 + AND email_attempts < 4 + AND email_failed_at <= NOW() - INTERVAL 30 MINUTE" +); + +if (mysqli_num_rows($sql_failed_queue) > 0) { + while ($rowf = mysqli_fetch_assoc($sql_failed_queue)) { + $email_id = (int)$rowf['email_id']; + $email_from = $rowf['email_from']; + $email_from_name = $rowf['email_from_name']; + $email_recipient = $rowf['email_recipient']; + $email_recipient_name = $rowf['email_recipient_name']; + $email_subject = $rowf['email_subject']; + $email_content = $rowf['email_content']; + $email_ics_str = $rowf['email_cal_str']; + $email_attempts = (int)$rowf['email_attempts'] + 1; + + // Claim the row - same lock as the send path, from the failed state this time. + mysqli_query($mysqli, "UPDATE email_queue SET email_status = 1 WHERE email_id = $email_id AND email_status = 2"); + if (mysqli_affected_rows($mysqli) !== 1) { + continue; + } + + if (!filter_var($email_recipient, FILTER_VALIDATE_EMAIL)) { + mysqli_query($mysqli, "UPDATE email_queue SET email_status = 2, email_attempts = $email_attempts WHERE email_id = $email_id"); + continue; + } + + try { + sendQueueEmail( + ($config_smtp_provider ?: 'standard_smtp'), + $config_smtp_host, + (int)$config_smtp_port, + (string)$config_smtp_encryption, + (string)$config_smtp_username, + (string)$config_smtp_password, + (string)$email_from, + (string)$email_from_name, + (string)$email_recipient, + (string)$email_recipient_name, + (string)$email_subject, + (string)$email_content, + (string)$email_ics_str, + (string)$config_mail_oauth_client_id, + (string)$config_mail_oauth_client_secret, + (string)$config_mail_oauth_tenant_id, + (string)$config_mail_oauth_refresh_token, + (string)$config_mail_oauth_access_token, + (string)$config_mail_oauth_access_token_expires_at + ); + + // Scrub the body on delivery - it can carry share decryption keys and temporary passwords + mysqli_query($mysqli, "UPDATE email_queue SET email_status = 3, email_sent_at = NOW(), email_attempts = $email_attempts, email_content = '', email_cal_str = '' WHERE email_id = $email_id"); + + } catch (Exception $e) { + mysqli_query($mysqli, "UPDATE email_queue SET email_status = 2, email_failed_at = NOW(), email_attempts = $email_attempts WHERE email_id = $email_id"); + + $email_recipient_logging = escapeSql($rowf['email_recipient']); + $email_subject_logging = escapeSql($rowf['email_subject']); + $err = substr("Mailer Error: " . $e->getMessage(), 0, 100) . "..."; + + logApp("Cron-Mail-Queue", "Error", "Failed to re-send email #$email_id to $email_recipient_logging regarding $email_subject_logging. $err"); + } + } +} diff --git a/js/app.js b/js/app.js index 41ed075b0..36d15e1ac 100644 --- a/js/app.js +++ b/js/app.js @@ -1,412 +1,412 @@ -$(document).ready(function() { - // Prevents resubmit on forms - if (window.history.replaceState) { - window.history.replaceState(null, null, window.location.href); - } - - // Slide alert up after 4 secs - $("#alert").fadeTo(5000, 500).slideUp(500, function() { - $("#alert").slideUp(500); - }); - - // Initialize Select2 Elements - $('.select2').select2({ - theme: 'bootstrap4', - }); - - // Initialize TinyMCE - tinymce.init({ - selector: '.tinymce-simple', - browser_spellcheck: true, - contextmenu: false, - resize: true, - min_height: 300, - max_height: 600, - promotion: false, - branding: false, - menubar: false, - statusbar: false, - toolbar: [ - { name: 'styles', items: ['styles'] }, - { name: 'formatting', items: ['bold', 'italic', 'forecolor'] }, - { name: 'link', items: ['link'] }, - { name: 'lists', items: ['bullist', 'numlist'] }, - { name: 'alignment', items: ['alignleft', 'aligncenter', 'alignright', 'alignjustify'] }, - { name: 'indentation', items: ['outdent', 'indent'] }, - { name: 'table', items: ['table'] }, - { name: 'extra', items: ['code', 'fullscreen'] } - ], - mobile: { - menubar: false, - plugins: 'autosave lists autolink', - toolbar: 'bold italic styles' - }, - convert_urls: false, - plugins: 'link image lists table code codesample fullscreen autoresize', - setup: function (editor) { - editor.on('init', function() { - window.onbeforeunload = function() { - // If editor is dirty AND not inside a visible modal → warn - const inVisibleModal = editor.getContainer()?.closest('.modal.show'); - if (!inVisibleModal && editor.isDirty()) { - return "You have unsaved changes. Are you sure you want to leave?"; - } - }; - - // When the modal closes, mark editor clean - const modal = editor.getContainer()?.closest('.modal'); - if (modal) { - modal.addEventListener('hidden.bs.modal', () => { - editor.undoManager.clear(); - editor.setDirty(false); - }); - } - }); - }, - license_key: 'gpl' - }); - - // Initialize TinyMCE with AI - tinymce.init({ - selector: '.tinymce', - browser_spellcheck: true, - contextmenu: false, - resize: true, - min_height: 300, - max_height: 600, - promotion: false, - branding: false, - menubar: false, - statusbar: false, - toolbar: [ - { name: 'styles', items: ['styles'] }, - { name: 'formatting', items: ['bold', 'italic', 'forecolor'] }, - { name: 'link', items: ['link'] }, - { name: 'lists', items: ['bullist', 'numlist'] }, - { name: 'alignment', items: ['alignleft', 'aligncenter', 'alignright', 'alignjustify'] }, - { name: 'indentation', items: ['outdent', 'indent'] }, - { name: 'table', items: ['table'] }, - { name: 'extra', items: ['code', 'fullscreen'] }, - { name: 'ai', items: ['reword', 'undo', 'redo'] } - ], - mobile: { - menubar: false, - plugins: 'autosave lists autolink', - toolbar: 'bold italic styles' - }, - convert_urls: false, - plugins: 'link image lists table code codesample fullscreen autoresize', - license_key: 'gpl', - setup: function(editor) { - editor.on('init', function() { - window.onbeforeunload = function() { - // If editor is dirty AND not inside a visible modal → warn - const inVisibleModal = editor.getContainer()?.closest('.modal.show'); - if (!inVisibleModal && editor.isDirty()) { - return "You have unsaved changes. Are you sure you want to leave?"; - } - }; - - // When the modal closes, mark editor clean - const modal = editor.getContainer()?.closest('.modal'); - if (modal) { - modal.addEventListener('hidden.bs.modal', () => { - editor.undoManager.clear(); - editor.setDirty(false); - }); - } - }); - - var rewordButtonApi; - - editor.ui.registry.addButton('reword', { - icon: 'ai', - tooltip: 'Reword Text', - onAction: function() { - var content = editor.getContent(); - - // Disable the Reword button - rewordButtonApi.setEnabled(false); - - // Show the progress indicator - editor.setProgressState(true); - - fetch('ajax.php?ai_reword', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ text: content }), - }) - .then(response => { - if (!response.ok) { - throw new Error('Network response was not ok'); - } - return response.json(); - }) - .then(data => { - editor.undoManager.transact(function() { - editor.setContent(data.rewordedText || 'Error: Could not reword the text.'); - }); - - editor.setProgressState(false); - rewordButtonApi.setEnabled(true); - - editor.notificationManager.open({ - text: 'Text reworded successfully!', - type: 'success', - timeout: 3000 - }); - }) - .catch(error => { - console.error('Error:', error); - editor.setProgressState(false); - rewordButtonApi.setEnabled(true); - editor.notificationManager.open({ - text: 'An error occurred while rewording the text.', - type: 'error', - timeout: 5000 - }); - }); - }, - onSetup: function(buttonApi) { - rewordButtonApi = buttonApi; - return function() {}; - } - }); - } - }); - - // Initialize TinyMCE AI for Tickets - tinymce.init({ - selector: '.tinymceTicket', - browser_spellcheck: true, - contextmenu: false, - resize: true, - min_height: 200, - max_height: 600, - promotion: false, - branding: false, - menubar: false, - statusbar: false, - toolbar: [ - { name: 'styles', items: ['styles'] }, - { name: 'formatting', items: ['bold', 'italic', 'forecolor'] }, - { name: 'link', items: ['link'] }, - { name: 'lists', items: ['bullist', 'numlist'] }, - { name: 'indentation', items: ['outdent', 'indent'] }, - { name: 'ai', items: ['reword', 'undo', 'redo'] }, - { name: 'custom', items: ['redactButton'] }, - { name: 'code', items: ['code'] }, - ], - mobile: { - menubar: false, - toolbar: [ - { name: 'styles', items: ['styles'] }, - { name: 'formatting', items: ['bold', 'italic', 'forecolor'] }, - { name: 'link', items: ['link'] }, - { name: 'lists', items: ['bullist', 'numlist'] }, - { name: 'indentation', items: ['outdent', 'indent'] }, - { name: 'ai', items: ['reword', 'undo', 'redo'] }, - { name: 'custom', items: ['redactButton'] }, - { name: 'code', items: ['code'] }, - ], - }, - convert_urls: false, - plugins: 'link image lists table code codesample fullscreen autoresize code', - license_key: 'gpl', - setup: function(editor) { - editor.on('init', function() { - window.onbeforeunload = function() { - // If editor is dirty AND not inside a visible modal → warn - const inVisibleModal = editor.getContainer()?.closest('.modal.show'); - if (!inVisibleModal && editor.isDirty()) { - return "You have unsaved changes. Are you sure you want to leave?"; - } - }; - - // When the modal closes, mark editor clean - const modal = editor.getContainer()?.closest('.modal'); - if (modal) { - modal.addEventListener('hidden.bs.modal', () => { - editor.undoManager.clear(); - editor.setDirty(false); - }); - } - }); - - var rewordButtonApi; - - editor.ui.registry.addButton('reword', { - icon: 'ai', - tooltip: 'Reword Text', - onAction: function() { - var content = editor.getContent(); - rewordButtonApi.setEnabled(false); - editor.setProgressState(true); - - fetch('ajax.php?ai_reword', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ text: content }), - }) - .then(response => { - if (!response.ok) throw new Error('Network response was not ok'); - return response.json(); - }) - .then(data => { - editor.undoManager.transact(function() { - editor.setContent(data.rewordedText || 'Error: Could not reword the text.'); - }); - editor.setProgressState(false); - rewordButtonApi.setEnabled(true); - editor.notificationManager.open({ - text: 'Text reworded successfully!', - type: 'success', - timeout: 3000 - }); - }) - .catch(error => { - console.error('Error:', error); - editor.setProgressState(false); - rewordButtonApi.setEnabled(true); - editor.notificationManager.open({ - text: 'An error occurred while rewording the text.', - type: 'error', - timeout: 5000 - }); - }); - }, - onSetup: function(buttonApi) { - rewordButtonApi = buttonApi; - return function() {}; - } - }); - - editor.ui.registry.addButton('redactButton', { - icon: 'permanent-pen', - tooltip: 'Redact Text', - onAction: function() { - var selectedText = editor.selection.getContent({ format: 'text' }); - if (selectedText) { - var newContent = '[REDACTED]'; - editor.selection.setContent(newContent); - } else { - alert('Please select a word to redact'); - } - } - }); - } - }); - - // Initialize TinyMCE Redact-only - tinymce.init({ - selector: '.tinymceRedact', - browser_spellcheck: true, - contextmenu: false, - resize: true, - min_height: 300, - max_height: 600, - promotion: false, - branding: false, - menubar: false, - statusbar: false, - toolbar: 'redactButton', - mobile: { - menubar: false, - plugins: 'autosave lists autolink', - toolbar: 'redactButton' - }, - convert_urls: false, - plugins: 'link image lists table code fullscreen autoresize', - license_key: 'gpl', - setup: function(editor) { - - editor.on('init', function() { - window.onbeforeunload = function() { - // If editor is dirty AND not inside a visible modal → warn - const inVisibleModal = editor.getContainer()?.closest('.modal.show'); - if (!inVisibleModal && editor.isDirty()) { - return "You have unsaved changes. Are you sure you want to leave?"; - } - }; - - // When the modal closes, mark editor clean - const modal = editor.getContainer()?.closest('.modal'); - if (modal) { - modal.addEventListener('hidden.bs.modal', () => { - editor.undoManager.clear(); - editor.setDirty(false); - }); - } - }); - - editor.on('keydown', function(e) { - e.preventDefault(); - }); - - editor.ui.registry.addButton('redactButton', { - icon: 'permanent-pen', - tooltip: 'Redact', - text: 'REDACT', - onAction: function() { - var selectedText = editor.selection.getContent({ format: 'text' }); - if (selectedText) { - var newContent = '[REDACTED]'; - editor.selection.setContent(newContent); - } else { - alert('Please select a word to redact'); - } - } - }); - } - }); - - // DateTime - $('.datetimepicker').datetimepicker(); - - // Data Input Mask - $('[data-mask]').inputmask(); - - // ClipboardJS fix for Bootstrap modals - $.fn.modal.Constructor.prototype._enforceFocus = function() {}; - - // Tooltip - $('button').tooltip({ - trigger: 'click', - placement: 'bottom' - }); - - function setTooltip(btn, message) { - $(btn).tooltip('hide') - .attr('data-original-title', message) - .tooltip('show'); - } - - function hideTooltip(btn) { - setTimeout(function() { - $(btn).tooltip('hide'); - }, 1000); - } - - // Clipboard - var clipboard = new ClipboardJS('.clipboardjs'); - - clipboard.on('success', function(e) { - setTooltip(e.trigger, 'Copied!'); - hideTooltip(e.trigger); - }); - - clipboard.on('error', function(e) { - setTooltip(e.trigger, 'Failed!'); - hideTooltip(e.trigger); - }); - - // Enable Popovers - $(function() { - $('[data-toggle="popover"]').popover(); - }); - - // Data Tables - new DataTable('.dataTables'); -}); +$(document).ready(function() { + // Prevents resubmit on forms + if (window.history.replaceState) { + window.history.replaceState(null, null, window.location.href); + } + + // Slide alert up after 4 secs + $("#alert").fadeTo(5000, 500).slideUp(500, function() { + $("#alert").slideUp(500); + }); + + // Initialize Select2 Elements + $('.select2').select2({ + theme: 'bootstrap4', + }); + + // Initialize TinyMCE + tinymce.init({ + selector: '.tinymce-simple', + browser_spellcheck: true, + contextmenu: false, + resize: true, + min_height: 300, + max_height: 600, + promotion: false, + branding: false, + menubar: false, + statusbar: false, + toolbar: [ + { name: 'styles', items: ['styles'] }, + { name: 'formatting', items: ['bold', 'italic', 'forecolor'] }, + { name: 'link', items: ['link'] }, + { name: 'lists', items: ['bullist', 'numlist'] }, + { name: 'alignment', items: ['alignleft', 'aligncenter', 'alignright', 'alignjustify'] }, + { name: 'indentation', items: ['outdent', 'indent'] }, + { name: 'table', items: ['table'] }, + { name: 'extra', items: ['code', 'fullscreen'] } + ], + mobile: { + menubar: false, + plugins: 'autosave lists autolink', + toolbar: 'bold italic styles' + }, + convert_urls: false, + plugins: 'link image lists table code codesample fullscreen autoresize', + setup: function (editor) { + editor.on('init', function() { + window.onbeforeunload = function() { + // If editor is dirty AND not inside a visible modal → warn + const inVisibleModal = editor.getContainer()?.closest('.modal.show'); + if (!inVisibleModal && editor.isDirty()) { + return "You have unsaved changes. Are you sure you want to leave?"; + } + }; + + // When the modal closes, mark editor clean + const modal = editor.getContainer()?.closest('.modal'); + if (modal) { + modal.addEventListener('hidden.bs.modal', () => { + editor.undoManager.clear(); + editor.setDirty(false); + }); + } + }); + }, + license_key: 'gpl' + }); + + // Initialize TinyMCE with AI + tinymce.init({ + selector: '.tinymce', + browser_spellcheck: true, + contextmenu: false, + resize: true, + min_height: 300, + max_height: 600, + promotion: false, + branding: false, + menubar: false, + statusbar: false, + toolbar: [ + { name: 'styles', items: ['styles'] }, + { name: 'formatting', items: ['bold', 'italic', 'forecolor'] }, + { name: 'link', items: ['link'] }, + { name: 'lists', items: ['bullist', 'numlist'] }, + { name: 'alignment', items: ['alignleft', 'aligncenter', 'alignright', 'alignjustify'] }, + { name: 'indentation', items: ['outdent', 'indent'] }, + { name: 'table', items: ['table'] }, + { name: 'extra', items: ['code', 'fullscreen'] }, + { name: 'ai', items: ['reword', 'undo', 'redo'] } + ], + mobile: { + menubar: false, + plugins: 'autosave lists autolink', + toolbar: 'bold italic styles' + }, + convert_urls: false, + plugins: 'link image lists table code codesample fullscreen autoresize', + license_key: 'gpl', + setup: function(editor) { + editor.on('init', function() { + window.onbeforeunload = function() { + // If editor is dirty AND not inside a visible modal → warn + const inVisibleModal = editor.getContainer()?.closest('.modal.show'); + if (!inVisibleModal && editor.isDirty()) { + return "You have unsaved changes. Are you sure you want to leave?"; + } + }; + + // When the modal closes, mark editor clean + const modal = editor.getContainer()?.closest('.modal'); + if (modal) { + modal.addEventListener('hidden.bs.modal', () => { + editor.undoManager.clear(); + editor.setDirty(false); + }); + } + }); + + var rewordButtonApi; + + editor.ui.registry.addButton('reword', { + icon: 'ai', + tooltip: 'Reword Text', + onAction: function() { + var content = editor.getContent(); + + // Disable the Reword button + rewordButtonApi.setEnabled(false); + + // Show the progress indicator + editor.setProgressState(true); + + fetch('ajax.php?ai_reword', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ text: content }), + }) + .then(response => { + if (!response.ok) { + throw new Error('Network response was not ok'); + } + return response.json(); + }) + .then(data => { + editor.undoManager.transact(function() { + editor.setContent(data.rewordedText || 'Error: Could not reword the text.'); + }); + + editor.setProgressState(false); + rewordButtonApi.setEnabled(true); + + editor.notificationManager.open({ + text: 'Text reworded successfully!', + type: 'success', + timeout: 3000 + }); + }) + .catch(error => { + console.error('Error:', error); + editor.setProgressState(false); + rewordButtonApi.setEnabled(true); + editor.notificationManager.open({ + text: 'An error occurred while rewording the text.', + type: 'error', + timeout: 5000 + }); + }); + }, + onSetup: function(buttonApi) { + rewordButtonApi = buttonApi; + return function() {}; + } + }); + } + }); + + // Initialize TinyMCE AI for Tickets + tinymce.init({ + selector: '.tinymceTicket', + browser_spellcheck: true, + contextmenu: false, + resize: true, + min_height: 200, + max_height: 600, + promotion: false, + branding: false, + menubar: false, + statusbar: false, + toolbar: [ + { name: 'styles', items: ['styles'] }, + { name: 'formatting', items: ['bold', 'italic', 'forecolor'] }, + { name: 'link', items: ['link'] }, + { name: 'lists', items: ['bullist', 'numlist'] }, + { name: 'indentation', items: ['outdent', 'indent'] }, + { name: 'ai', items: ['reword', 'undo', 'redo'] }, + { name: 'custom', items: ['redactButton'] }, + { name: 'code', items: ['code'] }, + ], + mobile: { + menubar: false, + toolbar: [ + { name: 'styles', items: ['styles'] }, + { name: 'formatting', items: ['bold', 'italic', 'forecolor'] }, + { name: 'link', items: ['link'] }, + { name: 'lists', items: ['bullist', 'numlist'] }, + { name: 'indentation', items: ['outdent', 'indent'] }, + { name: 'ai', items: ['reword', 'undo', 'redo'] }, + { name: 'custom', items: ['redactButton'] }, + { name: 'code', items: ['code'] }, + ], + }, + convert_urls: false, + plugins: 'link image lists table code codesample fullscreen autoresize code', + license_key: 'gpl', + setup: function(editor) { + editor.on('init', function() { + window.onbeforeunload = function() { + // If editor is dirty AND not inside a visible modal → warn + const inVisibleModal = editor.getContainer()?.closest('.modal.show'); + if (!inVisibleModal && editor.isDirty()) { + return "You have unsaved changes. Are you sure you want to leave?"; + } + }; + + // When the modal closes, mark editor clean + const modal = editor.getContainer()?.closest('.modal'); + if (modal) { + modal.addEventListener('hidden.bs.modal', () => { + editor.undoManager.clear(); + editor.setDirty(false); + }); + } + }); + + var rewordButtonApi; + + editor.ui.registry.addButton('reword', { + icon: 'ai', + tooltip: 'Reword Text', + onAction: function() { + var content = editor.getContent(); + rewordButtonApi.setEnabled(false); + editor.setProgressState(true); + + fetch('ajax.php?ai_reword', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ text: content }), + }) + .then(response => { + if (!response.ok) throw new Error('Network response was not ok'); + return response.json(); + }) + .then(data => { + editor.undoManager.transact(function() { + editor.setContent(data.rewordedText || 'Error: Could not reword the text.'); + }); + editor.setProgressState(false); + rewordButtonApi.setEnabled(true); + editor.notificationManager.open({ + text: 'Text reworded successfully!', + type: 'success', + timeout: 3000 + }); + }) + .catch(error => { + console.error('Error:', error); + editor.setProgressState(false); + rewordButtonApi.setEnabled(true); + editor.notificationManager.open({ + text: 'An error occurred while rewording the text.', + type: 'error', + timeout: 5000 + }); + }); + }, + onSetup: function(buttonApi) { + rewordButtonApi = buttonApi; + return function() {}; + } + }); + + editor.ui.registry.addButton('redactButton', { + icon: 'permanent-pen', + tooltip: 'Redact Text', + onAction: function() { + var selectedText = editor.selection.getContent({ format: 'text' }); + if (selectedText) { + var newContent = '[REDACTED]'; + editor.selection.setContent(newContent); + } else { + alert('Please select a word to redact'); + } + } + }); + } + }); + + // Initialize TinyMCE Redact-only + tinymce.init({ + selector: '.tinymceRedact', + browser_spellcheck: true, + contextmenu: false, + resize: true, + min_height: 300, + max_height: 600, + promotion: false, + branding: false, + menubar: false, + statusbar: false, + toolbar: 'redactButton', + mobile: { + menubar: false, + plugins: 'autosave lists autolink', + toolbar: 'redactButton' + }, + convert_urls: false, + plugins: 'link image lists table code fullscreen autoresize', + license_key: 'gpl', + setup: function(editor) { + + editor.on('init', function() { + window.onbeforeunload = function() { + // If editor is dirty AND not inside a visible modal → warn + const inVisibleModal = editor.getContainer()?.closest('.modal.show'); + if (!inVisibleModal && editor.isDirty()) { + return "You have unsaved changes. Are you sure you want to leave?"; + } + }; + + // When the modal closes, mark editor clean + const modal = editor.getContainer()?.closest('.modal'); + if (modal) { + modal.addEventListener('hidden.bs.modal', () => { + editor.undoManager.clear(); + editor.setDirty(false); + }); + } + }); + + editor.on('keydown', function(e) { + e.preventDefault(); + }); + + editor.ui.registry.addButton('redactButton', { + icon: 'permanent-pen', + tooltip: 'Redact', + text: 'REDACT', + onAction: function() { + var selectedText = editor.selection.getContent({ format: 'text' }); + if (selectedText) { + var newContent = '[REDACTED]'; + editor.selection.setContent(newContent); + } else { + alert('Please select a word to redact'); + } + } + }); + } + }); + + // DateTime + $('.datetimepicker').datetimepicker(); + + // Data Input Mask + $('[data-mask]').inputmask(); + + // ClipboardJS fix for Bootstrap modals + $.fn.modal.Constructor.prototype._enforceFocus = function() {}; + + // Tooltip + $('button').tooltip({ + trigger: 'click', + placement: 'bottom' + }); + + function setTooltip(btn, message) { + $(btn).tooltip('hide') + .attr('data-original-title', message) + .tooltip('show'); + } + + function hideTooltip(btn) { + setTimeout(function() { + $(btn).tooltip('hide'); + }, 1000); + } + + // Clipboard + var clipboard = new ClipboardJS('.clipboardjs'); + + clipboard.on('success', function(e) { + setTooltip(e.trigger, 'Copied!'); + hideTooltip(e.trigger); + }); + + clipboard.on('error', function(e) { + setTooltip(e.trigger, 'Failed!'); + hideTooltip(e.trigger); + }); + + // Enable Popovers + $(function() { + $('[data-toggle="popover"]').popover(); + }); + + // Data Tables + new DataTable('.dataTables'); +}); diff --git a/normalize_eol.sh b/normalize_eol.sh new file mode 100644 index 000000000..57a64d5c8 --- /dev/null +++ b/normalize_eol.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +# +# ITFlow - one-shot CRLF -> LF normalization. +# +# Converts every tracked text file outside libs/ to LF. Vendored libraries are +# left byte-for-byte as shipped upstream (CONTRIBUTING.md: libs/ is replaced +# wholesale, never edited), and binary assets are skipped outright. +# +# Run once, from the repo root, alongside adding .gitattributes. After that +# .gitattributes keeps new files in line and this script should be a no-op. +# +set -euo pipefail + +cd "$(git rev-parse --show-toplevel)" + +BINARY_RE='\.(png|gif|jpg|jpeg|webp|ico|icc|woff|woff2|ttf|eot|crt|ser|z)$' + +mapfile -t candidates < <(git ls-files | grep -v '^libs/' | grep -viE "$BINARY_RE") + +changed=0 +for f in "${candidates[@]}"; do + [ -f "$f" ] || continue + # only touch files that actually contain a CR + if LC_ALL=C grep -qU $'\r' "$f" 2>/dev/null; then + LC_ALL=C sed -i 's/\r$//' "$f" + changed=$((changed + 1)) + fi +done + +echo "normalized $changed file(s)" diff --git a/scripts/normalize_eol.sh b/scripts/normalize_eol.sh new file mode 100755 index 000000000..57a64d5c8 --- /dev/null +++ b/scripts/normalize_eol.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +# +# ITFlow - one-shot CRLF -> LF normalization. +# +# Converts every tracked text file outside libs/ to LF. Vendored libraries are +# left byte-for-byte as shipped upstream (CONTRIBUTING.md: libs/ is replaced +# wholesale, never edited), and binary assets are skipped outright. +# +# Run once, from the repo root, alongside adding .gitattributes. After that +# .gitattributes keeps new files in line and this script should be a no-op. +# +set -euo pipefail + +cd "$(git rev-parse --show-toplevel)" + +BINARY_RE='\.(png|gif|jpg|jpeg|webp|ico|icc|woff|woff2|ttf|eot|crt|ser|z)$' + +mapfile -t candidates < <(git ls-files | grep -v '^libs/' | grep -viE "$BINARY_RE") + +changed=0 +for f in "${candidates[@]}"; do + [ -f "$f" ] || continue + # only touch files that actually contain a CR + if LC_ALL=C grep -qU $'\r' "$f" 2>/dev/null; then + LC_ALL=C sed -i 's/\r$//' "$f" + changed=$((changed + 1)) + fi +done + +echo "normalized $changed file(s)" From 78e7e1c49e0987d49bac2927d5440decd973da50 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Tue, 28 Jul 2026 17:46:39 -0400 Subject: [PATCH 159/241] Remove Normalize Scripts --- normalize_eol.sh | 30 ------------------------------ scripts/normalize_eol.sh | 30 ------------------------------ 2 files changed, 60 deletions(-) delete mode 100644 normalize_eol.sh delete mode 100755 scripts/normalize_eol.sh diff --git a/normalize_eol.sh b/normalize_eol.sh deleted file mode 100644 index 57a64d5c8..000000000 --- a/normalize_eol.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env bash -# -# ITFlow - one-shot CRLF -> LF normalization. -# -# Converts every tracked text file outside libs/ to LF. Vendored libraries are -# left byte-for-byte as shipped upstream (CONTRIBUTING.md: libs/ is replaced -# wholesale, never edited), and binary assets are skipped outright. -# -# Run once, from the repo root, alongside adding .gitattributes. After that -# .gitattributes keeps new files in line and this script should be a no-op. -# -set -euo pipefail - -cd "$(git rev-parse --show-toplevel)" - -BINARY_RE='\.(png|gif|jpg|jpeg|webp|ico|icc|woff|woff2|ttf|eot|crt|ser|z)$' - -mapfile -t candidates < <(git ls-files | grep -v '^libs/' | grep -viE "$BINARY_RE") - -changed=0 -for f in "${candidates[@]}"; do - [ -f "$f" ] || continue - # only touch files that actually contain a CR - if LC_ALL=C grep -qU $'\r' "$f" 2>/dev/null; then - LC_ALL=C sed -i 's/\r$//' "$f" - changed=$((changed + 1)) - fi -done - -echo "normalized $changed file(s)" diff --git a/scripts/normalize_eol.sh b/scripts/normalize_eol.sh deleted file mode 100755 index 57a64d5c8..000000000 --- a/scripts/normalize_eol.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env bash -# -# ITFlow - one-shot CRLF -> LF normalization. -# -# Converts every tracked text file outside libs/ to LF. Vendored libraries are -# left byte-for-byte as shipped upstream (CONTRIBUTING.md: libs/ is replaced -# wholesale, never edited), and binary assets are skipped outright. -# -# Run once, from the repo root, alongside adding .gitattributes. After that -# .gitattributes keeps new files in line and this script should be a no-op. -# -set -euo pipefail - -cd "$(git rev-parse --show-toplevel)" - -BINARY_RE='\.(png|gif|jpg|jpeg|webp|ico|icc|woff|woff2|ttf|eot|crt|ser|z)$' - -mapfile -t candidates < <(git ls-files | grep -v '^libs/' | grep -viE "$BINARY_RE") - -changed=0 -for f in "${candidates[@]}"; do - [ -f "$f" ] || continue - # only touch files that actually contain a CR - if LC_ALL=C grep -qU $'\r' "$f" 2>/dev/null; then - LC_ALL=C sed -i 's/\r$//' "$f" - changed=$((changed + 1)) - fi -done - -echo "normalized $changed file(s)" From 556ab22c792ac5622efc4edb38721ee666b52db5 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Tue, 28 Jul 2026 17:53:13 -0400 Subject: [PATCH 160/241] Enfoce Sales Permission Read on products export --- agent/post/product.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/agent/post/product.php b/agent/post/product.php index ef40a9978..3d4a9d55d 100644 --- a/agent/post/product.php +++ b/agent/post/product.php @@ -248,6 +248,8 @@ if (isset($_POST['export_products_csv'])) { validateCSRFToken(); + enforceUserPermission('module_sales'); + //get records from database $sql = mysqli_query($mysqli,"SELECT * FROM products LEFT JOIN categories ON product_category_id = category_id From 0031438bce9add396784f51b9cfffcd434731bdd Mon Sep 17 00:00:00 2001 From: johnnyq Date: Tue, 28 Jul 2026 18:12:42 -0400 Subject: [PATCH 161/241] Update Contrubuting --- CONTRIBUTING.md | 41 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0acad1b2b..d7fff6453 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -90,11 +90,18 @@ If you write a query and even one variable in it skipped these, that is a SQL in ### 2. Every state-changing action validates CSRF. -`validateCSRFToken($_POST['csrf_token'])` (or `$_GET['csrf_token']` for link-style actions) is the first line of every action block. Forms and action links must include the token; copy how existing modals do it. +`validateCSRFToken()` is the first line of every action block. It takes no argument — it reads `csrf_token` from `$_POST`, then `$_GET`, itself, so the same call covers form posts and link-style actions. (The signature still accepts an explicit token for callers that need one, but no call site in the tree passes one; use the bare form.) Forms and action links must include the token; copy how existing modals do it. ### 3. Every action enforces permissions. -`enforceUserPermission('module_x', level)` where level is `1` = read, `2` = write, `3` = full/delete. Current modules: `module_client`, `module_support`, `module_sales`, `module_financial`, `module_credential`, `module_reporting`. Read pages enforce level 1; create/edit enforce 2; destructive actions enforce 3. Admin pages have their own check via the admin include chain. +`enforceUserPermission('module_x', level)` where level is `1` = read, `2` = write, `3` = full/delete. Current modules: `module_client`, `module_support`, `module_sales`, `module_financial`, `module_credential`, `module_reporting`. Read pages enforce level 1; create/edit enforce 2; destructive actions enforce 3. CSV/PDF exports are reads — gate them with the bare one-argument form, e.g. `enforceUserPermission('module_sales')`. + +Two portals are gated differently, which is why their handlers look like they are missing the call: + +- **Admin.** `admin/post.php` only loads anything in `admin/post/` when `$session_is_admin` is set, so admin handlers inherit the gate from the dispatcher and do not call `enforceUserPermission()` themselves. +- **Client portal.** `client/post.php` is a single file of action blocks rather than a dispatcher, and gates on the contact's own capabilities with `enforceContactCan('accounting'|'contacts'|'itdoc')`. + +Everywhere else — anything under `agent/post/` — the call belongs in the block. ### 4. Client scoping is enforced, not assumed. @@ -102,11 +109,27 @@ After loading a record, call `enforceClientAccess()` (optionally with the record ### 5. Escape on output. -Anything echoed into HTML goes through `escapeHtml()`. `escapeSql()` on the way in is **not** output escaping — data can enter the DB through other paths (API, email parser, older versions). Rich-text fields (TinyMCE content) are the exception and have their own handling; follow the existing pattern for the specific field rather than inventing one. +Anything rendered into HTML goes through `escapeHtml()`. `escapeSql()` on the way in is **not** output escaping — data can enter the DB through other paths (API, email parser, older versions). + +In practice the escaping happens **where the row is read, not where it is echoed**. A page or modal fetches its row and assigns each field through `escapeHtml()` once, then echoes the resulting variable raw: + +```php +$row = mysqli_fetch_assoc($sql); +$asset_id = intval($row['asset_id']); // ints: intval, not escapeHtml +$asset_name = escapeHtml($row['asset_name']); +... + +``` + +Follow that pattern. Escaping at the echo instead would double-escape a value that is already safe, and mixing the two is how fields get missed. If you introduce a view variable that does not come from a row, escape it at assignment so the rule still holds at the top of the file. + +Rich-text fields (TinyMCE content) are the exception and have their own handling; follow the existing pattern for the specific field rather than inventing one. ### 6. No shell-outs. No `eval`. -The project has deliberately eliminated `shell_exec`/`exec` in favor of native PHP (`dns_get_record()` instead of `dig`, RDAP instead of `whois`, etc.). PRs reintroducing shell execution will be declined. +The project has deliberately moved off `shell_exec`/`exec` in favor of native PHP — `dns_get_record()` instead of `dig`, RDAP instead of `whois`, and so on. **Do not add new shell execution or `eval`.** PRs introducing either will be declined. + +A handful of legacy call sites survive, all of them wrapping `git` or `which` in the self-update and diagnostics paths: `admin/debug.php`, `admin/update.php`, `admin/post/update.php`, `admin/post/backup.php`, `cron/cron.php`, `functions/app.php`, `scripts/update_cli.php`, `setup/index.php`. They are on the list to be replaced with direct `.git` file reads; treat them as debt, not as precedent. ### 7. Report vulnerabilities privately. @@ -116,7 +139,11 @@ Per [SECURITY.md](SECURITY.md) — never in a public issue. ## Conventions -**Database naming.** Every column is prefixed with its table's singular name: `tickets.ticket_id`, `tickets.ticket_subject`, `clients.client_name`. This makes JOIN results unambiguous and is why queries can `SELECT *` across joins safely. New tables must follow it. +**Database naming.** Every column is prefixed with the singular name of the entity it belongs to: `tickets.ticket_id`, `tickets.ticket_subject`, `clients.client_name`. This makes JOIN results unambiguous and is why queries can `SELECT *` across joins safely. New tables must follow it. + +The prefix is the entity name, which is usually but not always the singular of the table name. Where a table is named for its container rather than its row, the prefix follows the row: `calendar_events` → `event_*`, `asset_interfaces` → `interface_*`, `invoice_items` / `quote_items` → `item_*`, `rack_units` → `unit_*`, `user_roles` → `role_*`, `product_stock` → `stock_*`. Pick the prefix your columns will read best as and use it for every column in the table. + +Two standing exceptions: junction tables (`client_tags`, `service_assets`, …) carry the two parent FK names unprefixed, and `settings` / `user_settings` use `config_*` / `user_config_*`. **Schema changes require two edits in one PR:** @@ -133,8 +160,12 @@ A single update run applies every pending migration in order, stopping at the fi **Bulk vs. single actions.** If you change the behavior of a single action (e.g. resolving a ticket), check whether a `bulk_*` counterpart exists and update it too. They are currently parallel implementations and drift between them is a known bug source. **UI.** Bootstrap 4 / AdminLTE, modals per-module under `/modals//`, DataTables for lists, monospace styling for technical data (IPs, serials, keys) and proportional for human text. Match the page you're standing in. + +**Modals post to the portal you are standing in, not the one they live in.** Modal forms use `action="post.php"`, which the browser resolves against the *page* URL, not the modal's own path. A modal under `admin/modals/` that an agent page opens by relative path therefore submits to `agent/post.php` and is handled by `agent/post/`, not `admin/post/`. If you reuse a modal across portals, every portal that can open it needs a handler that accepts the same field set — otherwise fields are silently dropped on one side. **Style.** Procedural PHP, 4-space indentation, LF line endings, code and comments in English. Match the surrounding code rather than importing a personal style. Don't reformat code you aren't changing — it buries the real diff. + +Line endings and indentation are enforced by `.gitattributes` and `.editorconfig` at the repo root, so an editor that respects EditorConfig needs no configuration. `.gitattributes` marks `libs/` as `-text`: vendored code is preserved byte-for-byte as shipped upstream and must never be normalized, or the next wholesale library update turns into an unreviewable diff. --- From b3f959ac55925aee737bdc0dd75745bd231fb109 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Tue, 28 Jul 2026 18:47:52 -0400 Subject: [PATCH 162/241] Use Short echo tags across the code --- admin/ai_models.php | 16 +-- admin/ai_providers.php | 14 +- admin/api_keys.php | 30 ++-- admin/app_logs.php | 26 ++-- admin/audit_logs.php | 46 +++---- admin/backup.php | 4 +- admin/categories.php | 16 +-- admin/contract_templates.php | 26 ++-- admin/custom_links.php | 18 +-- admin/debug.php | 8 +- admin/document_template.php | 6 +- admin/document_templates.php | 14 +- admin/identity_providers.php | 6 +- admin/includes/side_nav.php | 80 +++++------ admin/mail_queue.php | 38 ++--- admin/modals/ai/ai_model_add.php | 4 +- admin/modals/ai/ai_model_edit.php | 12 +- admin/modals/ai/ai_provider_add.php | 2 +- admin/modals/ai/ai_provider_edit.php | 12 +- admin/modals/api/api_key_add.php | 18 +-- admin/modals/api/api_key_edit.php | 14 +- admin/modals/category/category_add.php | 2 +- admin/modals/category/category_edit.php | 12 +- .../contract_template_add.php | 2 +- .../contract_template_edit.php | 4 +- .../custom_field/custom_field_create.php | 6 +- .../modals/custom_field/custom_field_edit.php | 10 +- admin/modals/custom_link/custom_link_add.php | 2 +- admin/modals/custom_link/custom_link_edit.php | 14 +- .../document_template_edit.php | 10 +- .../mail_queue/mail_queue_message_view.php | 6 +- .../payment_method/payment_method_add.php | 2 +- .../payment_method/payment_method_edit.php | 8 +- .../payment_provider/payment_provider_add.php | 2 +- .../payment_provider_edit.php | 2 +- .../project_template_edit.php | 8 +- .../project_template_ticket_template_add.php | 4 +- .../software_template_add.php | 2 +- .../software_template_edit.php | 14 +- admin/modals/tag/tag_add.php | 4 +- admin/modals/tag/tag_edit.php | 12 +- admin/modals/tax/tax_add.php | 2 +- admin/modals/tax/tax_edit.php | 10 +- .../ticket_status/ticket_status_add.php | 2 +- .../ticket_status/ticket_status_edit.php | 12 +- .../ticket_template/ticket_template_add.php | 2 +- .../ticket_template/ticket_template_edit.php | 12 +- .../ticket_template_task_edit.php | 6 +- admin/modals/user/user_add.php | 12 +- admin/modals/user/user_all_reset_password.php | 2 +- admin/modals/user/user_archive.php | 10 +- admin/modals/user/user_edit.php | 44 +++--- admin/modals/user/user_export.php | 2 +- admin/modals/user/user_invite.php | 2 +- admin/modals/user/user_restore.php | 12 +- .../vendor_template/vendor_template_edit.php | 46 +++---- admin/modules.php | 2 +- admin/payment_methods.php | 14 +- admin/payment_providers.php | 20 +-- admin/project_template.php | 30 ++-- admin/project_templates.php | 8 +- admin/roles.php | 10 +- admin/saved_payment_methods.php | 22 +-- admin/settings_company.php | 26 ++-- admin/settings_custom_fields.php | 14 +- admin/settings_default.php | 26 ++-- admin/settings_invoice.php | 16 +-- admin/settings_localization.php | 8 +- admin/settings_mail.php | 80 +++++------ admin/settings_module.php | 8 +- admin/settings_notification.php | 2 +- admin/settings_project.php | 6 +- admin/settings_quote.php | 10 +- admin/settings_security.php | 12 +- admin/settings_telemetry.php | 4 +- admin/settings_theme.php | 12 +- admin/settings_ticket.php | 10 +- admin/software_templates.php | 16 +-- admin/tags.php | 6 +- admin/tax_rates.php | 10 +- admin/ticket_statuses.php | 14 +- admin/ticket_template.php | 16 +-- admin/ticket_templates.php | 2 +- admin/update.php | 12 +- admin/users.php | 30 ++-- admin/vendor_templates.php | 16 +-- agent/accounts.php | 12 +- agent/asset.php | 2 +- agent/assets.php | 96 ++++++------- agent/calendar.php | 4 +- agent/certificates.php | 48 +++---- agent/client_autopay.php | 6 +- agent/client_overview.php | 84 +++++------ agent/clients.php | 48 +++---- agent/contact.php | 130 +++++++++--------- agent/contacts.php | 48 +++---- agent/credentials.php | 60 ++++---- agent/custom/includes/custom_side_nav.php | 2 +- agent/custom/index.php | 4 +- agent/dashboard.php | 88 ++++++------ agent/document.php | 26 ++-- agent/domains.php | 56 ++++---- agent/expenses.php | 46 +++---- agent/files.php | 80 +++++------ agent/global_search.php | 92 ++++++------- agent/includes/client_overview_side_nav.php | 18 +-- agent/includes/client_side_nav.php | 88 ++++++------ agent/includes/inc_client_top_head.php | 42 +++--- agent/includes/side_nav.php | 26 ++-- agent/income.php | 66 ++++----- agent/index.php | 2 +- agent/invoice.php | 100 +++++++------- agent/invoices.php | 72 +++++----- agent/locations.php | 40 +++--- agent/modals/account/account_add.php | 4 +- agent/modals/account/account_edit.php | 10 +- agent/modals/asset/asset.php | 106 +++++++------- agent/modals/asset/asset_add.php | 4 +- agent/modals/asset/asset_bulk_add_ticket.php | 6 +- .../asset/asset_bulk_assign_contact.php | 2 +- .../asset/asset_bulk_assign_location.php | 2 +- agent/modals/asset/asset_bulk_assign_tags.php | 2 +- .../asset/asset_bulk_transfer_client.php | 2 +- agent/modals/asset/asset_copy.php | 62 ++++----- agent/modals/asset/asset_documents.php | 6 +- agent/modals/asset/asset_edit.php | 8 +- agent/modals/asset/asset_import.php | 2 +- agent/modals/asset/asset_interface_add.php | 12 +- .../asset_interface_bulk_edit_network.php | 2 +- agent/modals/asset/asset_interface_edit.php | 32 ++--- agent/modals/asset/asset_interface_export.php | 4 +- agent/modals/asset/asset_interface_import.php | 6 +- .../asset/asset_interface_multiple_add.php | 10 +- agent/modals/asset/asset_link_credential.php | 6 +- agent/modals/asset/asset_link_document.php | 6 +- agent/modals/asset/asset_link_file.php | 6 +- agent/modals/asset/asset_link_service.php | 6 +- agent/modals/asset/asset_link_software.php | 6 +- agent/modals/calendar/calendar_edit.php | 8 +- agent/modals/calendar/calendar_event_add.php | 6 +- agent/modals/calendar/calendar_event_edit.php | 36 ++--- agent/modals/certificate/certificate_add.php | 4 +- agent/modals/certificate/certificate_edit.php | 44 +++--- agent/modals/client/client_add.php | 12 +- .../modals/client/client_bulk_add_ticket.php | 6 +- .../modals/client/client_bulk_assign_tags.php | 2 +- .../client/client_bulk_edit_net_terms.php | 4 +- .../client/client_bulk_edit_referral.php | 2 +- agent/modals/client/client_bulk_email.php | 18 +-- agent/modals/client/client_credit_add.php | 8 +- agent/modals/client/client_delete.php | 10 +- agent/modals/client/client_download_pdf.php | 2 +- agent/modals/client/client_edit.php | 36 ++--- agent/modals/contact/contact.php | 4 +- agent/modals/contact/contact_archive.php | 22 +-- .../contact/contact_bulk_assign_location.php | 2 +- .../contact/contact_bulk_assign_tags.php | 2 +- agent/modals/contact/contact_bulk_email.php | 18 +-- agent/modals/contact/contact_edit.php | 62 ++++----- agent/modals/contact/contact_import.php | 2 +- agent/modals/contact/contact_invite.php | 4 +- agent/modals/contact/contact_link_asset.php | 6 +- .../contact/contact_link_credential.php | 6 +- .../modals/contact/contact_link_document.php | 6 +- agent/modals/contact/contact_link_file.php | 6 +- agent/modals/contact/contact_link_service.php | 6 +- .../modals/contact/contact_link_software.php | 6 +- agent/modals/contact/contact_note_add.php | 4 +- agent/modals/credential/credential_add.php | 10 +- .../credential_bulk_assign_tags.php | 2 +- agent/modals/credential/credential_edit.php | 48 +++---- .../document/document_add_file_relation.php | 6 +- .../document/document_add_from_template.php | 6 +- agent/modals/document/document_edit.php | 10 +- agent/modals/document/document_link_file.php | 2 +- agent/modals/document/document_move.php | 4 +- agent/modals/document/document_rename.php | 6 +- .../modals/document/document_version_view.php | 4 +- agent/modals/document/document_view.php | 4 +- agent/modals/domain/domain_add.php | 12 +- agent/modals/domain/domain_edit.php | 54 ++++---- agent/modals/expense/expense_add.php | 8 +- .../expense/expense_bulk_edit_account.php | 2 +- .../expense/expense_bulk_edit_category.php | 2 +- .../expense/expense_bulk_edit_client.php | 2 +- agent/modals/expense/expense_copy.php | 16 +-- agent/modals/expense/expense_edit.php | 28 ++-- agent/modals/expense/expense_refund.php | 12 +- agent/modals/file/file_delete.php | 2 +- agent/modals/file/file_link_asset.php | 12 +- agent/modals/file/file_move.php | 4 +- agent/modals/file/file_rename.php | 8 +- agent/modals/file/file_upload.php | 6 +- agent/modals/folder/folder_rename.php | 6 +- agent/modals/invoice/invoice_add.php | 8 +- agent/modals/invoice/invoice_add_ticket.php | 8 +- .../invoice/invoice_bulk_edit_category.php | 2 +- agent/modals/invoice/invoice_copy.php | 6 +- agent/modals/invoice/invoice_edit.php | 14 +- agent/modals/invoice/invoice_item_edit.php | 16 +-- agent/modals/invoice/invoice_note.php | 4 +- agent/modals/invoice/invoice_payments.php | 26 ++-- agent/modals/location/location_add.php | 8 +- .../location/location_bulk_assign_tags.php | 2 +- agent/modals/location/location_edit.php | 54 ++++---- agent/modals/network/network_add.php | 2 +- agent/modals/payment/invoice_apply_credit.php | 6 +- agent/modals/payment/payment_add.php | 20 +-- agent/modals/payment/payment_bulk_add.php | 18 +-- agent/modals/payment/payment_edit.php | 4 +- .../payment/payment_saved_method_add.php | 4 +- agent/modals/product/product_add.php | 4 +- .../product/product_bulk_edit_category.php | 2 +- agent/modals/product/product_edit.php | 14 +- agent/modals/product/product_stock_add.php | 4 +- agent/modals/project/project_add.php | 6 +- agent/modals/project/project_edit.php | 12 +- .../project/project_link_closed_ticket.php | 4 +- agent/modals/project/project_link_ticket.php | 6 +- agent/modals/quote/quote_add.php | 10 +- agent/modals/quote/quote_copy.php | 12 +- agent/modals/quote/quote_edit.php | 14 +- agent/modals/quote/quote_item_edit.php | 16 +-- agent/modals/quote/quote_note.php | 4 +- agent/modals/rack/rack_add.php | 4 +- agent/modals/rack/rack_device_add.php | 10 +- agent/modals/rack/rack_edit.php | 30 ++-- .../recurring_expense_add.php | 10 +- .../recurring_expense_edit.php | 20 +-- .../recurring_invoice_add.php | 8 +- .../recurring_invoice_edit.php | 12 +- .../recurring_invoice_export.php | 2 +- .../recurring_invoice_item_edit.php | 16 +-- .../recurring_invoice_note.php | 4 +- .../recurring_ticket/recurring_ticket_add.php | 14 +- .../recurring_ticket_bulk_category_edit.php | 2 +- .../recurring_ticket_edit.php | 24 ++-- agent/modals/revenue/revenue_add.php | 8 +- agent/modals/revenue/revenue_edit.php | 16 +-- agent/modals/service/service.php | 10 +- agent/modals/service/service_add.php | 4 +- agent/modals/service/service_edit.php | 26 ++-- agent/modals/share_modal.php | 2 +- agent/modals/software/software_add.php | 16 +-- .../software/software_add_from_template.php | 2 +- agent/modals/software/software_edit.php | 54 ++++---- agent/modals/ticket/ticket_add.php | 38 ++--- agent/modals/ticket/ticket_add_v2.php | 20 +-- agent/modals/ticket/ticket_add_watcher.php | 4 +- agent/modals/ticket/ticket_assign.php | 8 +- agent/modals/ticket/ticket_billable.php | 4 +- .../modals/ticket/ticket_bulk_add_project.php | 2 +- agent/modals/ticket/ticket_bulk_assign.php | 2 +- .../ticket/ticket_bulk_edit_category.php | 2 +- agent/modals/ticket/ticket_bulk_reply.php | 2 +- agent/modals/ticket/ticket_change_client.php | 4 +- agent/modals/ticket/ticket_contact.php | 8 +- agent/modals/ticket/ticket_edit.php | 28 ++-- agent/modals/ticket/ticket_edit_asset.php | 10 +- agent/modals/ticket/ticket_edit_project.php | 2 +- agent/modals/ticket/ticket_edit_schedule.php | 6 +- agent/modals/ticket/ticket_invoice_add.php | 14 +- agent/modals/ticket/ticket_priority.php | 4 +- agent/modals/ticket/ticket_quote_add.php | 14 +- agent/modals/ticket/ticket_reply_edit.php | 6 +- agent/modals/ticket/ticket_reply_redact.php | 4 +- agent/modals/ticket/ticket_summary.php | 2 +- .../ticket/ticket_task_approver_add.php | 2 +- agent/modals/ticket/ticket_task_edit.php | 6 +- agent/modals/transfer/transfer_add.php | 10 +- agent/modals/transfer/transfer_edit.php | 18 +-- agent/modals/trip/trip_add.php | 10 +- agent/modals/trip/trip_copy.php | 18 +-- agent/modals/trip/trip_edit.php | 20 +-- agent/modals/vendor/vendor.php | 6 +- agent/modals/vendor/vendor_edit.php | 44 +++--- agent/networks.php | 4 +- agent/notifications.php | 22 +-- agent/products.php | 32 ++--- agent/project.php | 56 ++++---- agent/projects.php | 56 ++++---- agent/quote.php | 72 +++++----- agent/quotes.php | 42 +++--- agent/racks.php | 46 +++---- agent/recurring_expenses.php | 42 +++--- agent/recurring_invoice.php | 78 +++++------ agent/recurring_invoices.php | 58 ++++---- agent/recurring_tickets.php | 16 +-- agent/reports/budget.php | 2 +- agent/reports/client_ticket_time_detail.php | 50 +++---- agent/reports/credential_rotation.php | 8 +- agent/reports/expense_by_vendor.php | 6 +- agent/reports/expense_summary.php | 20 +-- agent/reports/includes/reports_side_nav.php | 8 +- agent/reports/income_by_client.php | 6 +- agent/reports/income_summary.php | 12 +- agent/reports/outstanding_balances.php | 4 +- agent/reports/profit_loss.php | 56 ++++---- agent/reports/recurring_by_client.php | 6 +- agent/reports/tax_summary.php | 2 +- agent/reports/ticket_by_client.php | 42 +++--- agent/reports/ticket_summary.php | 6 +- agent/reports/tickets_unbilled.php | 10 +- agent/reports/time_by_tech.php | 12 +- agent/services.php | 28 ++-- agent/software.php | 44 +++--- agent/ticket.php | 70 +++++----- agent/ticket_kanban.php | 26 ++-- agent/ticket_list.php | 54 ++++---- agent/tickets.php | 22 +-- agent/transactions.php | 56 ++++---- agent/transfers.php | 34 ++--- agent/trips.php | 38 ++--- agent/user/includes/user_side_nav.php | 4 +- agent/user/mfa_enforcement.php | 12 +- agent/user/modals/user_mfa_modal.php | 8 +- agent/user/user_activity.php | 18 +-- agent/user/user_details.php | 12 +- agent/user/user_preferences.php | 2 +- agent/user/user_security.php | 6 +- agent/vendors.php | 34 ++--- client/assets.php | 20 +-- client/certificates.php | 8 +- client/contact_edit.php | 6 +- client/contacts.php | 6 +- client/document.php | 42 +++--- client/documents.php | 6 +- client/domains.php | 4 +- client/includes/header.php | 22 +-- client/index.php | 12 +- client/invoices.php | 14 +- client/login_reset.php | 10 +- client/profile.php | 12 +- client/quotes.php | 12 +- client/recurring_invoices.php | 12 +- client/saved_payment_methods.php | 2 +- client/ticket.php | 40 +++--- client/ticket_add.php | 4 +- client/tickets.php | 12 +- client/unpaid_invoices.php | 20 +-- guest/guest_approve_ticket_task.php | 12 +- guest/guest_pay_invoice_stripe.php | 20 +-- guest/guest_quote_upload_file_modal.php | 4 +- guest/guest_view_invoice.php | 82 +++++------ guest/guest_view_item.php | 24 ++-- guest/guest_view_quote.php | 56 ++++---- guest/guest_view_ticket.php | 34 ++--- guest/includes/guest_header.php | 2 +- includes/filter_footer.php | 4 +- includes/footer.php | 4 +- includes/header.php | 2 +- includes/inc_alert_feedback.php | 2 +- includes/top_nav.php | 20 +-- login.php | 18 +-- setup/index.php | 12 +- 355 files changed, 3113 insertions(+), 3113 deletions(-) diff --git a/admin/ai_models.php b/admin/ai_models.php index cbc077a42..e30dc6db3 100644 --- a/admin/ai_models.php +++ b/admin/ai_models.php @@ -35,17 +35,17 @@ $num_rows = mysqli_num_rows($sql); "> - + Model - + Provider - + Use Case @@ -71,12 +71,12 @@ $num_rows = mysqli_num_rows($sql); - + - - - + + + diff --git a/admin/ai_providers.php b/admin/ai_providers.php index f41fb2361..3bb6b5729 100644 --- a/admin/ai_providers.php +++ b/admin/ai_providers.php @@ -25,17 +25,17 @@ $num_rows = mysqli_num_rows($sql); "> - + Provider - + URL - + Key @@ -62,11 +62,11 @@ $num_rows = mysqli_num_rows($sql); - + - - + + @@ -80,7 +80,7 @@ $num_rows = mysqli_num_rows($sql); Edit - + Delete
    diff --git a/admin/api_keys.php b/admin/api_keys.php index 1530a41af..1d6173b81 100644 --- a/admin/api_keys.php +++ b/admin/api_keys.php @@ -64,7 +64,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
    - + "> @@ -75,27 +75,27 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); @@ -121,30 +121,30 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); - - - - - + + + + + "> @@ -151,10 +151,10 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); ?> - - - - + + + + - + @@ -112,7 +112,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); $user_id = intval($row['user_id']); $user_name = escapeHtml($row['user_name']); ?> - + @@ -131,7 +131,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); while ($row = mysqli_fetch_assoc($sql_types_filter)) { $log_type = escapeHtml($row['log_type']); ?> - + @@ -150,7 +150,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); while ($row = mysqli_fetch_assoc($sql_actions_filter)) { $log_action = escapeHtml($row['log_action']); ?> - + @@ -165,9 +165,9 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
    - - - + + +
    @@ -179,44 +179,44 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); text-nowrap"> @@ -254,16 +254,16 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); ?> - - + + - + - - - - - + + + + +
    If you are unable to back up the entire VM, you'll need to back up the files & database individually. There is no built-in restore. See the docs here.
    -

    Download Backup
    +

    Download Backup
    @@ -19,7 +19,7 @@ require_once "includes/inc_all_admin.php";
    - +
    diff --git a/admin/categories.php b/admin/categories.php index 8cf9a647e..9a9b24453 100644 --- a/admin/categories.php +++ b/admin/categories.php @@ -43,7 +43,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
    - +
    @@ -113,7 +113,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); } else { echo 'btn-default'; } ?>">Contact Note Type - ">
    @@ -152,11 +152,11 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); - + - - - - - - - - - - + + + + + + + + + + "> @@ -107,12 +107,12 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); - - - + + + "> @@ -92,10 +92,10 @@ - + "> @@ -84,14 +84,14 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
    -
    $software_template_version"; ?>
    -
    +
    $software_template_version" ?>
    +
    - - + + "> @@ -128,7 +128,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); "> @@ -55,10 +55,10 @@ $num_rows = mysqli_num_rows($sql); - + "> @@ -86,12 +86,12 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); class="ajax-modal" data-modal-url="modals/ticket_status/ticket_status_edit.php?id=" > - + + + + diff --git a/admin/update.php b/admin/update.php index 2bc4cc259..9f2beac2f 100644 --- a/admin/update.php +++ b/admin/update.php @@ -24,7 +24,7 @@ $git_log = shell_exec("git log $repo_branch..origin/$repo_branch --pretty=format
    WARNING: Could not find execute 'git fetch'.

    - Error details:- &1"); ?> + Error details:- &1") ?>

    Things to check: Is Git installed? Is the Git origin/remote correct? Are web server file permissions too strict?
    Seek support on the Forum if required - include relevant PHP error logs & ITFlow debug output @@ -41,9 +41,9 @@ $git_log = shell_exec("git log $repo_branch..origin/$repo_branch --pretty=format
    Update Database

    - Current DB Version: + Current DB Version:
    - Latest DB Version: + Latest DB Version:

    @@ -60,9 +60,9 @@ $git_log = shell_exec("git log $repo_branch..origin/$repo_branch --pretty=format
    FORCE Update App
    -

    Application Release Version:

    -

    Database Version:

    -

    Code Commit:

    +

    Application Release Version:

    +

    Database Version:

    +

    Code Commit:

    You are up to date!
    Everything is going to be alright


    diff --git a/admin/users.php b/admin/users.php index 5e0915279..f96d11567 100644 --- a/admin/users.php +++ b/admin/users.php @@ -75,22 +75,22 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
    "> @@ -170,23 +170,23 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); > - "> + "> - +
    -
    +
    -
    - - - - + + + + + "> @@ -94,23 +94,23 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); - + "> @@ -85,11 +85,11 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); - - + + diff --git a/agent/assets.php b/agent/assets.php index 4d1438a92..dd4d146de 100644 --- a/agent/assets.php +++ b/agent/assets.php @@ -177,27 +177,27 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
    - All Assets + All Assets 0) { ?> - Workstations + Workstations 0) { ?> - Servers + Servers 0) { ?> - Virtual + Virtual 0) { ?> - Network + Network 0) { ?> - Other + Other
    @@ -237,10 +237,10 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
    - + - - + +
    @@ -268,7 +268,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); $location_id = intval($row['location_id']); $location_name = escapeHtml($row['location_name']); ?> - + @@ -295,7 +295,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); $client_id = intval($row['client_id']); $client_name = escapeHtml($row['client_name']); ?> - + @@ -323,7 +323,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); $tag_id = intval($row['tag_id']); $tag_name = escapeHtml($row['tag_name']); ?> - + @@ -362,7 +362,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
    - "> Archived @@ -452,7 +452,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
    - +
    - + Name - + User - + Secret - + Created - + Expires
    - +
    @@ -117,22 +117,22 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
    - + Timestamp - + Type - + Category - + Details
    - + Timestamp - + User - + Client - + Type - + Action - + Description - + IP Address - + User Agent
    $log_user_browser"; ?>$log_user_browser" ?>
    - + Name - +
    - - + + -
    +
    - + Name - + Order - + URI / New Tab - + Location - + diff --git a/admin/debug.php b/admin/debug.php index 16a7ef452..43ddbc8b5 100644 --- a/admin/debug.php +++ b/admin/debug.php @@ -523,19 +523,19 @@ $mysqli->close(); - + - + - + - +
    ITFlow release version
    Current DB Version
    Current Code Commit
    Current Branch
    diff --git a/admin/document_template.php b/admin/document_template.php index 85cdbc07d..f90c025f0 100644 --- a/admin/document_template.php +++ b/admin/document_template.php @@ -43,13 +43,13 @@ $document_template_updated_at = escapeHtml($row['document_template_updated_at']) - +
    -

    +

    - +
    diff --git a/admin/document_templates.php b/admin/document_templates.php index 8fd475c1b..74692ca63 100644 --- a/admin/document_templates.php +++ b/admin/document_templates.php @@ -44,17 +44,17 @@
    - + Template Name - + Created - + Updated - -
    + +
    diff --git a/admin/identity_providers.php b/admin/identity_providers.php index d3f031149..2dcde0426 100644 --- a/admin/identity_providers.php +++ b/admin/identity_providers.php @@ -8,7 +8,7 @@ require_once "includes/inc_all_admin.php";
    - +

    Client Portal SSO via Microsoft Entra

    @@ -33,7 +33,7 @@ require_once "includes/inc_all_admin.php";
    - +
    @@ -43,7 +43,7 @@ require_once "includes/inc_all_admin.php";
    - + diff --git a/admin/includes/side_nav.php b/admin/includes/side_nav.php index 99a2666a2..d7a4e699c 100644 --- a/admin/includes/side_nav.php +++ b/admin/includes/side_nav.php @@ -1,6 +1,6 @@ -
    - + Template - + Type - + License Type
    - + Name - + @@ -142,7 +142,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); Edit - + Delete diff --git a/admin/tax_rates.php b/admin/tax_rates.php index 4f855dc48..a50a5174e 100644 --- a/admin/tax_rates.php +++ b/admin/tax_rates.php @@ -30,12 +30,12 @@ $num_rows = mysqli_num_rows($sql);
    - + Name - + Percent - + diff --git a/admin/ticket_statuses.php b/admin/ticket_statuses.php index f8a57a6e4..0ae217d25 100644 --- a/admin/ticket_statuses.php +++ b/admin/ticket_statuses.php @@ -47,17 +47,17 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
    - + Name - + Color - + Status - -
    - +
    @@ -78,7 +78,7 @@ $sql_task_templates = mysqli_query($mysqli, "SELECT * FROM task_templates WHERE
    - +
    @@ -96,10 +96,10 @@ $sql_task_templates = mysqli_query($mysqli, "SELECT * FROM task_templates WHERE $task_completion_estimate = intval($row['task_template_completion_estimate']); //$task_description = escapeHtml($row['task_template_description']); ?> -
    - +
    @@ -113,7 +113,7 @@ $sql_task_templates = mysqli_query($mysqli, "SELECT * FROM task_templates WHERE Edit - + Delete
    @@ -149,7 +149,7 @@ new Sortable(document.querySelector('table#tasks tbody'), { $.post('/agent/ajax.php', { update_task_templates_order: true, csrf_token: '', - ticket_template_id: , + ticket_template_id: , positions: positions }); } diff --git a/admin/ticket_templates.php b/admin/ticket_templates.php index 740aa53fb..df4922a15 100644 --- a/admin/ticket_templates.php +++ b/admin/ticket_templates.php @@ -59,7 +59,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
    - + Tasks
    - + Name - + Email - + Role - + Status
    - + Vendor - + Description - +
    - +
    - +
    - +
    - +
    diff --git a/agent/accounts.php b/agent/accounts.php index 32a3ff50b..ef8301d71 100644 --- a/agent/accounts.php +++ b/agent/accounts.php @@ -43,12 +43,12 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
    - + Name - + Currency - + - +
    @@ -464,75 +464,75 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); @@ -692,20 +692,20 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); @@ -717,36 +717,36 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); - + - + - + - + - + - + - + "> + "> diff --git a/agent/modals/asset/asset.php b/agent/modals/asset/asset.php index 2e65b4996..ec3eca775 100644 --- a/agent/modals/asset/asset.php +++ b/agent/modals/asset/asset.php @@ -635,7 +635,9 @@ ob_start(); } $ticket_closed_at = escapeHtml($row['ticket_closed_at']); - if ($ticket_priority == "High") { + if ($ticket_priority == "Urgent") { + $ticket_priority_display = "$ticket_priority"; + } elseif ($ticket_priority == "High") { $ticket_priority_display = "$ticket_priority"; } elseif ($ticket_priority == "Medium") { $ticket_priority_display = "$ticket_priority"; diff --git a/agent/modals/asset/asset_bulk_add_ticket.php b/agent/modals/asset/asset_bulk_add_ticket.php index 0a8b644f1..9050cac8f 100644 --- a/agent/modals/asset/asset_bulk_add_ticket.php +++ b/agent/modals/asset/asset_bulk_add_ticket.php @@ -50,6 +50,7 @@ ob_start(); + diff --git a/agent/modals/client/client_add.php b/agent/modals/client/client_add.php index bf05a3538..f715e6015 100644 --- a/agent/modals/client/client_add.php +++ b/agent/modals/client/client_add.php @@ -159,34 +159,6 @@ ob_start(); - -
    - -
    - -
    - - -
    - -
    - Default follows the global SLA assignment for each priority. -
    - -
    @@ -391,6 +363,7 @@ ob_start();
    + @@ -399,6 +372,34 @@ ob_start();
    + + +
    + +
    + +
    + + +
    + +
    + Default follows the global SLA assignment for each priority. +
    + diff --git a/agent/modals/client/client_bulk_add_ticket.php b/agent/modals/client/client_bulk_add_ticket.php index 8e852951c..026998f0a 100644 --- a/agent/modals/client/client_bulk_add_ticket.php +++ b/agent/modals/client/client_bulk_add_ticket.php @@ -46,6 +46,7 @@ ob_start(); + diff --git a/agent/modals/client/client_edit.php b/agent/modals/client/client_edit.php index b242d51b7..de4021e4a 100644 --- a/agent/modals/client/client_edit.php +++ b/agent/modals/client/client_edit.php @@ -193,34 +193,6 @@ ob_start(); - -
    - -
    - -
    - - -
    - -
    - Default follows the global SLA assignment for each priority. -
    - - @@ -269,6 +241,7 @@ ob_start(); + @@ -279,6 +252,34 @@ ob_start(); + +
    + +
    + +
    + + +
    + +
    + Default follows the global SLA assignment for each priority. +
    + + diff --git a/agent/modals/contact/contact.php b/agent/modals/contact/contact.php index 4c3be6771..ce77a1450 100644 --- a/agent/modals/contact/contact.php +++ b/agent/modals/contact/contact.php @@ -629,7 +629,9 @@ ob_start(); $ticket_updated_at_display = $ticket_updated_at; } - if ($ticket_priority == "High") { + if ($ticket_priority == "Urgent") { + $ticket_priority_display = "$ticket_priority"; + } elseif ($ticket_priority == "High") { $ticket_priority_display = "$ticket_priority"; } elseif ($ticket_priority == "Medium") { $ticket_priority_display = "$ticket_priority"; diff --git a/agent/modals/recurring_ticket/recurring_ticket_add.php b/agent/modals/recurring_ticket/recurring_ticket_add.php index 783923d3d..ac6753a22 100644 --- a/agent/modals/recurring_ticket/recurring_ticket_add.php +++ b/agent/modals/recurring_ticket/recurring_ticket_add.php @@ -111,6 +111,7 @@ ob_start(); + diff --git a/agent/modals/recurring_ticket/recurring_ticket_bulk_priority_edit.php b/agent/modals/recurring_ticket/recurring_ticket_bulk_priority_edit.php index 692adc376..adb00213d 100644 --- a/agent/modals/recurring_ticket/recurring_ticket_bulk_priority_edit.php +++ b/agent/modals/recurring_ticket/recurring_ticket_bulk_priority_edit.php @@ -33,6 +33,7 @@ ob_start(); + diff --git a/agent/modals/recurring_ticket/recurring_ticket_edit.php b/agent/modals/recurring_ticket/recurring_ticket_edit.php index b1c01b23c..69443692f 100644 --- a/agent/modals/recurring_ticket/recurring_ticket_edit.php +++ b/agent/modals/recurring_ticket/recurring_ticket_edit.php @@ -95,6 +95,7 @@ ob_start(); + diff --git a/agent/modals/ticket/ticket_add.php b/agent/modals/ticket/ticket_add.php index 2dec2dccd..b31ec92ff 100644 --- a/agent/modals/ticket/ticket_add.php +++ b/agent/modals/ticket/ticket_add.php @@ -149,6 +149,7 @@ ob_start(); + diff --git a/agent/modals/ticket/ticket_add_v2.php b/agent/modals/ticket/ticket_add_v2.php index efde07a08..e5c53a662 100644 --- a/agent/modals/ticket/ticket_add_v2.php +++ b/agent/modals/ticket/ticket_add_v2.php @@ -161,6 +161,7 @@ ob_start(); + diff --git a/agent/modals/ticket/ticket_bulk_edit_priority.php b/agent/modals/ticket/ticket_bulk_edit_priority.php index 6990c8b6b..c736ee141 100644 --- a/agent/modals/ticket/ticket_bulk_edit_priority.php +++ b/agent/modals/ticket/ticket_bulk_edit_priority.php @@ -33,6 +33,7 @@ ob_start(); + diff --git a/agent/modals/ticket/ticket_edit.php b/agent/modals/ticket/ticket_edit.php index 9ed6cb7ab..486826ad8 100644 --- a/agent/modals/ticket/ticket_edit.php +++ b/agent/modals/ticket/ticket_edit.php @@ -111,6 +111,7 @@ ob_start(); + diff --git a/agent/modals/ticket/ticket_priority.php b/agent/modals/ticket/ticket_priority.php index a2f03ab36..cd7dbf91a 100644 --- a/agent/modals/ticket/ticket_priority.php +++ b/agent/modals/ticket/ticket_priority.php @@ -49,6 +49,7 @@ ob_start(); + diff --git a/agent/post/client.php b/agent/post/client.php index 4a7ce844e..f80608ec1 100644 --- a/agent/post/client.php +++ b/agent/post/client.php @@ -246,7 +246,7 @@ if (isset($_POST['add_client'])) { // Ticket SLA assignments (fields only rendered when active SLAs exist) if (isset($_POST['client_sla_low'])) { - foreach (['Low', 'Medium', 'High'] as $sla_priority) { + foreach (['Low', 'Medium', 'High', 'Urgent'] as $sla_priority) { $sla_value = strval($_POST['client_sla_' . strtolower($sla_priority)] ?? 'default'); if ($sla_value !== 'default') { $client_sla_id = intval($sla_value); @@ -345,7 +345,7 @@ if (isset($_POST['edit_client'])) { } $sla_assignments_changed = false; - foreach (['Low', 'Medium', 'High'] as $sla_priority) { + foreach (['Low', 'Medium', 'High', 'Urgent'] as $sla_priority) { $sla_value = strval($_POST['client_sla_' . strtolower($sla_priority)] ?? 'default'); $sla_current = $current_sla_assignments[$sla_priority] ?? 'default'; if ($sla_value === $sla_current) { diff --git a/agent/project.php b/agent/project.php index 5cbfb5199..10c90edd7 100644 --- a/agent/project.php +++ b/agent/project.php @@ -413,7 +413,9 @@ if (isset($_GET['project_id'])) { } $ticket_closed_at = escapeHtml($row['ticket_closed_at']); - if ($ticket_priority == "High") { + if ($ticket_priority == "Urgent") { + $ticket_priority_display = "$ticket_priority"; + } elseif ($ticket_priority == "High") { $ticket_priority_display = "$ticket_priority"; } elseif ($ticket_priority == "Medium") { $ticket_priority_display = "$ticket_priority"; diff --git a/agent/recurring_tickets.php b/agent/recurring_tickets.php index 60b918757..9f3aef1f0 100644 --- a/agent/recurring_tickets.php +++ b/agent/recurring_tickets.php @@ -68,6 +68,7 @@ $sql = mysqli_query( CASE WHEN '$sort' = 'recurring_ticket_priority' THEN CASE recurring_ticket_priority + WHEN 'Urgent' THEN 0 WHEN 'High' THEN 1 WHEN 'Medium' THEN 2 WHEN 'Low' THEN 3 diff --git a/agent/ticket.php b/agent/ticket.php index d422b1bf6..0c51c4aa1 100644 --- a/agent/ticket.php +++ b/agent/ticket.php @@ -86,7 +86,9 @@ if (isset($_GET['ticket_id'])) { } //Set Ticket Badge Color based of priority - if ($ticket_priority == "High") { + if ($ticket_priority == "Urgent") { + $ticket_priority_display = "$ticket_priority"; + } elseif ($ticket_priority == "High") { $ticket_priority_display = "$ticket_priority"; } elseif ($ticket_priority == "Medium") { $ticket_priority_display = "$ticket_priority"; diff --git a/agent/ticket_kanban.php b/agent/ticket_kanban.php index bf6d04439..5a0976f3b 100644 --- a/agent/ticket_kanban.php +++ b/agent/ticket_kanban.php @@ -24,6 +24,7 @@ while ($row = mysqli_fetch_assoc($status_sql)) { $ordering_snippet = "ORDER BY CASE + WHEN ticket_priority = 'Urgent' THEN 0 WHEN ticket_priority = 'High' THEN 1 WHEN ticket_priority = 'Medium' THEN 2 WHEN ticket_priority = 'Low' THEN 3 @@ -98,7 +99,9 @@ $kanban = array_values($statuses); Low + From e76b38460657d18f63fc300b8429f245b5ccf281 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Wed, 29 Jul 2026 01:53:18 -0400 Subject: [PATCH 170/241] Add ticket reply API endpoints GET /api/v1/ticket_replies/read.php and POST create.php, so an RMM or monitoring system can append to a ticket it did not open. Replies default to Internal so an integration cannot email a client by omitting a parameter. Public replies mark first response, notify the contact and watchers, and fire the same custom actions as the agent reply handler. An optional ticket_status also sets the status, and resolves the ticket and marks the resolution SLA when set to 4. Replies are always joined to tickets so ticket_client_id is checked against the key user's client scope, and the client_id named on a write must match the ticket's own client. The reply is attributed to the user the API key runs as. read.php resolves ticket_reply_by_name, since that column holds a user_id on Internal and Public replies but a contact_id on Client ones. --- api/v1/enforce_api_rbac.php | 1 + api/v1/ticket_replies/create.php | 187 +++++++++++++++++++ api/v1/ticket_replies/read.php | 96 ++++++++++ api/v1/ticket_replies/ticket_reply_model.php | 45 +++++ 4 files changed, 329 insertions(+) create mode 100644 api/v1/ticket_replies/create.php create mode 100644 api/v1/ticket_replies/read.php create mode 100644 api/v1/ticket_replies/ticket_reply_model.php diff --git a/api/v1/enforce_api_rbac.php b/api/v1/enforce_api_rbac.php index 08811f0b4..c36ac9e3c 100644 --- a/api/v1/enforce_api_rbac.php +++ b/api/v1/enforce_api_rbac.php @@ -124,6 +124,7 @@ $resource_module = [ 'networks' => 'module_support', 'software' => 'module_support', 'tickets' => 'module_support', + 'ticket_replies' => 'module_support', 'technicians' => 'module_support', 'clients' => 'module_client', 'contacts' => 'module_client', diff --git a/api/v1/ticket_replies/create.php b/api/v1/ticket_replies/create.php new file mode 100644 index 000000000..e40c3358a --- /dev/null +++ b/api/v1/ticket_replies/create.php @@ -0,0 +1,187 @@ +##- Please type your reply above this line -##

    Hello $contact_name,

    Your ticket regarding $ticket_subject has been updated.

    --------------------------------
    $reply
    --------------------------------

    Ticket: $ticket_prefix$ticket_number
    Subject: $ticket_subject
    Status: $ticket_status_name
    Portal: View ticket

    --
    $company_name - Support
    $from_email
    $company_phone"; + + $data = []; + + // Email ticket contact + if (filter_var($contact_email, FILTER_VALIDATE_EMAIL)) { + $data[] = [ + 'from' => $from_email, + 'from_name' => $from_name, + 'recipient' => $contact_email, + 'recipient_name' => $contact_name, + 'subject' => $subject, + 'body' => $body + ]; + } + + // Also email all the watchers + $watcher_body = $body . "

    ----------------------------------------
    YOU ARE A COLLABORATOR ON THIS TICKET"; + $sql_watchers = mysqli_query($mysqli, "SELECT watcher_name, watcher_email FROM ticket_watchers WHERE watcher_ticket_id = $ticket_id"); + while ($watcher_row = mysqli_fetch_assoc($sql_watchers)) { + $watcher_name = escapeSql($watcher_row['watcher_name']); + $watcher_email = escapeSql($watcher_row['watcher_email']); + + if (filter_var($watcher_email, FILTER_VALIDATE_EMAIL)) { + $data[] = [ + 'from' => $from_email, + 'from_name' => $from_name, + 'recipient' => $watcher_email, + 'recipient_name' => $watcher_name, + 'subject' => $subject, + 'body' => $watcher_body + ]; + } + } + + if (!empty($data)) { + addToMailQueue($data); + } + + } + + } + + } + +} + +// Output +require_once '../create_output.php'; diff --git a/api/v1/ticket_replies/read.php b/api/v1/ticket_replies/read.php new file mode 100644 index 000000000..1819d9974 --- /dev/null +++ b/api/v1/ticket_replies/read.php @@ -0,0 +1,96 @@ + Date: Wed, 29 Jul 2026 13:02:27 -0400 Subject: [PATCH 171/241] Add SLA pausing, SLA reports, SLA filtering and kanban SLA state (phase 3) Statuses can be flagged to pause the resolution clock; sla_history records the intervals a ticket's clock actually ran and the deadline is re-based on remaining budget when it resumes. Adds SLA Summary and SLA by Client reports, an SLA state filter on the ticket list, SLA colouring on kanban cards, and an Urgent column on the Tickets by Client report. DB update 2.5.1. Also fixes resolution SLA verdicts being skipped when resolving via kanban or the client portal. --- admin/database_updates/2.5.1.php | 41 ++++ .../ticket_status/ticket_status_add.php | 14 ++ .../ticket_status/ticket_status_edit.php | 15 ++ admin/post/ticket_status.php | 14 +- admin/ticket_statuses.php | 9 + agent/ajax.php | 5 + agent/post/ticket.php | 10 + agent/reports/includes/reports_side_nav.php | 14 ++ agent/reports/sla_by_client.php | 171 ++++++++++++++ agent/reports/sla_summary.php | 212 ++++++++++++++++++ agent/reports/ticket_by_client.php | 14 ++ agent/ticket.php | 7 +- agent/ticket_kanban.php | 21 +- agent/ticket_list.php | 5 + agent/tickets.php | 37 +++ api/v1/tickets/resolve.php | 1 + client/post.php | 6 + cron/cron.php | 1 + cron/ticket_email_parser.php | 1 + cron/ticket_sla.php | 11 +- db.sql | 16 ++ functions/sla.php | 180 ++++++++++++++- 22 files changed, 796 insertions(+), 9 deletions(-) create mode 100644 admin/database_updates/2.5.1.php create mode 100644 agent/reports/sla_by_client.php create mode 100644 agent/reports/sla_summary.php diff --git a/admin/database_updates/2.5.1.php b/admin/database_updates/2.5.1.php new file mode 100644 index 000000000..e48d5a304 --- /dev/null +++ b/admin/database_updates/2.5.1.php @@ -0,0 +1,41 @@ + 0 + AND sla_resolution_minutes > 0 + AND ticket_resolution_due_at IS NOT NULL + AND ticket_resolved_at IS NULL + AND ticket_closed_at IS NULL + AND ticket_archived_at IS NULL"); diff --git a/admin/modals/ticket_status/ticket_status_add.php b/admin/modals/ticket_status/ticket_status_add.php index cbdc4e1fa..aca70aacc 100644 --- a/admin/modals/ticket_status/ticket_status_add.php +++ b/admin/modals/ticket_status/ticket_status_add.php @@ -33,6 +33,20 @@ ob_start(); + +
    + +
    +
    + +
    + +
    + Tickets sitting in a paused status never warn or breach on resolution. Time already spent is kept and the deadline moves out when the ticket comes back. +
    +
    + +
    +
    + +
    + +
    + Tickets sitting in a paused status never warn or breach on resolution. Time already spent is kept and the deadline moves out when the ticket comes back. +
    +
    @@ -72,6 +73,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); $ticket_status_name = escapeHtml($row['ticket_status_name']); $ticket_status_color = escapeHtml($row['ticket_status_color']); $ticket_status_active = intval($row['ticket_status_active']); + $ticket_status_pauses_sla = intval($row['ticket_status_pauses_sla']); if ($ticket_status_active) { $ticket_status_display = "
    Active
    "; } else { @@ -92,6 +94,13 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
    + + @@ -105,6 +106,11 @@ $sql_clients = mysqli_query($mysqli, "SELECT client_id, client_name FROM clients $row = mysqli_fetch_assoc($sql_high_ticket_count); $high_ticket_count = intval($row['high_ticket_count']); + // Breakdown tickets for each priority - Urgent + $sql_urgent_ticket_count = mysqli_query($mysqli, "SELECT COUNT(ticket_id) AS urgent_ticket_count FROM tickets WHERE YEAR(ticket_created_at) = $year AND ticket_client_id = $client_id AND ticket_priority = 'Urgent'"); + $row = mysqli_fetch_assoc($sql_urgent_ticket_count); + $urgent_ticket_count = intval($row['urgent_ticket_count']); + // Used to calculate average time to respond to tickets that were raised in period specified $sql_tickets_respond = mysqli_query($mysqli, "SELECT ticket_created_at, ticket_first_response_at FROM tickets WHERE YEAR(ticket_created_at) = $year AND ticket_client_id = $client_id"); @@ -158,6 +164,7 @@ $sql_clients = mysqli_query($mysqli, "SELECT client_id, client_name FROM clients + @@ -189,6 +196,7 @@ $sql_clients = mysqli_query($mysqli, "SELECT client_id, client_name FROM clients + @@ -227,6 +235,11 @@ $sql_clients = mysqli_query($mysqli, "SELECT client_id, client_name FROM clients $row = mysqli_fetch_assoc($sql_high_ticket_count); $high_ticket_count = intval($row['high_ticket_count']); + // Breakdown tickets for each priority - Urgent + $sql_urgent_ticket_count = mysqli_query($mysqli, "SELECT COUNT(ticket_id) AS urgent_ticket_count FROM tickets WHERE YEAR(ticket_created_at) = $year AND MONTH(ticket_created_at) = $month AND ticket_client_id = $client_id AND ticket_priority = 'Urgent'"); + $row = mysqli_fetch_assoc($sql_urgent_ticket_count); + $urgent_ticket_count = intval($row['urgent_ticket_count']); + // Used to calculate average time to respond to tickets that were raised in period specified $sql_tickets_respond = mysqli_query($mysqli, "SELECT ticket_created_at, ticket_first_response_at FROM tickets WHERE YEAR(ticket_created_at) = $year AND MONTH(ticket_created_at) = $month AND ticket_client_id = $client_id"); @@ -279,6 +292,7 @@ $sql_clients = mysqli_query($mysqli, "SELECT client_id, client_name FROM clients + diff --git a/agent/ticket.php b/agent/ticket.php index 0c51c4aa1..063330de6 100644 --- a/agent/ticket.php +++ b/agent/ticket.php @@ -117,6 +117,7 @@ if (isset($_GET['ticket_id'])) { $ticket_resolution_due_at = escapeHtml($row['ticket_resolution_due_at']); $ticket_response_sla_met = $row['ticket_response_sla_met']; $ticket_resolution_sla_met = $row['ticket_resolution_sla_met']; + $ticket_sla_paused = intval($row['ticket_status_pauses_sla']); $ticket_sla_name = "None"; if ($ticket_sla_id) { $sla_name_sql = mysqli_query($mysqli, "SELECT sla_name FROM slas WHERE sla_id = $ticket_sla_id"); @@ -911,7 +912,11 @@ if (isset($_GET['ticket_id'])) {
    - Resolve by: + Resolve by: + Paused + + + " : ""; } ?>
    diff --git a/agent/ticket_kanban.php b/agent/ticket_kanban.php index 5a0976f3b..de5632ca3 100644 --- a/agent/ticket_kanban.php +++ b/agent/ticket_kanban.php @@ -108,9 +108,22 @@ $kanban = array_values($statuses); } else { $ticket_priority_color = "info"; } + + // SLA state, same stages the ticket list colours on. A paused + // ticket drops its at-risk flag but keeps a recorded breach. + $ticket_sla_alert_stage = max(intval($item['ticket_response_sla_alert_stage']), intval($item['ticket_resolution_sla_alert_stage'])); + if (intval($item['ticket_status_pauses_sla']) && $ticket_sla_alert_stage < 2) { + $ticket_sla_alert_stage = 0; + } + $ticket_sla_class = ''; + if ($ticket_sla_alert_stage == 2) { + $ticket_sla_class = ' border-danger'; + } elseif ($ticket_sla_alert_stage == 1) { + $ticket_sla_class = ' border-warning'; + } ?> -
    @@ -119,6 +132,12 @@ $kanban = array_values($statuses); + + + + + + diff --git a/agent/ticket_list.php b/agent/ticket_list.php index 5fccefcc6..c24c1a271 100644 --- a/agent/ticket_list.php +++ b/agent/ticket_list.php @@ -92,6 +92,11 @@ $ticket_closed_at = escapeHtml($row['ticket_closed_at']); // SLA alert stages are maintained by cron/ticket_sla.php (1 = warned, 2 = breached) $ticket_sla_alert_stage = max(intval($row['ticket_response_sla_alert_stage']), intval($row['ticket_resolution_sla_alert_stage'])); + // A paused ticket isn't running down its clock, so drop the + // at-risk warning - a breach already recorded still stands + if (intval($row['ticket_status_pauses_sla']) && $ticket_sla_alert_stage < 2) { + $ticket_sla_alert_stage = 0; + } if (empty($ticket_updated_at)) { if (!empty($ticket_closed_at)) { $ticket_updated_at_display = "

    Never

    "; diff --git a/agent/tickets.php b/agent/tickets.php index a2ec0c326..70cf91ac6 100644 --- a/agent/tickets.php +++ b/agent/tickets.php @@ -69,6 +69,24 @@ if (isset($_GET['category']) & !empty($_GET['category'])) { // Default - any $ticket_assigned_query = ''; $ticket_assigned_filter_id = ''; +// SLA state filter - breached / at risk / met / no SLA +$ticket_sla_query = ''; +$ticket_sla_filter = ''; +if (isset($_GET['sla']) && !empty($_GET['sla'])) { + $ticket_sla_filter = $_GET['sla']; + if ($ticket_sla_filter == 'breached') { + $ticket_sla_query = 'AND ticket_sla_id > 0 AND (ticket_response_sla_alert_stage = 2 OR ticket_resolution_sla_alert_stage = 2 OR ticket_response_sla_met = 0 OR ticket_resolution_sla_met = 0)'; + } elseif ($ticket_sla_filter == 'at_risk') { + $ticket_sla_query = 'AND ticket_sla_id > 0 AND COALESCE(ticket_status_pauses_sla, 0) = 0 AND (ticket_response_sla_alert_stage = 1 OR ticket_resolution_sla_alert_stage = 1)'; + } elseif ($ticket_sla_filter == 'paused') { + $ticket_sla_query = 'AND ticket_sla_id > 0 AND ticket_status_pauses_sla = 1'; + } elseif ($ticket_sla_filter == 'met') { + $ticket_sla_query = 'AND ticket_sla_id > 0 AND ticket_response_sla_met = 1 AND (ticket_resolution_sla_met = 1 OR ticket_resolution_due_at IS NULL)'; + } elseif ($ticket_sla_filter == 'none') { + $ticket_sla_query = 'AND ticket_sla_id = 0'; + } +} + if (isset($_GET['assigned']) & !empty($_GET['assigned'])) { if ($_GET['assigned'] == 'unassigned') { $ticket_assigned_query = 'AND ticket_assigned_to = 0'; @@ -109,6 +127,7 @@ $query = $category_query AND DATE(ticket_created_at) BETWEEN '$dtf' AND '$dtt' AND (CONCAT(ticket_prefix,ticket_number) LIKE '%$q%' OR client_name LIKE '%$q%' OR ticket_subject LIKE '%$q%' OR ticket_status_name LIKE '%$q%' OR ticket_priority LIKE '%$q%' OR user_name LIKE '%$q%' OR contact_name LIKE '%$q%' OR asset_name LIKE '%$q%' OR vendor_name LIKE '%$q%' OR ticket_vendor_ticket_number LIKE '%q%') + $ticket_sla_query $ticket_billable_snippet $ticket_project_snippet $access_permission_query_overide @@ -211,6 +230,24 @@ $sql_categories_filter = mysqli_query(
    + 0; + if ($sla_filter_in_use) { ?> +
    +
    + +
    +
    + +
    diff --git a/agent/reports/sla_summary.php b/agent/reports/sla_summary.php index 272879fc6..dce6e0104 100644 --- a/agent/reports/sla_summary.php +++ b/agent/reports/sla_summary.php @@ -50,20 +50,6 @@ function getSlaCompliance($where) return $compliance; } -// Colour the headline figures the way the ticket list colours rows -function slaPercentDisplay($percent) -{ - if (is_null($percent)) { - return "-"; - } - if ($percent >= 95) { - return "$percent%"; - } - if ($percent >= 80) { - return "$percent%"; - } - return "$percent%"; -} $overall = getSlaCompliance("AND YEAR(ticket_created_at) = $year"); diff --git a/functions/sla.php b/functions/sla.php index 4bc326773..9abf7a637 100644 --- a/functions/sla.php +++ b/functions/sla.php @@ -17,12 +17,19 @@ */ // Business hours + SLA settings, fetched once per request -function getSlaSettings() +function getSlaSettings($refresh = false) { global $mysqli; static $sla_settings = null; + // Callers that have just written to the settings row pass true - otherwise + // they would restamp tickets using the business hours this request started + // with rather than the ones just saved + if ($refresh) { + $sla_settings = null; + } + if (!is_null($sla_settings)) { return $sla_settings; } @@ -166,16 +173,24 @@ function businessMinutesBetween($start_datetime, $end_datetime) } // Business minutes already spent on a ticket's resolution clock, including the -// interval currently running +// interval currently running. +// +// Tickets with no clock history at all fall back to the business time elapsed +// since they were raised. Only tickets carrying a resolution target get +// intervals, so this covers response-only plans, and tickets that were already +// resolved when SLA pausing was introduced. Without the fallback both report +// zero time spent, which reads as instant resolution. function getTicketSlaConsumedMinutes($ticket_id) { global $mysqli; $ticket_id = intval($ticket_id); $consumed = 0; + $has_history = false; $sql = mysqli_query($mysqli, "SELECT sla_history_started_at, sla_history_ended_at, sla_history_minutes FROM sla_history WHERE sla_history_ticket_id = $ticket_id"); while ($row = mysqli_fetch_assoc($sql)) { + $has_history = true; if (!is_null($row['sla_history_ended_at'])) { $consumed += intval($row['sla_history_minutes']); } else { @@ -183,6 +198,16 @@ function getTicketSlaConsumedMinutes($ticket_id) } } + if (!$has_history) { + $ticket_sql = mysqli_query($mysqli, "SELECT ticket_created_at, ticket_resolved_at, ticket_closed_at FROM tickets WHERE ticket_id = $ticket_id LIMIT 1"); + if (!$ticket_sql || !mysqli_num_rows($ticket_sql)) { + return 0; + } + $ticket = mysqli_fetch_assoc($ticket_sql); + $ended_at = $ticket['ticket_resolved_at'] ?: ($ticket['ticket_closed_at'] ?: date('Y-m-d H:i:s')); + return businessMinutesBetween($ticket['ticket_created_at'], $ended_at); + } + return $consumed; } @@ -199,6 +224,22 @@ function getTicketSlaPausedCount($ticket_id) return intval($row['paused_count']); } +// Colour an SLA compliance percentage for the reports. Null means nothing has +// been judged yet, which is not the same as zero. +function slaPercentDisplay($percent) +{ + if (is_null($percent)) { + return "-"; + } + if ($percent >= 95) { + return "$percent%"; + } + if ($percent >= 80) { + return "$percent%"; + } + return "$percent%"; +} + // Reconcile a ticket's resolution clock with its current status. Safe to call // after any status change (and after applyTicketSla) - it opens an interval // when the clock should be running, closes it when it should not, and on From bb1f0d5489586f608cfb424f9cc8f94f70c5b6c0 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Wed, 29 Jul 2026 13:50:00 -0400 Subject: [PATCH 176/241] SLA Fixes --- functions/sla.php | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/functions/sla.php b/functions/sla.php index 9abf7a637..28c2aafc8 100644 --- a/functions/sla.php +++ b/functions/sla.php @@ -462,7 +462,7 @@ function setTicketResolutionSlaMet($ticket_id) $ticket_id = intval($ticket_id); - $sql = mysqli_query($mysqli, "SELECT ticket_resolution_due_at, ticket_resolved_at FROM tickets WHERE ticket_id = $ticket_id LIMIT 1"); + $sql = mysqli_query($mysqli, "SELECT ticket_resolution_due_at, ticket_resolved_at, ticket_resolution_sla_met FROM tickets WHERE ticket_id = $ticket_id LIMIT 1"); if (!$sql || !mysqli_num_rows($sql)) { return; } @@ -472,6 +472,15 @@ function setTicketResolutionSlaMet($ticket_id) return; } + // A recorded miss is final at judge time. Reopening an exhausted ticket + // re-bases its deadline to the present, so without this a resolve in the + // same clock second would grade against that deadline and flip the miss + // to a met. Only an explicit re-stamp (applyTicketSla) may re-judge. + if (!is_null($row['ticket_resolution_sla_met']) && intval($row['ticket_resolution_sla_met']) === 0) { + syncTicketSlaClock($ticket_id); + return; + } + $ended_at = !empty($row['ticket_resolved_at']) ? strtotime($row['ticket_resolved_at']) : time(); $resolution_met = $ended_at <= strtotime($row['ticket_resolution_due_at']) ? 1 : 0; @@ -483,12 +492,31 @@ function setTicketResolutionSlaMet($ticket_id) // A reopened ticket goes back on the resolution clock. syncTicketSlaClock // reopens an interval and re-bases the deadline on the budget that is left, so // a ticket that was resolved with time to spare gets that remainder back. +// +// A missed verdict survives the reopen when the budget is already spent. +// Without this, re-basing would hand an exhausted ticket a zero-length fresh +// window, and resolving it again straight away would overwrite the recorded +// miss with a met - reopen must never be a way to launder a breach. function resetTicketResolutionSla($ticket_id) { global $mysqli; $ticket_id = intval($ticket_id); + $sql = mysqli_query($mysqli, "SELECT ticket_resolution_sla_met, sla_resolution_minutes FROM tickets LEFT JOIN slas ON ticket_sla_id = sla_id WHERE ticket_id = $ticket_id LIMIT 1"); + if ($sql && mysqli_num_rows($sql)) { + $row = mysqli_fetch_assoc($sql); + $resolution_minutes = intval($row['sla_resolution_minutes']); + $was_missed = !is_null($row['ticket_resolution_sla_met']) && intval($row['ticket_resolution_sla_met']) === 0; + + if ($was_missed && $resolution_minutes > 0 && getTicketSlaConsumedMinutes($ticket_id) >= $resolution_minutes) { + // Budget gone: keep the miss and the breach stage (so the cron does + // not re-alert), just restart the clock for the time-spent record + syncTicketSlaClock($ticket_id); + return; + } + } + mysqli_query($mysqli, "UPDATE tickets SET ticket_resolution_sla_met = NULL, ticket_resolution_sla_alert_stage = 0 WHERE ticket_id = $ticket_id"); syncTicketSlaClock($ticket_id); From fc5cdeea8213f92c9a01c0e1cad77ea86fae5ecd Mon Sep 17 00:00:00 2001 From: johnnyq Date: Wed, 29 Jul 2026 14:13:55 -0400 Subject: [PATCH 177/241] Add UI Elements for Asset Notes similar to contact notes --- admin/categories.php | 6 ++ admin/database_updates/2.5.3.php | 19 +++++ agent/asset.php | 96 +++++++++++++++++++++ agent/modals/asset/asset.php | 64 ++++++++++++++ agent/modals/asset/asset_note_add.php | 70 ++++++++++++++++ agent/post/asset.php | 115 ++++++++++++++++++++++++++ scripts/setup_cli.php | 8 ++ setup/index.php | 8 ++ 8 files changed, 386 insertions(+) create mode 100644 admin/database_updates/2.5.3.php create mode 100644 agent/modals/asset/asset_note_add.php diff --git a/admin/categories.php b/admin/categories.php index 9a9b24453..d9bb8a01f 100644 --- a/admin/categories.php +++ b/admin/categories.php @@ -113,6 +113,12 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); } else { echo 'btn-default'; } ?>">Contact Note Type + Asset Note Type @@ -1213,6 +1235,80 @@ if (isset($_GET['asset_id'])) { +
    "> +
    +

    Notes

    +
    + +
    +
    +
    +
    +
    - + Name - + Type - + Model - + IP - + MAC Address - + Purchase Date - + Install Date - + Warranty Expire - + Assigned To - + Location - + Status - + Client -
    -
    +
    +
    - -
    + +
    -
    -
    +
    +
    @@ -761,14 +761,14 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); 2) { ?> - + Restore - + Delete - + Archive diff --git a/agent/calendar.php b/agent/calendar.php index 61a793a91..5a6c3bb94 100644 --- a/agent/calendar.php +++ b/agent/calendar.php @@ -191,7 +191,7 @@ while ($row = mysqli_fetch_assoc($sql)) { var $link = $('', { href: '#', 'class': 'ajax-modal', - 'data-modal-url': 'modals/calendar/calendar_event_edit.php?&id=' + eventId + 'data-modal-url': 'modals/calendar/calendar_event_edit.php?&id=' + eventId }); $('body').append($link); // Append to the body @@ -378,7 +378,7 @@ while ($row = mysqli_fetch_assoc($sql)) { $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT user_config_calendar_first_day FROM user_settings WHERE user_id = $session_user_id")); $user_config_calendar_first_day = intval($row['user_config_calendar_first_day']); ?> - firstDay: , + firstDay: , }); calendar.render(); diff --git a/agent/certificates.php b/agent/certificates.php index 82cd34b74..9bef2c8a3 100644 --- a/agent/certificates.php +++ b/agent/certificates.php @@ -96,9 +96,9 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
    - + - +
    @@ -129,7 +129,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); $client_id = intval($row['client_id']); $client_name = escapeHtml($row['client_name']); ?> - + @@ -159,7 +159,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
    - "> Archived @@ -188,7 +188,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
    - + "> @@ -199,28 +199,28 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); @@ -263,11 +263,11 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); } ?> - + - + - + - + @@ -395,7 +395,7 @@ $sql_asset_retired = mysqli_query( @@ -456,16 +456,16 @@ $sql_asset_retired = mysqli_query( } ?> - - + @@ -509,8 +509,8 @@ $sql_asset_retired = mysqli_query( ?>

    - Domain: - -- () + Domain: + -- ()

    - Certificate: - -- () + Certificate: + -- ()

    - Asset Warranty: - -- () + Asset Warranty: + -- ()

    @@ -565,8 +565,8 @@ $sql_asset_retired = mysqli_query( ?>

    - Asset Retire: - -- () + Asset Retire: + -- ()

    - License: - -- () + License: + -- ()

    - Domain: - -- () + Domain: + -- ()

    - Certificate: - -- () + Certificate: + -- ()

    Asset Warranty: - - -- () + + -- ()

    @@ -683,8 +683,8 @@ $sql_asset_retired = mysqli_query( ?>

    - Asset Retire: - -- () + Asset Retire: + -- ()

    - Software: - -- () + Software: + -- ()

    - - - + + + - - + + diff --git a/agent/clients.php b/agent/clients.php index da40e1abe..6977ce9eb 100644 --- a/agent/clients.php +++ b/agent/clients.php @@ -108,8 +108,8 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
    - - + +
    @@ -130,7 +130,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
    - "> Archived @@ -219,9 +219,9 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
    - - - + + +
    @@ -241,7 +241,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); $tag_id = intval($row['tag_id']); $tag_name = escapeHtml($row['tag_name']); ?> - + @@ -258,7 +258,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); while ($row = mysqli_fetch_assoc($sql_industries_filter)) { $industry_name = escapeHtml($row['client_type']); ?> - + @@ -277,7 +277,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); while ($row = mysqli_fetch_assoc($sql_referrals_filter)) { $referral_name = escapeHtml($row['client_referral']); ?> - + @@ -291,7 +291,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
    - +
    - + Name - + Domain - + Issued By - + Expire - + Client
    - - + +
    @@ -276,24 +276,24 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
    -
    -
    +
    +
    -
    +
    -
    +
    @@ -261,23 +261,23 @@ $sql_asset_retired = mysqli_query(
    - "> + "> - +
    -
    - -
    +
    + +
    - +
    @@ -287,11 +287,11 @@ $sql_asset_retired = mysqli_query(
    - $contact_phone $contact_extension"; ?> + $contact_phone $contact_extension" ?>
    -
    +
    - +
    - + + -
    Views:
    -
    +
    Views:
    +
    Expires Expires - +
    bg-light"> @@ -302,18 +302,18 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); @@ -433,7 +433,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); @@ -501,25 +501,25 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); @@ -538,12 +538,12 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); - + Restore - + Archive diff --git a/agent/contact.php b/agent/contact.php index 878865c83..fb75f7942 100644 --- a/agent/contact.php +++ b/agent/contact.php @@ -187,45 +187,45 @@ if (isset($_GET['contact_id'])) { data-modal-url="modals/contact/contact_edit.php?id="> -

    +

    -
    +
    - contact_photo"> + contact_photo"> - +
    - +

    -
    +
    -
    +
    - + -
    x
    +
    x
    -
    +
    -
    +
    Primary Contact
    @@ -239,7 +239,7 @@ if (isset($_GET['contact_id'])) { if ($contact_billing) { ?>
    Billing
    -
    +
    @@ -248,7 +248,7 @@ if (isset($_GET['contact_id'])) {
    Notes
    - + @@ -257,12 +257,12 @@ if (isset($_GET['contact_id'])) {
    @@ -482,7 +482,7 @@ if (isset($_GET['contact_id'])) { - + Archive @@ -591,16 +591,16 @@ if (isset($_GET['contact_id'])) { - + -
    - + + - - + + - - - - + + + + @@ -757,12 +757,12 @@ if (isset($_GET['contact_id'])) { - - - + + + - - - - - - - + + + + + + + - - + + @@ -987,19 +987,19 @@ if (isset($_GET['contact_id'])) { - - - + + + @@ -1055,13 +1055,13 @@ if (isset($_GET['contact_id'])) { - + - + @@ -1123,22 +1123,22 @@ if (isset($_GET['contact_id'])) { ?> - - - - + + + + - - + + - + + + + + + + + + + + + + $refundable_cents) { + flashAlert("Refund can not be more than the " . numfmt_format_currency($currency_format, $refundable_amount, $payment_currency_code) . " remaining on this payment", 'error'); + redirect(); + } + + $amount = round($amount, 2); + $stripe_pi_id = getStripePaymentIntentId($original_reference); + $refund_reference = $reference; + $stripe_refunded = false; + + // Refund through Stripe when the payment came in through Stripe and the agent asked for it + if ($refund_stripe && $stripe_pi_id) { + + $stripe_provider = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT * FROM payment_providers WHERE payment_provider_name = 'Stripe' LIMIT 1")); + $provider_private_key = $stripe_provider['payment_provider_private_key'] ?? ''; + + if (empty($provider_private_key)) { + flashAlert("Stripe is not configured - refund not issued", 'error'); + redirect(); + } + + require_once __DIR__ . '/../../includes/stripe_init.php'; + $stripe = new \Stripe\StripeClient($provider_private_key); + + try { + // The idempotency key is minted once per rendered modal, so a double submit + // of the same form returns the original refund instead of sending the money twice + $stripe_refund = $stripe->refunds->create( + [ + 'payment_intent' => $stripe_pi_id, + 'amount' => intval(round($amount * 100)), // Stripe expects cents + 'metadata' => [ + 'itflow_client_id' => $client_id, + 'itflow_invoice_id' => $invoice_id, + 'itflow_invoice_number' => $invoice_prefix . $invoice_number, + 'itflow_payment_id' => $payment_id, + ] + ], + $idempotency_key ? ['idempotency_key' => "itflow_refund_$idempotency_key"] : [] + ); + } catch (Exception $e) { + $error = $e->getMessage(); + error_log("Stripe refund error - payment ID $payment_id / $stripe_pi_id on invoice $invoice_prefix$invoice_number: $error"); + logApp("Stripe", "error", "Refund failed for payment ID $payment_id ($stripe_pi_id): $error"); + flashAlert("Stripe refund failed: " . escapeHtml($error) . " - nothing was recorded", 'error'); + redirect(); + } + + if ($stripe_refund->status === 'failed' || $stripe_refund->status === 'canceled') { + logApp("Stripe", "error", "Refund for payment ID $payment_id ($stripe_pi_id) came back as {$stripe_refund->status}"); + flashAlert("Stripe reported the refund as {$stripe_refund->status} - nothing was recorded", 'error'); + redirect(); + } + + $stripe_refund_id = escapeSql($stripe_refund->id); + $refund_reference = "Stripe Refund - $stripe_refund_id"; + $stripe_refunded = true; + + // An idempotent replay hands back the same refund object - do not book it twice + $sql_existing = mysqli_query($mysqli, "SELECT payment_id FROM payments WHERE payment_reference = '$refund_reference' LIMIT 1"); + if (mysqli_num_rows($sql_existing) > 0) { + flashAlert("That refund has already been recorded", 'error'); + redirect(); + } + + } + + // Refunds are stored as a negative payment - every SUM(payment_amount) in the app + // then reports the right invoice balance and account balance with no other changes + $refund_amount_signed = -1 * $amount; + + mysqli_query($mysqli, "INSERT INTO payments SET + payment_date = '$date', + payment_amount = $refund_amount_signed, + payment_currency_code = '$payment_currency_code', + payment_account_id = $account, + payment_method = '$payment_method', + payment_reference = '$refund_reference', + payment_invoice_id = $invoice_id, + payment_refund_of_id = $payment_id" + ); + + $invoice_status = updateInvoiceStatusFromPayments($invoice_id); + + $refund_type = ($amount_cents === $refundable_cents && $refundable_cents === (int) round($payment_amount * 100)) ? 'Refund' : 'Partial refund'; + $refund_channel = $stripe_refunded ? ' via Stripe' : ''; + + mysqli_query($mysqli, "INSERT INTO history SET history_status = '$invoice_status', history_description = '$refund_type issued$refund_channel', history_invoice_id = $invoice_id"); + + logAudit("Invoice", "Refund", "$refund_type of " . numfmt_format_currency($currency_format, $amount, $payment_currency_code) . " issued$refund_channel against payment ID $payment_id on invoice $invoice_prefix$invoice_number", $client_id, $invoice_id); + + // Email the client a refund notification + if ($email_receipt == 1 && !empty($config_smtp_provider) && !empty($contact_email)) { + + $sql = mysqli_query($mysqli, "SELECT * FROM companies WHERE company_id = 1"); + $row = mysqli_fetch_assoc($sql); + $company_name = escapeSql($row['company_name']); + $company_phone = escapeSql(formatPhoneNumber($row['company_phone'], $row['company_phone_country_code'])); + + $config_invoice_from_name = escapeSql($config_invoice_from_name); + $config_invoice_from_email = escapeSql($config_invoice_from_email); + + $subject = "Refund Issued - Invoice $invoice_prefix$invoice_number"; + $body = "Hello $contact_name,

    A refund of " . numfmt_format_currency($currency_format, $amount, $payment_currency_code) . " has been issued against invoice $invoice_prefix$invoice_number.

    Refund Amount: " . numfmt_format_currency($currency_format, $amount, $payment_currency_code) . "
    Original Payment Method: $payment_method

    Card refunds usually appear on your statement within 5-10 business days.


    --
    $company_name - Billing Department
    $config_invoice_from_email
    $company_phone"; + + $email_data = [ + [ + 'from' => $config_invoice_from_email, + 'from_name' => $config_invoice_from_name, + 'recipient' => $contact_email, + 'recipient_name' => $contact_name, + 'subject' => $subject, + 'body' => $body + ] + ]; + + addToMailQueue($email_data); + + $email_id = mysqli_insert_id($mysqli); + + mysqli_query($mysqli, "INSERT INTO history SET history_status = '$invoice_status', history_description = 'Refund notification sent to mail queue ID: $email_id!', history_invoice_id = $invoice_id"); + logAudit("Invoice", "Refund", "Refund notification for invoice $invoice_prefix$invoice_number queued to $contact_email Email ID: $email_id", $client_id, $invoice_id); + + } + + flashAlert("$refund_type of " . numfmt_format_currency($currency_format, $amount, $payment_currency_code) . " issued$refund_channel"); + + redirect(); + +} + /* Apply Credit Not ready for use 2025-08-27 - JQ @@ -649,49 +844,42 @@ if (isset($_GET['delete_payment'])) { $payment_id = intval($_GET['delete_payment']); - $sql = mysqli_query($mysqli,"SELECT * FROM payments WHERE payment_id = $payment_id"); + // payments has no client column - the client comes from the invoice the payment sits on + $sql = mysqli_query($mysqli,"SELECT * FROM payments + LEFT JOIN invoices ON payment_invoice_id = invoice_id + WHERE payment_id = $payment_id + LIMIT 1" + ); $row = mysqli_fetch_assoc($sql); $invoice_id = intval($row['payment_invoice_id']); - $deleted_payment_amount = floatval($row['payment_amount']); - $client_id = intval($row['payment_client_id']); + $payment_is_refund = !is_null($row['payment_refund_of_id']); + $invoice_prefix = escapeSql($row['invoice_prefix']); + $invoice_number = intval($row['invoice_number']); + $client_id = intval($row['invoice_client_id']); enforceClientAccess(); - //Add up all the payments for the invoice and get the total amount paid to the invoice - $sql_total_payments_amount = mysqli_query($mysqli,"SELECT SUM(payment_amount) AS total_payments_amount FROM payments WHERE payment_invoice_id = $invoice_id"); - $row = mysqli_fetch_assoc($sql_total_payments_amount); - $total_payments_amount = floatval($row['total_payments_amount']); - - // Get the invoice total and details - $sql = mysqli_query($mysqli,"SELECT * FROM invoices WHERE invoice_id = $invoice_id"); - $row = mysqli_fetch_assoc($sql); - $invoice_prefix = escapeSql($row['invoice_prefix']); - $invoice_number = intval($row['invoice_number']); - $invoice_amount = floatval($row['invoice_amount']); - - //Calculate the Invoice balance - $invoice_balance = $invoice_amount - $total_payments_amount + $deleted_payment_amount; - - //Determine if invoice has been paid - if ($invoice_balance == 0) { - $invoice_status = "Paid"; - } else { - $invoice_status = "Partial"; + // Deleting a payment that has been refunded would leave the refund rows dangling + if (!$payment_is_refund && getPaymentRefundedTotal($payment_id) > 0) { + flashAlert("This payment has been refunded - delete the refund first", 'error'); + redirect(); } - //Update Invoice Status - mysqli_query($mysqli,"UPDATE invoices SET invoice_status = '$invoice_status' WHERE invoice_id = $invoice_id"); - - //Add Payment to History - mysqli_query($mysqli,"INSERT INTO history SET history_status = '$invoice_status', history_description = 'Payment deleted', history_invoice_id = $invoice_id"); - mysqli_query($mysqli,"DELETE FROM payments WHERE payment_id = $payment_id"); - logAudit("Invoice", "Edit", "$session_name deleted Payment on Invoice $invoice_prefix$invoice_number", $client_id, $invoice_id); + // Recalculate from what is left rather than from the pre-delete total + $invoice_status = updateInvoiceStatusFromPayments($invoice_id); - flashAlert("Payment deleted", 'error'); - if ($config_stripe_enable) { - flashAlert("Payment deleted - Stripe payments must be manually refunded in Stripe", 'error'); + $deleted_description = $payment_is_refund ? 'Refund deleted' : 'Payment deleted'; + + mysqli_query($mysqli,"INSERT INTO history SET history_status = '$invoice_status', history_description = '$deleted_description', history_invoice_id = $invoice_id"); + + logAudit("Invoice", "Edit", "$session_name deleted $deleted_description on Invoice $invoice_prefix$invoice_number", $client_id, $invoice_id); + + if (!$payment_is_refund && $config_stripe_enable) { + flashAlert("Payment deleted - deleting a payment does not refund it. Use Refund to send the money back through Stripe", 'error'); + } else { + flashAlert("$deleted_description", 'error'); } redirect(); diff --git a/db.sql b/db.sql index aeb726c3d..2b95bd886 100644 --- a/db.sql +++ b/db.sql @@ -1534,7 +1534,9 @@ CREATE TABLE `payments` ( `payment_archived_at` datetime DEFAULT NULL, `payment_account_id` int(11) NOT NULL, `payment_invoice_id` int(11) NOT NULL DEFAULT 0, - PRIMARY KEY (`payment_id`) + `payment_refund_of_id` int(11) DEFAULT NULL, + PRIMARY KEY (`payment_id`), + KEY `payment_refund_of_id` (`payment_refund_of_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; @@ -2997,4 +2999,4 @@ CREATE TABLE `vendors` ( /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2026-07-27 18:38:36 +-- Dump completed on 2026-07-28 21:33:31 diff --git a/functions.php b/functions.php index 5abd11e9c..5183cccc8 100644 --- a/functions.php +++ b/functions.php @@ -16,3 +16,4 @@ require_once __DIR__ . '/functions/auth.php'; require_once __DIR__ . '/functions/logging.php'; require_once __DIR__ . '/functions/app.php'; require_once __DIR__ . '/functions/db.php'; +require_once __DIR__ . '/functions/payments.php'; diff --git a/functions/payments.php b/functions/payments.php new file mode 100644 index 000000000..7a8cb82fc --- /dev/null +++ b/functions/payments.php @@ -0,0 +1,114 @@ += $total_cents) { + $new_status = 'Paid'; + } else { + $new_status = 'Partial'; + } + + mysqli_query($mysqli, "UPDATE invoices SET invoice_status = '$new_status' WHERE invoice_id = $invoice_id"); + + return $new_status; +} From 1494d2cb5e83699bf2618a4ea7e2c5b598d3eeb7 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Tue, 28 Jul 2026 22:03:35 -0400 Subject: [PATCH 164/241] Backed out of Refunds which still keeps the fix to properly set the invoice status when payment is deleted --- agent/invoice.php | 18 +- agent/modals/payment/payment_refund.php | 223 ------------------------ agent/post/payment.php | 214 +---------------------- functions/payments.php | 68 +------- 4 files changed, 11 insertions(+), 512 deletions(-) delete mode 100644 agent/modals/payment/payment_refund.php diff --git a/agent/invoice.php b/agent/invoice.php index 9998f8ee4..fe1031c2a 100644 --- a/agent/invoice.php +++ b/agent/invoice.php @@ -649,25 +649,13 @@ if (isset($_GET['invoice_id'])) { $payment_reference = escapeHtml($row['payment_reference']); $account_name = escapeHtml($row['account_name']); - // Refunds are negative rows linked back to the payment they reverse - $payment_is_refund = !is_null($row['payment_refund_of_id']); - $payment_refundable = $payment_is_refund ? 0.00 : round($payment_amount - getPaymentRefundedTotal($payment_id), 2); - ?> - - + + - + - - - - - - - - - - - - $refundable_cents) { - flashAlert("Refund can not be more than the " . numfmt_format_currency($currency_format, $refundable_amount, $payment_currency_code) . " remaining on this payment", 'error'); - redirect(); - } - - $amount = round($amount, 2); - $stripe_pi_id = getStripePaymentIntentId($original_reference); - $refund_reference = $reference; - $stripe_refunded = false; - - // Refund through Stripe when the payment came in through Stripe and the agent asked for it - if ($refund_stripe && $stripe_pi_id) { - - $stripe_provider = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT * FROM payment_providers WHERE payment_provider_name = 'Stripe' LIMIT 1")); - $provider_private_key = $stripe_provider['payment_provider_private_key'] ?? ''; - - if (empty($provider_private_key)) { - flashAlert("Stripe is not configured - refund not issued", 'error'); - redirect(); - } - - require_once __DIR__ . '/../../includes/stripe_init.php'; - $stripe = new \Stripe\StripeClient($provider_private_key); - - try { - // The idempotency key is minted once per rendered modal, so a double submit - // of the same form returns the original refund instead of sending the money twice - $stripe_refund = $stripe->refunds->create( - [ - 'payment_intent' => $stripe_pi_id, - 'amount' => intval(round($amount * 100)), // Stripe expects cents - 'metadata' => [ - 'itflow_client_id' => $client_id, - 'itflow_invoice_id' => $invoice_id, - 'itflow_invoice_number' => $invoice_prefix . $invoice_number, - 'itflow_payment_id' => $payment_id, - ] - ], - $idempotency_key ? ['idempotency_key' => "itflow_refund_$idempotency_key"] : [] - ); - } catch (Exception $e) { - $error = $e->getMessage(); - error_log("Stripe refund error - payment ID $payment_id / $stripe_pi_id on invoice $invoice_prefix$invoice_number: $error"); - logApp("Stripe", "error", "Refund failed for payment ID $payment_id ($stripe_pi_id): $error"); - flashAlert("Stripe refund failed: " . escapeHtml($error) . " - nothing was recorded", 'error'); - redirect(); - } - - if ($stripe_refund->status === 'failed' || $stripe_refund->status === 'canceled') { - logApp("Stripe", "error", "Refund for payment ID $payment_id ($stripe_pi_id) came back as {$stripe_refund->status}"); - flashAlert("Stripe reported the refund as {$stripe_refund->status} - nothing was recorded", 'error'); - redirect(); - } - - $stripe_refund_id = escapeSql($stripe_refund->id); - $refund_reference = "Stripe Refund - $stripe_refund_id"; - $stripe_refunded = true; - - // An idempotent replay hands back the same refund object - do not book it twice - $sql_existing = mysqli_query($mysqli, "SELECT payment_id FROM payments WHERE payment_reference = '$refund_reference' LIMIT 1"); - if (mysqli_num_rows($sql_existing) > 0) { - flashAlert("That refund has already been recorded", 'error'); - redirect(); - } - - } - - // Refunds are stored as a negative payment - every SUM(payment_amount) in the app - // then reports the right invoice balance and account balance with no other changes - $refund_amount_signed = -1 * $amount; - - mysqli_query($mysqli, "INSERT INTO payments SET - payment_date = '$date', - payment_amount = $refund_amount_signed, - payment_currency_code = '$payment_currency_code', - payment_account_id = $account, - payment_method = '$payment_method', - payment_reference = '$refund_reference', - payment_invoice_id = $invoice_id, - payment_refund_of_id = $payment_id" - ); - - $invoice_status = updateInvoiceStatusFromPayments($invoice_id); - - $refund_type = ($amount_cents === $refundable_cents && $refundable_cents === (int) round($payment_amount * 100)) ? 'Refund' : 'Partial refund'; - $refund_channel = $stripe_refunded ? ' via Stripe' : ''; - - mysqli_query($mysqli, "INSERT INTO history SET history_status = '$invoice_status', history_description = '$refund_type issued$refund_channel', history_invoice_id = $invoice_id"); - - logAudit("Invoice", "Refund", "$refund_type of " . numfmt_format_currency($currency_format, $amount, $payment_currency_code) . " issued$refund_channel against payment ID $payment_id on invoice $invoice_prefix$invoice_number", $client_id, $invoice_id); - - // Email the client a refund notification - if ($email_receipt == 1 && !empty($config_smtp_provider) && !empty($contact_email)) { - - $sql = mysqli_query($mysqli, "SELECT * FROM companies WHERE company_id = 1"); - $row = mysqli_fetch_assoc($sql); - $company_name = escapeSql($row['company_name']); - $company_phone = escapeSql(formatPhoneNumber($row['company_phone'], $row['company_phone_country_code'])); - - $config_invoice_from_name = escapeSql($config_invoice_from_name); - $config_invoice_from_email = escapeSql($config_invoice_from_email); - - $subject = "Refund Issued - Invoice $invoice_prefix$invoice_number"; - $body = "Hello $contact_name,

    A refund of " . numfmt_format_currency($currency_format, $amount, $payment_currency_code) . " has been issued against invoice $invoice_prefix$invoice_number.

    Refund Amount: " . numfmt_format_currency($currency_format, $amount, $payment_currency_code) . "
    Original Payment Method: $payment_method

    Card refunds usually appear on your statement within 5-10 business days.


    --
    $company_name - Billing Department
    $config_invoice_from_email
    $company_phone"; - - $email_data = [ - [ - 'from' => $config_invoice_from_email, - 'from_name' => $config_invoice_from_name, - 'recipient' => $contact_email, - 'recipient_name' => $contact_name, - 'subject' => $subject, - 'body' => $body - ] - ]; - - addToMailQueue($email_data); - - $email_id = mysqli_insert_id($mysqli); - - mysqli_query($mysqli, "INSERT INTO history SET history_status = '$invoice_status', history_description = 'Refund notification sent to mail queue ID: $email_id!', history_invoice_id = $invoice_id"); - logAudit("Invoice", "Refund", "Refund notification for invoice $invoice_prefix$invoice_number queued to $contact_email Email ID: $email_id", $client_id, $invoice_id); - - } - - flashAlert("$refund_type of " . numfmt_format_currency($currency_format, $amount, $payment_currency_code) . " issued$refund_channel"); - - redirect(); - -} - /* Apply Credit Not ready for use 2025-08-27 - JQ @@ -852,34 +658,24 @@ if (isset($_GET['delete_payment'])) { ); $row = mysqli_fetch_assoc($sql); $invoice_id = intval($row['payment_invoice_id']); - $payment_is_refund = !is_null($row['payment_refund_of_id']); $invoice_prefix = escapeSql($row['invoice_prefix']); $invoice_number = intval($row['invoice_number']); $client_id = intval($row['invoice_client_id']); enforceClientAccess(); - // Deleting a payment that has been refunded would leave the refund rows dangling - if (!$payment_is_refund && getPaymentRefundedTotal($payment_id) > 0) { - flashAlert("This payment has been refunded - delete the refund first", 'error'); - redirect(); - } - mysqli_query($mysqli,"DELETE FROM payments WHERE payment_id = $payment_id"); // Recalculate from what is left rather than from the pre-delete total $invoice_status = updateInvoiceStatusFromPayments($invoice_id); - $deleted_description = $payment_is_refund ? 'Refund deleted' : 'Payment deleted'; + mysqli_query($mysqli,"INSERT INTO history SET history_status = '$invoice_status', history_description = 'Payment deleted', history_invoice_id = $invoice_id"); - mysqli_query($mysqli,"INSERT INTO history SET history_status = '$invoice_status', history_description = '$deleted_description', history_invoice_id = $invoice_id"); + logAudit("Invoice", "Edit", "$session_name deleted Payment on Invoice $invoice_prefix$invoice_number", $client_id, $invoice_id); - logAudit("Invoice", "Edit", "$session_name deleted $deleted_description on Invoice $invoice_prefix$invoice_number", $client_id, $invoice_id); - - if (!$payment_is_refund && $config_stripe_enable) { - flashAlert("Payment deleted - deleting a payment does not refund it. Use Refund to send the money back through Stripe", 'error'); - } else { - flashAlert("$deleted_description", 'error'); + flashAlert("Payment deleted", 'error'); + if ($config_stripe_enable) { + flashAlert("Payment deleted - Stripe payments must be manually refunded in Stripe", 'error'); } redirect(); diff --git a/functions/payments.php b/functions/payments.php index 7a8cb82fc..81fc5dfdc 100644 --- a/functions/payments.php +++ b/functions/payments.php @@ -1,76 +1,14 @@ Date: Tue, 28 Jul 2026 22:08:01 -0400 Subject: [PATCH 165/241] Revert DB Update --- admin/database_updates/2.4.9.php | 16 ---------------- db.sql | 6 ++---- 2 files changed, 2 insertions(+), 20 deletions(-) delete mode 100644 admin/database_updates/2.4.9.php diff --git a/admin/database_updates/2.4.9.php b/admin/database_updates/2.4.9.php deleted file mode 100644 index 8d8966646..000000000 --- a/admin/database_updates/2.4.9.php +++ /dev/null @@ -1,16 +0,0 @@ - Date: Wed, 29 Jul 2026 00:00:42 -0400 Subject: [PATCH 166/241] Add optional ticket SLAs Response/resolution targets stamped at creation from per-client/priority assignments, business-hours due date math, warn/breach alert stages via cron/ticket_sla.php, ticket list coloring, per-ticket SLA override, admin page for plans/assignments/business hours. DB update 2.5.0. No behavior change unless SLAs are assigned. Bulk reply now only counts Public replies as first response. --- admin/database_updates/2.5.0.php | 59 +++++ admin/includes/side_nav.php | 8 + admin/modals/sla/sla_add.php | 64 +++++ admin/modals/sla/sla_assignment_client.php | 85 +++++++ admin/modals/sla/sla_edit.php | 76 ++++++ admin/post/sla.php | 217 ++++++++++++++++ admin/sla.php | 274 ++++++++++++++++++++ agent/modals/ticket/ticket_sla.php | 70 ++++++ agent/post/client.php | 1 + agent/post/project.php | 1 + agent/post/recurring_ticket.php | 2 + agent/post/ticket.php | 90 ++++++- agent/ticket.php | 36 +++ agent/ticket_list.php | 4 +- api/v1/tickets/create.php | 1 + api/v1/tickets/resolve.php | 3 +- client/post.php | 1 + cron/cron.php | 1 + cron/ticket_email_parser.php | 1 + cron/ticket_sla.php | 163 ++++++++++++ db.sql | 52 +++- functions.php | 1 + functions/sla.php | 280 +++++++++++++++++++++ 23 files changed, 1479 insertions(+), 11 deletions(-) create mode 100644 admin/database_updates/2.5.0.php create mode 100644 admin/modals/sla/sla_add.php create mode 100644 admin/modals/sla/sla_assignment_client.php create mode 100644 admin/modals/sla/sla_edit.php create mode 100644 admin/post/sla.php create mode 100644 admin/sla.php create mode 100644 agent/modals/ticket/ticket_sla.php create mode 100644 cron/ticket_sla.php create mode 100644 functions/sla.php diff --git a/admin/database_updates/2.5.0.php b/admin/database_updates/2.5.0.php new file mode 100644 index 000000000..82792d13a --- /dev/null +++ b/admin/database_updates/2.5.0.php @@ -0,0 +1,59 @@ + + + + diff --git a/admin/modals/sla/sla_add.php b/admin/modals/sla/sla_add.php new file mode 100644 index 000000000..9b9b5a176 --- /dev/null +++ b/admin/modals/sla/sla_add.php @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 ? $resolution_minutes : "NULL"; + + mysqli_query($mysqli, "INSERT INTO slas SET sla_name = '$name', sla_description = '$description', sla_response_minutes = $response_minutes, sla_resolution_minutes = $resolution_minutes_set"); + + logAudit("SLA", "Create", "$session_name created SLA $name"); + + flashAlert("SLA $name created"); + + redirect(); + +} + +if (isset($_POST['edit_sla'])) { + + validateCSRFToken(); + + $sla_id = intval($_POST['sla_id']); + $name = escapeSql($_POST['name']); + $description = escapeSql($_POST['description']); + $response_minutes = intval($_POST['response_minutes']); + $resolution_minutes = intval($_POST['resolution_minutes']); + $resolution_minutes_set = $resolution_minutes > 0 ? $resolution_minutes : "NULL"; + + mysqli_query($mysqli, "UPDATE slas SET sla_name = '$name', sla_description = '$description', sla_response_minutes = $response_minutes, sla_resolution_minutes = $resolution_minutes_set WHERE sla_id = $sla_id"); + + // Re-stamp open tickets on this SLA so their targets follow the new minutes + $restamped = 0; + $sql_tickets = mysqli_query($mysqli, "SELECT ticket_id FROM tickets WHERE ticket_sla_id = $sla_id AND ticket_closed_at IS NULL AND ticket_archived_at IS NULL"); + while ($ticket_row = mysqli_fetch_assoc($sql_tickets)) { + applyTicketSla($ticket_row['ticket_id'], $sla_id); + $restamped++; + } + + logAudit("SLA", "Edit", "$session_name edited SLA $name"); + + flashAlert("SLA $name updated - targets recalculated on $restamped open ticket(s)"); + + redirect(); + +} + +if (isset($_GET['archive_sla'])) { + + validateCSRFToken(); + + $sla_id = intval($_GET['archive_sla']); + + mysqli_query($mysqli, "UPDATE slas SET sla_archived_at = NOW() WHERE sla_id = $sla_id"); + + // Assignments pointing at an archived SLA resolve to "no SLA" for new + // tickets; existing tickets keep their stamped targets + + logAudit("SLA", "Archive", "$session_name archived SLA ID $sla_id"); + + flashAlert("SLA archived"); + + redirect(); + +} + +if (isset($_GET['unarchive_sla'])) { + + validateCSRFToken(); + + $sla_id = intval($_GET['unarchive_sla']); + + mysqli_query($mysqli, "UPDATE slas SET sla_archived_at = NULL WHERE sla_id = $sla_id"); + + logAudit("SLA", "Unarchive", "$session_name restored SLA ID $sla_id"); + + flashAlert("SLA restored"); + + redirect(); + +} + +if (isset($_POST['edit_sla_settings'])) { + + validateCSRFToken(); + + // Business days arrive as an array of ISO weekday numbers (1 = Mon .. 7 = Sun) + $business_days = []; + if (isset($_POST['business_days']) && is_array($_POST['business_days'])) { + foreach ($_POST['business_days'] as $day) { + $day = intval($day); + if ($day >= 1 && $day <= 7) { + $business_days[] = $day; + } + } + } + $business_days = escapeSql(implode(',', $business_days)); + + $business_hours_start = escapeSql($_POST['business_hours_start']); + $business_hours_end = escapeSql($_POST['business_hours_end']); + $warning_percent = intval($_POST['warning_percent']); + $notification_email = escapeSql($_POST['notification_email']); + + mysqli_query($mysqli, "UPDATE settings SET config_business_days = '$business_days', config_business_hours_start = '$business_hours_start', config_business_hours_end = '$business_hours_end', config_sla_warning_percent = $warning_percent, config_sla_notification_email = '$notification_email' WHERE company_id = 1"); + + // Business hours feed the due date math - re-stamp open SLA tickets + $restamped = 0; + $sql_tickets = mysqli_query($mysqli, "SELECT ticket_id, ticket_sla_id FROM tickets WHERE ticket_sla_id > 0 AND ticket_closed_at IS NULL AND ticket_archived_at IS NULL"); + while ($ticket_row = mysqli_fetch_assoc($sql_tickets)) { + applyTicketSla($ticket_row['ticket_id'], $ticket_row['ticket_sla_id']); + $restamped++; + } + + logAudit("Settings", "Edit", "$session_name edited SLA / business hours settings"); + + flashAlert("SLA settings updated - targets recalculated on $restamped open ticket(s)"); + + redirect(); + +} + +if (isset($_POST['save_sla_assignments'])) { + + validateCSRFToken(); + + // Global defaults - one select per priority; 0 means no SLA, which for the + // global row is simply no assignment + foreach (['Low', 'Medium', 'High'] as $priority) { + + $field = 'global_sla_' . strtolower($priority); + $sla_id = intval($_POST[$field] ?? 0); + + mysqli_query($mysqli, "DELETE FROM sla_assignments WHERE sla_assignment_client_id = 0 AND sla_assignment_priority = '$priority'"); + if ($sla_id > 0) { + mysqli_query($mysqli, "INSERT INTO sla_assignments SET sla_assignment_client_id = 0, sla_assignment_priority = '$priority', sla_assignment_sla_id = $sla_id"); + } + } + + // Re-resolve open tickets against the new defaults + $restamped = 0; + $sql_tickets = mysqli_query($mysqli, "SELECT ticket_id FROM tickets WHERE ticket_closed_at IS NULL AND ticket_archived_at IS NULL"); + while ($ticket_row = mysqli_fetch_assoc($sql_tickets)) { + applyTicketSla($ticket_row['ticket_id']); + $restamped++; + } + + logAudit("SLA", "Edit", "$session_name updated default SLA assignments"); + + flashAlert("Default SLA assignments saved - $restamped open ticket(s) re-evaluated"); + + redirect(); + +} + +if (isset($_POST['save_client_sla_assignment'])) { + + validateCSRFToken(); + + $client_id = intval($_POST['client_id']); + + // Per-priority values: 'default' = follow the global default (no row), + // '0' = explicitly no SLA for this client, otherwise an sla_id + foreach (['Low', 'Medium', 'High'] as $priority) { + + $field = 'client_sla_' . strtolower($priority); + $value = $_POST[$field] ?? 'default'; + + mysqli_query($mysqli, "DELETE FROM sla_assignments WHERE sla_assignment_client_id = $client_id AND sla_assignment_priority = '$priority'"); + if ($value !== 'default') { + $sla_id = intval($value); + mysqli_query($mysqli, "INSERT INTO sla_assignments SET sla_assignment_client_id = $client_id, sla_assignment_priority = '$priority', sla_assignment_sla_id = $sla_id"); + } + } + + // Re-resolve this client's open tickets + $restamped = 0; + $sql_tickets = mysqli_query($mysqli, "SELECT ticket_id FROM tickets WHERE ticket_client_id = $client_id AND ticket_closed_at IS NULL AND ticket_archived_at IS NULL"); + while ($ticket_row = mysqli_fetch_assoc($sql_tickets)) { + applyTicketSla($ticket_row['ticket_id']); + $restamped++; + } + + logAudit("SLA", "Edit", "$session_name updated SLA assignments for client ID $client_id"); + + flashAlert("Client SLA assignments saved - $restamped open ticket(s) re-evaluated"); + + redirect(); + +} + +if (isset($_GET['delete_client_sla_assignments'])) { + + validateCSRFToken(); + + $client_id = intval($_GET['delete_client_sla_assignments']); + + mysqli_query($mysqli, "DELETE FROM sla_assignments WHERE sla_assignment_client_id = $client_id"); + + // Back on the global defaults - re-resolve this client's open tickets + $sql_tickets = mysqli_query($mysqli, "SELECT ticket_id FROM tickets WHERE ticket_client_id = $client_id AND ticket_closed_at IS NULL AND ticket_archived_at IS NULL"); + while ($ticket_row = mysqli_fetch_assoc($sql_tickets)) { + applyTicketSla($ticket_row['ticket_id']); + } + + logAudit("SLA", "Delete", "$session_name removed SLA overrides for client ID $client_id"); + + flashAlert("Client SLA overrides removed"); + + redirect(); + +} diff --git a/admin/sla.php b/admin/sla.php new file mode 100644 index 000000000..19dba03c1 --- /dev/null +++ b/admin/sla.php @@ -0,0 +1,274 @@ +Default"; + } + $sla_id = $assignments[$client_id][$priority]; + if ($sla_id == 0) { + return "None"; + } + if (isset($active_slas[$sla_id])) { + return escapeHtml($active_slas[$sla_id]); + } + return "None (archived)"; +} + +?> + +
    +
    +

    SLAs

    +
    + +
    +
    + +
    + +

    SLAs are optional. Tickets only get response/resolution targets when an assignment below matches their client and priority - with nothing assigned, nothing changes.

    + +
    +
    - + Client Name - + Primary Contact - + Primary Location
    - +
    @@ -479,19 +479,19 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); if (!empty($contact_phone)) { ?>
    - +
    - +
    - +
    Balance - +
    Paid - +
    0) { ?>
    Credit - +
    Monthly - +
    Hourly Rate - +
    - +
    - +
    - + @@ -870,13 +870,13 @@ if (isset($_GET['contact_id'])) { ?>
    -
    -
    +
    +
    - +
    -
    -
    +
    +
    - +
    -
    +
    - +
    "> + Refund + + + 0) { ?> + + + +
    "> - Refund - - - 0) { ?> - - - -
    + + + + + + + + + + + + + + + + + + + + + + +
    NameDescriptionResponseResolutionStatusAction
    + + + + min + +
    Archived
    + +
    Active
    + +
    + +
    +
    +
    +
    + +
    +
    +

    SLA Assignments

    +
    + +
    +
    + +
    + +
    + + + Default (all clients) +
    + +
    + + +
    + +
    + +
    +
    +
    + +
    + + Client overrides +
    + + "> + + + + + + + + + + + + + $override_client_name) { ?> + + + + + + + + + +
    ClientLowMediumHighAction
    No client overrides - everyone follows the defaults above.
    + + + + + +
    +
    +
    +
    + +
    +
    +

    Business Hours & Notifications

    +
    + +
    + +
    + + +
    + +
    + 'Mon', 2 => 'Tue', 3 => 'Wed', 4 => 'Thu', 5 => 'Fri', 6 => 'Sat', 7 => 'Sun'] as $day_number => $day_name) { ?> +
    + > + +
    + +
    + SLA clocks only run during business hours on these days. Unchecking everything makes SLAs count 24x7. +
    + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + Warnings and breach alerts also notify the assigned agent in-app and by email. Requires cron/ticket_sla.php running every minute. + + +
    + +
    +
    + + + + +
    + + + + + + + +
    + +$original_sla_name to $sla_name"); + + redirect(); + +} + if (isset($_POST['edit_ticket_contact'])) { validateCSRFToken(); @@ -1091,6 +1154,7 @@ if (isset($_POST['bulk_edit_ticket_priority'])) { // Update ticket & insert reply mysqli_query($mysqli, "UPDATE tickets SET ticket_priority = '$priority' WHERE ticket_id = $ticket_id"); + applyTicketSla($ticket_id); mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = '$session_name updated the priority from $current_ticket_priority to $priority', ticket_reply_type = 'Internal', ticket_reply_time_worked = '00:01:00', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); @@ -1208,10 +1272,11 @@ if (isset($_POST['bulk_merge_tickets'])) { // Update current ticket if (empty($ticket_first_response_at)) { - mysqli_query($mysqli, "UPDATE tickets SET ticket_first_response_at = NOW() WHERE ticket_id = $ticket_id"); + setTicketFirstResponse($ticket_id); } mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = 'Ticket $ticket_prefix$ticket_number bulk merged into $ticket_prefix$merge_into_ticket_number. Comment: $merge_comment', ticket_reply_time_worked = '00:01:00', ticket_reply_type = '$ticket_reply_type', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); mysqli_query($mysqli, "UPDATE tickets SET ticket_status = '5', ticket_resolved_at = NOW(), ticket_closed_at = NOW(), ticket_closed_by = $session_user_id WHERE ticket_id = $ticket_id") or die(mysqli_error($mysqli)); + setTicketResolutionSlaMet($ticket_id); // Update new parent ticket mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = 'Ticket $ticket_prefix$ticket_number was bulk merged into this ticket with comment: $merge_comment.

    $ticket_subject
    $ticket_details', ticket_reply_time_worked = '00:01:00', ticket_reply_type = 'Internal', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $merge_into_ticket_id"); @@ -1286,11 +1351,12 @@ if (isset($_POST['bulk_resolve_tickets'])) { // Mark FR time if required if (empty($ticket_first_response_at)) { - mysqli_query($mysqli, "UPDATE tickets SET ticket_first_response_at = NOW() WHERE ticket_id = $ticket_id"); + setTicketFirstResponse($ticket_id); } // Update ticket & insert reply mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 4, ticket_resolved_at = NOW() WHERE ticket_id = $ticket_id"); + setTicketResolutionSlaMet($ticket_id); mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = '$details', ticket_reply_type = '$ticket_reply_type', ticket_reply_time_worked = '$ticket_reply_time_worked', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); @@ -1426,9 +1492,9 @@ if (isset($_POST['bulk_ticket_reply'])) { $client_uri = ''; } - // Mark FR time if required - if (empty($ticket_first_response_at)) { - mysqli_query($mysqli, "UPDATE tickets SET ticket_first_response_at = NOW() WHERE ticket_id = $ticket_id"); + // Mark FR time if required - internal notes don't count as a response + if (empty($ticket_first_response_at) && $ticket_reply_type == 'Public') { + setTicketFirstResponse($ticket_id); } // Add reply @@ -1451,6 +1517,7 @@ if (isset($_POST['bulk_ticket_reply'])) { // Resolve the ticket, if set if ($ticket_status == 4) { mysqli_query($mysqli, "UPDATE tickets SET ticket_resolved_at = NOW() WHERE ticket_id = $ticket_id"); + setTicketResolutionSlaMet($ticket_id); // Logging logAudit("Ticket", "Resolved", "$session_name resolved Ticket $ticket_prefix$ticket_number", $client_id, $ticket_id); @@ -1684,6 +1751,7 @@ if (isset($_POST['bulk_add_asset_ticket'])) { mysqli_query($mysqli, "INSERT INTO tickets SET ticket_prefix = '$config_ticket_prefix', ticket_number = $ticket_number, ticket_category = $category_id, ticket_subject = '$subject_asset_prepended', ticket_details = '$details', ticket_priority = '$priority', ticket_billable = $billable, ticket_status = $ticket_status, ticket_asset_id = $asset_id, ticket_created_by = $session_user_id, ticket_assigned_to = $assigned_to, ticket_url_key = '$url_key', ticket_client_id = $client_id, ticket_project_id = $project_id"); $ticket_id = mysqli_insert_id($mysqli); + applyTicketSla($ticket_id); // Add Tasks if (!empty($_POST['tasks'])) { @@ -1769,6 +1837,7 @@ if (isset($_POST['add_ticket_reply'])) { // Resolve the ticket, if set if ($ticket_status == 4) { mysqli_query($mysqli, "UPDATE tickets SET ticket_resolved_at = NOW() WHERE ticket_id = $ticket_id"); + setTicketResolutionSlaMet($ticket_id); logAudit("Ticket", "Resolved", "$session_name resolved Ticket ticket ID $ticket_id", $client_id, $ticket_id); } @@ -1885,7 +1954,7 @@ if (isset($_POST['add_ticket_reply'])) { // Handle first response if (empty($ticket_first_response_at) && $ticket_reply_type == 'Public') { - mysqli_query($mysqli, "UPDATE tickets SET ticket_first_response_at = NOW() WHERE ticket_id = $ticket_id"); + setTicketFirstResponse($ticket_id); } // Custom action/notif handler @@ -2059,12 +2128,13 @@ if (isset($_POST['merge_ticket'])) { // Update current ticket if (empty($ticket_first_response_at)) { - mysqli_query($mysqli, "UPDATE tickets SET ticket_first_response_at = NOW() WHERE ticket_id = $ticket_id"); + setTicketFirstResponse($ticket_id); } mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = 'Ticket $ticket_prefix$ticket_number merged into $ticket_prefix$merge_into_ticket_number. Comment: $merge_comment', ticket_reply_time_worked = '00:01:00', ticket_reply_type = '$ticket_reply_type', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); mysqli_query($mysqli, "UPDATE tickets SET ticket_status = '5', ticket_resolved_at = NOW(), ticket_closed_at = NOW(), ticket_closed_by = $session_user_id WHERE ticket_id = $ticket_id") or die(mysqli_error($mysqli)); + setTicketResolutionSlaMet($ticket_id); //Update new parent ticket mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = 'Ticket $ticket_prefix$ticket_number was merged into this ticket with comment: $merge_comment.

    $ticket_subject
    $ticket_details', ticket_reply_time_worked = '00:01:00', ticket_reply_type = '$ticket_reply_type', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $merge_into_ticket_id"); @@ -2101,6 +2171,7 @@ if (isset($_POST['change_client_ticket'])) { // Update ticket client & contact mysqli_query($mysqli, "UPDATE tickets SET ticket_client_id = $client_id, ticket_contact_id = $contact_id WHERE ticket_id = $ticket_id LIMIT 1"); + applyTicketSla($ticket_id); logAudit("Ticket", "Change", "$session_name changed ticket client", $client_id, $ticket_id); @@ -2134,11 +2205,12 @@ if (isset($_GET['resolve_ticket'])) { // Mark FR if (empty($ticket_first_response_at)) { - mysqli_query($mysqli, "UPDATE tickets SET ticket_first_response_at = NOW() WHERE ticket_id = $ticket_id"); + setTicketFirstResponse($ticket_id); } // Resolve mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 4, ticket_resolved_at = NOW() WHERE ticket_id = $ticket_id"); + setTicketResolutionSlaMet($ticket_id); logAudit("Ticket", "Resolved", "$session_name resolved ticket $ticket_prefix$ticket_number (ID: $ticket_id)", $client_id, $ticket_id); @@ -2239,6 +2311,7 @@ if (isset($_GET['close_ticket'])) { } mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 5, ticket_closed_at = NOW(), ticket_closed_by = $session_user_id WHERE ticket_id = $ticket_id") or die(mysqli_error($mysqli)); + setTicketResolutionSlaMet($ticket_id); mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = 'Ticket closed.', ticket_reply_type = 'Internal', ticket_reply_time_worked = '00:01:00', ticket_reply_by = $session_user_id, ticket_reply_ticket_id = $ticket_id"); @@ -2339,6 +2412,7 @@ if (isset($_GET['reopen_ticket'])) { } mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 2, ticket_resolved_at = NULL WHERE ticket_id = $ticket_id"); + resetTicketResolutionSla($ticket_id); logAudit("Ticket", "Reopened", "$session_name reopened ticket ID $ticket_id", $client_id, $ticket_id); diff --git a/agent/ticket.php b/agent/ticket.php index fe65f891a..d422b1bf6 100644 --- a/agent/ticket.php +++ b/agent/ticket.php @@ -110,6 +110,18 @@ if (isset($_GET['ticket_id'])) { $ticket_updated_at = escapeHtml($row['ticket_updated_at']); $ticket_updated_at_ago = timeAgo($row['ticket_updated_at']); $ticket_first_response_at = escapeHtml($row['ticket_first_response_at']); + $ticket_sla_id = intval($row['ticket_sla_id']); + $ticket_response_due_at = escapeHtml($row['ticket_response_due_at']); + $ticket_resolution_due_at = escapeHtml($row['ticket_resolution_due_at']); + $ticket_response_sla_met = $row['ticket_response_sla_met']; + $ticket_resolution_sla_met = $row['ticket_resolution_sla_met']; + $ticket_sla_name = "None"; + if ($ticket_sla_id) { + $sla_name_sql = mysqli_query($mysqli, "SELECT sla_name FROM slas WHERE sla_id = $ticket_sla_id"); + if (mysqli_num_rows($sla_name_sql)) { + $ticket_sla_name = escapeHtml(mysqli_fetch_assoc($sla_name_sql)['sla_name']); + } + } $ticket_resolved_at = escapeHtml($row['ticket_resolved_at']); $ticket_resolved_at_ago = timeAgo($row['ticket_resolved_at']); $ticket_resolved_date = date('Y-m-d', strtotime($ticket_resolved_at)); @@ -488,6 +500,16 @@ if (isset($_GET['ticket_id'])) {
    + +
    @@ -878,6 +900,20 @@ if (isset($_GET['ticket_id'])) {
    + + +
    + Respond by: + " : ""; } ?> +
    + + +
    + Resolve by: + " : ""; } ?> +
    + +
    diff --git a/agent/ticket_list.php b/agent/ticket_list.php index b2c5a3fb7..2107acef0 100644 --- a/agent/ticket_list.php +++ b/agent/ticket_list.php @@ -90,6 +90,8 @@ $ticket_updated_at = escapeHtml($row['ticket_updated_at']); $ticket_updated_at_time_ago = timeAgo($row['ticket_updated_at']); $ticket_closed_at = escapeHtml($row['ticket_closed_at']); + // SLA alert stages are maintained by cron/ticket_sla.php (1 = warned, 2 = breached) + $ticket_sla_alert_stage = max(intval($row['ticket_response_sla_alert_stage']), intval($row['ticket_resolution_sla_alert_stage'])); if (empty($ticket_updated_at)) { if (!empty($ticket_closed_at)) { $ticket_updated_at_display = "

    Never

    "; @@ -192,7 +194,7 @@ ?> -
    diff --git a/api/v1/tickets/create.php b/api/v1/tickets/create.php index 339b81926..2ced44ead 100644 --- a/api/v1/tickets/create.php +++ b/api/v1/tickets/create.php @@ -50,6 +50,7 @@ if (!empty($subject)) { // Check insert & get insert ID if ($insert_sql) { $insert_id = mysqli_insert_id($mysqli); + applyTicketSla($insert_id); // Logging logAudit("Ticket", "Create", "Created ticket $config_ticket_prefix$ticket_number $subject via API ($api_key_name)", $client_id, $insert_id); diff --git a/api/v1/tickets/resolve.php b/api/v1/tickets/resolve.php index 6cd2ecf83..4fe4c46dd 100644 --- a/api/v1/tickets/resolve.php +++ b/api/v1/tickets/resolve.php @@ -25,11 +25,12 @@ if (!empty($ticket_id)) { // Mark FR (if not) if (empty($ticket_first_response_at)) { - mysqli_query($mysqli, "UPDATE tickets SET ticket_first_response_at = NOW() WHERE ticket_id = $ticket_id AND ticket_client_id = $client_id LIMIT 1"); + setTicketFirstResponse($ticket_id); } // Resolve $update_sql = mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 4, ticket_resolved_at = NOW() WHERE ticket_id = $ticket_id AND ticket_client_id = $client_id LIMIT 1"); + setTicketResolutionSlaMet($ticket_id); // Check insert & get insert ID if ($update_sql) { diff --git a/client/post.php b/client/post.php index a8cf5a715..77931dbb7 100644 --- a/client/post.php +++ b/client/post.php @@ -49,6 +49,7 @@ if (isset($_POST['add_ticket'])) { mysqli_query($mysqli, "INSERT INTO tickets SET ticket_prefix = '$config_ticket_prefix', ticket_number = $ticket_number, ticket_source = 'Portal', ticket_category = $category, ticket_subject = '$subject', ticket_details = '$details', ticket_priority = '$priority', ticket_status = 1, ticket_billable = $config_ticket_default_billable, ticket_created_by = $session_user_id, ticket_contact_id = $session_contact_id, ticket_asset_id = $asset, ticket_url_key = '$url_key', ticket_client_id = $session_client_id"); $ticket_id = mysqli_insert_id($mysqli); + applyTicketSla($ticket_id); // Notify agent DL of the new ticket, if populated with a valid email if ($config_ticket_new_ticket_notification_email) { diff --git a/cron/cron.php b/cron/cron.php index 15cd603d1..ba7e85783 100644 --- a/cron/cron.php +++ b/cron/cron.php @@ -343,6 +343,7 @@ if (mysqli_num_rows($sql_recurring_tickets) > 0) { // Raise the ticket mysqli_query($mysqli, "INSERT INTO tickets SET ticket_prefix = '$config_ticket_prefix', ticket_number = $ticket_number, ticket_source = 'Recurring', ticket_subject = '$subject', ticket_details = '$details', ticket_priority = '$priority', ticket_status = '$ticket_status', ticket_billable = $billable, ticket_created_by = $created_id, ticket_assigned_to = $assigned_id, ticket_contact_id = $contact_id, ticket_client_id = $client_id, ticket_asset_id = $asset_id, ticket_category = $category, ticket_recurring_ticket_id = $recurring_ticket_id"); $id = mysqli_insert_id($mysqli); + applyTicketSla($id); // Copy Additional Assets from Recurring ticket to new ticket mysqli_query($mysqli, "INSERT INTO ticket_assets (ticket_id, asset_id) diff --git a/cron/ticket_email_parser.php b/cron/ticket_email_parser.php index 119a5bf50..4926ae1e1 100644 --- a/cron/ticket_email_parser.php +++ b/cron/ticket_email_parser.php @@ -124,6 +124,7 @@ function addTicket($contact_id, $contact_name, $contact_email, $client_id, $date mysqli_query($mysqli, "INSERT INTO tickets SET ticket_prefix = '$ticket_prefix_esc', ticket_number = $ticket_number, ticket_source = 'Email', ticket_subject = '$subject', ticket_details = '$message_esc', ticket_priority = 'Low', ticket_status = 1, ticket_billable = $config_ticket_default_billable, ticket_created_by = 0, ticket_contact_id = $contact_id, ticket_url_key = '$url_key', ticket_client_id = $client_id"); $id = mysqli_insert_id($mysqli); + applyTicketSla($id); // Logging logAudit("Ticket", "Create", "Email parser: Client contact $contact_email_esc created ticket $ticket_prefix_esc$ticket_number ($subject) ($id)", $client_id, $id); diff --git a/cron/ticket_sla.php b/cron/ticket_sla.php new file mode 100644 index 000000000..a6c450dae --- /dev/null +++ b/cron/ticket_sla.php @@ -0,0 +1,163 @@ + 99) { + $warning_percent = 0; // Out of range = warnings disabled, breach alerts only +} + +$sla_notification_email = trim(strval($sla_settings['notification_email'])); +$from_email = $sla_settings['ticket_from_email']; +$from_name = $sla_settings['ticket_from_name']; + +$now = time(); + +// Queue in-app + email notifications for an SLA event +function sendSlaAlert($ticket, $subject_line, $body_line) +{ + global $mysqli, $sla_notification_email, $from_email, $from_name, $config_base_url; + + $ticket_id = intval($ticket['ticket_id']); + $client_id = intval($ticket['ticket_client_id']); + + $ticket_ref = "{$ticket['ticket_prefix']}{$ticket['ticket_number']}"; + $ticket_subject = strval($ticket['ticket_subject']); + + // appNotify inserts what it is given - escape at the boundary + appNotify("Ticket SLA", escapeSql("$subject_line - $ticket_ref - $ticket_subject"), "/agent/ticket.php?ticket_id=$ticket_id", $client_id, $ticket_id); + + // addToMailQueue also inserts raw, and the body's link markup contains + // single quotes - escape whole strings once here. The body keeps its HTML, + // so it gets mysqli_real_escape_string directly (escapeSql strips tags), + // same as the ticket email parser does for its bodies. + $email_subject = escapeSql("$subject_line: $ticket_ref - $ticket_subject"); + $email_body = mysqli_real_escape_string($mysqli, "Hello,

    $body_line

    Ticket: $ticket_ref
    Subject: $ticket_subject

    View ticket"); + + $email_data = []; + + if (!empty($sla_notification_email)) { + $email_data[] = [ + 'from' => $from_email, + 'from_name' => escapeSql($from_name), + 'recipient' => $sla_notification_email, + 'recipient_name' => 'SLA Notifications', + 'subject' => $email_subject, + 'body' => $email_body, + ]; + } + + // Assigned agent (skip a duplicate if they are also the notification address) + if (!empty($ticket['user_email']) && strtolower($ticket['user_email']) != strtolower($sla_notification_email)) { + $email_data[] = [ + 'from' => $from_email, + 'from_name' => escapeSql($from_name), + 'recipient' => $ticket['user_email'], + 'recipient_name' => escapeSql(strval($ticket['user_name'])), + 'subject' => $email_subject, + 'body' => $email_body, + ]; + } + + if (!empty($email_data)) { + addToMailQueue($email_data); + } +} + +// --- Response SLA track --- +// Open tickets awaiting a first response, not yet marked breached +$sql_response = mysqli_query($mysqli, "SELECT ticket_id, ticket_prefix, ticket_number, ticket_subject, ticket_client_id, ticket_created_at, ticket_response_due_at, ticket_response_sla_alert_stage, sla_response_minutes, user_email, user_name + FROM tickets + LEFT JOIN slas ON ticket_sla_id = sla_id + LEFT JOIN users ON ticket_assigned_to = user_id + WHERE ticket_sla_id > 0 + AND ticket_response_due_at IS NOT NULL + AND ticket_first_response_at IS NULL + AND ticket_resolved_at IS NULL + AND ticket_closed_at IS NULL + AND ticket_archived_at IS NULL + AND ticket_response_sla_alert_stage < 2" +); + +while ($ticket = mysqli_fetch_assoc($sql_response)) { + + $ticket_id = intval($ticket['ticket_id']); + $stage = intval($ticket['ticket_response_sla_alert_stage']); + $due = strtotime($ticket['ticket_response_due_at']); + + if ($now >= $due) { + // Breached without a response - the verdict is final, record the miss + mysqli_query($mysqli, "UPDATE tickets SET ticket_response_sla_alert_stage = 2, ticket_response_sla_met = 0 WHERE ticket_id = $ticket_id"); + sendSlaAlert($ticket, "Response SLA breached", "The response SLA on this ticket was missed (due {$ticket['ticket_response_due_at']})."); + + } elseif ($stage < 1 && $warning_percent) { + $warn_at = strtotime(addBusinessMinutes($ticket['ticket_created_at'], floor(intval($ticket['sla_response_minutes']) * $warning_percent / 100))); + if ($now >= $warn_at) { + mysqli_query($mysqli, "UPDATE tickets SET ticket_response_sla_alert_stage = 1 WHERE ticket_id = $ticket_id"); + sendSlaAlert($ticket, "Response SLA at risk", "This ticket is approaching its response SLA (due {$ticket['ticket_response_due_at']})."); + } + } +} + +// --- Resolution SLA track --- +// Open tickets with a resolution target, not yet resolved or marked breached +$sql_resolution = mysqli_query($mysqli, "SELECT ticket_id, ticket_prefix, ticket_number, ticket_subject, ticket_client_id, ticket_created_at, ticket_resolution_due_at, ticket_resolution_sla_alert_stage, sla_resolution_minutes, user_email, user_name + FROM tickets + LEFT JOIN slas ON ticket_sla_id = sla_id + LEFT JOIN users ON ticket_assigned_to = user_id + WHERE ticket_sla_id > 0 + AND ticket_resolution_due_at IS NOT NULL + AND ticket_resolved_at IS NULL + AND ticket_closed_at IS NULL + AND ticket_archived_at IS NULL + AND ticket_resolution_sla_alert_stage < 2" +); + +while ($ticket = mysqli_fetch_assoc($sql_resolution)) { + + $ticket_id = intval($ticket['ticket_id']); + $stage = intval($ticket['ticket_resolution_sla_alert_stage']); + $due = strtotime($ticket['ticket_resolution_due_at']); + + if ($now >= $due) { + mysqli_query($mysqli, "UPDATE tickets SET ticket_resolution_sla_alert_stage = 2, ticket_resolution_sla_met = 0 WHERE ticket_id = $ticket_id"); + sendSlaAlert($ticket, "Resolution SLA breached", "The resolution SLA on this ticket was missed (due {$ticket['ticket_resolution_due_at']})."); + + } elseif ($stage < 1 && $warning_percent) { + $warn_at = strtotime(addBusinessMinutes($ticket['ticket_created_at'], floor(intval($ticket['sla_resolution_minutes']) * $warning_percent / 100))); + if ($now >= $warn_at) { + mysqli_query($mysqli, "UPDATE tickets SET ticket_resolution_sla_alert_stage = 1 WHERE ticket_id = $ticket_id"); + sendSlaAlert($ticket, "Resolution SLA at risk", "This ticket is approaching its resolution SLA (due {$ticket['ticket_resolution_due_at']})."); + } + } +} diff --git a/db.sql b/db.sql index 9530026be..3b78a8e77 100644 --- a/db.sql +++ b/db.sql @@ -2213,6 +2213,11 @@ CREATE TABLE `settings` ( `config_theme` varchar(200) DEFAULT 'blue', `config_telemetry` tinyint(1) DEFAULT 0, `config_timezone` varchar(200) NOT NULL DEFAULT 'America/New_York', + `config_business_days` varchar(20) NOT NULL DEFAULT '1,2,3,4,5', + `config_business_hours_start` time NOT NULL DEFAULT '09:00:00', + `config_business_hours_end` time NOT NULL DEFAULT '17:00:00', + `config_sla_warning_percent` tinyint(3) NOT NULL DEFAULT 75, + `config_sla_notification_email` varchar(200) DEFAULT NULL, `config_destructive_deletes_enable` tinyint(1) NOT NULL DEFAULT 0, `config_whitelabel_enabled` int(11) NOT NULL DEFAULT 0, `config_whitelabel_key` text DEFAULT NULL, @@ -2249,6 +2254,42 @@ CREATE TABLE `shared_items` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; +-- +-- Table structure for table `sla_assignments` +-- + +DROP TABLE IF EXISTS `sla_assignments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE `sla_assignments` ( + `sla_assignment_id` int(11) NOT NULL AUTO_INCREMENT, + `sla_assignment_client_id` int(11) NOT NULL DEFAULT 0, + `sla_assignment_priority` varchar(200) NOT NULL, + `sla_assignment_sla_id` int(11) NOT NULL DEFAULT 0, + PRIMARY KEY (`sla_assignment_id`), + UNIQUE KEY `sla_assignment_client_priority` (`sla_assignment_client_id`,`sla_assignment_priority`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `slas` +-- + +DROP TABLE IF EXISTS `slas`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8mb4 */; +CREATE TABLE `slas` ( + `sla_id` int(11) NOT NULL AUTO_INCREMENT, + `sla_name` varchar(200) NOT NULL, + `sla_description` varchar(500) DEFAULT NULL, + `sla_response_minutes` int(11) NOT NULL, + `sla_resolution_minutes` int(11) DEFAULT NULL, + `sla_created_at` datetime NOT NULL DEFAULT current_timestamp(), + `sla_archived_at` datetime DEFAULT NULL, + PRIMARY KEY (`sla_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + -- -- Table structure for table `software` -- @@ -2700,6 +2741,7 @@ CREATE TABLE `tickets` ( `ticket_details` longtext NOT NULL, `ticket_priority` varchar(200) DEFAULT NULL, `ticket_status` int(11) NOT NULL, + `ticket_sla_id` int(11) NOT NULL DEFAULT 0, `ticket_billable` tinyint(1) NOT NULL DEFAULT 0, `ticket_schedule` datetime DEFAULT NULL, `ticket_onsite` tinyint(1) NOT NULL DEFAULT 0, @@ -2712,6 +2754,12 @@ CREATE TABLE `tickets` ( `ticket_resolved_at` datetime DEFAULT NULL, `ticket_archived_at` datetime DEFAULT NULL, `ticket_first_response_at` datetime DEFAULT NULL, + `ticket_response_due_at` datetime DEFAULT NULL, + `ticket_resolution_due_at` datetime DEFAULT NULL, + `ticket_response_sla_met` tinyint(1) DEFAULT NULL, + `ticket_resolution_sla_met` tinyint(1) DEFAULT NULL, + `ticket_response_sla_alert_stage` tinyint(1) NOT NULL DEFAULT 0, + `ticket_resolution_sla_alert_stage` tinyint(1) NOT NULL DEFAULT 0, `ticket_closed_at` datetime DEFAULT NULL, `ticket_created_by` int(11) NOT NULL, `ticket_assigned_to` int(11) NOT NULL DEFAULT 0, @@ -2726,7 +2774,9 @@ CREATE TABLE `tickets` ( `ticket_project_id` int(11) NOT NULL DEFAULT 0, `ticket_recurring_ticket_id` int(11) DEFAULT 0, `ticket_order` int(11) NOT NULL DEFAULT 0, - PRIMARY KEY (`ticket_id`) + PRIMARY KEY (`ticket_id`), + KEY `ticket_response_due_at` (`ticket_response_due_at`), + KEY `ticket_resolution_due_at` (`ticket_resolution_due_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; diff --git a/functions.php b/functions.php index 5183cccc8..8f9be24d0 100644 --- a/functions.php +++ b/functions.php @@ -17,3 +17,4 @@ require_once __DIR__ . '/functions/logging.php'; require_once __DIR__ . '/functions/app.php'; require_once __DIR__ . '/functions/db.php'; require_once __DIR__ . '/functions/payments.php'; +require_once __DIR__ . '/functions/sla.php'; diff --git a/functions/sla.php b/functions/sla.php new file mode 100644 index 000000000..0fee1dfcb --- /dev/null +++ b/functions/sla.php @@ -0,0 +1,280 @@ += 1 && $day <= 7) { + $business_days[] = $day; + } + } + + $sla_settings = [ + 'business_days' => $business_days, + 'business_hours_start' => $row['config_business_hours_start'], + 'business_hours_end' => $row['config_business_hours_end'], + 'warning_percent' => intval($row['config_sla_warning_percent']), + 'notification_email' => $row['config_sla_notification_email'], + 'ticket_from_name' => $row['config_ticket_from_name'] ?: $row['config_mail_from_name'], + 'ticket_from_email' => $row['config_ticket_from_email'] ?: $row['config_mail_from_email'], + ]; + + return $sla_settings; +} + +// Add $minutes of business time to a datetime, honouring the configured +// business days and hours. Returns a Y-m-d H:i:s string in the app timezone +// (includes/inc_set_timezone.php has already set it). With no usable business +// calendar configured the clock is treated as 24x7. +function addBusinessMinutes($start_datetime, $minutes) +{ + $minutes = intval($minutes); + $cursor = new DateTime($start_datetime); + + if ($minutes <= 0) { + return $cursor->format('Y-m-d H:i:s'); + } + + $sla_settings = getSlaSettings(); + $business_days = $sla_settings['business_days']; + $day_start = $sla_settings['business_hours_start']; + $day_end = $sla_settings['business_hours_end']; + + if (empty($business_days) || empty($day_start) || empty($day_end) || $day_start >= $day_end) { + $cursor->modify("+$minutes minutes"); + return $cursor->format('Y-m-d H:i:s'); + } + + $remaining_seconds = $minutes * 60; + + // Walk forward a day at a time consuming available business time. Interval + // math is done on timestamps (real elapsed time), window edges by wall + // clock - so a DST-shortened business day yields less SLA time, which is + // the honest reading. Guard: two years of calendar. + for ($i = 0; $i < 731; $i++) { + + if (in_array(intval($cursor->format('N')), $business_days)) { + + $window_start = new DateTime($cursor->format('Y-m-d') . " $day_start"); + $window_end = new DateTime($cursor->format('Y-m-d') . " $day_end"); + + if ($cursor < $window_start) { + $cursor = $window_start; + } + + if ($cursor < $window_end) { + $available_seconds = $window_end->getTimestamp() - $cursor->getTimestamp(); + + if ($remaining_seconds <= $available_seconds) { + $cursor->setTimestamp($cursor->getTimestamp() + $remaining_seconds); + return $cursor->format('Y-m-d H:i:s'); + } + + $remaining_seconds -= $available_seconds; + } + } + + // Start of the next calendar day + $cursor = new DateTime($cursor->format('Y-m-d') . ' 00:00:00'); + $cursor->modify('+1 day'); + } + + // Unreachable with a sane configuration - fail open rather than loop + $cursor->setTimestamp($cursor->getTimestamp() + $remaining_seconds); + return $cursor->format('Y-m-d H:i:s'); +} + +// Resolve which SLA (if any) applies to a client + priority combination. +// Returns an sla_id, or 0 when no SLA applies. +function getTicketSlaId($client_id, $priority) +{ + global $mysqli; + + $client_id = intval($client_id); + $priority = escapeSql($priority); + + $sla_id = null; + + // Client-level assignment wins; a row pointing at SLA 0 is an explicit + // "no SLA for this client/priority" override of the global default + if ($client_id > 0) { + $sql = mysqli_query($mysqli, "SELECT sla_assignment_sla_id FROM sla_assignments WHERE sla_assignment_client_id = $client_id AND sla_assignment_priority = '$priority' LIMIT 1"); + if (mysqli_num_rows($sql)) { + $sla_id = intval(mysqli_fetch_assoc($sql)['sla_assignment_sla_id']); + } + } + + // Fall back to the global default (client 0) + if (is_null($sla_id)) { + $sql = mysqli_query($mysqli, "SELECT sla_assignment_sla_id FROM sla_assignments WHERE sla_assignment_client_id = 0 AND sla_assignment_priority = '$priority' LIMIT 1"); + if (mysqli_num_rows($sql)) { + $sla_id = intval(mysqli_fetch_assoc($sql)['sla_assignment_sla_id']); + } + } + + if (empty($sla_id)) { + return 0; + } + + // Ignore assignments pointing at archived SLAs + $sql = mysqli_query($mysqli, "SELECT sla_id FROM slas WHERE sla_id = $sla_id AND sla_archived_at IS NULL LIMIT 1"); + if (!mysqli_num_rows($sql)) { + return 0; + } + + return $sla_id; +} + +// Stamp (or re-stamp) a ticket's SLA and computed due dates. Call after ticket +// creation and after anything that changes which SLA applies (priority edit, +// client change, manual SLA change). Pass $forced_sla_id to pin a specific SLA +// (0 = explicitly none) instead of resolving from the assignments. +function applyTicketSla($ticket_id, $forced_sla_id = null) +{ + global $mysqli; + + $ticket_id = intval($ticket_id); + + $sql = mysqli_query($mysqli, "SELECT ticket_client_id, ticket_priority, ticket_created_at, ticket_first_response_at, ticket_resolved_at FROM tickets WHERE ticket_id = $ticket_id LIMIT 1"); + if (!$sql || !mysqli_num_rows($sql)) { + return; + } + $row = mysqli_fetch_assoc($sql); + + if (is_null($forced_sla_id)) { + $sla_id = getTicketSlaId($row['ticket_client_id'], $row['ticket_priority']); + } else { + $sla_id = intval($forced_sla_id); + } + + // No SLA applies - clear any previous targets + if ($sla_id == 0) { + mysqli_query($mysqli, "UPDATE tickets SET ticket_sla_id = 0, ticket_response_due_at = NULL, ticket_resolution_due_at = NULL, ticket_response_sla_met = NULL, ticket_resolution_sla_met = NULL, ticket_response_sla_alert_stage = 0, ticket_resolution_sla_alert_stage = 0 WHERE ticket_id = $ticket_id"); + return; + } + + $sla_sql = mysqli_query($mysqli, "SELECT sla_response_minutes, sla_resolution_minutes FROM slas WHERE sla_id = $sla_id LIMIT 1"); + if (!$sla_sql || !mysqli_num_rows($sla_sql)) { + return; + } + $sla = mysqli_fetch_assoc($sla_sql); + + $created_at = $row['ticket_created_at']; + + $response_due_at = addBusinessMinutes($created_at, $sla['sla_response_minutes']); + + $resolution_due_at = null; + $resolution_due_at_set = "NULL"; + if (intval($sla['sla_resolution_minutes']) > 0) { + $resolution_due_at = addBusinessMinutes($created_at, $sla['sla_resolution_minutes']); + $resolution_due_at_set = "'$resolution_due_at'"; + } + + // Re-judge met flags for milestones already reached; alert stages reset so + // the SLA cron re-evaluates pending milestones against the new targets + $response_met_set = "NULL"; + if (!empty($row['ticket_first_response_at'])) { + $response_met_set = strtotime($row['ticket_first_response_at']) <= strtotime($response_due_at) ? 1 : 0; + } + + $resolution_met_set = "NULL"; + if (!empty($row['ticket_resolved_at']) && !is_null($resolution_due_at)) { + $resolution_met_set = strtotime($row['ticket_resolved_at']) <= strtotime($resolution_due_at) ? 1 : 0; + } + + mysqli_query($mysqli, "UPDATE tickets SET ticket_sla_id = $sla_id, ticket_response_due_at = '$response_due_at', ticket_resolution_due_at = $resolution_due_at_set, ticket_response_sla_met = $response_met_set, ticket_resolution_sla_met = $resolution_met_set, ticket_response_sla_alert_stage = 0, ticket_resolution_sla_alert_stage = 0 WHERE ticket_id = $ticket_id"); +} + +// Record the ticket's first response (if not already recorded) and judge the +// response SLA against the stored due date. Replaces the previous inline +// ticket_first_response_at updates so the SLA verdict can never drift from +// the timestamp. +function setTicketFirstResponse($ticket_id) +{ + global $mysqli; + + $ticket_id = intval($ticket_id); + + $sql = mysqli_query($mysqli, "SELECT ticket_first_response_at, ticket_response_due_at FROM tickets WHERE ticket_id = $ticket_id LIMIT 1"); + if (!$sql || !mysqli_num_rows($sql)) { + return; + } + $row = mysqli_fetch_assoc($sql); + + if (!empty($row['ticket_first_response_at'])) { + return; + } + + $response_met_set = "NULL"; + if (!empty($row['ticket_response_due_at'])) { + $response_met_set = time() <= strtotime($row['ticket_response_due_at']) ? 1 : 0; + } + + mysqli_query($mysqli, "UPDATE tickets SET ticket_first_response_at = NOW(), ticket_response_sla_met = $response_met_set WHERE ticket_id = $ticket_id"); +} + +// Judge the resolution SLA when a ticket is resolved (or closed without being +// resolved, which also stops the clock). No-op for tickets without a +// resolution target. +function setTicketResolutionSlaMet($ticket_id) +{ + global $mysqli; + + $ticket_id = intval($ticket_id); + + $sql = mysqli_query($mysqli, "SELECT ticket_resolution_due_at, ticket_resolved_at FROM tickets WHERE ticket_id = $ticket_id LIMIT 1"); + if (!$sql || !mysqli_num_rows($sql)) { + return; + } + $row = mysqli_fetch_assoc($sql); + + if (empty($row['ticket_resolution_due_at'])) { + return; + } + + $ended_at = !empty($row['ticket_resolved_at']) ? strtotime($row['ticket_resolved_at']) : time(); + $resolution_met = $ended_at <= strtotime($row['ticket_resolution_due_at']) ? 1 : 0; + + mysqli_query($mysqli, "UPDATE tickets SET ticket_resolution_sla_met = $resolution_met WHERE ticket_id = $ticket_id"); +} + +// A reopened ticket goes back on the resolution clock (original due date - no +// pause/extend logic yet, that arrives with SLA pausing) +function resetTicketResolutionSla($ticket_id) +{ + global $mysqli; + + $ticket_id = intval($ticket_id); + + mysqli_query($mysqli, "UPDATE tickets SET ticket_resolution_sla_met = NULL, ticket_resolution_sla_alert_stage = 0 WHERE ticket_id = $ticket_id"); +} From dd45a0f4f1b5b4e6f1e1cb2a36dcf04d553a7c42 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Wed, 29 Jul 2026 00:03:08 -0400 Subject: [PATCH 167/241] Update DB Structure --- db.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db.sql b/db.sql index 3b78a8e77..b379e42f3 100644 --- a/db.sql +++ b/db.sql @@ -3047,4 +3047,4 @@ CREATE TABLE `vendors` ( /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2026-07-28 22:07:36 +-- Dump completed on 2026-07-29 0:02:52 From d5ed05017baf6153432d6c050cd59960ef305d22 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Wed, 29 Jul 2026 00:21:13 -0400 Subject: [PATCH 168/241] Allow selecting client SLA assignments on client create/edit --- agent/modals/client/client_add.php | 28 ++++++++++++++++++ agent/modals/client/client_edit.php | 35 ++++++++++++++++++++++ agent/post/client.php | 46 +++++++++++++++++++++++++++++ 3 files changed, 109 insertions(+) diff --git a/agent/modals/client/client_add.php b/agent/modals/client/client_add.php index 64cb44ae2..bf05a3538 100644 --- a/agent/modals/client/client_add.php +++ b/agent/modals/client/client_add.php @@ -159,6 +159,34 @@ ob_start(); + +
    + +
    + +
    + + +
    + +
    + Default follows the global SLA assignment for each priority. +
    + +
    diff --git a/agent/modals/client/client_edit.php b/agent/modals/client/client_edit.php index 3a9fa8a8e..b242d51b7 100644 --- a/agent/modals/client/client_edit.php +++ b/agent/modals/client/client_edit.php @@ -24,6 +24,13 @@ $client_notes = escapeHtml($row['client_notes']); $client_created_at = escapeHtml($row['client_created_at']); $client_archived_at = escapeHtml($row['client_archived_at']); +// Client SLA assignments +$client_sla_assignments = []; +$sql_client_slas = mysqli_query($mysqli, "SELECT sla_assignment_priority, sla_assignment_sla_id FROM sla_assignments WHERE sla_assignment_client_id = $client_id"); +while ($client_sla_row = mysqli_fetch_assoc($sql_client_slas)) { + $client_sla_assignments[$client_sla_row['sla_assignment_priority']] = intval($client_sla_row['sla_assignment_sla_id']); +} + // Client Tags $client_tag_id_array = array(); $sql_client_tags = mysqli_query($mysqli, "SELECT tag_id FROM client_tags WHERE client_id = $client_id"); @@ -186,6 +193,34 @@ ob_start();
    + +
    + +
    + +
    + + +
    + +
    + Default follows the global SLA assignment for each priority. +
    + + diff --git a/agent/post/client.php b/agent/post/client.php index af285bfe0..4a7ce844e 100644 --- a/agent/post/client.php +++ b/agent/post/client.php @@ -244,6 +244,17 @@ if (isset($_POST['add_client'])) { } } + // Ticket SLA assignments (fields only rendered when active SLAs exist) + if (isset($_POST['client_sla_low'])) { + foreach (['Low', 'Medium', 'High'] as $sla_priority) { + $sla_value = strval($_POST['client_sla_' . strtolower($sla_priority)] ?? 'default'); + if ($sla_value !== 'default') { + $client_sla_id = intval($sla_value); + mysqli_query($mysqli, "INSERT INTO sla_assignments SET sla_assignment_client_id = $client_id, sla_assignment_priority = '$sla_priority', sla_assignment_sla_id = $client_sla_id"); + } + } + } + logAudit("Client", "Create", "$session_name created client $name$extended_log_description", $client_id, $client_id); flashAlert("Client $name created"); @@ -322,6 +333,41 @@ if (isset($_POST['edit_client'])) { } } + // Ticket SLA assignments (fields only rendered when active SLAs exist) + if (isset($_POST['client_sla_low'])) { + + // Compare with current state so an unrelated client edit doesn't + // restamp tickets (restamping clobbers manual per-ticket SLA pins) + $current_sla_assignments = []; + $sql_current_slas = mysqli_query($mysqli, "SELECT sla_assignment_priority, sla_assignment_sla_id FROM sla_assignments WHERE sla_assignment_client_id = $client_id"); + while ($current_sla_row = mysqli_fetch_assoc($sql_current_slas)) { + $current_sla_assignments[$current_sla_row['sla_assignment_priority']] = strval(intval($current_sla_row['sla_assignment_sla_id'])); + } + + $sla_assignments_changed = false; + foreach (['Low', 'Medium', 'High'] as $sla_priority) { + $sla_value = strval($_POST['client_sla_' . strtolower($sla_priority)] ?? 'default'); + $sla_current = $current_sla_assignments[$sla_priority] ?? 'default'; + if ($sla_value === $sla_current) { + continue; + } + $sla_assignments_changed = true; + mysqli_query($mysqli, "DELETE FROM sla_assignments WHERE sla_assignment_client_id = $client_id AND sla_assignment_priority = '$sla_priority'"); + if ($sla_value !== 'default') { + $client_sla_id = intval($sla_value); + mysqli_query($mysqli, "INSERT INTO sla_assignments SET sla_assignment_client_id = $client_id, sla_assignment_priority = '$sla_priority', sla_assignment_sla_id = $client_sla_id"); + } + } + + if ($sla_assignments_changed) { + // Re-resolve this client's open tickets against the new assignments + $sql_sla_tickets = mysqli_query($mysqli, "SELECT ticket_id FROM tickets WHERE ticket_client_id = $client_id AND ticket_closed_at IS NULL AND ticket_archived_at IS NULL"); + while ($sla_ticket_row = mysqli_fetch_assoc($sql_sla_tickets)) { + applyTicketSla($sla_ticket_row['ticket_id']); + } + } + } + logAudit("Client", "Edit", "$session_name edited client $name", $client_id, $client_id); flashAlert("Client $name updated"); From 07c73a6a04e65b1ddaa588d67539971d81bfc5ff Mon Sep 17 00:00:00 2001 From: johnnyq Date: Wed, 29 Jul 2026 00:49:31 -0400 Subject: [PATCH 169/241] Add Urgent Priority, move Per Client SLA Settings to notes tab in client add / edit modal remove unnessesary sla admin setting for client overide --- admin/modals/sla/sla_assignment_client.php | 85 ------------------ admin/post/sla.php | 60 +------------ admin/sla.php | 88 ++----------------- agent/asset.php | 4 +- agent/contact.php | 4 +- agent/dashboard.php | 2 +- agent/modals/asset/asset.php | 4 +- agent/modals/asset/asset_bulk_add_ticket.php | 1 + agent/modals/client/client_add.php | 57 ++++++------ .../modals/client/client_bulk_add_ticket.php | 1 + agent/modals/client/client_edit.php | 57 ++++++------ agent/modals/contact/contact.php | 4 +- .../recurring_ticket/recurring_ticket_add.php | 1 + .../recurring_ticket_bulk_priority_edit.php | 1 + .../recurring_ticket_edit.php | 1 + agent/modals/ticket/ticket_add.php | 1 + agent/modals/ticket/ticket_add_v2.php | 1 + .../ticket/ticket_bulk_edit_priority.php | 1 + agent/modals/ticket/ticket_edit.php | 1 + agent/modals/ticket/ticket_priority.php | 1 + agent/post/client.php | 4 +- agent/project.php | 4 +- agent/recurring_tickets.php | 1 + agent/ticket.php | 4 +- agent/ticket_kanban.php | 5 +- agent/ticket_list.php | 4 +- agent/tickets.php | 1 + client/post.php | 2 +- client/ticket_add.php | 1 + 29 files changed, 107 insertions(+), 294 deletions(-) delete mode 100644 admin/modals/sla/sla_assignment_client.php diff --git a/admin/modals/sla/sla_assignment_client.php b/admin/modals/sla/sla_assignment_client.php deleted file mode 100644 index 90f70405d..000000000 --- a/admin/modals/sla/sla_assignment_client.php +++ /dev/null @@ -1,85 +0,0 @@ - - - -
    - - - - - -
    - -Default"; - } - $sla_id = $assignments[$client_id][$priority]; - if ($sla_id == 0) { - return "None"; - } - if (isset($active_slas[$sla_id])) { - return escapeHtml($active_slas[$sla_id]); - } - return "None (archived)"; -} ?> @@ -138,9 +115,6 @@ function slaAssignmentWording($assignments, $active_slas, $client_id, $priority)

    SLA Assignments

    -
    - -
    @@ -150,7 +124,7 @@ function slaAssignmentWording($assignments, $active_slas, $client_id, $priority) Default (all clients)
    -
    @@ -163,61 +137,11 @@ function slaAssignmentWording($assignments, $active_slas, $client_id, $priority)
    -
    - -
    + -
    - - Client overrides -
    - - "> - - - - - - - - - - - - - $override_client_name) { ?> - - - - - - - - - -
    ClientLowMediumHighAction
    No client overrides - everyone follows the defaults above.
    - - - - - -
    -
    + Per-client overrides are set on each client (edit client, Notes tab).
    diff --git a/agent/asset.php b/agent/asset.php index ec3cd0b30..b197acc0f 100644 --- a/agent/asset.php +++ b/agent/asset.php @@ -1107,7 +1107,9 @@ if (isset($_GET['asset_id'])) { } $ticket_closed_at = escapeHtml($row['ticket_closed_at']); - if ($ticket_priority == "High") { + if ($ticket_priority == "Urgent") { + $ticket_priority_display = "$ticket_priority"; + } elseif ($ticket_priority == "High") { $ticket_priority_display = "$ticket_priority"; } elseif ($ticket_priority == "Medium") { $ticket_priority_display = "$ticket_priority"; diff --git a/agent/contact.php b/agent/contact.php index fb75f7942..1c19a483a 100644 --- a/agent/contact.php +++ b/agent/contact.php @@ -847,7 +847,9 @@ if (isset($_GET['contact_id'])) { } $ticket_closed_at = escapeHtml($row['ticket_closed_at']); - if ($ticket_priority == "High") { + if ($ticket_priority == "Urgent") { + $ticket_priority_display = "$ticket_priority"; + } elseif ($ticket_priority == "High") { $ticket_priority_display = "$ticket_priority"; } elseif ($ticket_priority == "Medium") { $ticket_priority_display = "$ticket_priority"; diff --git a/agent/dashboard.php b/agent/dashboard.php index f87e81e08..ff237de93 100644 --- a/agent/dashboard.php +++ b/agent/dashboard.php @@ -770,7 +770,7 @@ if ($user_config_dashboard_technical_enable == 1) { $has_client = ""; } - $ticket_priority_color = $ticket_priority == "High" ? "danger" : ($ticket_priority == "Medium" ? "warning" : "info"); + $ticket_priority_color = $ticket_priority == "Urgent" ? "dark" : ($ticket_priority == "High" ? "danger" : ($ticket_priority == "Medium" ? "warning" : "info")); $contact_display = empty($contact_name) ? "-" : "$contact_name"; ?>
    SLA Action
    + + Paused + + Running + + + +
    +
    + + +
    + +
    +
    +

    +
    +
    +
    + + + + + + + + + + + + + + + + + 0 AND ticket_client_id = $client_id AND $period_query" + )); + + $ticket_count = intval($stats['ticket_count']); + if ($ticket_count == 0) { + continue; + } + $any_rows = true; + + $response_met = intval($stats['response_met']); + $response_missed = intval($stats['response_missed']); + $resolution_met = intval($stats['resolution_met']); + $resolution_missed = intval($stats['resolution_missed']); + + $response_judged = $response_met + $response_missed; + $response_percent = $response_judged ? round($response_met / $response_judged * 100, 1) : null; + + $resolution_judged = $resolution_met + $resolution_missed; + $resolution_percent = $resolution_judged ? round($resolution_met / $resolution_judged * 100, 1) : null; + + $avg_time_to_respond = is_null($stats['avg_response_seconds']) ? '-' : secondsToTime($stats['avg_response_seconds']); + + // Resolution time is measured in clock time actually spent - + // paused spells are excluded, which is what the SLA judged on + $avg_time_to_resolve = '-'; + $resolved_minutes_total = 0; + $resolved_count = 0; + $sql_resolved = mysqli_query($mysqli, "SELECT ticket_id FROM tickets WHERE ticket_sla_id > 0 AND ticket_client_id = $client_id AND ticket_resolved_at IS NOT NULL AND $period_query"); + while ($resolved_row = mysqli_fetch_assoc($sql_resolved)) { + $resolved_minutes_total += getTicketSlaConsumedMinutes($resolved_row['ticket_id']); + $resolved_count++; + } + if ($resolved_count > 0) { + $avg_time_to_resolve = secondsToTime(($resolved_minutes_total / $resolved_count) * 60); + } + ?> + + + + + + + + + + + + + + + + +
    ClientTicketsResponse metResponse missedResponse %Resolution metResolution missedResolution %Avg time to respondAvg clock to resolve
    No tickets with an SLA in this period.
    +
    + + Time to respond is wall-clock from ticket creation. Time to resolve counts only business hours with the SLA clock running, so paused time is excluded. + +
    +
    + +
    + + + 0 $where" + )); + + $compliance = [ + 'ticket_count' => intval($row['ticket_count']), + 'response_met' => intval($row['response_met']), + 'response_missed' => intval($row['response_missed']), + 'response_pending' => intval($row['response_pending']), + 'resolution_met' => intval($row['resolution_met']), + 'resolution_missed' => intval($row['resolution_missed']), + 'resolution_pending' => intval($row['resolution_pending']), + ]; + + // Percentages count only judged tickets - a ticket still in flight is + // neither a hit nor a miss + $response_judged = $compliance['response_met'] + $compliance['response_missed']; + $compliance['response_percent'] = $response_judged ? round($compliance['response_met'] / $response_judged * 100, 1) : null; + + $resolution_judged = $compliance['resolution_met'] + $compliance['resolution_missed']; + $compliance['resolution_percent'] = $resolution_judged ? round($compliance['resolution_met'] / $resolution_judged * 100, 1) : null; + + return $compliance; +} + +// Colour the headline figures the way the ticket list colours rows +function slaPercentDisplay($percent) +{ + if (is_null($percent)) { + return "-"; + } + if ($percent >= 95) { + return "$percent%"; + } + if ($percent >= 80) { + return "$percent%"; + } + return "$percent%"; +} + +$overall = getSlaCompliance("AND YEAR(ticket_created_at) = $year"); + +?> + +
    +
    +

    SLA Summary

    +
    + +
    +
    +
    +
    + +
    + + +

    No tickets raised in carried an SLA. Assign SLAs under Admin > SLAs to start tracking.

    + + +
    +
    +
    + +
    + Tickets with an SLA + +
    +
    +
    +
    +
    + +
    + Response compliance + +
    +
    +
    +
    +
    + +
    + Resolution compliance + +
    +
    +
    +
    + +
    +
    +

    By Priority ()

    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PriorityTicketsResponse metResponse missedResponse %Resolution metResolution missedResolution %
    +
    +
    +
    + +
    +
    +

    By Month ()

    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    MonthTicketsResponse %Resolution %Still open
    +
    +
    +
    + + Percentages count only tickets whose targets have been judged - tickets still awaiting a response or resolution are excluded until their outcome is known. Tickets raised before SLAs were assigned carry no SLA and are not counted. + + + +
    +
    + +Priority: Low
    Priority: Med Priority: HighPriority: Urgent Resolved Total Time worked (H:M:S) Avg time to respond Priority: Low Priority: Med Priority: HighPriority: Urgent Resolved Total Time worked (H:M:S) Avg time to respond
    + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNoteByCreatedAction
    + +
    +
    +
    +
    +
    diff --git a/agent/modals/asset/asset.php b/agent/modals/asset/asset.php index ec3eca775..3419d3ca5 100644 --- a/agent/modals/asset/asset.php +++ b/agent/modals/asset/asset.php @@ -218,6 +218,22 @@ $sql_related_software = mysqli_query( $software_count = mysqli_num_rows($sql_related_software); +// Related Notes +$sql_related_notes = mysqli_query($mysqli, "SELECT * FROM asset_notes + LEFT JOIN users ON asset_note_created_by = user_id + WHERE asset_note_asset_id = $asset_id + AND asset_note_archived_at IS NULL + ORDER BY asset_note_created_at DESC" +); +$note_count = mysqli_num_rows($sql_related_notes); + +// Note type icons, read from the categories list +$note_type_icons = array(); +$sql_note_type_icons = mysqli_query($mysqli, "SELECT category_name, category_icon FROM categories WHERE category_type = 'asset_note_type'"); +while ($row = mysqli_fetch_assoc($sql_note_type_icons)) { + $note_type_icons[escapeHtml($row['category_name'])] = escapeHtml($row['category_icon']); +} + if (isset($_GET['client_id'])) { $client_url = "client_id=$client_id&"; } else { @@ -293,6 +309,13 @@ ob_start(); Files () + + +
    @@ -913,6 +936,47 @@ ob_start();
    + +
    +
    + + + + + + + + + + + + + + + + + + + + +
    TypeNoteByCreated
    +
    +
    + +
    diff --git a/agent/modals/asset/asset_note_add.php b/agent/modals/asset/asset_note_add.php new file mode 100644 index 000000000..85bb3413e --- /dev/null +++ b/agent/modals/asset/asset_note_add.php @@ -0,0 +1,70 @@ + + + + +
    + + + + + + +
    + +$type
    created for $asset_name"; + + redirect(); + +} + +if (isset($_GET['archive_asset_note'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + $asset_note_id = intval($_GET['archive_asset_note']); + + // Get Asset Name and Client ID for logging and alert message + $sql = mysqli_query($mysqli,"SELECT asset_note_type, asset_id, asset_name, asset_client_id FROM asset_notes LEFT JOIN assets ON asset_id = asset_note_asset_id WHERE asset_note_id = $asset_note_id"); + $row = mysqli_fetch_assoc($sql); + $asset_note_type = escapeSql($row['asset_note_type']); + $asset_name = escapeSql($row['asset_name']); + $client_id = intval($row['asset_client_id']); + $asset_id = intval($row['asset_id']); + + enforceClientAccess(); + + mysqli_query($mysqli,"UPDATE asset_notes SET asset_note_archived_at = NOW() WHERE asset_note_id = $asset_note_id"); + + logAudit("Asset", "Edit", "$session_name archived note $asset_note_type for $asset_name", $client_id, $asset_id); + + flashAlert("Note $asset_note_type archived", 'error'); + + redirect(); + +} + +if (isset($_GET['restore_asset_note'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 2); + + $asset_note_id = intval($_GET['restore_asset_note']); + + // Get Asset Name and Client ID for logging and alert message + $sql = mysqli_query($mysqli,"SELECT asset_note_type, asset_id, asset_name, asset_client_id FROM asset_notes LEFT JOIN assets ON asset_id = asset_note_asset_id WHERE asset_note_id = $asset_note_id"); + $row = mysqli_fetch_assoc($sql); + $asset_note_type = escapeSql($row['asset_note_type']); + $asset_name = escapeSql($row['asset_name']); + $client_id = intval($row['asset_client_id']); + $asset_id = intval($row['asset_id']); + + enforceClientAccess(); + + mysqli_query($mysqli,"UPDATE asset_notes SET asset_note_archived_at = NULL WHERE asset_note_id = $asset_note_id"); + + logAudit("Asset", "Edit", "$session_name restored note $asset_note_type for $asset_name", $client_id, $asset_id); + + flashAlert("Note $asset_note_type restored"); + + redirect(); + +} + +if (isset($_GET['delete_asset_note'])) { + + validateCSRFToken(); + + enforceUserPermission('module_support', 3); + + $asset_note_id = intval($_GET['delete_asset_note']); + + // Get Asset Name and Client ID for logging and alert message + $sql = mysqli_query($mysqli,"SELECT asset_note_type, asset_id, asset_name, asset_client_id FROM asset_notes LEFT JOIN assets ON asset_id = asset_note_asset_id WHERE asset_note_id = $asset_note_id"); + $row = mysqli_fetch_assoc($sql); + $asset_note_type = escapeSql($row['asset_note_type']); + $asset_name = escapeSql($row['asset_name']); + $client_id = intval($row['asset_client_id']); + $asset_id = intval($row['asset_id']); + + enforceClientAccess(); + + mysqli_query($mysqli,"DELETE FROM asset_notes WHERE asset_note_id = $asset_note_id"); + + logAudit("Asset", "Edit", "$session_name deleted $asset_note_type note for $asset_name", $client_id, $asset_id); + + flashAlert("Note $asset_note_type deleted.", 'error'); + + redirect(); + +} + if (isset($_POST['bulk_assign_asset_tags'])) { validateCSRFToken(); diff --git a/scripts/setup_cli.php b/scripts/setup_cli.php index a6654cb7e..a1fc8eb82 100644 --- a/scripts/setup_cli.php +++ b/scripts/setup_cli.php @@ -360,6 +360,14 @@ mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Meeting', cat mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'In Person', category_description = 'In person visit or on-site interaction', category_icon = 'fa-people-arrows', category_type = 'contact_note_type', category_order = 4"); // 4 mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Note', category_description = 'General note or internal comment', category_icon = 'fa-sticky-note', category_type = 'contact_note_type', category_order = 5"); // 5 +// Asset note types +mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Maintenance', category_description = 'Routine or scheduled maintenance performed on the asset', category_icon = 'fa-tools', category_type = 'asset_note_type', category_order = 1"); // 1 +mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Repair', category_description = 'Repair work or hardware replacement', category_icon = 'fa-wrench', category_type = 'asset_note_type', category_order = 2"); // 2 +mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Configuration', category_description = 'Configuration or settings change made to the asset', category_icon = 'fa-sliders-h', category_type = 'asset_note_type', category_order = 3"); // 3 +mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Upgrade', category_description = 'Hardware or software upgrade', category_icon = 'fa-arrow-circle-up', category_type = 'asset_note_type', category_order = 4"); // 4 +mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Inspection', category_description = 'Physical inspection or audit of the asset', category_icon = 'fa-clipboard-check', category_type = 'asset_note_type', category_order = 5"); // 5 +mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Note', category_description = 'General note or internal comment', category_icon = 'fa-sticky-note', category_type = 'asset_note_type', category_order = 6"); // 6 + // Rack Types mysqli_query($mysqli, "INSERT INTO categories SET category_name = '2-Post Open Frame', category_description = 'Two-post open frame rack for patch panels and lightweight equipment', category_type = 'rack_type', category_order = 1"); // 1 mysqli_query($mysqli, "INSERT INTO categories SET category_name = '4-Post Open Frame', category_description = 'Four-post open frame rack for servers and heavier equipment', category_type = 'rack_type', category_order = 2"); // 2 diff --git a/setup/index.php b/setup/index.php index f7040f5df..ab3becf28 100644 --- a/setup/index.php +++ b/setup/index.php @@ -608,6 +608,14 @@ if (isset($_POST['add_company_settings'])) { mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'In Person', category_description = 'In person visit or on-site interaction', category_icon = 'fa-people-arrows', category_type = 'contact_note_type', category_order = 4"); // 4 mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Note', category_description = 'General note or internal comment', category_icon = 'fa-sticky-note', category_type = 'contact_note_type', category_order = 5"); // 5 + // Asset note types + mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Maintenance', category_description = 'Routine or scheduled maintenance performed on the asset', category_icon = 'fa-tools', category_type = 'asset_note_type', category_order = 1"); // 1 + mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Repair', category_description = 'Repair work or hardware replacement', category_icon = 'fa-wrench', category_type = 'asset_note_type', category_order = 2"); // 2 + mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Configuration', category_description = 'Configuration or settings change made to the asset', category_icon = 'fa-sliders-h', category_type = 'asset_note_type', category_order = 3"); // 3 + mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Upgrade', category_description = 'Hardware or software upgrade', category_icon = 'fa-arrow-circle-up', category_type = 'asset_note_type', category_order = 4"); // 4 + mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Inspection', category_description = 'Physical inspection or audit of the asset', category_icon = 'fa-clipboard-check', category_type = 'asset_note_type', category_order = 5"); // 5 + mysqli_query($mysqli, "INSERT INTO categories SET category_name = 'Note', category_description = 'General note or internal comment', category_icon = 'fa-sticky-note', category_type = 'asset_note_type', category_order = 6"); // 6 + // Rack Types mysqli_query($mysqli, "INSERT INTO categories SET category_name = '2-Post Open Frame', category_description = 'Two-post open frame rack for patch panels and lightweight equipment', category_type = 'rack_type', category_order = 1"); // 1 mysqli_query($mysqli, "INSERT INTO categories SET category_name = '4-Post Open Frame', category_description = 'Four-post open frame rack for servers and heavier equipment', category_type = 'rack_type', category_order = 2"); // 2 From a900b2cd748ed698f4089bd325f5f301c4c0447b Mon Sep 17 00:00:00 2001 From: johnnyq Date: Wed, 29 Jul 2026 14:15:15 -0400 Subject: [PATCH 178/241] Update DB Structure --- db.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db.sql b/db.sql index c6c848b1c..f47c68b62 100644 --- a/db.sql +++ b/db.sql @@ -3066,4 +3066,4 @@ CREATE TABLE `vendors` ( /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2026-07-29 13:22:41 +-- Dump completed on 2026-07-29 14:15:02 From af9990ff13f1bc5d85849c1d24cee055e927b191 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Wed, 29 Jul 2026 14:22:18 -0400 Subject: [PATCH 179/241] Fix Contact Notes and Fix a few broken links --- agent/contact.php | 18 +++++++++--------- agent/modals/asset/asset.php | 2 +- agent/modals/contact/contact.php | 11 +++++++++-- agent/modals/contact/contact_note_add.php | 4 +++- agent/modals/file/file_link_asset.php | 2 +- 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/agent/contact.php b/agent/contact.php index 1c19a483a..196dcdc5e 100644 --- a/agent/contact.php +++ b/agent/contact.php @@ -142,6 +142,14 @@ if (isset($_GET['contact_id'])) { $sql_related_notes = mysqli_query($mysqli, "SELECT * FROM contact_notes LEFT JOIN users ON contact_note_created_by = user_id WHERE contact_note_contact_id = $contact_id AND contact_note_archived_at IS NULL ORDER BY contact_note_created_at DESC"); $note_count = mysqli_num_rows($sql_related_notes); + // Note type icons, read from the categories list so the seeded icons + // stay the single source of truth + $note_type_icons = array(); + $sql_note_type_icons = mysqli_query($mysqli, "SELECT category_name, category_icon FROM categories WHERE category_type = 'contact_note_type'"); + while ($row = mysqli_fetch_assoc($sql_note_type_icons)) { + $note_type_icons[escapeHtml($row['category_name'])] = escapeHtml($row['category_icon']); + } + // Linked Services $sql_linked_services = mysqli_query($mysqli, "SELECT * FROM service_contacts, services WHERE service_contacts.contact_id = $contact_id @@ -1104,14 +1112,6 @@ if (isset($_GET['contact_id'])) { 'fa-phone-alt', - 'Email'=>'fa-envelope', - 'Meeting'=>'fa-handshake', - 'In Person'=>'fa-people-arrows', - 'Note'=>'fa-sticky-note' - ); - while ($row = mysqli_fetch_assoc($sql_related_notes)) { $contact_note_id = intval($row['contact_note_id']); $contact_note_type = escapeHtml($row['contact_note_type']); @@ -1120,7 +1120,7 @@ if (isset($_GET['contact_id'])) { $contact_note_created_at = escapeHtml($row['contact_note_created_at']); // Get the corresponding icon for the note type - $note_type_icon = isset($note_types_array[$contact_note_type]) ? $note_types_array[$contact_note_type] : 'fa-fw fa-sticky-note'; // default icon if not found + $note_type_icon = !empty($note_type_icons[$contact_note_type]) ? $note_type_icons[$contact_note_type] : 'fa-sticky-note'; ?> diff --git a/agent/modals/asset/asset.php b/agent/modals/asset/asset.php index 3419d3ca5..59af1695a 100644 --- a/agent/modals/asset/asset.php +++ b/agent/modals/asset/asset.php @@ -982,7 +982,7 @@ ob_start();
    @@ -307,7 +307,7 @@ ob_start();
    - +
    diff --git a/agent/modals/client/client_edit.php b/agent/modals/client/client_edit.php index de4021e4a..175c2a56e 100644 --- a/agent/modals/client/client_edit.php +++ b/agent/modals/client/client_edit.php @@ -117,7 +117,7 @@ ob_start();
    -
    diff --git a/agent/modals/contact/contact_add.php b/agent/modals/contact/contact_add.php index bfff018be..5f7196562 100644 --- a/agent/modals/contact/contact_add.php +++ b/agent/modals/contact/contact_add.php @@ -138,7 +138,7 @@ ob_start();
    - +
    diff --git a/agent/modals/contact/contact_edit.php b/agent/modals/contact/contact_edit.php index cb2d8f7f5..d1c5ac1f8 100644 --- a/agent/modals/contact/contact_edit.php +++ b/agent/modals/contact/contact_edit.php @@ -148,7 +148,7 @@ ob_start(); " placeholder="+" maxlength="4"> - + diff --git a/agent/modals/credential/credential_edit.php b/agent/modals/credential/credential_edit.php index 70823325c..91635c576 100644 --- a/agent/modals/credential/credential_edit.php +++ b/agent/modals/credential/credential_edit.php @@ -99,7 +99,7 @@ ob_start();
    - + diff --git a/agent/modals/document/document_add_from_template.php b/agent/modals/document/document_add_from_template.php index 2c6ca1911..a70fb42c0 100644 --- a/agent/modals/document/document_add_from_template.php +++ b/agent/modals/document/document_add_from_template.php @@ -54,7 +54,7 @@ ob_start();
    - + diff --git a/agent/modals/product/product_add.php b/agent/modals/product/product_add.php index 0bcb51658..1d9280068 100644 --- a/agent/modals/product/product_add.php +++ b/agent/modals/product/product_add.php @@ -135,7 +135,7 @@ ob_start();
    - + @@ -151,7 +151,7 @@ ob_start();
    - + diff --git a/agent/modals/product/product_edit.php b/agent/modals/product/product_edit.php index 741734b34..3afc91f4c 100644 --- a/agent/modals/product/product_edit.php +++ b/agent/modals/product/product_edit.php @@ -120,7 +120,7 @@ ob_start();
    - + @@ -136,7 +136,7 @@ ob_start();
    - + diff --git a/agent/modals/revenue/revenue_add.php b/agent/modals/revenue/revenue_add.php index 45ff3e802..1f4ad4102 100644 --- a/agent/modals/revenue/revenue_add.php +++ b/agent/modals/revenue/revenue_add.php @@ -116,7 +116,7 @@ ob_start();
    - +
    diff --git a/agent/modals/revenue/revenue_edit.php b/agent/modals/revenue/revenue_edit.php index 8cca84ce2..4663cc915 100644 --- a/agent/modals/revenue/revenue_edit.php +++ b/agent/modals/revenue/revenue_edit.php @@ -140,7 +140,7 @@ ob_start();
    - +
    diff --git a/agent/modals/software/software_add.php b/agent/modals/software/software_add.php index 4b4cb8647..0f5701414 100644 --- a/agent/modals/software/software_add.php +++ b/agent/modals/software/software_add.php @@ -203,7 +203,7 @@ ob_start();
    - +
    diff --git a/agent/modals/software/software_edit.php b/agent/modals/software/software_edit.php index ebca3d41e..80e23a5a7 100644 --- a/agent/modals/software/software_edit.php +++ b/agent/modals/software/software_edit.php @@ -217,7 +217,7 @@ ob_start();
    - + diff --git a/agent/modals/ticket/ticket_add.php b/agent/modals/ticket/ticket_add.php index df6e1c837..caeae4195 100644 --- a/agent/modals/ticket/ticket_add.php +++ b/agent/modals/ticket/ticket_add.php @@ -279,7 +279,7 @@ ob_start();
    - + diff --git a/agent/modals/ticket/ticket_edit.php b/agent/modals/ticket/ticket_edit.php index 486826ad8..fa9baad1a 100644 --- a/agent/modals/ticket/ticket_edit.php +++ b/agent/modals/ticket/ticket_edit.php @@ -372,7 +372,7 @@ ob_start();
    - + diff --git a/agent/modals/ticket/ticket_invoice_add.php b/agent/modals/ticket/ticket_invoice_add.php index 87707b73b..3ffe6c6c7 100644 --- a/agent/modals/ticket/ticket_invoice_add.php +++ b/agent/modals/ticket/ticket_invoice_add.php @@ -226,7 +226,7 @@ ob_start();
    - + diff --git a/agent/modals/ticket/ticket_quote_add.php b/agent/modals/ticket/ticket_quote_add.php index 664419d37..40b32683c 100644 --- a/agent/modals/ticket/ticket_quote_add.php +++ b/agent/modals/ticket/ticket_quote_add.php @@ -161,7 +161,7 @@ ob_start();
    - + diff --git a/agent/quote.php b/agent/quote.php index 49e691fe1..9f35b9dbe 100644 --- a/agent/quote.php +++ b/agent/quote.php @@ -376,7 +376,7 @@ if (isset($_GET['quote_id'])) { ?>"> - + diff --git a/agent/recurring_invoice.php b/agent/recurring_invoice.php index fd06ebc7c..42c5d6ec9 100644 --- a/agent/recurring_invoice.php +++ b/agent/recurring_invoice.php @@ -338,7 +338,7 @@ if (isset($_GET['recurring_invoice_id'])) { ?>"> - + diff --git a/agent/user/user_details.php b/agent/user/user_details.php index f3003aeb3..75d4ec37a 100644 --- a/agent/user/user_details.php +++ b/agent/user/user_details.php @@ -32,7 +32,7 @@ require_once "includes/inc_all_user.php";
    - + @@ -52,7 +52,7 @@ require_once "includes/inc_all_user.php";
    - + diff --git a/setup/index.php b/setup/index.php index a1e5ce7be..47a9a2c04 100644 --- a/setup/index.php +++ b/setup/index.php @@ -1189,7 +1189,7 @@ if (isset($_POST['add_telemetry'])) {
    - + @@ -1199,7 +1199,7 @@ if (isset($_POST['add_telemetry'])) {
    - + @@ -1243,7 +1243,7 @@ if (isset($_POST['add_telemetry'])) {
    - + @@ -1323,7 +1323,7 @@ if (isset($_POST['add_telemetry'])) {
    - + From e793804203dd47b2a8e6b3011b10a4b95332ba78 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Sun, 2 Aug 2026 16:18:36 -0400 Subject: [PATCH 220/241] Migrate credential password from varbinary to varchar and set max length for passwords --- admin/database_updates/2.6.5.php | 26 ++++++++++++++++++++++++++ agent/modals/asset/asset_add.php | 2 +- agent/modals/asset/asset_copy.php | 2 +- db.sql | 4 ++-- 4 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 admin/database_updates/2.6.5.php diff --git a/admin/database_updates/2.6.5.php b/admin/database_updates/2.6.5.php new file mode 100644 index 000000000..5ae8408b5 --- /dev/null +++ b/admin/database_updates/2.6.5.php @@ -0,0 +1,26 @@ + - + diff --git a/agent/modals/asset/asset_copy.php b/agent/modals/asset/asset_copy.php index 4ed4d4b93..e212a9d3e 100644 --- a/agent/modals/asset/asset_copy.php +++ b/agent/modals/asset/asset_copy.php @@ -432,7 +432,7 @@ ob_start();
    - + diff --git a/db.sql b/db.sql index 0d4cadc86..4de0496f5 100644 --- a/db.sql +++ b/db.sql @@ -934,7 +934,7 @@ CREATE TABLE `credentials` ( `credential_uri` varchar(500) DEFAULT NULL, `credential_uri_2` varchar(500) DEFAULT NULL, `credential_username` varchar(500) DEFAULT NULL, - `credential_password` varbinary(200) DEFAULT NULL, + `credential_password` varchar(500) DEFAULT NULL, `credential_otp_secret` varchar(200) DEFAULT NULL, `credential_note` text DEFAULT NULL, `credential_favorite` tinyint(1) NOT NULL DEFAULT 0, @@ -3150,4 +3150,4 @@ CREATE TABLE `vendors` ( /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2026-07-31 16:18:11 +-- Dump completed on 2026-08-02 16:18:05 From ad15fabbb315dddd30ac76ee5b6e18e58821f75e Mon Sep 17 00:00:00 2001 From: johnnyq Date: Sun, 2 Aug 2026 16:30:14 -0400 Subject: [PATCH 221/241] Credential length guard --- agent/post/asset.php | 13 ++++++ agent/post/credential.php | 22 ++++++++-- agent/post/credential_model.php | 7 ++++ api/v1/credentials/credential_model.php | 23 +++++++++++ functions/security.php | 54 +++++++++++++++++++++++++ 5 files changed, 116 insertions(+), 3 deletions(-) diff --git a/agent/post/asset.php b/agent/post/asset.php index e5db2ec02..b82a07f4a 100644 --- a/agent/post/asset.php +++ b/agent/post/asset.php @@ -18,6 +18,19 @@ if (isset($_POST['add_asset'])) { enforceClientAccess(); + // Only the two credential fields this handler writes - name/description/uri here + // belong to the asset, not the credential, and have their own column widths. + // Checked before the asset is created, so an overlong credential can't leave a + // half-built asset behind. Form maxlength doesn't reach a hand-rolled POST. + if ($credential_field_too_long = checkCredentialLengths([ + 'username' => $_POST['username'] ?? null, + 'password' => $_POST['password'] ?? null, + ])) { + flashAlert("Credential $credential_field_too_long is too long to store", 'error'); + redirect(); + exit; + } + $alert_extended = ""; mysqli_query($mysqli,"INSERT INTO assets SET asset_name = '$name', asset_description = '$description', asset_type = '$type', asset_make = '$make', asset_model = '$model', asset_serial = '$serial', asset_os = '$os', asset_uri = '$uri', asset_uri_2 = '$uri_2', asset_uri_client = '$uri_client', asset_location_id = $location, asset_vendor_id = $vendor, asset_contact_id = $contact, asset_status = '$status', asset_purchase_reference = '$purchase_reference', asset_purchase_date = $purchase_date, asset_warranty_expire = $warranty_expire, asset_install_date = $install_date, asset_physical_location = '$physical_location', asset_notes = '$notes', asset_favorite = $favorite, asset_client_id = $client_id"); diff --git a/agent/post/credential.php b/agent/post/credential.php index 355a1b0cb..23d3a9c6e 100644 --- a/agent/post/credential.php +++ b/agent/post/credential.php @@ -563,8 +563,24 @@ if (isset($_POST["import_credentials_csv"])) { fgetcsv($file, 1000, ","); // Skip first line $row_count = 0; $duplicate_count = 0; + $too_long_count = 0; while(($column = fgetcsv($file, 1000, ",")) !== false){ $duplicate_detect = 0; + + // Nothing client-side guards an uploaded file, and an overlong value is a hard + // MySQL error - skip the row and report it rather than losing the whole import + if (checkCredentialLengths([ + 'name' => $column[0] ?? null, + 'description' => $column[1] ?? null, + 'username' => $column[2] ?? null, + 'password' => $column[3] ?? null, + 'otp_secret' => $column[4] ?? null, + 'uri' => $column[5] ?? null, + ])) { + $too_long_count = $too_long_count + 1; + continue; + } + // Name if (isset($column[0])) { $name = escapeSql($column[0]); @@ -589,7 +605,7 @@ if (isset($_POST["import_credentials_csv"])) { $totp = escapeSql($column[4]); } // URL - if (isset($column[4])) { + if (isset($column[5])) { $uri = escapeSql($column[5]); } @@ -604,9 +620,9 @@ if (isset($_POST["import_credentials_csv"])) { } fclose($file); - logAudit("Credential", "Import", "$session_name imported $row_count credential(s) via CSV file. $duplicate_count duplicate(s) found and not imported", $client_id); + logAudit("Credential", "Import", "$session_name imported $row_count credential(s) via CSV file. $duplicate_count duplicate(s) found and not imported, $too_long_count row(s) skipped for over-length fields", $client_id); - flashAlert("$row_count credential(s) imported, $duplicate_count duplicate(s) detected and not imported", 'warning'); + flashAlert("$row_count credential(s) imported, $duplicate_count duplicate(s) detected and not imported, $too_long_count row(s) skipped for over-length fields", 'warning'); redirect(); } diff --git a/agent/post/credential_model.php b/agent/post/credential_model.php index 4d839ac29..806814a44 100644 --- a/agent/post/credential_model.php +++ b/agent/post/credential_model.php @@ -2,6 +2,13 @@ // Model of reusable variables for client credentials - not to be confused with the ITFLow login process defined('FROM_POST_HANDLER') || die("Direct file access is not allowed"); +// The form maxlength is client-side only - a hand-rolled POST gets here without it +if ($credential_field_too_long = checkCredentialLengths($_POST)) { + flashAlert("Credential $credential_field_too_long is too long to store", 'error'); + redirect(); + exit; +} + $name = escapeSql($_POST['name']); $description = escapeSql($_POST['description']); $uri = escapeSql($_POST['uri']); diff --git a/api/v1/credentials/credential_model.php b/api/v1/credentials/credential_model.php index 8d37b09b2..24562f63e 100644 --- a/api/v1/credentials/credential_model.php +++ b/api/v1/credentials/credential_model.php @@ -3,6 +3,29 @@ // Variable assignment from POST (or: blank/from DB is updating) +/* + * There is no form behind the API, so nothing has capped these before they arrive. + * An overlong value is a hard MySQL error, not a truncation, so it would surface as a + * generic "insert query failed" - say what actually went wrong instead. + * Only the fields present are checked, which keeps partial updates working. + */ +$credential_field_too_long = checkCredentialLengths([ + 'name' => $_POST['credential_name'] ?? null, + 'description' => $_POST['credential_description'] ?? null, + 'uri' => $_POST['credential_uri'] ?? null, + 'uri_2' => $_POST['credential_uri_2'] ?? null, + 'username' => $_POST['credential_username'] ?? null, + 'password' => $_POST['credential_password'] ?? null, + 'otp_secret' => $_POST['credential_otp_secret'] ?? null, +]); + +if ($credential_field_too_long) { + $return_arr['success'] = "False"; + $return_arr['message'] = "credential_$credential_field_too_long is too long to store."; + echo json_encode($return_arr); + exit(); +} + $api_key_decrypt_password = ''; if (isset($_POST['api_key_decrypt_password'])) { $api_key_decrypt_password = $_POST['api_key_decrypt_password']; // No sanitization diff --git a/functions/security.php b/functions/security.php index 24c9632f0..ef59dd506 100644 --- a/functions/security.php +++ b/functions/security.php @@ -175,6 +175,60 @@ function apiEncryptCredentialEntry(#[\SensitiveParameter]$credential_cleartext, return $iv . $ciphertext; } +/* + * Longest cleartext a credential username or password may be. + * Both encrypt functions above return a 16-char IV followed by base64 AES-128-CBC + * ciphertext, which expands about 1.37x, so 350 is the most that still fits the + * varchar(500) columns. Keep in step with the maxlength on the credential/asset forms. + */ +define('CREDENTIAL_ENTRY_MAX_LENGTH', 350); + +/* + * Checks a credential's cleartext fields against what the columns can actually store. + * Form maxlength is client-side only, so the CSV import, the API and any hand-rolled POST + * reach the INSERT with nothing stopping an overlong value - and MySQL rejects it outright + * rather than truncating, taking the request down with it. + * + * Returns the name of the first field that is too long, or an empty string when they all + * fit. Only keys actually present are checked, so partial updates are fine. + */ +function checkCredentialLengths(array $fields) { + + // Encrypted before storage - ciphertext size follows the BYTE length of the cleartext. + $byte_limits = [ + 'username' => CREDENTIAL_ENTRY_MAX_LENGTH, + 'password' => CREDENTIAL_ENTRY_MAX_LENGTH, + ]; + + // Stored as given - MySQL measures varchar in CHARACTERS, not bytes. + $char_limits = [ + 'name' => 200, + 'description' => 500, + 'uri' => 500, + 'uri_2' => 500, + 'otp_secret' => 200, + ]; + + foreach ($byte_limits as $field => $limit) { + if (isset($fields[$field]) && strlen($fields[$field]) > $limit) { + return $field; + } + } + + foreach ($char_limits as $field => $limit) { + if (!isset($fields[$field]) || strlen($fields[$field]) <= $limit) { + continue; // byte length caps character count, so this already fits + } + // Only worth counting characters once the cheap check fails. preg keeps this + // free of an mbstring dependency, which nothing else in the tree relies on. + if (preg_match_all('/./us', $fields[$field]) > $limit) { + return $field; + } + } + + return ''; +} + // Cross-Site Request Forgery check for sensitive functions // Validates the CSRF token provided matches the one in the users session function validateCSRFToken(?string $token = null) { From a27019511e2700fd0c090675cdd0e0e5be95bb1e Mon Sep 17 00:00:00 2001 From: johnnyq Date: Sun, 2 Aug 2026 17:22:28 -0400 Subject: [PATCH 222/241] Remove unused overdue invoice setting move master cron switch out of notificaiton and into cron --- CHANGELOG.md | 16 ++++--- CONTRIBUTING.md | 18 ++++++-- admin/backup.php | 8 ++-- admin/cron.php | 21 +++++++-- admin/database_updates/2.6.1.php | 2 +- admin/database_updates/2.6.6.php | 19 ++++++++ admin/post/backup.php | 2 +- admin/post/cron.php | 27 ++++++++++-- admin/post/settings_notification.php | 6 ++- admin/settings_notification.php | 65 ---------------------------- admin/settings_ticket.php | 2 +- cron/backup.php | 2 +- cron/cron.php | 8 ++-- cron/nightly_tasks.php | 2 - cron/ticket_email_parser.php | 6 +++ cron/ticket_sla.php | 13 ++++++ db.sql | 3 +- functions/backup.php | 4 +- includes/cron_jobs.php | 14 +++--- includes/load_global_settings.php | 1 - scripts/restore_cli.php | 4 +- scripts/setup_cli.php | 13 +++++- setup/index.php | 12 ++--- 23 files changed, 154 insertions(+), 114 deletions(-) create mode 100644 admin/database_updates/2.6.6.php diff --git a/CHANGELOG.md b/CHANGELOG.md index e0233054e..89ff0b329 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,9 +9,9 @@ This file documents all notable changes made to ITFlow. Backups are now encrypted, catalogued, schedulable, and restorable from the command line. - **Three types** — Full (database + uploads), Database Only, and Master Key. Every archive is an AES-256 encrypted zip. -- **One encryption key per install**, generated on first use and stored in `config.php` — never in the database and never in the file name. It is shown in Settings > Backup. **Write it down: without it a backup cannot be restored.** Open archives with 7-Zip, WinZip, PeaZip or Keka — `unzip`, Windows Explorer and the macOS Archive Utility do not support AES. +- **One encryption key per install**, generated on first use and stored in `config.php` — never in the database and never in the file name. It is shown in Maintenance > Backup. **Write it down: without it a backup cannot be restored.** Open archives with 7-Zip, WinZip, PeaZip or Keka — `unzip`, Windows Explorer and the macOS Archive Utility do not support AES. - **Backups are built by cron, not by your browser.** The button queues the work and the dispatcher picks it up within the minute, then notifies you. A dump of a real install takes longer than a web request is allowed to live, which is why the old Download Backup button timed out on large instances. -- **Scheduled backups** are a new `backup` cron job, off by default. Turn it on in Settings > Cron. Retention (by age and by count) runs in the nightly job and never deletes the newest backup. +- **Scheduled backups** are a new `backup` cron job, off by default. Turn it on in Maintenance > Cron. Retention (by age and by count) runs in the nightly job and never deletes the newest backup. - **Archives are stored outside the web-served path** under `uploads/backups/` with a deny-all rule, and downloaded through an admin-only handler. Set `$config_backup_path` in `config.php` to keep them off the web root entirely. - **Restore from the command line** with `php scripts/restore_cli.php --file=/path/to/backup.zip`. This is the only restore path with no size limit — the setup wizard's restore is capped by PHP's upload limits, and a full backup is usually larger. Use `--inspect` to check an archive without changing anything. - **Restores validate before they destroy.** The key is checked and the archive unpacked before any table is dropped, and the current database is dumped first and put back automatically if the import fails. @@ -38,14 +38,14 @@ sudo -u www-data php /path/to/itflow/scripts/update_cli.php --update_db ``` It applies every pending version in order and reports each one as it goes. On an install with a lot of ticket history it can take a minute or more, so let it finish. If a step fails it stops there without advancing the recorded version, so you can fix the problem and run it again. The 500s stop as soon as it completes. -5. **Add the new cron entry.** One line runs everything now, and the schedules are managed in ITFlow under Settings > Cron: +5. **Add the new cron entry.** One line runs everything now, and the schedules are managed in ITFlow under Maintenance > Cron: ``` * * * * * www-data php /path/to/itflow/cron/cron.php >/dev/null ``` Drop the `www-data` column if this goes in a user crontab rather than `/etc/cron.d`. 6. **Recreate your API keys.** Every existing key is deleted by this update. Issue new ones and update anything that talks to the ITFlow API. -7. **Check it took.** Open Settings > Cron — the green "Cron last checked in" banner should appear within a couple of minutes and every job should pick up a schedule. +7. **Check it took, and check the master switch.** Open Maintenance > Cron — the green "Cron last checked in" banner should appear within a couple of minutes and every job should pick up a schedule. The **Enable Cron** switch has moved to this page from Settings > Notifications, and it now stops *every* job rather than most of them. If it is off, turn it on here: on earlier releases the ticket email parser and the SLA monitor ran regardless of it, so an install with the switch off may have been parsing mail all along without anyone realising the switch mattered. Only this release needs the command line for the database update. Normal updates go back to running from Settings > Update as usual. ### Breaking Changes and Notes @@ -62,7 +62,13 @@ Only this release needs the command line for the database update. Normal updates ### New Features & Updates - Cron: one entry instead of five, and a page to manage it. Jobs are tracked in a new `cron_jobs` table, so a job whose slot was missed runs at the next opportunity rather than waiting a day, and each job locks for its own run so a slow mailbox or a long nightly pass no longer holds anything else up. -- Cron: new Settings > Cron page listing every job with its schedule, last run, duration, outcome and next due time. Jobs can be disabled, rescheduled, or run on demand — Run Now hands the job to the next dispatch so it starts within a minute and still runs on the command line. The last error is kept until dismissed rather than vanishing behind the next success, and the page says plainly when the crontab entry itself is missing. +- Cron: new Maintenance > Cron page listing every job with its schedule, last run, duration, outcome and next due time. Jobs can be disabled, rescheduled, or run on demand — Run Now hands the job to the next dispatch so it starts within a minute and still runs on the command line. The last error is kept until dismissed rather than vanishing behind the next success, and the page says plainly when the crontab entry itself is missing. +- Cron: the master **Enable Cron** switch has moved from Settings > Notifications to Maintenance > Cron, alongside everything else about cron. It can be turned on and off from that page, and the page now explains what it is for — stopping a restored backup or a staging clone from emailing clients and charging cards, which per-job toggles cannot do on their own. Saving Notification settings no longer touches it. +- Cron: the master switch now stops **every** job. The Ticket Email Parser and Ticket SLA Monitor previously ignored it and kept running while cron was switched off, which was neither documented nor visible anywhere. **If your Enable Cron switch is off but email-to-ticket has been working, turn cron on in Maintenance > Cron after upgrading** — see the upgrade steps above. Both jobs report "Cron: is not enabled" on the Cron page when the switch is off, so the state is now legible instead of silent. +- Settings > Notifications: removed five rows that had no controls in them and no setting behind them — certificate expiry, asset warranty expiry, shared item views, cron execution and ITFlow updates. The cron execution row is now covered properly by the last run, duration and outcome columns on Maintenance > Cron. +- Settings > Ticketing: the email-to-ticket hint no longer names a cron script that has not existed for several releases, and points at Maintenance > Cron instead. +- Setup: the command line installer now prints the crontab entry and the reminder to turn cron on, the same two steps the web installer shows on its finish page. +- Removed the unused `config_invoice_overdue_reminders` setting. It was seeded on install and read in two places but never actually used by anything; the overdue reminder schedule is fixed in the nightly job. - Cron: the nightly run is safe to repeat. Late fees, overdue invoice reminders and autopay retries now apply at most once per invoice per day, so a Run Now after the scheduled pass no longer stacks fees or re-emails clients. Nightly Tasks only accepts the daily schedule. - Ticket SLAs, optional throughout. An SLA sets a response target and an optional resolution target, assigned per client and priority with a global default and an explicit "no SLA" override. Targets are measured against your business hours. Tickets show time remaining and turn yellow at a configurable warning threshold and red on breach, on both the ticket list and the kanban board, and can be filtered by SLA state. Nominated statuses pause the resolution clock for "waiting on customer", preserving the remaining budget. Two new reports, SLA Summary and SLA by Client. With no assignments defined nothing behaves any differently. - Ticket: added an Urgent priority. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 91199822a..3e076677d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -87,7 +87,7 @@ One crontab entry runs everything: `cron/cron.php` is a dispatcher. It wakes every minute, works out which scripts in `cron/` are due, and requires them into its own process. Adding a job is a new script in `cron/` plus an entry in `includes/cron_jobs.php`. The crontab never changes again. -That registry is the only thing that decides **which** scripts can run, and the schedule in it is only a default: it seeds the job's `cron_jobs` row the first time the dispatcher meets the job, and from then on the row is what runs, because Settings > Cron writes to it. The database therefore holds **when and whether**, never **what** — a row naming a script that is not in the registry is ignored, so nothing that reaches the database can point the dispatcher at an arbitrary file. Keep it that way. +That registry is the only thing that decides **which** scripts can run, and the schedule in it is only a default: it seeds the job's `cron_jobs` row the first time the dispatcher meets the job, and from then on the row is what runs, because Maintenance > Cron writes to it. The database therefore holds **when and whether**, never **what** — a row naming a script that is not in the registry is ignored, so nothing that reaches the database can point the dispatcher at an arbitrary file. Keep it that way. Run Now in the admin UI does not execute anything in the web request: these scripts are CLI-only and some take minutes, so the button sets `cron_job_run_now` and the next dispatch picks it up, through the same lock and claim as a scheduled run. @@ -97,14 +97,24 @@ Because the jobs share one PHP process, job code has three rules: 1. **Never `exit()` or `die()`.** It ends the whole cycle and every job after it. Use `cronJobStop($message, $exit_code)` instead: it exits when the script was run directly and unwinds back to the dispatcher when it wasn't, so both paths behave as they always have. 2. **Never declare a function or class another job might declare.** Two jobs each declaring the same helper is a fatal `Cannot redeclare` the moment they share a process. Shared helpers belong in `functions/`. -3. **Be safe to run twice in one day.** The dispatcher's lock stops overlap, but nothing stops a repeat: an admin presses Run Now after the scheduled pass, or a schedule is misconfigured. Work selected by a date match (`... = CURDATE()`) fires again on every run of that day unless something records that it happened — nightly's late fees and overdue reminders guard on the history rows they write. A job whose work cannot be made repeat-safe declares `'interval_safe' => false` in `includes/cron_jobs.php`, which locks it to the daily schedule in Settings > Cron and in the dispatcher. +3. **Be safe to run twice in one day.** The dispatcher's lock stops overlap, but nothing stops a repeat: an admin presses Run Now after the scheduled pass, or a schedule is misconfigured. Work selected by a date match (`... = CURDATE()`) fires again on every run of that day unless something records that it happened — nightly's late fees and overdue reminders guard on the history rows they write. A job whose work cannot be made repeat-safe declares `'interval_safe' => false` in `includes/cron_jobs.php`, which locks it to the daily schedule in Maintenance > Cron and in the dispatcher. 4. **Set what you read.** One global scope and one set of `require_once` includes are shared across the cycle — a job's own `require_once "../config.php"` is a no-op if an earlier job already loaded it, and any variable an earlier job left behind is still there. Do not rely on the state a fresh process would have given you. -A job can also ship switched off with `'enabled' => 0` in the registry. The row is seeded disabled and stays that way until somebody turns it on in Settings > Cron. Use it for work an install should opt into rather than inherit silently from an upgrade — `backup` ships this way, because a full backup can be gigabytes a night. +A job can also ship switched off with `'enabled' => 0` in the registry. The row is seeded disabled and stays that way until somebody turns it on in Maintenance > Cron. Use it for work an install should opt into rather than inherit silently from an upgrade — `backup` ships this way, because a full backup can be gigabytes a night. + +### The master switch + +`config_enable_cron` is a second, coarser switch that sits above the per-job ones. It is **not** enforced by the dispatcher — every job checks it in its own header and stops itself with `cronJobStop()`. A new job has to make that check too; one that skips it keeps running on an install that believes cron is off, which is exactly the trap `ticket_email_parser` and `ticket_sla` sat in until 26.08. + +Be precise about what it does, because it is easy to oversell. It is **not** a guard on restored data: a full backup dumps the `settings` table, so a restored copy comes back with `config_enable_cron = 1` alongside every enabled `cron_jobs` row, exactly as production had them. What it gives you is one reversible bit — the fastest way to stop an install acting on live data once you have noticed, and the only way to stop everything without editing seven rows. + +That last part is the reason it is not redundant with `cron_job_enabled`. Turning the switch off and back on returns you to exactly the configuration you had. Sweeping all seven rows off and back on does not: `backup` ships `'enabled' => 0`, so the sweep quietly turns on nightly backups nobody asked for, along with anything else that was deliberately disabled. + +It defaults to `0`. That is a weaker guard than it looks — an install with no crontab entry runs nothing whatever the switch says, so the entry is the real gate — but it does mean adding the crontab line to a half-configured install is not enough on its own to start emailing. Both setup paths name the step on the way out. ## Backups -`functions/backup.php` is the whole engine, and all three entry points go through it: Settings > Backup, `cron/backup.php`, and `scripts/restore_cli.php`. Nothing else should dump, zip, or import a database. +`functions/backup.php` is the whole engine, and all three entry points go through it: Maintenance > Backup, `cron/backup.php`, and `scripts/restore_cli.php`. Nothing else should dump, zip, or import a database. Archives are AES-256 encrypted zips. The key is one value per install, generated on first use and appended to `config.php` — **never** the database and **never** the file name. That is the point: a backup that leaks cannot be opened with anything the backup itself contains, and a URL or an access log never carries the key. The 32 random characters in the file name are an unguessable path component, nothing more. Note that `unzip`, Windows Explorer and the macOS Archive Utility cannot read AES zips; 7-Zip, WinZip, PeaZip and Keka can. diff --git a/admin/backup.php b/admin/backup.php index 6740ab1f4..574da3bbc 100644 --- a/admin/backup.php +++ b/admin/backup.php @@ -13,7 +13,7 @@ $config_backup_retention_days = intval($row['config_backup_retention_days']); $config_backup_retention_count = intval($row['config_backup_retention_count']); $config_backup_cron_type = $row['config_backup_cron_type']; -// Same heartbeat rule as Settings > Cron - archives are built by the dispatcher, so a dead +// Same heartbeat rule as Maintenance > Cron - archives are built by the dispatcher, so a dead // crontab means the buttons below queue work that never runs $cron_is_running = $cron_last_dispatch_at !== null && (time() - strtotime($cron_last_dispatch_at)) < 300; @@ -51,12 +51,12 @@ if (!empty($_SESSION['backup_master_key_reveal'])) {
    Cron is not running
    Backups are built by the cron dispatcher, not by your browser. Until cron is running, anything you - start here will sit in the queue. See Settings > Cron. + start here will sit in the queue. See Maintenance > Cron.
    Cron is switched off in - Settings > Notifications. + Maintenance > Cron.
    @@ -241,7 +241,7 @@ if (!empty($_SESSION['backup_master_key_reveal'])) { Scheduled backups are switched off. - Turn them on or change the time in Settings > Cron. + Turn them on or change the time in Maintenance > Cron.

    Old backups are removed by the nightly job, never by the backup itself, so a failed nightly diff --git a/admin/cron.php b/admin/cron.php index f57a75369..4bf71af64 100644 --- a/admin/cron.php +++ b/admin/cron.php @@ -54,10 +54,25 @@ while ($job_row = mysqli_fetch_assoc($sql)) {

    - Cron is switched off in - Settings > Notifications. The dispatcher is running, but most jobs - stop themselves immediately while this is off. + +
    Cron is switched off
    + The dispatcher is running, but every job below stops itself immediately while this is off - + no mail is sent, no email becomes a ticket, and nothing is invoiced.
    + +

    + + The master switch is on. Turning it off + stops every job at once without touching their schedules, which is what you want on a restored + backup or a staging clone - those come up with every job enabled and will otherwise email clients + and charge cards. Switching back on returns you to exactly this configuration. + Turn cron off. + +

    diff --git a/admin/database_updates/2.6.1.php b/admin/database_updates/2.6.1.php index ebda3eadd..767ed1897 100644 --- a/admin/database_updates/2.6.1.php +++ b/admin/database_updates/2.6.1.php @@ -8,7 +8,7 @@ defined('FROM_DB_UPDATER') || die("Direct file access is not allowed"); // The cron dispatcher's schedule moves out of code and into the database so it can be - // managed from Settings > Cron. The registry in includes/cron_jobs.php still decides + // managed from Maintenance > Cron. The registry in includes/cron_jobs.php still decides // which scripts exist and seeds these columns the first time it meets a job; from then // on the row is what runs. Nothing here can name a script - a row whose job is not in // the registry is ignored. diff --git a/admin/database_updates/2.6.6.php b/admin/database_updates/2.6.6.php new file mode 100644 index 000000000..b27aa7a0a --- /dev/null +++ b/admin/database_updates/2.6.6.php @@ -0,0 +1,19 @@ + Notifications, so it will not start until that is enabled.", 'error'); + flashAlert(backupTypeLabel($type) . " queued, but cron is switched off in Maintenance > Cron, so it will not start until that is enabled.", 'error'); } else { flashAlert(backupTypeLabel($type) . " queued - it will start within a minute and you will be notified when it is ready."); } diff --git a/admin/post/cron.php b/admin/post/cron.php index 62cf2b6b2..535b9384a 100644 --- a/admin/post/cron.php +++ b/admin/post/cron.php @@ -3,11 +3,32 @@ defined('FROM_POST_HANDLER') || die("Direct file access is not allowed"); /* - * Settings > Cron. Everything here identifies a job by its row, and every row is checked - * against the registry in includes/cron_jobs.php before anything is written - the database - * decides when and whether a job runs, never which file the dispatcher executes. + * Maintenance > Cron. Apart from the master switch, everything here identifies a job by its + * row, and every row is checked against the registry in includes/cron_jobs.php before + * anything is written - the database decides when and whether a job runs, never which file + * the dispatcher executes. */ +if (isset($_GET['enable_cron']) || isset($_GET['disable_cron'])) { + + validateCSRFToken(); + + // The master switch, config_enable_cron. Most jobs check it themselves and stop; it is + // not a dispatcher-level gate, so the two jobs that do not check it keep running. It + // lived in Settings > Notifications until 26.08, which is nowhere near anything else + // about cron. + $enabled = isset($_GET['enable_cron']) ? 1 : 0; + + mysqli_query($mysqli, "UPDATE settings SET config_enable_cron = $enabled WHERE company_id = 1"); + + logAudit("Cron", "Edit", "$session_name " . ($enabled ? 'enabled' : 'disabled') . " the master cron switch"); + + flashAlert("Cron " . ($enabled ? 'enabled' : 'disabled') . ".", $enabled ? 'success' : 'error'); + + redirect(); + +} + if (isset($_POST['edit_cron_job'])) { validateCSRFToken(); diff --git a/admin/post/settings_notification.php b/admin/post/settings_notification.php index 52543c070..52623ce92 100644 --- a/admin/post/settings_notification.php +++ b/admin/post/settings_notification.php @@ -6,13 +6,15 @@ if (isset($_POST['edit_notification_settings'])) { validateCSRFToken(); - $config_enable_cron = intval($_POST['config_enable_cron'] ?? 0); + // config_enable_cron is NOT set here - the master cron switch moved to Maintenance > Cron + // in 26.08. Leaving it in this UPDATE would switch cron off every time somebody saved + // this form, because the checkbox that fed it is gone from the page. $config_enable_alert_domain_expire = intval($_POST['config_enable_alert_domain_expire'] ?? 0); $config_send_invoice_reminders = intval($_POST['config_send_invoice_reminders'] ?? 0); $config_recurring_auto_send_invoice = intval($_POST['config_recurring_auto_send_invoice'] ?? 0); $config_ticket_client_general_notifications = intval($_POST['config_ticket_client_general_notifications'] ?? 0); - mysqli_query($mysqli,"UPDATE settings SET config_send_invoice_reminders = $config_send_invoice_reminders, config_recurring_auto_send_invoice = $config_recurring_auto_send_invoice, config_enable_cron = $config_enable_cron, config_enable_alert_domain_expire = $config_enable_alert_domain_expire, config_ticket_client_general_notifications = $config_ticket_client_general_notifications WHERE company_id = 1"); + mysqli_query($mysqli,"UPDATE settings SET config_send_invoice_reminders = $config_send_invoice_reminders, config_recurring_auto_send_invoice = $config_recurring_auto_send_invoice, config_enable_alert_domain_expire = $config_enable_alert_domain_expire, config_ticket_client_general_notifications = $config_ticket_client_general_notifications WHERE company_id = 1"); logAudit("Settings", "Edit", "$session_name edited notification settings"); diff --git a/admin/settings_notification.php b/admin/settings_notification.php index 8dc75fd59..217512754 100644 --- a/admin/settings_notification.php +++ b/admin/settings_notification.php @@ -12,12 +12,6 @@ require_once "includes/inc_all_admin.php";
    -
    -
    - value="1" id="enableCronSwitch"> - -
    -
    @@ -50,32 +44,6 @@ require_once "includes/inc_all_admin.php"; - - - - - - - - - - - - - - @@ -135,39 +103,6 @@ require_once "includes/inc_all_admin.php"; - - - - - - - - - - - - - - - - - - - - -
    -
    Certificate Expiration Notice
    - - (This setting triggers a notification when a certificate is approaching its expiration date, specifically at 1, 7 and 45 days prior to expiry.) - -
    -
    -
    Asset Warranty Expiration Notice
    - - (This setting triggers a notification when an asset is approaching its expiration date, specifically at 1, 7 and 45 days prior to expiry.) - -
    -
    Billing
    -
    Shared Item View
    - (Notify when Shared items are viewed) -
    -
    -
    Cron Execution
    - (Notify when the nightly cron job ran) -
    -
    -
    ITFlow Updates
    - (Notify when ITFlow has an update) -
    -
    diff --git a/admin/settings_ticket.php b/admin/settings_ticket.php index 49fd8c87b..66cb579a5 100644 --- a/admin/settings_ticket.php +++ b/admin/settings_ticket.php @@ -33,7 +33,7 @@ require_once "includes/inc_all_admin.php";
    value="1" id="emailToTicketParseSwitch"> - +
    diff --git a/cron/backup.php b/cron/backup.php index 0bfd6c7f0..a81125537 100644 --- a/cron/backup.php +++ b/cron/backup.php @@ -29,7 +29,7 @@ if ($config_enable_cron == 0) { } /* - * Anything an administrator started from Settings > Backup is built first. Those are + * Anything an administrator started from Maintenance > Backup is built first. Those are * explicit requests and somebody is waiting on the notification. */ $queued = backupRunQueued($mysqli); diff --git a/cron/cron.php b/cron/cron.php index 722aeabaa..6fa7cb71c 100644 --- a/cron/cron.php +++ b/cron/cron.php @@ -9,7 +9,7 @@ * * It wakes once a minute, works out which jobs are due, and runs them. The jobs themselves * are listed in includes/cron_jobs.php; when and whether each one runs is held in the - * cron_jobs table and edited from Settings > Cron. + * cron_jobs table and edited from Maintenance > Cron. * * WHAT THE JOBS INHERIT * @@ -72,7 +72,7 @@ function cronJobClaim($mysqli, array $job): bool $now = date('Y-m-d H:i:s'); // Register the job the first time it is seen, seeded with the schedule it ships with. - // From here on the row is what runs - Settings > Cron writes to it. + // From here on the row is what runs - Maintenance > Cron writes to it. $default_schedule = escapeSql($job['schedule']); $default_interval = intval($job['interval_minutes'] ?? 1); $default_daily_at = isset($job['daily_at']) ? "'" . escapeSql($job['daily_at']) . ":00'" : 'NULL'; @@ -144,7 +144,7 @@ function cronJobClaim($mysqli, array $job): bool /* * Record how a job ended. The status is the outcome of the run that just happened; the error * is sticky and survives later successes, because the run that failed is usually long gone by - * the time anyone goes looking. Settings > Cron clears it. + * the time anyone goes looking. Maintenance > Cron clears it. */ function cronJobFinished($mysqli, string $job_name, string $status, ?float $duration = null, ?string $error = null): void { @@ -179,7 +179,7 @@ function cronJobFinished($mysqli, string $job_name, string $status, ?float $dura } } -// Proof the crontab is firing, recorded before any job runs. Settings > Cron reads it to tell +// Proof the crontab is firing, recorded before any job runs. Maintenance > Cron reads it to tell // "no job was due" apart from "nothing has run this since the server was rebuilt". mysqli_query($mysqli, "UPDATE settings SET config_cron_last_dispatch_at = '" . date('Y-m-d H:i:s') . "' WHERE company_id = 1"); diff --git a/cron/nightly_tasks.php b/cron/nightly_tasks.php index 107895d9d..997da02f9 100644 --- a/cron/nightly_tasks.php +++ b/cron/nightly_tasks.php @@ -43,7 +43,6 @@ $company_currency = escapeSql($row['company_currency']); // Company Settings $config_enable_cron = intval($row['config_enable_cron']); -$config_invoice_overdue_reminders = $row['config_invoice_overdue_reminders']; $config_invoice_prefix = escapeSql($row['config_invoice_prefix']); $config_invoice_from_email = escapeSql($row['config_invoice_from_email']); $config_invoice_from_name = escapeSql($row['config_invoice_from_name']); @@ -539,7 +538,6 @@ while ($row = mysqli_fetch_assoc($sql_resolved_tickets_to_close)) { if ($config_send_invoice_reminders == 1) { // PAST DUE INVOICE Notifications - //$invoiceAlertArray = [$config_invoice_overdue_reminders]; $invoiceAlertArray = [1,30,60,90,120,150,180,210,240,270,300,330,360,390,420,450,480,510,540,570,590,620,650,680,710,740]; foreach ($invoiceAlertArray as $day) { diff --git a/cron/ticket_email_parser.php b/cron/ticket_email_parser.php index 849606092..95fc84aa4 100644 --- a/cron/ticket_email_parser.php +++ b/cron/ticket_email_parser.php @@ -42,6 +42,12 @@ $row = mysqli_fetch_assoc($sql); $company_name = escapeSql($row['company_name']); $company_phone = escapeSql(formatPhoneNumber($row['company_phone'], $row['company_phone_country_code'])); +// Check cron is enabled +if ($config_enable_cron == 0) { + logApp("Cron-Email-Parser", "error", "Cron Email Parser unable to run - cron not enabled in admin settings."); + cronJobStop("Cron: is not enabled -- Quitting.."); +} + // Check setting enabled if ($config_ticket_email_parse == 0) { logApp("Cron-Email-Parser", "error", "Cron Email Parser unable to run - not enabled in admin settings."); diff --git a/cron/ticket_sla.php b/cron/ticket_sla.php index ea115422e..9e4472b77 100644 --- a/cron/ticket_sla.php +++ b/cron/ticket_sla.php @@ -34,6 +34,19 @@ require_once "../functions.php"; * breach until someone moves them back to a running status. */ +// Read the master switch here rather than trusting a global. Every job shares one process +// and one global scope, so a value an earlier job happened to leave behind is not this +// script's to rely on - see the cron rules in CONTRIBUTING.md. +$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT config_enable_cron FROM settings WHERE company_id = 1")); + +$config_enable_cron = intval($row['config_enable_cron']); + +// Check cron is enabled +if ($config_enable_cron == 0) { + logApp("Cron-Ticket-SLA", "error", "Cron Ticket SLA monitor unable to run - cron not enabled in admin settings."); + cronJobStop("Cron: is not enabled -- Quitting.."); +} + $sla_settings = getSlaSettings(); $warning_percent = intval($sla_settings['warning_percent']); diff --git a/db.sql b/db.sql index 4de0496f5..c0bcebd73 100644 --- a/db.sql +++ b/db.sql @@ -2276,7 +2276,6 @@ CREATE TABLE `settings` ( `config_recurring_auto_send_invoice` tinyint(1) NOT NULL DEFAULT 1, `config_enable_alert_domain_expire` tinyint(1) NOT NULL DEFAULT 1, `config_send_invoice_reminders` tinyint(1) NOT NULL DEFAULT 1, - `config_invoice_overdue_reminders` varchar(200) DEFAULT NULL, `config_azure_client_id` varchar(200) DEFAULT NULL, `config_azure_client_secret` varchar(200) DEFAULT NULL, `config_module_enable_itdoc` tinyint(1) NOT NULL DEFAULT 1, @@ -3150,4 +3149,4 @@ CREATE TABLE `vendors` ( /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2026-08-02 16:18:05 +-- Dump completed on 2026-08-02 17:22:01 diff --git a/functions/backup.php b/functions/backup.php index 0955339a4..baa6d2df9 100644 --- a/functions/backup.php +++ b/functions/backup.php @@ -58,7 +58,7 @@ function backupAppRoot(): string * The encryption key for this install. * * Lives in config.php only. Generated and appended on first use so nobody has to think - * about it, then displayed in Settings > Backup so it can be written down - without it a + * about it, then displayed in Maintenance > Backup so it can be written down - without it a * backup cannot be restored, on this server or any other. * * Returns an empty string if config.php could not be written, which every caller treats @@ -513,7 +513,7 @@ function backupSealArchive(array $entries, string $zip_path, string $key, ?strin * than a web request is allowed to live on most hosts - PHP-FPM's request_terminate_timeout * and the front end's read timeout both cut it off, and neither is affected by * set_time_limit() - so the button records the intent and cron/backup.php does the work - * within the minute. Same shape as the Run Now button on Settings > Cron. + * within the minute. Same shape as the Run Now button on Maintenance > Cron. */ function backupQueue(mysqli $mysqli, string $type, string $created_by, ?string &$error = null): int { diff --git a/includes/cron_jobs.php b/includes/cron_jobs.php index 088e721ff..00aea2a37 100644 --- a/includes/cron_jobs.php +++ b/includes/cron_jobs.php @@ -7,7 +7,7 @@ * Adding a job is a script in cron/ and an entry here - the crontab never changes. * * Schedules here are DEFAULTS. They seed the job's row in the cron_jobs table the first - * time the dispatcher sees it, and from then on the row is what runs: Settings > Cron + * time the dispatcher sees it, and from then on the row is what runs: Maintenance > Cron * writes to it. Changing a default in this file therefore only affects installs that have * not met the job yet. * @@ -16,7 +16,7 @@ * so nothing that reaches the database can point the dispatcher at an arbitrary file. * * Loaded from both sides: cron/cron.php requires it on the command line under system cron, - * and Settings > Cron requires it in a web request. Nothing in here may touch $_SERVER, + * and Maintenance > Cron requires it in a web request. Nothing in here may touch $_SERVER, * $_SESSION or any other superglobal - there is no DOCUMENT_ROOT, no session and no request * when cron runs it. * @@ -24,13 +24,17 @@ * only cron loads: the admin pages would otherwise be reaching into the cron directory. * * 'enabled' => 0 ships a job switched off - the row is seeded disabled and stays that way - * until somebody turns it on in Settings > Cron. Used for work an install should opt into + * until somebody turns it on in Maintenance > Cron. Used for work an install should opt into * rather than inherit from an upgrade, like the backup job filling a disk overnight. * * 'interval_safe' => false marks a job whose work repeats if the day repeats - nightly's - * late fees and overdue reminders fire again on a second run of the same day. Settings > + * late fees and overdue reminders fire again on a second run of the same day. Maintenance > * Cron only offers the daily schedule for such a job, and the dispatcher refuses to run * one on an interval whatever its row says. + * + * Every job here checks config_enable_cron in its own header and stops itself when that + * switch is off. It is not a dispatcher-level gate - a new job has to make the check + * itself, and a job that skips it will keep running on an install that thinks cron is off. */ function cronJobRegistry(): array @@ -81,7 +85,7 @@ function cronJobRegistry(): array 'name' => 'backup', 'label' => 'Backup', 'script' => 'backup.php', - 'description' => 'Builds the scheduled backup and anything queued from Settings > Backup. Off by default.', + 'description' => 'Builds the scheduled backup and anything queued from Maintenance > Backup. Off by default.', 'schedule' => 'Daily', 'daily_at' => '02:00', 'enabled' => 0, diff --git a/includes/load_global_settings.php b/includes/load_global_settings.php index 13b8ebf5c..6931145a1 100644 --- a/includes/load_global_settings.php +++ b/includes/load_global_settings.php @@ -99,7 +99,6 @@ $config_enable_cron = intval($row['config_enable_cron']); $config_recurring_auto_send_invoice = intval($row['config_recurring_auto_send_invoice']); $config_enable_alert_domain_expire = intval($row['config_enable_alert_domain_expire']); $config_send_invoice_reminders = intval($row['config_send_invoice_reminders']); -$config_invoice_overdue_reminders = intval($row['config_invoice_overdue_reminders']); // Modules $config_module_enable_itdoc = intval($row['config_module_enable_itdoc']); diff --git a/scripts/restore_cli.php b/scripts/restore_cli.php index 59e00a835..a4ddc917d 100644 --- a/scripts/restore_cli.php +++ b/scripts/restore_cli.php @@ -62,7 +62,7 @@ $key = $options['key'] ?? ($config_backup_key ?? ''); if ($key === '') { fwrite(STDERR, "No encryption key.\n\n"); fwrite(STDERR, "config.php has no \$config_backup_key, so pass the key from the install that made\n"); - fwrite(STDERR, "this backup with --key=... It is shown in Settings > Backup on that install.\n"); + fwrite(STDERR, "this backup with --key=... It is shown in Maintenance > Backup on that install.\n"); exit(1); } @@ -131,6 +131,6 @@ echo "\nNext steps:\n"; echo " 1. Log in with the credentials that were in use when the backup was taken.\n"; echo " 2. If the backup is older than the code in this directory, finish the database update:\n"; echo " php " . realpath(__DIR__) . "/update_cli.php --update_db\n"; -echo " 3. Check Settings > Cron - the schedule came back with the database.\n"; +echo " 3. Check Maintenance > Cron - the schedule came back with the database.\n"; exit(0); diff --git a/scripts/setup_cli.php b/scripts/setup_cli.php index a1fc8eb82..58c43ffb4 100644 --- a/scripts/setup_cli.php +++ b/scripts/setup_cli.php @@ -282,7 +282,7 @@ mysqli_query($mysqli,"INSERT INTO companies SET company_name = '$company_name', // Insert default settings and categories $latest_database_version = LATEST_DATABASE_VERSION; -mysqli_query($mysqli,"INSERT INTO settings SET company_id = 1, config_current_database_version = '$latest_database_version', config_invoice_prefix = 'INV-', config_invoice_next_number = 1, config_recurring_invoice_prefix = 'REC-', config_invoice_overdue_reminders = '1,3,7', config_quote_prefix = 'QUO-', config_quote_next_number = 1, config_default_net_terms = 30, config_ticket_next_number = 1, config_ticket_prefix = 'TCK-'"); +mysqli_query($mysqli,"INSERT INTO settings SET company_id = 1, config_current_database_version = '$latest_database_version', config_invoice_prefix = 'INV-', config_invoice_next_number = 1, config_recurring_invoice_prefix = 'REC-', config_quote_prefix = 'QUO-', config_quote_next_number = 1, config_default_net_terms = 30, config_ticket_next_number = 1, config_ticket_prefix = 'TCK-'"); // Categories mysqli_query($mysqli,"INSERT INTO categories SET category_name = 'Office Supplies', category_type = 'Expense', category_color = 'blue'"); @@ -447,4 +447,15 @@ fclose($myfile); echo "\nSetup complete!\n"; echo "You can now log in with the user you created at: https://$base_url/login.php\n"; +// Whoever ran this is already at a shell on the right host, which makes this the one moment +// they can paste the crontab line without going and finding it. The web setup shows the same +// two steps on its finish page. +$itflow_path = realpath(__DIR__ . '/..'); + +echo "\nTwo things left before ITFlow can send mail, parse tickets or bill anyone:\n\n"; +echo " 1. Add this single entry to the crontab of the user that owns the ITFlow files:\n\n"; +echo " * * * * * php $itflow_path/cron/cron.php >/dev/null\n\n"; +echo " 2. Turn cron on in Maintenance > Cron. It ships off, and every job stops\n"; +echo " itself until it is enabled. Per-job schedules live on the same page.\n\n"; + exit(0); diff --git a/setup/index.php b/setup/index.php index 47a9a2c04..fd48fa915 100644 --- a/setup/index.php +++ b/setup/index.php @@ -204,7 +204,7 @@ if (isset($_POST['restore'])) { } if ($restore_key === '') { - $_SESSION['alert_message'] = "Enter the backup encryption key. It is shown in Settings > Backup on the install that made this archive."; + $_SESSION['alert_message'] = "Enter the backup encryption key. It is shown in Maintenance > Backup on the install that made this archive."; header("Location: ?restore"); exit; } @@ -376,7 +376,7 @@ if (isset($_POST['add_company_settings'])) { } $latest_database_version = LATEST_DATABASE_VERSION; - mysqli_query($mysqli,"INSERT INTO settings SET company_id = 1, config_current_database_version = '$latest_database_version', config_invoice_prefix = 'INV-', config_invoice_next_number = 1, config_recurring_invoice_prefix = 'REC-', config_invoice_overdue_reminders = '1,3,7', config_quote_prefix = 'QUO-', config_quote_next_number = 1, config_default_net_terms = 30, config_ticket_next_number = 1, config_ticket_prefix = 'TCK-'"); + mysqli_query($mysqli,"INSERT INTO settings SET company_id = 1, config_current_database_version = '$latest_database_version', config_invoice_prefix = 'INV-', config_invoice_next_number = 1, config_recurring_invoice_prefix = 'REC-', config_quote_prefix = 'QUO-', config_quote_next_number = 1, config_default_net_terms = 30, config_ticket_next_number = 1, config_ticket_prefix = 'TCK-'"); // Create Categories // Expense Categories Examples @@ -1154,7 +1154,7 @@ if (isset($_POST['add_telemetry'])) {
    - Shown in Settings > Backup on that install. The archive cannot be opened without it. + Shown in Maintenance > Backup on that install. The archive cannot be opened without it.
    @@ -1454,10 +1454,12 @@ if (isset($_POST['add_telemetry'])) {
  • Setup backups
  • Setup cron - ITFlow needs one entry, which runs - every job on the schedule set in Settings > Cron. Add it to the crontab of the user that + every job on the schedule set in Maintenance > Cron. Add it to the crontab of the user that owns the ITFlow files:
    /dev/null") ?>
    - *If installing via the script this is set up for you. + Then turn cron on in Maintenance > Cron - it ships off, and every job + stops itself until it is enabled. + *If installing via the script the crontab entry is set up for you.
  • Star ITFlow on Github :)
  • From 6b5be0f8811101a0e775640fef51622749eaf053 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Sun, 2 Aug 2026 18:07:24 -0400 Subject: [PATCH 223/241] Rework Update UI and fix banch --- CHANGELOG.md | 4 + admin/post/update.php | 12 +- admin/update.php | 247 ++++++++++++++++++++++++++++------------- functions/app.php | 26 ++++- scripts/update_cli.php | 8 +- 5 files changed, 208 insertions(+), 89 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 89ff0b329..a794d9d0a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -69,6 +69,10 @@ Only this release needs the command line for the database update. Normal updates - Settings > Ticketing: the email-to-ticket hint no longer names a cron script that has not existed for several releases, and points at Maintenance > Cron instead. - Setup: the command line installer now prints the crontab entry and the reminder to turn cron on, the same two steps the web installer shows on its finish page. - Removed the unused `config_invoice_overdue_reminders` setting. It was seeded on install and read in two places but never actually used by anything; the overdue reminder schedule is fixed in the nightly job. +- Update page: reworked. Release, tracked branch, database version and code commit are now shown whatever state the install is in, instead of only when it is already up to date, and a pending database update no longer hides a pending application update — both appear, in the order they need doing. Pending commits are listed in a readable table rather than a centred one, and the backup warning is stated once instead of twice. +- Update page: **Force Update no longer resets to `origin/master` regardless of the branch you track.** On an install following any other branch it silently moved the files onto master and discarded the code that was actually running. It now resets to the branch in `$repo_branch`, and so does `update_cli.php --force_update`. Installs with no `$repo_branch` in `config.php` still get master, as before. +- Update page: the database update is now offered using a proper version comparison. The old string comparison would have stopped offering updates once a version reached a two-digit part — `2.6.10` sorts below `2.6.9` as plain text. +- Update page: Git output — commit subjects and error text — is escaped before it reaches the page, and the branch name is escaped before it reaches a shell command. The page also no longer runs a second `git fetch` just to read the error message from the first one. - Cron: the nightly run is safe to repeat. Late fees, overdue invoice reminders and autopay retries now apply at most once per invoice per day, so a Run Now after the scheduled pass no longer stacks fees or re-emails clients. Nightly Tasks only accepts the daily schedule. - Ticket SLAs, optional throughout. An SLA sets a response target and an optional resolution target, assigned per client and priority with a global default and an explicit "no SLA" override. Targets are measured against your business hours. Tickets show time remaining and turn yellow at a configurable warning threshold and red on breach, on both the ticket list and the kanban board, and can be filtered by SLA state. Nominated statuses pause the resolution clock for "waiting on customer", preserving the remaining budget. Two new reports, SLA Summary and SLA by Client. With no assignments defined nothing behaves any differently. - Ticket: added an Urgent priority. diff --git a/admin/post/update.php b/admin/post/update.php index 1a2b3b3ac..5e28fc130 100644 --- a/admin/post/update.php +++ b/admin/post/update.php @@ -8,11 +8,17 @@ if (isset($_GET['update'])) { enforceAdminPermission(); - //git fetch downloads the latest from remote without trying to merge or rebase anything. Then the git reset resets the master branch to what you just fetched. The --hard option changes all the files in your working tree to match the files in origin/master - + // git fetch downloads the latest from the remote without merging or rebasing anything. + // The hard reset then throws away every local change and makes the working tree match + // the tracked branch exactly. + // + // That reset used to name origin/master outright, so a force update on an install + // tracking any other branch silently moved it onto master and discarded the code it was + // actually running. if (isset($_GET['force_update']) == 1) { + $remote_ref = escapeshellarg("origin/" . getRepoBranch()); exec("git fetch --all"); - exec("git reset --hard origin/master"); + exec("git reset --hard $remote_ref"); } else { exec("git pull"); } diff --git a/admin/update.php b/admin/update.php index 9f2beac2f..da75bfd5e 100644 --- a/admin/update.php +++ b/admin/update.php @@ -3,106 +3,197 @@ require_once "includes/inc_all_admin.php"; require_once "../includes/database_version.php"; +$repo_branch = getRepoBranch(); +$remote_ref = escapeshellarg("origin/$repo_branch"); + $updates = checkForUpdates(); -$latest_version = $updates->latest_version; $current_version = $updates->current_version; -$result = $updates->result; +$fetch_ok = $updates->result === 0; -$git_log = shell_exec("git log $repo_branch..origin/$repo_branch --pretty=format:'%h%ar%s'"); +// Commits sitting between this working tree and the remote branch. Fields are separated +// by \x1f rather than having git build the table markup, because a commit subject comes +// from outside this install and used to reach the page as unescaped HTML. +$pending_commits = []; + +$git_log = shell_exec("git log HEAD..$remote_ref --pretty=format:'%h%x1f%ar%x1f%s'"); + +foreach (explode("\n", trim((string) $git_log)) as $commit_line) { + + if ($commit_line === '') { + continue; + } + + $commit_fields = explode("\x1f", $commit_line, 3); + + if (count($commit_fields) === 3) { + $pending_commits[] = $commit_fields; + } + +} + +// version_compare, not > - "2.6.10" is less than "2.6.9" as a plain string comparison, so +// the plain comparison silently stops offering database updates once a minor reaches 10. +$db_update_available = version_compare(LATEST_DATABASE_VERSION, CURRENT_DATABASE_VERSION, '>'); +$app_update_available = !empty($pending_commits); ?> -
    -
    -

    Update

    -
    -
    +
    +
    +

    Update

    +
    +
    - - -
    - WARNING: Could not find execute 'git fetch'. -

    - Error details:- &1") ?> -
    -
    Things to check: Is Git installed? Is the Git origin/remote correct? Are web server file permissions too strict? -
    Seek support on the Forum if required - include relevant PHP error logs & ITFlow debug output + +
    +
    Cannot reach the Git remote
    + ITFlow updates itself with Git, so nothing below is current until this is fixed. + output)) { ?> +
    output)) ?>
    + + Check that Git is installed, that the remote is reachable from this server, and that the web server + user can write to the ITFlow directory. The + forum can help - include + your PHP error log and the output above. +
    + + +
    +
    + Release +
    +
    +
    + Branch +
    + + Not the release branch + +
    +
    + Database +
    + + + + +
    +
    +
    + Commit +
    +
    +
    + +
    + + + +
    + +

    You are up to date

    +

    Everything is going to be alright.

    +
    + + + - CURRENT_DATABASE_VERSION) { ?> -
    -

    ⚠️ DANGER ⚠️

    -

    Do NOT run updates without first taking a backup

    -

    VM Snapshots are highly recommended over other methods - see the docs. Review the changelog for breaking changes that may require manual remediation.

    -

    Ignore this warning at your own risk.

    + + +
    +
    Do not update without a backup
    + A VM snapshot is the safest option - other methods are covered in the + docs. Read the + changelog + first: some releases need manual steps, and this page will not do them for you. +
    + + +

    + Both are pending. Update the application files first - + they bring the database migrations that the second step then applies. +

    + + + +
    +
    Application files
    +

    + commit + behind . +

    + + Update App + + + Force Update + +

    + + Update App runs git pull. Force Update discards every local change and resets + the files to - use it only when a + normal update will not apply. + +

    -
    -
    Update Database
    -
    - Current DB Version: -
    - Latest DB Version: -
    -
    + - -
    -

    ⚠️ DANGER ⚠️

    -

    Do NOT run updates without first taking a backup

    -

    VM Snapshots are highly recommended over other methods - see the docs. Review the changelog for breaking changes that may require manual remediation.

    -

    Ignore this warning at your own risk.

    -
    + +
    +
    Database
    +

    + Schema is at and this code expects + . Parts of the app will error until + this is applied. +

    + + Update Database + +

    + + A large instance can take a minute or more. If it fails part way it stops without advancing + the recorded version, so it is safe to run again after fixing the cause. + +

    +
    + -
    Update App
    -
    FORCE Update App
    + - -

    Application Release Version:

    -

    Database Version:

    -

    Code Commit:

    -

    You are up to date!
    Everything is going to be alright

    -
    - - -
    - - - - - - - - - - - + +
    Pending commits
    +
    +
    CommitWhenDescription
    + + + + + + - + + + + + + +
    CommitWhenDescription
    - + - ?> - -
    +
    &1", $output, $result); + $latest_version = exec("git rev-parse $remote_ref"); $current_version = exec("git rev-parse HEAD"); if ($current_version == $latest_version) { diff --git a/scripts/update_cli.php b/scripts/update_cli.php index cc08b8bd9..e3780f7c1 100644 --- a/scripts/update_cli.php +++ b/scripts/update_cli.php @@ -29,7 +29,7 @@ function printHelp() { echo "Options:\n"; echo " --help Show this help message.\n"; echo " --update Perform a git pull to update the application.\n"; - echo " --force_update Perform a git fetch and hard reset to origin/master.\n"; + echo " --force_update Perform a git fetch and hard reset to the branch this install tracks.\n"; echo " --update_db Update the database structure to the latest version.\n"; echo "\nIf no options are provided, a standard update (git pull) is performed.\n"; } @@ -82,9 +82,11 @@ if (count($options) === 0) { // If "update" or "force_update" is requested if (isset($options['update']) || isset($options['force_update'])) { if (isset($options['force_update'])) { - // Perform a hard reset + // Perform a hard reset onto the tracked branch. This named origin/master outright + // until 26.08, which moved any install tracking another branch onto master. + $remote_ref = escapeshellarg("origin/" . getRepoBranch()); exec("git fetch --all 2>&1", $output, $return_var); - exec("git reset --hard origin/master 2>&1", $output2, $return_var2); + exec("git reset --hard $remote_ref 2>&1", $output2, $return_var2); echo implode("\n", $output) . "\n" . implode("\n", $output2) . "\n"; } else { // Perform a standard update (git pull) From 315768d651a568a43e1d09872c9aad25df566055 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Sun, 2 Aug 2026 18:23:18 -0400 Subject: [PATCH 224/241] Add Category column and filter into income along with the exports --- CHANGELOG.md | 3 ++ agent/income.php | 59 ++++++++++++++++++++++++--- agent/modals/income/income_export.php | 37 ++++++++++++++++- agent/post/income.php | 48 ++++++++++++++++++++-- functions/export.php | 4 +- 5 files changed, 138 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a794d9d0a..e66bdd955 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -73,6 +73,9 @@ Only this release needs the command line for the database update. Normal updates - Update page: **Force Update no longer resets to `origin/master` regardless of the branch you track.** On an install following any other branch it silently moved the files onto master and discarded the code that was actually running. It now resets to the branch in `$repo_branch`, and so does `update_cli.php --force_update`. Installs with no `$repo_branch` in `config.php` still get master, as before. - Update page: the database update is now offered using a proper version comparison. The old string comparison would have stopped offering updates once a version reached a two-digit part — `2.6.10` sorts below `2.6.9` as plain text. - Update page: Git output — commit subjects and error text — is escaped before it reaches the page, and the branch name is escaped before it reaches a shell command. The page also no longer runs a second `git fetch` just to read the error message from the first one. +- Income: added a Category filter and a Category column. A revenue carries its own category and a payment inherits the one on the invoice it was paid against, so both are categorised. Only categories actually in use are listed. Category is searchable and sortable, and it carries through to the export. +- Income: the Source column now shows what the money was for. A revenue's category was being displayed there, which meant the revenue description never appeared on the page at all even though it is captured on the add and edit forms. Category has its own column now, so both are visible. +- Income: fixed a PHP warning on every page load without a date range, and the export's filter summary, which was never populated - a filtered PDF came out looking like a full export. - Cron: the nightly run is safe to repeat. Late fees, overdue invoice reminders and autopay retries now apply at most once per invoice per day, so a Run Now after the scheduled pass no longer stacks fees or re-emails clients. Nightly Tasks only accepts the daily schedule. - Ticket SLAs, optional throughout. An SLA sets a response target and an optional resolution target, assigned per client and priority with a global default and an explicit "no SLA" override. Targets are measured against your business hours. Tickets show time remaining and turn yellow at a configurable warning threshold and red on breach, on both the ticket list and the kanban board, and can be filtered by SLA state. Nominated statuses pause the resolution clock for "waiting on customer", preserving the remaining budget. Two new reports, SLA Summary and SLA by Client. With no assignments defined nothing behaves any differently. - Ticket: added an Urgent priority. diff --git a/agent/income.php b/agent/income.php index e2633193f..95c5b4b0e 100644 --- a/agent/income.php +++ b/agent/income.php @@ -41,6 +41,17 @@ if (isset($_GET['account']) && !empty($_GET['account'])) { $account_filter = ''; } +// Category Filter - a revenue carries its own category, a payment inherits the one on the +// invoice it was paid against. Both come from the same 'Income' category pool. +if (isset($_GET['category']) && !empty($_GET['category'])) { + $category_query = 'AND (income_category_id = ' . intval($_GET['category']) . ')'; + $category_filter = intval($_GET['category']); +} else { + // Default - any + $category_query = ''; + $category_filter = ''; +} + // Payment Method Filter if (isset($_GET['method']) && !empty($_GET['method'])) { $method_query = "AND (income_method = '" . escapeSql($_GET['method']) . "')"; @@ -62,6 +73,8 @@ $income_query = payment_created_at AS income_created_at, payment_invoice_id AS income_invoice_id, CONCAT(invoice_prefix, invoice_number) AS income_source, + category_name AS income_category, + IFNULL(invoice_category_id, 0) AS income_category_id, invoice_client_id AS income_client_id, client_name AS income_client, payment_amount AS income_amount, @@ -75,6 +88,7 @@ $income_query = LEFT JOIN invoices ON payment_invoice_id = invoice_id LEFT JOIN clients ON invoice_client_id = client_id LEFT JOIN accounts ON payment_account_id = account_id + LEFT JOIN categories ON invoice_category_id = category_id WHERE payment_archived_at IS NULL $payment_client_query $access_permission_query @@ -87,7 +101,9 @@ $income_query = revenue_date, revenue_created_at, 0, + revenue_description, category_name, + revenue_category_id, revenue_client_id, client_name, revenue_amount, @@ -108,8 +124,9 @@ $income_query = $income_filter_query = "WHERE DATE(income_date) BETWEEN '$dtf' AND '$dtt' - AND (income_source LIKE '%$q%' OR income_client LIKE '%$q%' OR income_account LIKE '%$q%' OR income_method LIKE '%$q%' OR income_reference LIKE '%$q%' OR income_amount LIKE '%$q%') + AND (income_source LIKE '%$q%' OR income_category LIKE '%$q%' OR income_client LIKE '%$q%' OR income_account LIKE '%$q%' OR income_method LIKE '%$q%' OR income_reference LIKE '%$q%' OR income_amount LIKE '%$q%') $type_query + $category_query $account_query $method_query"; @@ -155,14 +172,14 @@ $summary_total_income = floatval($row['total_income']);
    @@ -194,6 +211,29 @@ $summary_total_income = floatval($row['total_income']);
    +
    +
    + +
    +
    @@ -244,7 +284,7 @@ $summary_total_income = floatval($row['total_income']);
    - +
    @@ -317,6 +357,11 @@ $summary_total_income = floatval($row['total_income']); Source + + + Category + + @@ -356,6 +401,7 @@ $summary_total_income = floatval($row['total_income']); $income_date = escapeHtml($row['income_date']); $income_invoice_id = intval($row['income_invoice_id']); $income_source = escapeHtml($row['income_source']); + $income_category = escapeHtml($row['income_category']); $income_client_id = intval($row['income_client_id']); $income_client = escapeHtml($row['income_client']); $income_amount = floatval($row['income_amount']); @@ -403,9 +449,10 @@ $summary_total_income = floatval($row['total_income']); - + + diff --git a/agent/modals/income/income_export.php b/agent/modals/income/income_export.php index 8ef75c9a8..2670cebda 100644 --- a/agent/modals/income/income_export.php +++ b/agent/modals/income/income_export.php @@ -15,6 +15,13 @@ if (isset($_GET['type']) && !empty($_GET['type']) && in_array($_GET['type'], $in $type_filter = ''; } +// Category Filter +if (isset($_GET['category']) && !empty($_GET['category'])) { + $category_filter = intval($_GET['category']); +} else { + $category_filter = ''; +} + // Account Filter if (isset($_GET['account']) && !empty($_GET['account'])) { $account_filter = intval($_GET['account']); @@ -74,7 +81,7 @@ ob_start();
    - +
    @@ -95,6 +102,34 @@ ob_start();
    +
    + +
    +
    + +
    + +
    +
    +
    diff --git a/agent/post/income.php b/agent/post/income.php index 74eea6869..cc1900e28 100644 --- a/agent/post/income.php +++ b/agent/post/income.php @@ -53,6 +53,16 @@ if (isset($_POST['export_income'])) { $account_query = ''; } + // Category Filter - a revenue carries its own category, a payment inherits the one on the + // invoice it was paid against. Both come from the same 'Income' category pool. + $category = intval($_POST['category'] ?? 0); + if ($category) { + $category_query = "AND (income_category_id = $category)"; + } else { + // Default - any + $category_query = ''; + } + // Payment Method Filter if (!empty($_POST['method'])) { $method_query = "AND (income_method = '" . escapeSql($_POST['method']) . "')"; @@ -64,7 +74,7 @@ if (isset($_POST['export_income'])) { // Search Filter - mirrors the income page search box $q = escapeSql($_POST['q']); if (!empty($q)) { - $search_query = "AND (income_source LIKE '%$q%' OR income_client LIKE '%$q%' OR income_account LIKE '%$q%' OR income_method LIKE '%$q%' OR income_reference LIKE '%$q%' OR income_amount LIKE '%$q%')"; + $search_query = "AND (income_source LIKE '%$q%' OR income_category LIKE '%$q%' OR income_client LIKE '%$q%' OR income_account LIKE '%$q%' OR income_method LIKE '%$q%' OR income_reference LIKE '%$q%' OR income_amount LIKE '%$q%')"; } else { // Default - any $search_query = ''; @@ -77,6 +87,32 @@ if (isset($_POST['export_income'])) { $date_query = ''; } + // Filter summary for the export header. This handler was the only one not building it, + // so a filtered PDF came out looking like a full export. + $filter_summary = []; + + if ($client_id) { + $filter_summary['Client'] = $client_name; + } + if (!empty($_POST['type']) && in_array($_POST['type'], $income_types_array)) { + $filter_summary['Type'] = $_POST['type']; + } + if ($category) { + $filter_summary['Category'] = getFieldById('categories', $category, 'category_name'); + } + if ($account) { + $filter_summary['Account'] = getFieldById('accounts', $account, 'account_name'); + } + if (!empty($_POST['method'])) { + $filter_summary['Payment Method'] = $_POST['method']; + } + if (!empty($date_from) && !empty($date_to)) { + $filter_summary['Date'] = "$date_from to $date_to"; + } + if (!empty($_POST['q'])) { + $filter_summary['Search'] = $_POST['q']; + } + // Same union as income.php - payments applied to an invoice, and standalone revenues. // Transfers between accounts are stored as a linked expense + revenue pair, so the revenue leg // is excluded here (transfer_id IS NULL) - moving your own money is not income. @@ -89,7 +125,8 @@ if (isset($_POST['export_income'])) { payment_date AS income_date, payment_created_at AS income_created_at, CONCAT(invoice_prefix, invoice_number) AS income_source, - NULL AS income_description, + category_name AS income_category, + IFNULL(invoice_category_id, 0) AS income_category_id, client_name AS income_client, payment_amount AS income_amount, payment_currency_code AS income_currency_code, @@ -101,6 +138,7 @@ if (isset($_POST['export_income'])) { LEFT JOIN invoices ON payment_invoice_id = invoice_id LEFT JOIN clients ON invoice_client_id = client_id LEFT JOIN accounts ON payment_account_id = account_id + LEFT JOIN categories ON invoice_category_id = category_id WHERE payment_archived_at IS NULL $payment_client_query $access_permission_query @@ -112,8 +150,9 @@ if (isset($_POST['export_income'])) { revenue_id, revenue_date, revenue_created_at, - category_name, revenue_description, + category_name, + revenue_category_id, client_name, revenue_amount, revenue_currency_code, @@ -133,6 +172,7 @@ if (isset($_POST['export_income'])) { WHERE 1 = 1 $date_query $type_query + $category_query $account_query $method_query $search_query @@ -144,7 +184,7 @@ if (isset($_POST['export_income'])) { guardExportPdfRowCount($format, $num_rows); - $export = beginExport('income', $format, $file_name_prepend . 'Income', 'Income', summarizeExportFilters($filter_summary ?? [])); + $export = beginExport('income', $format, $file_name_prepend . 'Income', 'Income', summarizeExportFilters($filter_summary)); while ($row = mysqli_fetch_assoc($sql)) { addExportRow($export, $row); diff --git a/functions/export.php b/functions/export.php index 617c59c09..d80739f29 100644 --- a/functions/export.php +++ b/functions/export.php @@ -259,8 +259,8 @@ function getExportColumns($export_type) { 'income' => [ 'income_date' => ['label' => 'Date'], 'income_type' => ['label' => 'Type'], - 'income_source' => ['label' => 'Source'], - 'income_description' => ['label' => 'Description', 'weight' => 3], + 'income_source' => ['label' => 'Source', 'weight' => 3], + 'income_category' => ['label' => 'Category'], 'income_client' => ['label' => 'Client', 'weight' => 2], 'income_amount' => ['label' => 'Amount', 'format' => 'money'], 'income_currency_code' => ['label' => 'Currency'], From 5ee1c9580f754ed366ab06bbadf7f27f2a186063 Mon Sep 17 00:00:00 2001 From: wrongecho Date: Mon, 3 Aug 2026 17:51:04 +0100 Subject: [PATCH 225/241] Enhance .htaccess rules --- .gitignore | 1 + .htaccess | 2 +- scripts/.htaccess | 6 +++--- uploads/tmp/.htaccess | 3 +++ 4 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 uploads/tmp/.htaccess diff --git a/.gitignore b/.gitignore index 1d73a5648..f18711d1f 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,7 @@ uploads/users/* !uploads/users/index.php uploads/tmp/* !uploads/tmp/index.php +!uploads/tmp/.htaccess uploads/backups/* !uploads/backups/index.php !uploads/backups/.htaccess diff --git a/.htaccess b/.htaccess index f38dbabcd..826afe9a4 100644 --- a/.htaccess +++ b/.htaccess @@ -1,2 +1,2 @@ # Prevent access to .git, .github, and config.php -RedirectMatch 404 ^/(\.git|\.github|config\.php) \ No newline at end of file +RedirectMatch 401 ^/(\.git|\.github|config\.php) diff --git a/scripts/.htaccess b/scripts/.htaccess index 77b4e697e..7cb1de172 100644 --- a/scripts/.htaccess +++ b/scripts/.htaccess @@ -1,3 +1,3 @@ - - Require all denied - \ No newline at end of file +Require all denied +Options -ExecCGI -Indexes +php_flag engine off diff --git a/uploads/tmp/.htaccess b/uploads/tmp/.htaccess new file mode 100644 index 000000000..7cb1de172 --- /dev/null +++ b/uploads/tmp/.htaccess @@ -0,0 +1,3 @@ +Require all denied +Options -ExecCGI -Indexes +php_flag engine off From ffe32adbd3aacaa0edd969995d720024d9e8146f Mon Sep 17 00:00:00 2001 From: johnnyq Date: Mon, 3 Aug 2026 12:54:33 -0400 Subject: [PATCH 226/241] Move categories and tag types to a left side nav instead of top nav --- admin/categories.php | 332 ++++++++++++++++++++++--------------------- admin/tags.php | 222 ++++++++++++++--------------- 2 files changed, 277 insertions(+), 277 deletions(-) diff --git a/admin/categories.php b/admin/categories.php index d9bb8a01f..ca549e0a0 100644 --- a/admin/categories.php +++ b/admin/categories.php @@ -23,193 +23,195 @@ $sql = mysqli_query( ); $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); +// Category types shown in the left nav +$category_types = [ + 'Expense' => ['label' => 'Expense', 'icon' => 'fa-shopping-cart'], + 'Income' => ['label' => 'Income', 'icon' => 'fa-hand-holding-usd'], + 'Referral' => ['label' => 'Referral', 'icon' => 'fa-share-alt'], + 'Ticket' => ['label' => 'Ticket', 'icon' => 'fa-life-ring'], + 'network_interface' => ['label' => 'Network Interface', 'icon' => 'fa-ethernet'], + 'asset_status' => ['label' => 'Asset Status', 'icon' => 'fa-heartbeat'], + 'software_type' => ['label' => 'Software Type', 'icon' => 'fa-cube'], + 'rack_type' => ['label' => 'Rack Type', 'icon' => 'fa-server'], + 'contact_note_type' => ['label' => 'Contact Note Type', 'icon' => 'fa-address-book'], + 'asset_note_type' => ['label' => 'Asset Note Type', 'icon' => 'fa-desktop'], +]; + +// Label for the selected type, falling back for anything not in the map +$category_label = $category_types[$category]['label'] ?? ucwords(str_replace('_', ' ', $category)); + +// Row count per type for the nav badges, respecting the archived view +$category_type_counts = []; +$sql_category_type_counts = mysqli_query( + $mysqli, + "SELECT category_type, COUNT(category_id) AS category_type_count FROM categories + WHERE category_$archive_query + GROUP BY category_type" +); +while ($row = mysqli_fetch_assoc($sql_category_type_counts)) { + $category_type_counts[$row['category_type']] = intval($row['category_type_count']); +} + +// Archived nav item toggles the view while holding the selected type/search +$archive_toggle_query = $_GET; +unset($archive_toggle_query['page']); +$archive_toggle_query['category'] = $category; +if ($archived) { + unset($archive_toggle_query['archived']); +} else { + $archive_toggle_query['archived'] = 1; +} +$archive_toggle_url = '?' . http_build_query($archive_toggle_query); + ?>

    - Categories + Categories

    + class="fas fa-plus mr-2">New Category
    - - -
    -
    -
    - -
    - +
    + + +
    + +
    + + +
    + + + + + +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    +
    + + "> + + + + + + + + + + + + + + + + + +
    + + Name + + ColorAction
    + + +
    +
    +
    + +
    - +
    - -
    -
    - - "> - - - - - - - - - - - - - - - - - -
    - - Name - - ColorAction
    - - -
    -
    -
    - -
    -
    diff --git a/admin/tags.php b/admin/tags.php index 0ff61201f..33cfa9a66 100644 --- a/admin/tags.php +++ b/admin/tags.php @@ -12,19 +12,17 @@ if (isset($_GET['type'])) { $type_filter = 1; } -if ($type_filter == 1) { - $tag_type_display = "Client"; -} elseif ( $type_filter == 2) { - $tag_type_display = "Location"; -} elseif ( $type_filter == 3) { - $tag_type_display = "Contact"; -} elseif ( $type_filter == 4) { - $tag_type_display = "Credential"; - } elseif ( $type_filter == 5) { - $tag_type_display = "Asset"; -} else { - $tag_type_display = "Unknown"; -} +// Tag types shown in the left nav +$tag_types = [ + 1 => ['label' => 'Client', 'icon' => 'fa-users'], + 2 => ['label' => 'Location', 'icon' => 'fa-map-marker-alt'], + 3 => ['label' => 'Contact', 'icon' => 'fa-address-book'], + 4 => ['label' => 'Credential', 'icon' => 'fa-key'], + 5 => ['label' => 'Asset', 'icon' => 'fa-desktop'], +]; + +// Label for the selected type +$tag_type_display = $tag_types[$type_filter]['label'] ?? 'Unknown'; $sql = mysqli_query( $mysqli, @@ -36,6 +34,13 @@ $sql = mysqli_query( $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); +// Row count per type for the nav badges +$tag_type_counts = []; +$sql_tag_type_counts = mysqli_query($mysqli, "SELECT tag_type, COUNT(tag_id) AS tag_type_count FROM tags GROUP BY tag_type"); +while ($row = mysqli_fetch_assoc($sql_tag_type_counts)) { + $tag_type_counts[intval($row['tag_type'])] = intval($row['tag_type_count']); +} + ?>
    @@ -48,118 +53,111 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
    -
    + + +
    + +
    + + +
    -
    - -
    - + + + + +
    +
    +
    + +
    + +
    +
    +
    +
    -
    - -
    +
    +
    + + "> + + + + + + + -
    -
    + + Name + + Action
    - "> - - - - - - - - - - + - + + + - + ?> - -
    - - Name - - Action
    - - - - -
    + - Edit + - - - Delete - - - -
    + +
    + + +
    + +
    -
    From f16e7893ac6e7a6e69634885f4da053c16c79e94 Mon Sep 17 00:00:00 2001 From: wrongecho Date: Mon, 3 Aug 2026 18:01:40 +0100 Subject: [PATCH 227/241] Bump supported version --- SECURITY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SECURITY.md b/SECURITY.md index aea5b2479..3479ef2ed 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -13,7 +13,7 @@ We operate a rolling release model. Any bug fixes will be released into latest v | Version | Supported | |---------| ------------------ | -| 25.12 | :white_check_mark: | +| 26.08 | :white_check_mark: | ## Reporting a Vulnerability via GitHub Security Advisories From 7a44cdd438c8f23508d38ba64dd1ef1dbb6bfb7e Mon Sep 17 00:00:00 2001 From: johnnyq Date: Mon, 3 Aug 2026 13:28:41 -0400 Subject: [PATCH 228/241] Fix Autofill products in invoice, quotes, recurring invoice, tax field wasnt updating and a dash was being put in front --- agent/invoice.php | 35 ++++++++++++++++++++++++----------- agent/quote.php | 4 ++-- agent/recurring_invoice.php | 4 ++-- 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/agent/invoice.php b/agent/invoice.php index 6695faa41..296d1c816 100644 --- a/agent/invoice.php +++ b/agent/invoice.php @@ -163,7 +163,7 @@ if (isset($_GET['invoice_id'])) { //Product autocomplete $products_sql = mysqli_query($mysqli, " SELECT - CONCAT(product_code, ' - ', product_name) AS label, + IF(product_code IS NULL OR product_code = '', product_name, CONCAT(product_code, ' - ', product_name)) AS label, product_name, product_code, product_type AS type, @@ -178,6 +178,7 @@ if (isset($_GET['invoice_id'])) { LEFT JOIN taxes ON product_tax_id = tax_id WHERE product_archived_at IS NULL GROUP BY product_id + ORDER BY product_name ASC "); if (mysqli_num_rows($products_sql) > 0) { @@ -449,7 +450,7 @@ if (isset($_GET['invoice_id'])) {
    - + @@ -752,21 +753,32 @@ $(function() { var term = $.ui.autocomplete.escapeRegex(request.term.toLowerCase()); var matcher = new RegExp(term, "i"); var matches = $.grep(availableProducts, function(item) { - return matcher.test(item.label) || matcher.test(item.product_name) || matcher.test(item.product_code); + return matcher.test(item.label || "") || matcher.test(item.product_name || "") || matcher.test(item.product_code || ""); }); response(matches); }, select: function (event, ui) { - $("#name").val(ui.item.label); + $("#name").val(ui.item.product_name); $("#desc").val(ui.item.description); $("#qty").val(1); $("#price").val(ui.item.price); - $("#tax").val(ui.item.tax); + $("#tax").val(ui.item.tax).trigger('change'); $("#product_id").val(ui.item.prod_id); return false; } }); + // Typing over the name by hand breaks the link to the product + $("#name").on("input", function() { + $("#product_id").val(0); + }); + + // Product names and descriptions are user supplied - escape before + // building markup, the default renderer uses .text() for this reason + function esc(value) { + return $("
    ").text(value == null ? "" : value).html(); + } + // Keep it simple: default jQuery UI look, just richer content $("#name").autocomplete("instance")._renderItem = function(ul, item) { var typeText = item.type ? item.type.charAt(0).toUpperCase() + item.type.slice(1).toLowerCase() : ""; @@ -774,21 +786,22 @@ $(function() { var taxText = (item.tax_percent != null) ? (parseFloat(item.tax_percent) + "%") : "No tax"; var priceText = (item.price != null && item.price !== "") ? String(item.price) : ""; + var stockText = (item.available_stock ?? 0); var infoLeft = "
    " + "
    " + - "
    " + (item.label || "") + - (typeText ? " (" + typeText + ")" : "") + + "
    " + esc(item.label) + + (typeText ? " (" + esc(typeText) + ")" : "") + "
    " + - "
    " + (item.description || "") + "
    " + + "
    " + esc(item.description) + "
    " + "
    " + - "Tax: " + taxText + "" + - (showStock ? "Stock: " + (item.available_stock ?? 0) + "" : "") + + "Tax: " + esc(taxText) + "" + + (showStock ? "Stock: " + esc(stockText) + "" : "") + "
    " + "
    " + "
    " + - "
    " + priceText + "
    " + + "
    " + esc(priceText) + "
    " + "
    " + "
    "; diff --git a/agent/quote.php b/agent/quote.php index 9f35b9dbe..197775eac 100644 --- a/agent/quote.php +++ b/agent/quote.php @@ -584,7 +584,7 @@ require_once "../includes/footer.php"; + + + + + + + + + + + + + +
    + + + + +
    + + + + +
    + + + + +
    + +$account_name to $updated_count income record(s)"); + } else { + flashAlert("No income records were updated", 'error'); + } + + redirect(); + +} + +if (isset($_POST['bulk_edit_income_category'])) { + + validateCSRFToken(); + + enforceUserPermission('module_sales', 3); + enforceUserPermission('module_financial', 3); + + require_once 'income_model.php'; + + $category_id = intval($_POST['bulk_category_id']); + + // Get Category name for logging and Notification - and confirm it is a live Income category + $sql_category = mysqli_query($mysqli, "SELECT category_name FROM categories WHERE category_id = $category_id AND category_type = 'Income' AND category_archived_at IS NULL LIMIT 1"); + $row = mysqli_fetch_assoc($sql_category); + + if (!$row || !$income_count) { + flashAlert("Nothing to update", 'error'); + redirect(); + } + + $category_name = escapeSql($row['category_name']); + + $revenue_updated_count = 0; + $invoice_updated_count = 0; + $skipped_count = 0; + + // Revenues carry their own category + foreach ($revenue_ids as $revenue_id) { + + $sql = mysqli_query($mysqli, "SELECT revenue_description, revenue_client_id FROM revenues WHERE revenue_id = $revenue_id AND revenue_archived_at IS NULL"); + $row = mysqli_fetch_assoc($sql); + + if (!$row) { + $skipped_count++; + continue; + } + + $revenue_description = escapeSql($row['revenue_description']); + $client_id = intval($row['revenue_client_id']); + + if ($client_id) { + enforceClientAccess($client_id); + } + + mysqli_query($mysqli, "UPDATE revenues SET revenue_category_id = $category_id WHERE revenue_id = $revenue_id"); + + logAudit("Revenue", "Edit", "$session_name assigned revenue $revenue_description to category $category_name", $client_id, $revenue_id); + + $revenue_updated_count++; + + } + + // A payment has no category of its own - it inherits the one on the invoice it was paid + // against, so this writes to the INVOICE. Two selected payments against the same invoice + // therefore collapse into a single invoice update, and a payment with no invoice is skipped. + $invoice_ids = []; + + foreach ($payment_ids as $payment_id) { + + $sql = mysqli_query($mysqli, "SELECT payment_invoice_id FROM payments WHERE payment_id = $payment_id AND payment_archived_at IS NULL"); + $row = mysqli_fetch_assoc($sql); + $payment_invoice_id = intval($row['payment_invoice_id'] ?? 0); + + if ($payment_invoice_id) { + $invoice_ids[$payment_invoice_id] = $payment_invoice_id; + } else { + $skipped_count++; + } + + } + + foreach ($invoice_ids as $invoice_id) { + + $sql = mysqli_query($mysqli, "SELECT invoice_prefix, invoice_number, invoice_client_id FROM invoices WHERE invoice_id = $invoice_id"); + $row = mysqli_fetch_assoc($sql); + + if (!$row) { + $skipped_count++; + continue; + } + + $invoice_prefix = escapeSql($row['invoice_prefix']); + $invoice_number = intval($row['invoice_number']); + $client_id = intval($row['invoice_client_id']); + + enforceClientAccess($client_id); + + mysqli_query($mysqli, "UPDATE invoices SET invoice_category_id = $category_id WHERE invoice_id = $invoice_id"); + + logAudit("Invoice", "Edit", "$session_name assigned invoice $invoice_prefix$invoice_number to category $category_name", $client_id, $invoice_id); + + $invoice_updated_count++; + + } + + // Spell out the invoice leg - the user selected payments, not invoices + $updated_summary = []; + if ($revenue_updated_count) { + $updated_summary[] = "$revenue_updated_count revenue(s)"; + } + if ($invoice_updated_count) { + $updated_summary[] = "$invoice_updated_count invoice(s) behind the selected payment(s)"; + } + + if ($updated_summary) { + + logAudit("Income", "Bulk Edit", "$session_name assigned category $category_name to $revenue_updated_count revenue(s) and $invoice_updated_count invoice(s)"); + + $skipped_note = ''; + if ($skipped_count) { + $skipped_note = " - $skipped_count record(s) skipped"; + } + + flashAlert("You assigned category $category_name to " . implode(' and ', $updated_summary) . $skipped_note); + + } else { + flashAlert("No income records were categorised - a payment can only take a category from the invoice it was paid against", 'error'); + } + + redirect(); + +} + +if (isset($_POST['bulk_edit_income_method'])) { + + validateCSRFToken(); + + enforceUserPermission('module_sales', 3); + enforceUserPermission('module_financial', 3); + + require_once 'income_model.php'; + + // The method is stored by name on both tables, so validate it against the lookup list + $payment_method = escapeSql($_POST['bulk_payment_method']); + + $sql_payment_method = mysqli_query($mysqli, "SELECT payment_method_name FROM payment_methods WHERE payment_method_name = '$payment_method' LIMIT 1"); + $row = mysqli_fetch_assoc($sql_payment_method); + + if (!$row || !$income_count) { + flashAlert("Nothing to update", 'error'); + redirect(); + } + + $payment_method = escapeSql($row['payment_method_name']); + + $updated_count = 0; + + // Payments - client comes from the invoice the payment was made against + foreach ($payment_ids as $payment_id) { + + $sql = mysqli_query($mysqli, "SELECT payment_reference, invoice_client_id FROM payments LEFT JOIN invoices ON payment_invoice_id = invoice_id WHERE payment_id = $payment_id AND payment_archived_at IS NULL"); + $row = mysqli_fetch_assoc($sql); + + if (!$row) { + continue; + } + + $payment_reference = escapeSql($row['payment_reference']); + $client_id = intval($row['invoice_client_id']); + + if ($client_id) { + enforceClientAccess($client_id); + } + + mysqli_query($mysqli, "UPDATE payments SET payment_method = '$payment_method' WHERE payment_id = $payment_id"); + + logAudit("Payment", "Edit", "$session_name set payment $payment_reference to payment method $payment_method", $client_id, $payment_id); + + $updated_count++; + + } + + // Revenues + foreach ($revenue_ids as $revenue_id) { + + $sql = mysqli_query($mysqli, "SELECT revenue_description, revenue_client_id FROM revenues WHERE revenue_id = $revenue_id AND revenue_archived_at IS NULL"); + $row = mysqli_fetch_assoc($sql); + + if (!$row) { + continue; + } + + $revenue_description = escapeSql($row['revenue_description']); + $client_id = intval($row['revenue_client_id']); + + if ($client_id) { + enforceClientAccess($client_id); + } + + mysqli_query($mysqli, "UPDATE revenues SET revenue_payment_method = '$payment_method' WHERE revenue_id = $revenue_id"); + + logAudit("Revenue", "Edit", "$session_name set revenue $revenue_description to payment method $payment_method", $client_id, $revenue_id); + + $updated_count++; + + } + + if ($updated_count) { + logAudit("Income", "Bulk Edit", "$session_name set $updated_count income record(s) to payment method $payment_method"); + flashAlert("You set payment method $payment_method on $updated_count income record(s)"); + } else { + flashAlert("No income records were updated", 'error'); + } + + redirect(); + +} + if (isset($_POST['export_income'])) { validateCSRFToken(); diff --git a/agent/post/income_model.php b/agent/post/income_model.php new file mode 100644 index 000000000..2e094482e --- /dev/null +++ b/agent/post/income_model.php @@ -0,0 +1,36 @@ + Date: Mon, 3 Aug 2026 15:28:36 -0400 Subject: [PATCH 231/241] Fix Expense Description logging spelling --- agent/post/expense.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/agent/post/expense.php b/agent/post/expense.php index 5efa7fcdc..317be59d6 100644 --- a/agent/post/expense.php +++ b/agent/post/expense.php @@ -158,7 +158,7 @@ if (isset($_POST['bulk_edit_expense_category'])) { mysqli_query($mysqli,"UPDATE expenses SET expense_category_id = $category_id WHERE expense_id = $expense_id"); - logAudit("Expense", "Edit", "$session_name assigned expense $expense_descrition to category $category_name", $client_id, $expense_id); + logAudit("Expense", "Edit", "$session_name assigned expense $expense_description to category $category_name", $client_id, $expense_id); } // End Assign Loop @@ -203,7 +203,7 @@ if (isset($_POST['bulk_edit_expense_account'])) { mysqli_query($mysqli,"UPDATE expenses SET expense_account_id = $account_id WHERE expense_id = $expense_id"); - logAudit("Expense", "Edit", "$session_name assigned expense $expense_descrition to account $account_name", $client_id, $expense_id); + logAudit("Expense", "Edit", "$session_name assigned expense $expense_descritpion to account $account_name", $client_id, $expense_id); } // End Assign Loop @@ -243,7 +243,7 @@ if (isset($_POST['bulk_edit_expense_client'])) { mysqli_query($mysqli,"UPDATE expenses SET expense_client_id = $client_id WHERE expense_id = $expense_id"); - logAudit("Expense", "Edit", "$session_name assigned expense $expense_descrition to client $client_name", $client_id, $expense_id); + logAudit("Expense", "Edit", "$session_name assigned expense $expense_description to client $client_name", $client_id, $expense_id); } // End Assign Loop @@ -284,7 +284,7 @@ if (isset($_POST['bulk_delete_expenses'])) { mysqli_query($mysqli, "DELETE FROM expenses WHERE expense_id = $expense_id"); - logAudit("Expense", "Delete", "$session_name deleted expense $expense_descrition", $client_id); + logAudit("Expense", "Delete", "$session_name deleted expense $expense_description", $client_id); } From c5288f9e3087cb041c2edcf24c6285ee53d0612b Mon Sep 17 00:00:00 2001 From: johnnyq Date: Mon, 3 Aug 2026 15:34:18 -0400 Subject: [PATCH 232/241] Fix undefined variables in expense, asset and contact audit/flash messages --- agent/post/asset.php | 2 +- agent/post/contact.php | 2 +- agent/post/expense.php | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/agent/post/asset.php b/agent/post/asset.php index b82a07f4a..b9be4e687 100644 --- a/agent/post/asset.php +++ b/agent/post/asset.php @@ -953,7 +953,7 @@ if (isset($_POST['link_asset_to_credential'])) { logAudit("Credential", "Link", "$session_name linked credential $credential_name to asset $asset_name", $client_id, $credential_id); - flashAlert("Asset $asset_name linked with credential $crdential_name"); + flashAlert("Asset $asset_name linked with credential $credential_name"); redirect(); diff --git a/agent/post/contact.php b/agent/post/contact.php index adb4cc49e..2a8ff379c 100644 --- a/agent/post/contact.php +++ b/agent/post/contact.php @@ -374,7 +374,7 @@ if (isset($_POST['bulk_assign_contact_location'])) { mysqli_query($mysqli,"UPDATE contacts SET contact_location_id = $location_id WHERE contact_id = $contact_id"); - logAudit("Contact", "Edit", "$session_name assigned $contaxt_name to location $location_name", $client_id, $contact_id); + logAudit("Contact", "Edit", "$session_name assigned $contact_name to location $location_name", $client_id, $contact_id); } // End Assign Location Loop diff --git a/agent/post/expense.php b/agent/post/expense.php index 317be59d6..213a1b737 100644 --- a/agent/post/expense.php +++ b/agent/post/expense.php @@ -203,7 +203,7 @@ if (isset($_POST['bulk_edit_expense_account'])) { mysqli_query($mysqli,"UPDATE expenses SET expense_account_id = $account_id WHERE expense_id = $expense_id"); - logAudit("Expense", "Edit", "$session_name assigned expense $expense_descritpion to account $account_name", $client_id, $expense_id); + logAudit("Expense", "Edit", "$session_name assigned expense $expense_description to account $account_name", $client_id, $expense_id); } // End Assign Loop @@ -247,7 +247,7 @@ if (isset($_POST['bulk_edit_expense_client'])) { } // End Assign Loop - flashAlert("You assigned Client $client_name to $expense_count expenses"); + flashAlert("You assigned client $client_name to $count expense(s)"); } redirect(); From 0311a3d056dec6dbc1f8afab37d5d73d03efb0e2 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Mon, 3 Aug 2026 15:40:44 -0400 Subject: [PATCH 233/241] Fix remaing undefine vars for audits and flash messages --- admin/post/settings_theme.php | 2 +- admin/post/ticket_status.php | 2 +- agent/post/network.php | 2 +- agent/post/rack.php | 6 +++--- agent/post/ticket.php | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/admin/post/settings_theme.php b/admin/post/settings_theme.php index a67388f37..732ede75d 100644 --- a/admin/post/settings_theme.php +++ b/admin/post/settings_theme.php @@ -10,7 +10,7 @@ if (isset($_POST['edit_theme_settings'])) { mysqli_query($mysqli,"UPDATE settings SET config_theme = '$theme' WHERE company_id = 1"); - logAudit("Settings", "Edit", "$session_name edited theme settings $dark_mode"); + logAudit("Settings", "Edit", "$session_name edited theme settings to $theme"); flashAlert("Changed theme to $theme"); diff --git a/admin/post/ticket_status.php b/admin/post/ticket_status.php index faf7e454c..b653e0897 100644 --- a/admin/post/ticket_status.php +++ b/admin/post/ticket_status.php @@ -61,7 +61,7 @@ if (isset($_GET['delete_ticket_status'])) { exit("Can't delete built-in statuses"); } - $ticlet_status_name = escapeSql(getFieldById('ticket_statuses', $ticket_status_id, 'ticket_status_name')); + $ticket_status_name = escapeSql(getFieldById('ticket_statuses', $ticket_status_id, 'ticket_status_name')); mysqli_query($mysqli, "DELETE FROM ticket_statuses WHERE ticket_status_id = $ticket_status_id"); diff --git a/agent/post/network.php b/agent/post/network.php index 5fcf959f4..f546b8b29 100644 --- a/agent/post/network.php +++ b/agent/post/network.php @@ -98,7 +98,7 @@ if (isset($_GET['restore_network'])) { mysqli_query($mysqli,"UPDATE networks SET network_archived_at = NULL WHERE network_id = $network_id"); - logAudit("Network", "Restore", "$session_name restored contact $contact_name", $client_id, $network_id); + logAudit("Network", "Restore", "$session_name restored network $network_name", $client_id, $network_id); flashAlert("Network $network_name restored"); diff --git a/agent/post/rack.php b/agent/post/rack.php index c3f71c2ae..afd5f871a 100644 --- a/agent/post/rack.php +++ b/agent/post/rack.php @@ -272,7 +272,7 @@ if (isset($_GET['remove_rack_unit'])) { $unit_id = intval($_GET['remove_rack_unit']); // Get Name and Client ID for logging and alert message - $sql = mysqli_query($mysqli,"SELECT rack_name, rack_id, rack_client_id FROM racks LEFT JOIN rack_units ON unit_rack_id = rack_id WHERE unit_id = $unit_id"); + $sql = mysqli_query($mysqli,"SELECT rack_name, rack_id, rack_client_id, unit_device FROM racks LEFT JOIN rack_units ON unit_rack_id = rack_id WHERE unit_id = $unit_id"); $row = mysqli_fetch_assoc($sql); $rack_name = escapeSql($row['rack_name']); $unit_device = escapeSql($row['unit_device']); @@ -283,9 +283,9 @@ if (isset($_GET['remove_rack_unit'])) { mysqli_query($mysqli,"DELETE FROM rack_units WHERE unit_id = $unit_id"); - logAudit("Rack", "Edit", "$session_name removed device $device_name from rack $rack_name", $client_id, $rack_id); + logAudit("Rack", "Edit", "$session_name removed device $unit_device from rack $rack_name", $client_id, $rack_id); - flashAlert("Device $device_name removed from rack", 'error'); + flashAlert("Device $unit_device removed from rack", 'error'); redirect(); diff --git a/agent/post/ticket.php b/agent/post/ticket.php index d5a7840b4..b59372ea3 100644 --- a/agent/post/ticket.php +++ b/agent/post/ticket.php @@ -1246,7 +1246,7 @@ if (isset($_POST['bulk_edit_ticket_category'])) { // Update ticket mysqli_query($mysqli, "UPDATE tickets SET ticket_category = '$category_id' WHERE ticket_id = $ticket_id"); - logAudit("Ticket", "Edit", "$session_name updated the category on ticket $ticket_prefix$ticket_number - $ticket_subject from $previous_category_name to $category_name", $client_id, $ticket_id); + logAudit("Ticket", "Edit", "$session_name updated the category on ticket $ticket_prefix$ticket_number - $ticket_subject from $previous_ticket_category_name to $category_name", $client_id, $ticket_id); triggerCustomAction('ticket_update', $ticket_id); } // End For Each Ticket ID Loop From d74c9743be3c64493893c668068427cfc7c00f39 Mon Sep 17 00:00:00 2001 From: wrongecho Date: Mon, 3 Aug 2026 20:53:53 +0100 Subject: [PATCH 234/241] Feature: Add invoice_items API endpoint (adding line items to an invoice) --- api/v1/invoice_items/create.php | 204 ++++++++++++++++++++++++++++++++ 1 file changed, 204 insertions(+) create mode 100644 api/v1/invoice_items/create.php diff --git a/api/v1/invoice_items/create.php b/api/v1/invoice_items/create.php new file mode 100644 index 000000000..f8158fa36 --- /dev/null +++ b/api/v1/invoice_items/create.php @@ -0,0 +1,204 @@ + 0 +) { + + // Load invoice, scoped to API key permissions + $invoice_sql = mysqli_query( + $mysqli, + "SELECT * + FROM invoices + WHERE invoice_id = $invoice_id + AND invoice_status != 'Paid' + AND 1=1 " . apiClientScopeSql('invoice_client_id') . " + LIMIT 1" + ); + + $invoice_row = $invoice_sql ? mysqli_fetch_assoc($invoice_sql) : null; + + // Ensure supplied client matches invoice client + if ($invoice_row && $client_id != 0 && intval($invoice_row['invoice_client_id']) !== $client_id) { + $invoice_row = null; + } + + if ($invoice_row) { + + $client_id = intval($invoice_row['invoice_client_id']); + $invoice_prefix = escapeSql($invoice_row['invoice_prefix']); + $invoice_number = intval($invoice_row['invoice_number']); + $invoice_discount = floatval($invoice_row['invoice_discount_amount']); + + $subtotal = $price * $qty; + + // Product inventory + if ($product_id) { + + $product_type = escapeSql(getFieldById('products', $product_id, 'product_type')); + + if ($product_type === 'product') { + + $stock_sql = mysqli_query( + $mysqli, + "SELECT COALESCE(SUM(stock_qty),0) AS available_stock + FROM product_stock + WHERE stock_product_id = $product_id" + ); + + $stock_row = mysqli_fetch_assoc($stock_sql); + $available_stock = floatval($stock_row['available_stock']); + + if ($available_stock >= $qty) { + + mysqli_query( + $mysqli, + "INSERT INTO product_stock + SET stock_qty = -$qty, + stock_note = 'QTY $qty - Invoice $invoice_id', + stock_product_id = $product_id" + ); + + } else { + + logAudit( + "API", + "Failure", + "Failed adding item $name to invoice $invoice_prefix$invoice_number via API ($api_key_name) due to insufficient stock", + $client_id + ); + + require_once '../create_output.php'; + exit; + + } + + } + + } + + // Tax + if ($tax_id > 0) { + + $tax_sql = mysqli_query($mysqli, "SELECT tax_percent FROM taxes WHERE tax_id = $tax_id"); + $tax_row = mysqli_fetch_assoc($tax_sql); + + $tax_percent = floatval($tax_row['tax_percent']); + $tax_amount = $subtotal * $tax_percent / 100; + + } else { + + $tax_amount = 0; + + } + + $total = $subtotal + $tax_amount; + + $insert_sql = mysqli_query( + $mysqli, + "INSERT INTO invoice_items SET + item_name = '$name', + item_description = '$description', + item_quantity = $qty, + item_price = $price, + item_subtotal = $subtotal, + item_tax = $tax_amount, + item_total = $total, + item_order = $item_order, + item_tax_id = $tax_id, + item_product_id = $product_id, + item_invoice_id = $invoice_id" + ); + + if ($insert_sql) { + + $insert_id = mysqli_insert_id($mysqli); + + // Recalculate invoice total + $items_sql = mysqli_query( + $mysqli, + "SELECT SUM(item_total) AS invoice_total + FROM invoice_items + WHERE item_invoice_id = $invoice_id" + ); + + $items_row = mysqli_fetch_assoc($items_sql); + $invoice_total = floatval($items_row['invoice_total']); + + $new_invoice_amount = $invoice_total - $invoice_discount; + + mysqli_query( + $mysqli, + "UPDATE invoices + SET invoice_amount = $new_invoice_amount + WHERE invoice_id = $invoice_id + LIMIT 1" + ); + + logAudit( + "Invoice", + "Edit", + "Added item $name to invoice $invoice_prefix$invoice_number via API ($api_key_name)", + $client_id, + $invoice_id + ); + + logAudit( + "API", + "Success", + "Added item $name to invoice $invoice_prefix$invoice_number via API ($api_key_name)", + $client_id + ); + + } + + } + +} + +// Output +require_once '../create_output.php'; \ No newline at end of file From c30c12674a5e9f584a7ed8cd84a502609c3e57af Mon Sep 17 00:00:00 2001 From: johnnyq Date: Mon, 3 Aug 2026 22:41:31 -0400 Subject: [PATCH 235/241] Sync DB Seed data between setup and setup cli --- admin/includes/side_nav.php | 6 + admin/post/starter_content.php | 47 + admin/post/starter_content_model.php | 1227 ++++++++++++++++++++++++++ admin/starter_content.php | 109 +++ scripts/setup_cli.php | 110 +-- setup/index.php | 143 +-- setup/seed_data.php | 164 ++++ 7 files changed, 1561 insertions(+), 245 deletions(-) create mode 100644 admin/post/starter_content.php create mode 100644 admin/post/starter_content_model.php create mode 100644 admin/starter_content.php create mode 100644 setup/seed_data.php diff --git a/admin/includes/side_nav.php b/admin/includes/side_nav.php index fe3156ad7..fe2ba5465 100644 --- a/admin/includes/side_nav.php +++ b/admin/includes/side_nav.php @@ -203,6 +203,12 @@

    Update

    +
  • "+r+"
  • ");const s=Ed(e);return e.schema.isValidChild(t.nodeName.toLowerCase(),s.toLowerCase())?(n=r,n=e.dom.createHTML(s,xd(e),n)):n||(n=r),FS(e,n,o.no_selection),{content:n,html:n}}{"raw"!==o.format&&(n=jh({validate:!1},e.schema).serialize(e.parser.parse(n,{isRootContent:!0,insert:!0})));const r=Vi(un.fromDom(t))?n:dn.trim(n);return FS(e,r,o.no_selection),{content:r,html:r}}})(e,o,t,n)).getOr({content:t,html:aS(n.content)?"":n.content}))(e,t,n),insertContent:(t,n)=>IS(e,t,n),addVisual:t=>((e,t)=>{const n=e.dom,o=C(t)?t:e.getBody();q(n.select("table,a",o),t=>{switch(t.nodeName){case"TABLE":const o=Nm(e),r=n.getAttrib(t,"border");r&&"0"!==r||!e.hasVisual?n.removeClass(t,o):n.addClass(t,o);break;case"A":if(!n.getAttrib(t,"href")){const o=n.getAttrib(t,"name")||t.id,r=Am(e);o&&e.hasVisual?n.addClass(t,r):n.removeClass(t,r)}}}),e.dispatch("VisualAid",{element:t,hasVisual:e.hasVisual})})(e,t)},selection:{getContent:(t,n)=>((e,t,n={})=>{const o=((e,t)=>({...e,format:t,get:!0,selection:!0,getInner:!0}))(n,t);return cS(e,o).fold(A,t=>{const n=((e,t)=>{if("text"===t.format)return(e=>I.from(e.selection.getRng()).map(t=>{const n=I.from(e.dom.getParent(t.commonAncestorContainer,e.dom.isBlock)),o=e.getBody(),r=(e=>e.map(e=>e.nodeName).getOr("div").toLowerCase())(n),s=un.fromDom(t.cloneContents());Mh(s),Ih(s);const a=e.dom.add(o,r,{"data-mce-bogus":"all",style:"overflow: hidden; opacity: 0;"},s.dom),i=dE(a),l=Gi(a.textContent??"");if(e.dom.remove(a),cE(l,0)||cE(l,l.length-1)){const e=n.getOr(o),t=dE(e),r=t.indexOf(i);return-1===r?i:(cE(t,r-1)?" ":"")+i+(cE(t,r+i.length)?" ":"")}return i}).getOr(""))(e);{const n=((e,t)=>{const n=e.selection.getRng(),o=e.dom.create("body"),r=e.selection.getSel(),s=bh(e,Gf(r)),a=t.contextual?lE(un.fromDom(e.getBody()),s,e.schema).dom:n.cloneContents();return a&&o.appendChild(a),e.selection.serializer.serialize(o,t)})(e,t);return"tree"===t.format?n:e.selection.isCollapsed()?"":n}})(e,t);return dS(e,n,t)})})(e,t,n)},autocompleter:{addDecoration:x,removeDecoration:x},raw:{getModel:()=>I.none()}}),EE=e=>_e(e.plugins,"rtc"),xE=e=>e.rtcInstance?e.rtcInstance:SE(e),_E=e=>{const t=e.rtcInstance;if(t)return t;throw new Error("Failed to get RTC instance not yet initialized.")},kE=e=>_E(e).init.bindEvents(),NE=(e,t,n)=>{if(_e(e,t)){const o=Y(e[t],e=>e!==n);0===o.length?delete e[t]:e[t]=o}};const AE=e=>!(!e||!e.ownerDocument)&&Cn(un.fromDom(e.ownerDocument),un.fromDom(e)),RE=(e,t,n,o)=>{let r,s;const{selectorChangedWithUnbind:a}=((e,t)=>{let n,o;const r=(t,n)=>Z(n,n=>e.is(n,t)),s=t=>e.getParents(t,void 0,e.getRoot());return{selectorChangedWithUnbind:(e,a)=>(n||(n={},o={},t.on("NodeChange",e=>{const t=e.element,a=s(t),i={};he(n,(e,t)=>{r(t,a).each(n=>{o[t]||(q(e,e=>{e(!0,{node:n,selector:t,parents:a})}),o[t]=e),i[t]=e})}),he(o,(e,n)=>{i[n]||(delete o[n],q(e,e=>{e(!1,{node:t,selector:n,parents:a})}))})})),n[e]||(n[e]=[]),n[e].push(a),r(e,s(t.selection.getStart())).each(()=>{o[e]=n[e]}),{unbind:()=>{NE(n,e,a),NE(o,e,a)}})}})(e,o),i=e=>{const t=c();t.collapse(!!e),d(t)},l=()=>t.getSelection?t.getSelection():t.document.selection,c=()=>{let n;const a=(e,t,n)=>{try{return t.compareBoundaryPoints(e,n)}catch{return-1}},i=t.document;if(C(o.bookmark)&&!kp(o)){const e=gp(o);if(e.isSome())return e.map(e=>bh(o,[e])[0]).getOr(i.createRange())}try{const e=l();e&&!Jr(e.anchorNode)&&(n=e.rangeCount>0?e.getRangeAt(0):i.createRange(),n=bh(o,[n])[0])}catch{}if(n||(n=i.createRange()),fs(n.startContainer)&&n.collapsed){const t=e.getRoot();n.setStart(t,0),n.setEnd(t,0)}return r&&s&&(0===a(n.START_TO_START,n,r)&&0===a(n.END_TO_END,n,r)?n=s:(r=null,s=null)),n},d=(e,t)=>{if(!(e=>!!e&&AE(e.startContainer)&&AE(e.endContainer))(e))return;const n=l();if(e=o.dispatch("SetSelectionRange",{range:e,forward:t}).range,n){s=e;try{n.removeAllRanges(),n.addRange(e)}catch{}!1===t&&n.extend&&(n.collapse(e.endContainer,e.endOffset),n.extend(e.startContainer,e.startOffset)),r=n.rangeCount>0?n.getRangeAt(0):null}if(!e.collapsed&&e.startContainer===e.endContainer&&n?.setBaseAndExtent&&e.endOffset-e.startOffset<2&&e.startContainer.hasChildNodes()){const t=e.startContainer.childNodes[e.startOffset];t&&"IMG"===t.nodeName&&(n.setBaseAndExtent(e.startContainer,e.startOffset,e.endContainer,e.endOffset),n.anchorNode===e.startContainer&&n.focusNode===e.endContainer||n.setBaseAndExtent(t,0,t,1))}o.dispatch("AfterSetSelectionRange",{range:e,forward:t})},m=()=>{const t=l(),n=t?.anchorNode,o=t?.focusNode;if(!t||!n||!o||Jr(n)||Jr(o))return!0;const r=e.createRng(),s=e.createRng();try{r.setStart(n,t.anchorOffset),r.collapse(!0),s.setStart(o,t.focusOffset),s.collapse(!0)}catch{return!0}return r.compareBoundaryPoints(r.START_TO_START,s)<=0},u={dom:e,win:t,serializer:n,editor:o,expand:(t={type:"word"})=>d(Kp(e).expand(c(),t)),collapse:i,setCursorLocation:(t,n)=>{const r=e.createRng();C(t)&&C(n)?(r.setStart(t,n),r.setEnd(t,n),d(r),i(!1)):(ng(e,r,o.getBody(),!0),d(r))},getContent:e=>((e,t={})=>((e,t,n)=>_E(e).selection.getContent(t,n))(e,t.format?t.format:"html",t))(o,e),setContent:(e,t)=>((e,t,n={})=>{_S("selectionSetContent"),AS(e,t,n)})(o,e,t),getBookmark:(e,t)=>f.getBookmark(e,t),moveToBookmark:e=>f.moveToBookmark(e),select:(t,n)=>(((e,t,n)=>I.from(t).bind(t=>I.from(t.parentNode).map(o=>{const r=e.nodeIndex(t),s=e.createRng();return s.setStart(o,r),s.setEnd(o,r+1),n&&(ng(e,s,t,!0),ng(e,s,t,!1)),s})))(e,t,n).each(d),t),isCollapsed:()=>{const e=c(),t=l();return!(!e||e.item)&&(e.compareEndPoints?0===e.compareEndPoints("StartToEnd",e):!t||e.collapsed)},isEditable:()=>{if(o.mode.isReadOnly())return!1;const t=c(),n=o.getBody().querySelectorAll('[data-mce-selected="1"]');return n.length>0?oe(n,t=>e.isEditable(t.parentElement)):uh(e,t)},isForward:m,setNode:t=>(AS(o,e.getOuterHTML(t)),t),getNode:()=>((e,t)=>{if(!t)return e;let n=t.startContainer,o=t.endContainer;const r=t.startOffset,s=t.endOffset;let a=t.commonAncestorContainer;t.collapsed||(n===o&&s-r<2&&n.hasChildNodes()&&(a=n.childNodes[r]),cs(n)&&cs(o)&&(n=n.length===r?hh(n.nextSibling,!0):n.parentNode,o=0===s?hh(o.previousSibling,!1):o.parentNode,n&&n===o&&(a=n)));const i=cs(a)?a.parentNode:a;return ts(i)?i:e})(o.getBody(),c()),getSel:l,setRng:d,getRng:c,getStart:e=>gh(o.getBody(),c(),e),getEnd:e=>ph(o.getBody(),c(),e),getSelectedBlocks:(t,n)=>((e,t,n,o)=>{const r=[],s=e.getRoot(),a=e.getParent(n||gh(s,t,t.collapsed),e.isBlock),i=e.getParent(o||ph(s,t,t.collapsed),e.isBlock);if(a&&a!==s&&r.push(a),a&&i&&a!==i){let t;const n=new Kr(a,s);for(;(t=n.next())&&t!==i;)e.isBlock(t)&&r.push(t)}return i&&a!==i&&i!==s&&r.push(i),r})(e,c(),t,n),normalize:()=>{const t=c(),n=l();if(!(Gf(n).length>1)&&og(o)){const n=Vp(e,t);return n.each(e=>{d(e,m())}),n.getOr(t)}return t},selectorChanged:(e,t)=>(a(e,t),u),selectorChangedWithUnbind:a,getScrollContainer:()=>{let t,n=e.getRoot();for(;n&&"BODY"!==n.nodeName;){if(n.scrollHeight>n.clientHeight){t=n;break}n=n.parentNode}return t},scrollIntoView:(e,t)=>{C(e)?((e,t,n)=>{(e.inline?lh:dh)(e,t,n)})(o,e,t):mh(o,c(),t)},placeCaretAt:(e,t)=>d(Mp(e,t,o.getDoc())),getBoundingClientRect:()=>{const e=c();return e.collapsed?Kl.fromRangeStart(e).getClientRects()[0]:e.getBoundingClientRect()},destroy:()=>{t=r=s=null,g.destroy()}},f=sp(u),g=Lp(u,o);return u.bookmarkManager=f,u.controlSelection=g,u},DE=(e,t,n)=>{-1===dn.inArray(t,n)&&(e.addAttributeFilter(n,(e,t)=>{let n=e.length;for(;n--;)e[n].attr(t,null)}),t.push(n))},TE=(e,t)=>{const n=["data-mce-selected"],o={entity_encoding:"named",remove_trailing_brs:!0,pad_empty_with_br:!1,...e},r=t&&t.dom?t.dom:gi.DOM,s=t&&t.schema?t.schema:Ua(o),a=sS(o,s);return((e,t,n)=>{e.addAttributeFilter("data-mce-tabindex",(e,t)=>{let n=e.length;for(;n--;){const o=e[n];o.attr("tabindex",o.attr("data-mce-tabindex")),o.attr(t,null)}}),e.addAttributeFilter("src,href,style",(e,o)=>{const r="data-mce-"+o,s=t.url_converter,a=t.url_converter_scope;let i=e.length;for(;i--;){const t=e[i];let l=t.attr(r);void 0!==l?(t.attr(o,l.length>0?l:null),t.attr(r,null)):(l=t.attr(o),"style"===o?l=n.serializeStyle(n.parseStyle(l),t.name):s&&(l=s.call(a,l,o,t.name)),t.attr(o,l.length>0?l:null))}}),e.addAttributeFilter("class",e=>{let t=e.length;for(;t--;){const n=e[t];let o=n.attr("class");o&&(o=o.replace(/(?:^|\s)mce-item-\w+(?!\S)/g,""),n.attr("class",o.length>0?o:null))}}),e.addAttributeFilter("data-mce-type",(e,t,n)=>{let o=e.length;for(;o--;){const t=e[o];if("bookmark"===t.attr("data-mce-type")&&!n.cleanup){const e=I.from(t.firstChild).exists(e=>!Yi(e.value??""));e?t.unwrap():t.remove()}}}),e.addNodeFilter("script,style",(e,n)=>{const o=e=>e.replace(/()/g,"\n").replace(/^[\r\n]*|[\r\n]*$/g,"").replace(/^\s*(()?|\s*\/\/\s*\]\]>(-->)?|\/\/\s*(-->)?|\]\]>|\/\*\s*-->\s*\*\/|\s*-->\s*)\s*$/g,"");let r=e.length;for(;r--;){const s=e[r],a=s.firstChild,i=a?.value??"";if("script"===n){const e=s.attr("type");e&&s.attr("type","mce-no/type"===e?null:e.replace(/^mce\-/,"")),"xhtml"===t.element_format&&a&&i.length>0&&(a.value="// ")}else"xhtml"===t.element_format&&a&&i.length>0&&(a.value="\x3c!--\n"+o(i)+"\n--\x3e")}}),e.addNodeFilter("#comment",e=>{let o=e.length;for(;o--;){const r=e[o],s=r.value;t.preserve_cdata&&0===s?.indexOf("[CDATA[")&&(r.name="#cdata",r.type=4,r.value=n.decode(s.replace(/^\[CDATA\[|\]\]$/g,"")))}}),e.addNodeFilter("xml:namespace,input",(e,t)=>{let n=e.length;for(;n--;){const o=e[n];7===o.type?o.remove():1===o.type&&("input"!==t||o.attr("type")||o.attr("type","text"))}}),e.addAttributeFilter("data-mce-type",t=>{q(t,t=>{"format-caret"===t.attr("data-mce-type")&&(t.isEmpty(e.schema.getNonEmptyElements())?t.remove():t.unwrap())})}),e.addAttributeFilter("data-mce-src,data-mce-href,data-mce-style,data-mce-selected,data-mce-expando,data-mce-block,data-mce-type,data-mce-resize,data-mce-placeholder",(e,t)=>{let n=e.length;for(;n--;)e[n].attr(t,null)}),t.remove_trailing_brs&&((e,t,n)=>{t.addNodeFilter("br",(t,o,r)=>{const s=dn.extend({},n.getBlockElements()),a=n.getNonEmptyElements(),i=n.getWhitespaceElements();s.body=1;const l=e=>e.name in s||ea(n,e);for(let o=0,c=t.length;o{const{indent:i,entity_encoding:l,...c}=n,d={format:"html",...c},m=((e,t,n)=>((e,t)=>C(e)&&e.hasEventListeners("PreProcess")&&!t.no_events)(e,n)?((e,t,n)=>{let o;const r=e.dom;let s=t.cloneNode(!0);const a=document.implementation;if(a.createHTMLDocument){const e=a.createHTMLDocument("");dn.each("BODY"===s.nodeName?s.childNodes:[s],t=>{e.body.appendChild(e.importNode(t,!0))}),s="BODY"!==s.nodeName?e.body.firstChild:e.body,o=r.doc,r.doc=e}return((e,t)=>{e.dispatch("PreProcess",t)})(e,{...n,node:s}),o&&(r.doc=o),s})(e,t,n):t)(t,e,d),u=((e,t,n)=>{const o=Gi(n.getInner?t.innerHTML:e.getOuterHTML(t));return n.selection||Vi(un.fromDom(t))?o:dn.trim(o)})(r,m,d),f=((e,t,n)=>{const o=n.selection?{forced_root_block:!1,...n}:n,r=e.parse(t,o);return(e=>{const t=e=>"br"===e?.name,n=e.lastChild;if(t(n)){const e=n.prev;t(e)&&(n.remove(),e.remove())}})(r),r})(a,u,d);if("tree"===d.format)return f;const g={...o,...C(i)?{indent:i}:{},...C(l)?{entity_encoding:l}:{}};return((e,t,n,o,r)=>{const s=((e,t,n)=>jh(e,t).serialize(n))(t,n,o);return((e,t,n)=>{if(!t.no_events&&e){const o=((e,t)=>e.dispatch("PostProcess",t))(e,{...t,content:n});return o.content}return n})(e,r,s)})(t,g,s,f,d)},addRules:s.addValidElements,setRules:s.setValidElements,addTempAttr:D(DE,a,n),getTempAttrs:N(n),getNodeFilters:a.getNodeFilters,getAttributeFilters:a.getAttributeFilters,removeNodeFilter:a.removeNodeFilter,removeAttributeFilter:a.removeAttributeFilter}},OE=(e,t)=>{const n=TE(e,t);return{schema:n.schema,addNodeFilter:n.addNodeFilter,addAttributeFilter:n.addAttributeFilter,serialize:n.serialize,addRules:n.addRules,setRules:n.setRules,addTempAttr:n.addTempAttr,getTempAttrs:n.getTempAttrs,getNodeFilters:n.getNodeFilters,getAttributeFilters:n.getAttributeFilters,removeNodeFilter:n.removeNodeFilter,removeAttributeFilter:n.removeAttributeFilter}},BE=(e,t,n={})=>{const o=((e,t)=>({format:"html",...e,set:!0,content:t}))(n,t);mS(e,o).each(t=>{const n=((e,t,n)=>xE(e).editor.setContent(t,n))(e,t.content,t);uS(e,n.html,t)})},PE=gi.DOM,LE=e=>I.from(e).each(e=>e.destroy()),ME=(()=>{const e={};return{add:(t,n)=>{e[t]=n},get:t=>e[t]?e[t]:{icons:{}},has:t=>_e(e,t)}})(),IE=wi.ModelManager,FE=(e,t)=>t.dom[e],UE=(e,t)=>parseInt($o(t,e),10),zE=D(FE,"clientWidth"),jE=D(FE,"clientHeight"),$E=D(UE,"margin-top"),HE=D(UE,"margin-left"),VE=e=>{const t=[],n=()=>{const t=e.theme;return t&&t.getNotificationManagerImpl?t.getNotificationManagerImpl():(()=>{const e=()=>{throw new Error("Theme did not provide a NotificationManager implementation.")};return{open:e,close:e,getArgs:e}})()},o=()=>I.from(t[0]),r=()=>{o().each(e=>{e.reposition()})},s=e=>{J(t,t=>t===e).each(e=>{t.splice(e,1)})},a=(o,a=!0)=>e.removed||!(e=>{return(t=e.inline?e.getBody():e.getContentAreaContainer(),I.from(t).map(un.fromDom)).map(Fo).getOr(!1);var t})(e)?{}:(a&&e.dispatch("BeforeOpenNotification",{notification:o}),Z(t,e=>{return t=n().getArgs(e),r=o,!(t.type!==r.type||t.text!==r.text||t.progressBar||t.timeout||r.progressBar||r.timeout);var t,r}).getOrThunk(()=>{e.editorManager.setActive(e);const a=n().open(o,()=>{s(a)},()=>Np(e));return(e=>{t.push(e)})(a),r(),e.dispatch("OpenNotification",{notification:{...a}}),a})),i=N(t);return(e=>{e.on("SkinLoaded",()=>{const t=nm(e);t&&a({text:t,type:"warning",timeout:0},!1),r()}),e.on("show ResizeEditor ResizeWindow NodeChange ToggleView FullscreenStateChanged",()=>{requestAnimationFrame(r)}),e.on("remove",()=>{q(t.slice(),e=>{n().close(e)})}),e.on("keydown",e=>{const t="f12"===e.key?.toLowerCase()||123===e.keyCode;e.altKey&&t&&(e.preventDefault(),o().map(e=>un.fromDom(e.getEl())).each(e=>io(e)))})})(e),{open:a,close:()=>{o().each(e=>{n().close(e),s(e),r()})},getNotifications:i}},qE=wi.PluginManager,WE=wi.ThemeManager,KE=e=>{let t=[];const n=()=>{const t=e.theme;return t&&t.getWindowManagerImpl?t.getWindowManagerImpl():(()=>{const e=()=>{throw new Error("Theme did not provide a WindowManager implementation.")};return{open:e,openUrl:e,alert:e,confirm:e,close:e}})()},o=(e,t)=>(...n)=>t?t.apply(e,n):void 0,r=n=>{(t=>{e.dispatch("CloseWindow",{dialog:t})})(n);const o=ue(t,({instanceApi:e,triggerElement:t})=>e===n?t:I.none());t=Y(t,({instanceApi:e})=>e!==n),0===t.length?e.focus():o.filter(Fo).each(io)},s=n=>{e.editorManager.setActive(e),fp(e);const o=co();e.ui.show();const r=n();return((n,o)=>{t.push({instanceApi:n,triggerElement:o}),(t=>{e.dispatch("OpenWindow",{dialog:t})})(n)})(r,o),r},a=e=>{0!==t.length&&e.each(e=>io(e))};return e.on("remove",()=>{q(t,({instanceApi:e})=>{n().close(e)})}),{open:(e,t)=>s(()=>n().open(e,t,r)),openUrl:e=>s(()=>n().openUrl(e,r)),alert:(e,t,r)=>{const s=co(),i=n();i.alert(e,o(r||i,()=>{a(s),t?.()}))},confirm:(e,t,r)=>{const s=co(),i=n();i.confirm(e,o(r||i,e=>{a(s),t?.(e)}))},close:()=>{I.from(t[t.length-1]).each(({instanceApi:e})=>{n().close(e),r(e)})}}},YE=(e,t)=>{e.notificationManager.open({type:"error",text:t})},GE=(e,t)=>{e._skinLoaded?YE(e,t):e.on("SkinLoaded",()=>{YE(e,t)})},XE=(e,t,n)=>{nd(e,t,{message:n}),console.error(n)},QE=(e,t,n)=>n?`Failed to load ${e}: ${n} from url ${t}`:`Failed to load ${e} url: ${t}`,ZE=(e,...t)=>{const n=window.console;n&&(n.error?n.error(e,...t):n.log(e,...t))},JE=new WeakMap,ex=(e,t)=>{const{type:n,message:o}=t;e.notificationManager.open({type:n,text:o})},tx=e=>{const t=(e=>{switch(e){case"error":return console.error;case"info":return console.info;case"warn":return console.warn;default:return console.log}})(e.type);t(e.message)},nx=(e,t)=>{const{console:n,editor:o}=t;C(o)&&(e._skinLoaded?ex(e,o):e.on("SkinLoaded",()=>{ex(e,o)})),C(n)&&tx(n)},ox="Read more: https://www.tiny.cloud/docs/tinymce/latest/license-key/",rx="Make sure to provide a valid license key or add license_key: 'gpl' to the init config to agree to the open source license terms.",sx="licensekeymanager",ax=e=>{const t=(e=>u(uu(e))?"online":"offline")(e),n=(e=>{const t=mu(e)?.toLowerCase();return"gpl"===t?"gpl":v(t)?"no_key":"non_gpl"})(e),o=new Set([...Em(e),...ge(xm(e))]).has(sx);return"gpl"!==n||"online"===t||o?{type:"use_plugin",onlineStatus:t,licenseKeyType:n,forcePlugin:o}:{type:"use_gpl",onlineStatus:t,licenseKeyType:n,forcePlugin:o}},ix=e=>t=>{let n=!1;return{validate:o=>{const{plugin:r}=o,s=u(r);return s&&(((e,t,n)=>{nx(e,{console:{type:"error",message:[`The "${t}" plugin requires a valid TinyMCE license key.`,ox].join(" ")},...n?{}:{editor:{type:"warning",message:"One or more premium plugins are disabled due to license key restrictions."}}})})(t,r,n),n=!0),Promise.resolve(e&&!s)}}},lx=ix(!1),cx=ix(!0),dx="manager",mx=sx,ux=(()=>{const e=wi();return{load:(t,n)=>{if("use_plugin"===ax(t).type){const o=xe(xm(t),mx).map(et).filter(ot).getOr(`plugins/${mx}/plugin${n}.js`);e.load(dx,o).catch(()=>{((e,t)=>{XE(e,"LicenseKeyManagerLoadError",QE("license key manager",t))})(t,o)})}},add:t=>{e.add(dx,t)},init:t=>{const n=e=>{Object.defineProperty(t,"licenseKeyManager",{value:e,writable:!1,configurable:!1,enumerable:!0})},o=ax(t),r=e.get(dx);if(C(r))n(r(t,e.urls[dx]));else switch(o.type){case"use_gpl":n(cx(t));break;case"use_plugin":(e=>{JE.has(e)||(JE.set(e,!0),e.initialized?(e.removed||e.mode.set("readonly"),e.options.set("disabled",!0)):e.on("init",()=>{e.removed||e.mode.set("readonly"),e.options.set("disabled",!0)}),e.on("DisabledStateChange",e=>{const{state:t}=e;t||e.preventDefault()},!0),e.on("SwitchMode",t=>{const{mode:n}=t;"readonly"!==n&&e.mode.set("readonly")}))})(t),n(lx(t)),"offline"===o.onlineStatus&&"no_key"===o.licenseKeyType?(e=>{const t="The editor is disabled because a TinyMCE license key has not been provided.";nx(e,{console:{type:"error",message:[`${t}`,rx,ox].join(" ")},editor:{type:"warning",message:`${t}`}})})(t):((e,t)=>{const n=("online"===t?"API":"license")+" key",o=`The editor is disabled because the TinyMCE ${n} could not be validated.`;nx(e,{console:{type:"error",message:[`${o}`,`The TinyMCE Commercial License Key Manager plugin is required for the provided ${n} to be validated but could not be loaded.`,ox].join(" ")},editor:{type:"warning",message:`${o}`}})})(t,o.onlineStatus)}t.licenseKeyManager.validate({})}}})(),fx=(e,t,n)=>{try{e.getDoc().execCommand(t,!1,String(n))}catch{}},gx=(e,t,n)=>{wr(e,t)&&!n?Cr(e,t):n&&yr(e,t)},px=e=>{const t=un.fromDom(e.getBody());gx(t,"mce-content-readonly",!0),e.selection.controlSelection.hideResizeRect(),e._selectionOverrides.hideFakeCaret(),(e=>{I.from(e.selection.getNode()).each(e=>{e.removeAttribute("data-mce-selected")})})(e)},hx=e=>{const t=un.fromDom(e.getBody());gx(t,"mce-content-readonly",!1),e.hasEditableRoot()&&xr(t,!0),((e,t)=>{fx(e,"StyleWithCSS",t),fx(e,"enableInlineTableEditing",t),fx(e,"enableObjectResizing",t)})(e,!1),Np(e)&&e.focus(),(e=>{e.selection.setRng(e.selection.getRng())})(e),e.nodeChanged()},bx=e=>fu(e),yx="data-mce-contenteditable",vx=(e,t)=>{const n=un.fromDom(e.getBody());t?(px(e),xr(n,!1),q(Ar(n,'*[contenteditable="true"]'),e=>{vo(e,yx,"true"),xr(e,!1)})):(q(Ar(n,`*[${yx}="true"]`),e=>{xo(e,yx),xr(e,!0)}),hx(e))},Cx=e=>{e.parser.addAttributeFilter("contenteditable",t=>{bx(e)&&q(t,e=>{e.attr(yx,e.attr("contenteditable")),e.attr("contenteditable","false")})}),e.serializer.addAttributeFilter(yx,t=>{bx(e)&&q(t,e=>{e.attr("contenteditable",e.attr(yx))})}),e.serializer.addTempAttr(yx)},wx=["copy"],Sx=(e,t)=>fr(t,"details",t=>vn(t,un.fromDom(e.getBody()))).isSome(),Ex=e=>"content/"+e+"/content.css",xx=(e,t)=>{const n=e.editorManager.baseURL+"/skins/content",o=`content${e.editorManager.suffix}.css`;return V(t,t=>(e=>tinymce.Resource.has(Ex(e)))(t)?Ex(t):(e=>/^[a-z0-9\-]+$/i.test(e))(t)&&!e.inline?`${n}/${t}/${o}`:e.documentBaseURI.toAbsolute(t))},_x=(e,t)=>{const n={};return{findAll:(o,r=M)=>{const s=Y((e=>e?me(e.getElementsByTagName("img")):[])(o),t=>{const n=t.src;return!t.hasAttribute("data-mce-bogus")&&!t.hasAttribute("data-mce-placeholder")&&!(!n||n===sn.transparentSrc)&&(Qe(n,"blob:")?!e.isUploaded(n)&&r(t):!!Qe(n,"data:")&&r(t))}),a=V(s,e=>{const o=e.src;if(_e(n,o))return n[o].then(t=>u(t)?t:{image:e,blobInfo:t.blobInfo});{const r=((e,t)=>{const n=()=>Promise.reject("Invalid data URI");if(Qe(t,"blob:")){const s=e.getByUri(t);return C(s)?Promise.resolve(s):(o=t,Qe(o,"blob:")?(e=>fetch(e).then(e=>e.ok?e.blob():Promise.reject()).catch(()=>Promise.reject({message:`Cannot convert ${e} to Blob. Resource might not exist or is inaccessible.`,uriType:"blob"})))(o):Qe(o,"data:")?(r=o,new Promise((e,t)=>{bC(r).bind(({type:e,data:t,base64Encoded:n})=>yC(e,t,n)).fold(()=>t("Invalid data URI"),e)})):Promise.reject("Unknown URI format")).then(t=>vC(t).then(o=>wC(o,!1,n=>I.some(SC(e,t,n))).getOrThunk(n)))}var o,r;return Qe(t,"data:")?EC(e,t).fold(n,e=>Promise.resolve(e)):Promise.reject("Unknown image data format")})(t,o).then(t=>(delete n[o],{image:e,blobInfo:t})).catch(e=>(delete n[o],e));return n[o]=r,r}});return Promise.all(a)}}},kx=()=>{let e={};const t=(e,t)=>({status:e,resultUri:t}),n=t=>t in e;return{hasBlobUri:n,getResultUri:t=>{const n=e[t];return n?n.resultUri:null},isPending:t=>!!n(t)&&1===e[t].status,isUploaded:t=>!!n(t)&&2===e[t].status,markPending:n=>{e[n]=t(1,null)},markUploaded:(n,o)=>{e[n]=t(2,o)},removeFailed:t=>{delete e[t]},destroy:()=>{e={}}}};let Nx=0;const Ax=(e,t)=>{const n={},o=(e,n)=>new Promise((o,r)=>{const s=new XMLHttpRequest;s.open("POST",t.url),s.withCredentials=t.credentials,s.upload.onprogress=e=>{n(e.loaded/e.total*100)},s.onerror=()=>{r("Image upload failed due to a XHR Transport error. Code: "+s.status)},s.onload=()=>{if(s.status<200||s.status>=300)return void r("HTTP Error: "+s.status);const e=JSON.parse(s.responseText);var n,a;e&&u(e.location)?o((n=t.basePath,a=e.location,n?n.replace(/\/$/,"")+"/"+a.replace(/^\//,""):a)):r("Invalid JSON: "+s.responseText)};const a=new FormData;a.append("file",e.blob(),e.filename()),s.send(a)}),r=w(t.handler)?t.handler:o,s=(e,t)=>({url:t,blobInfo:e,status:!0}),a=(e,t)=>({url:"",blobInfo:e,status:!1,error:t}),i=(e,t)=>{dn.each(n[e],e=>{e(t)}),delete n[e]};return{upload:(l,c)=>t.url||r!==o?((t,o)=>(t=dn.grep(t,t=>!e.isUploaded(t.blobUri())),Promise.all(dn.map(t,t=>e.isPending(t.blobUri())?(e=>{const t=e.blobUri();return new Promise(e=>{n[t]=n[t]||[],n[t].push(e)})})(t):((t,n,o)=>(e.markPending(t.blobUri()),new Promise(r=>{let l,c;try{const d=()=>{l&&(l.close(),c=x)},m=n=>{d();const o=u(n)?n:n.url;e.markUploaded(t.blobUri(),o),i(t.blobUri(),s(t,o)),r(s(t,o))},f=n=>{d(),e.removeFailed(t.blobUri()),i(t.blobUri(),a(t,n)),r(a(t,n))};c=e=>{e<0||e>100||I.from(l).orThunk(()=>I.from(o).map(B)).each(t=>{l=t,t.progressBar.value(e)})},n(t,c).then(m,e=>{f(u(e)?{message:e}:e)})}catch(e){r(a(t,e))}})))(t,r,o)))))(l,c):new Promise(e=>{e([])})}},Rx=e=>()=>e.notificationManager.open({text:e.translate("Image uploading..."),type:"info",timeout:-1,progressBar:!0}),Dx=(e,t)=>Ax(t,{url:Ld(e),basePath:Md(e),credentials:Id(e),handler:Fd(e)}),Tx=e=>{const t=(()=>{let e=[];const t=e=>{if(v(e.blob)||v(e.base64)||""===e.base64&&!e.allowEmptyFile)throw new Error("blob and base64 representations of the image are required for BlobInfo to be created");const t=e.id||"blobid"+Nx+++(()=>{const e=()=>Math.round(4294967295*Be()).toString(36);return"s"+(new Date).getTime().toString(36)+e()+e()+e()})(),n=e.name||t,o=e.blob;var r;return{id:N(t),name:N(n),filename:N(e.filename||n+"."+(r=o.type,{"image/jpeg":"jpg","image/jpg":"jpg","image/gif":"gif","image/png":"png","image/apng":"apng","image/avif":"avif","image/svg+xml":"svg","image/webp":"webp","image/bmp":"bmp","image/tiff":"tiff"}[r.toLowerCase()]||"dat")),blob:N(o),base64:N(e.base64),blobUri:N(e.blobUri||URL.createObjectURL(o)),uri:N(e.uri)}},n=t=>Z(e,t).getOrUndefined(),o=e=>n(t=>t.id()===e);return{create:(e,n,o,r,s)=>{if(u(e))return t({id:e,name:r,filename:s,blob:n,base64:o});if(f(e))return t(e);throw new Error("Unknown input type")},add:t=>{o(t.id())||e.push(t)},get:o,getByUri:e=>n(t=>t.blobUri()===e),getByData:(e,t)=>n(n=>n.base64()===e&&n.blob().type===t),findFirst:n,removeByUri:t=>{e=Y(e,e=>e.blobUri()!==t||(URL.revokeObjectURL(e.blobUri()),!1))},destroy:()=>{q(e,e=>{URL.revokeObjectURL(e.blobUri())}),e=[]}}})();let n,o;const r=kx(),s=[],a=t=>n=>e.selection?t(n):[],i=(e,t,n)=>{let o=0;do{o=e.indexOf(t,o),-1!==o&&(e=e.substring(0,o)+n+e.substr(o+t.length),o+=n.length-t.length+1)}while(-1!==o);return e},l=(e,t,n)=>{const o=`src="${n}"${n===sn.transparentSrc?' data-mce-placeholder="1"':""}`;return e=i(e,`src="${t}"`,o),i(e,'data-mce-src="'+t+'"','data-mce-src="'+n+'"')},c=(t,n)=>{q(e.undoManager.data,e=>{"fragmented"===e.type?e.fragments=V(e.fragments,e=>l(e,t,n)):e.content=l(e.content,t,n)})},d=()=>(n||(n=Dx(e,r)),p().then(a(o=>{const r=V(o,e=>e.blobInfo);return n.upload(r,Rx(e)).then(a(n=>{const r=[];let s=!1;const a=V(n,(n,a)=>{const{blobInfo:i,image:l}=o[a];let d=!1;return n.status&&Od(e)?(n.url&&!Xe(l.src,n.url)&&(s=!0),t.removeByUri(l.src),EE(e)||((t,n)=>{const o=e.convertURL(n,"src");var r;c(t.src,n),Co(un.fromDom(t),{src:Td(e)?(r=n,r+(-1===r.indexOf("?")?"?":"&")+(new Date).getTime()):n,"data-mce-src":o})})(l,n.url)):n.error&&(n.error.remove&&(c(l.src,sn.transparentSrc),r.push(l),d=!0),((e,t)=>{GE(e,Ci.translate(["Failed to upload image: {0}",t]))})(e,n.error.message)),{element:l,status:n.status,uploadUri:n.url,blobInfo:i,removed:d}});return r.length>0&&!EE(e)?e.undoManager.transact(()=>{q(Po(r),n=>{const o=Mn(n);Ao(n),o.each((e=>t=>{((e,t)=>e.dom.isEmpty(t.dom)&&C(e.schema.getTextBlockElements()[En(t)]))(e,t)&&go(t,un.fromHtml('
    '))})(e)),t.removeByUri(n.dom.src)})}):s&&e.undoManager.dispatchChange(),a}))}))),m=()=>Dd(e)?d():Promise.resolve([]),g=e=>oe(s,t=>t(e)),p=()=>(o||(o=_x(r,t)),o.findAll(e.getBody(),g).then(a(t=>{const n=Y(t,t=>u(t)?(GE(e,t),!1):"blob"!==t.uriType);return EE(e)||q(n,e=>{c(e.image.src,e.blobInfo.blobUri()),e.image.src=e.blobInfo.blobUri(),e.image.removeAttribute("data-mce-src")}),n}))),h=n=>n.replace(/src="(blob:[^"]+)"/g,(n,o)=>{const s=r.getResultUri(o);if(s)return'src="'+s+'"';let a=t.getByUri(o);return a||(a=X(e.editorManager.get(),(e,t)=>e||t.editorUpload&&t.editorUpload.blobCache.getByUri(o),void 0)),a?'src="data:'+a.blob().type+";base64,"+a.base64()+'"':n});return e.on("SetContent",()=>{Dd(e)?m():p()}),e.on("RawSaveContent",e=>{e.content=h(e.content)}),e.on("GetContent",e=>{e.source_view||"raw"===e.format||"tree"===e.format||(e.content=h(e.content))}),e.on("PostRender",()=>{e.parser.addNodeFilter("img",e=>{q(e,e=>{const n=e.attr("src");if(!n||t.getByUri(n))return;const o=r.getResultUri(n);o&&e.attr("src",o)})})}),{blobCache:t,addFilter:e=>{s.push(e)},uploadImages:d,uploadImagesAuto:m,scanForImages:p,destroy:()=>{t.destroy(),r.destroy(),o=n=null}}},Ox={remove_similar:!0,inherit:!1},Bx={selector:"td,th",...Ox},Px={tablecellbackgroundcolor:{styles:{backgroundColor:"%value"},...Bx},tablecellverticalalign:{styles:{"vertical-align":"%value"},...Bx},tablecellbordercolor:{styles:{borderColor:"%value"},...Bx},tablecellclass:{classes:["%value"],...Bx},tableclass:{selector:"table",classes:["%value"],...Ox},tablecellborderstyle:{styles:{borderStyle:"%value"},...Bx},tablecellborderwidth:{styles:{borderWidth:"%value"},...Bx}},Lx=N(Px),Mx=dn.each,Ix=gi.DOM,Fx=e=>C(e)&&f(e),Ux=(e,t)=>{const n=t&&t.schema||Ua({}),o=e=>{const t=u(e)?{name:e,classes:[],attrs:{}}:e,n=Ix.create(t.name);return((e,t)=>{t.classes.length>0&&Ix.addClass(e,t.classes.join(" ")),Ix.setAttribs(e,t.attrs)})(n,t),n},r=(e,t,s)=>{let a;const i=t[0],l=Fx(i)?i.name:void 0,c=((e,t)=>{const o=n.getElementRule(e.nodeName.toLowerCase()),r=o?.parentsRequired;return!(!r||!r.length)&&(t&&$(r,t)?t:r[0])})(e,l);if(c)l===c?(a=i,t=t.slice(1)):a=c;else if(i)a=i,t=t.slice(1);else if(!s)return e;const d=a?o(a):Ix.create("div");d.appendChild(e),s&&dn.each(s,t=>{const n=o(t);d.insertBefore(n,e)});const m=Fx(a)?a.siblings:void 0;return r(d,t,m)},s=Ix.create("div");if(e.length>0){const t=e[0],n=o(t),a=Fx(t)?t.siblings:void 0;s.appendChild(r(n,e.slice(1),a))}return s},zx=e=>{let t="div";const n={name:t,classes:[],attrs:{},selector:e=dn.trim(e)};return"*"!==e&&(t=e.replace(/(?:([#\.]|::?)([\w\-]+)|(\[)([^\]]+)\]?)/g,(e,t,o,r,s)=>{switch(t){case"#":n.attrs.id=o;break;case".":n.classes.push(o);break;case":":-1!==dn.inArray("checked disabled enabled read-only required".split(" "),o)&&(n.attrs[o]=o)}if("["===r){const e=s.match(/([\w\-]+)(?:\=\"([^\"]+))?/);e&&(n.attrs[e[1]]=e[2])}return""})),n.name=t||"div",n},jx=(e,t)=>{let n="",o=cm(e);if(""===o)return"";const r=e=>u(e)?e.replace(/%(\w+)/g,""):"",s=(t,n)=>Ix.getStyle(n??e.getBody(),t,!0);if(u(t)){const n=e.formatter.get(t);if(!n)return"";t=n[0]}if("preview"in t){const e=t.preview;if(!1===e)return"";o=e||o}let a,i=t.block||t.inline||"span";const l=(c=t.selector,u(c)?(c=(c=c.split(/\s*,\s*/)[0]).replace(/\s*(~\+|~|\+|>)\s*/g,"$1"),dn.map(c.split(/(?:>|\s+(?![^\[\]]+\]))/),e=>{const t=dn.map(e.split(/(?:~\+|~|\+)/),zx),n=t.pop();return t.length&&(n.siblings=t),n}).reverse()):[]);var c;l.length>0?(l[0].name||(l[0].name=i),i=t.selector,a=Ux(l,e)):a=Ux([i],e);const d=Ix.select(i,a)[0]||a.firstChild;Mx(t.styles,(e,t)=>{const n=r(e);n&&Ix.setStyle(d,t,n)}),Mx(t.attributes,(e,t)=>{const n=r(e);n&&Ix.setAttrib(d,t,n)}),Mx(t.classes,e=>{const t=r(e);Ix.hasClass(d,t)||Ix.addClass(d,t)}),e.dispatch("PreviewFormats"),Ix.setStyles(a,{position:"absolute",left:-65535}),e.getBody().appendChild(a);const m=s("fontSize"),f=/px$/.test(m)?parseInt(m,10):0;return Mx(o.split(" "),e=>{let t=s(e,d);if(!("background-color"===e&&/transparent|rgba\s*\([^)]+,\s*0\)/.test(t)&&(t=s(e),"#ffffff"===Ya(t).toLowerCase())||"color"===e&&"#000000"===Ya(t).toLowerCase())){if("font-size"===e&&/em|%$/.test(t)){if(0===f)return;t=parseFloat(t)/(/%$/.test(t)?100:1)*f+"px"}"border"===e&&t&&(n+="padding:0 2px;"),n+=e+":"+t+";"}}),e.dispatch("AfterPreviewFormats"),Ix.remove(a),n},$x=e=>{const t=(e=>{const t={},n=(e,o)=>{e&&(u(e)?(p(o)||(o=[o]),q(o,e=>{y(e.deep)&&(e.deep=!_g(e)),y(e.split)&&(e.split=!_g(e)||kg(e)),y(e.remove)&&_g(e)&&!kg(e)&&(e.remove="none"),_g(e)&&kg(e)&&(e.mixed=!0,e.block_expand=!0),u(e.classes)&&(e.classes=e.classes.split(/\s+/))}),t[e]=o):he(e,(e,t)=>{n(t,e)}))};return n((e=>{const t=e.dom,n=e.schema.type,o={valigntop:[{selector:"td,th",styles:{verticalAlign:"top"}}],valignmiddle:[{selector:"td,th",styles:{verticalAlign:"middle"}}],valignbottom:[{selector:"td,th",styles:{verticalAlign:"bottom"}}],alignleft:[{selector:"figure.image",collapsed:!1,classes:"align-left",ceFalseOverride:!0,preview:"font-family font-size"},{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li,pre",styles:{textAlign:"left"},inherit:!1,preview:!1},{selector:"img,audio,video",collapsed:!1,styles:{float:"left"},preview:"font-family font-size"},{selector:".mce-placeholder",styles:{float:"left"},ceFalseOverride:!0},{selector:"table",collapsed:!1,styles:{marginLeft:"0px",marginRight:"auto"},onformat:e=>{t.setStyle(e,"float",null)},preview:"font-family font-size"},{selector:".mce-preview-object,[data-ephox-embed-iri],.tiny-pageembed",ceFalseOverride:!0,styles:{float:"left"}}],aligncenter:[{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li,pre",styles:{textAlign:"center"},inherit:!1,preview:"font-family font-size"},{selector:"figure.image",collapsed:!1,classes:"align-center",ceFalseOverride:!0,preview:"font-family font-size"},{selector:"img,audio,video",collapsed:!1,styles:{display:"block",marginLeft:"auto",marginRight:"auto"},preview:!1},{selector:".mce-placeholder",styles:{display:"block",marginLeft:"auto",marginRight:"auto"},ceFalseOverride:!0},{selector:"table",collapsed:!1,styles:{marginLeft:"auto",marginRight:"auto"},preview:"font-family font-size"},{selector:".mce-preview-object,.tiny-pageembed",ceFalseOverride:!0,styles:{display:"table",marginLeft:"auto",marginRight:"auto"},preview:!1},{selector:"[data-ephox-embed-iri]",ceFalseOverride:!0,styles:{marginLeft:"auto",marginRight:"auto"},preview:!1}],alignright:[{selector:"figure.image",collapsed:!1,classes:"align-right",ceFalseOverride:!0,preview:"font-family font-size"},{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li,pre",styles:{textAlign:"right"},inherit:!1,preview:"font-family font-size"},{selector:"img,audio,video",collapsed:!1,styles:{float:"right"},preview:"font-family font-size"},{selector:".mce-placeholder",styles:{float:"right"},ceFalseOverride:!0},{selector:"table",collapsed:!1,styles:{marginRight:"0px",marginLeft:"auto"},onformat:e=>{t.setStyle(e,"float",null)},preview:"font-family font-size"},{selector:".mce-preview-object,[data-ephox-embed-iri],.tiny-pageembed",ceFalseOverride:!0,styles:{float:"right"},preview:!1}],alignjustify:[{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li,pre",styles:{textAlign:"justify"},inherit:!1,preview:"font-family font-size"}],bold:[{inline:"strong",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{fontWeight:"bold"}},{inline:"b",remove:"all",preserve_attributes:["class","style"]}],italic:[{inline:"em",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{fontStyle:"italic"}},{inline:"i",remove:"all",preserve_attributes:["class","style"]}],underline:[{inline:"span",styles:{textDecoration:"underline"},exact:!0},{inline:"u",remove:"all",preserve_attributes:["class","style"]}],strikethrough:(()=>{const e={inline:"span",styles:{textDecoration:"line-through"},exact:!0},t={inline:"strike",remove:"all",preserve_attributes:["class","style"]},o={inline:"s",remove:"all",preserve_attributes:["class","style"]};return"html4"!==n?[o,e,t]:[e,o,t]})(),forecolor:{inline:"span",styles:{color:"%value"},links:!0,remove_similar:!0,clear_child_styles:!0},hilitecolor:{inline:"span",styles:{backgroundColor:"%value"},links:!0,remove_similar:!0,clear_child_styles:!0},fontname:{inline:"span",toggle:!1,styles:{fontFamily:"%value"},clear_child_styles:!0},fontsize:{inline:"span",toggle:!1,styles:{fontSize:"%value"},clear_child_styles:!0},lineheight:{selector:"h1,h2,h3,h4,h5,h6,p,li,td,th,div",styles:{lineHeight:"%value"},remove_similar:!0},fontsize_class:{inline:"span",attributes:{class:"%value"}},blockquote:{block:"blockquote",wrapper:!0,remove:"all"},subscript:{inline:"sub"},superscript:{inline:"sup"},code:{inline:"code"},samp:{inline:"samp"},link:{inline:"a",selector:"a",remove:"all",split:!0,deep:!0,onmatch:(e,t,n)=>es(e)&&e.hasAttribute("href"),onformat:(e,n,o)=>{dn.each(o,(n,o)=>{t.setAttrib(e,o,n)})}},lang:{inline:"span",clear_child_styles:!0,remove_similar:!0,attributes:{lang:"%value","data-mce-lang":e=>e?.customValue??null}},removeformat:[{selector:"b,strong,em,i,font,u,strike,s,sub,sup,dfn,code,samp,kbd,var,cite,mark,q,del,ins,small",remove:"all",split:!0,expand:!1,block_expand:!0,deep:!0},{selector:"span",attributes:["style","class"],remove:"empty",split:!0,expand:!1,deep:!0},{selector:"*",attributes:["style","class"],split:!1,expand:!1,deep:!0}]};return dn.each("p h1 h2 h3 h4 h5 h6 div address pre dt dd".split(/\s/),e=>{o[e]={block:e,remove:"all"}}),o})(e)),n(Lx()),n(lm(e)),{get:e=>C(e)?t[e]:t,has:e=>_e(t,e),register:n,unregister:e=>(e&&t[e]&&delete t[e],t)}})(e),n=Ae({});return(e=>{e.addShortcut("meta+b","","Bold"),e.addShortcut("meta+i","","Italic"),e.addShortcut("meta+u","","Underline");for(let t=1;t<=6;t++)e.addShortcut("access+"+t,"",["FormatBlock",!1,"h"+t]);e.addShortcut("access+7","",["FormatBlock",!1,"p"]),e.addShortcut("access+8","",["FormatBlock",!1,"div"]),e.addShortcut("access+9","",["FormatBlock",!1,"address"])})(e),(e=>{e.on("mouseup keydown",t=>{var n;((e,t,n)=>{const o=e.selection,r=e.getBody();cv(e,null,n),8!==t&&46!==t||!o.isCollapsed()||o.getStart().innerHTML!==sv||cv(e,Of(r,o.getStart()),!0),37!==t&&39!==t||cv(e,Of(r,o.getStart()),!0)})(e,t.keyCode,(n=e.selection.getRng().endContainer,cs(n)&&Ze(n.data,dt)))})})(e),EE(e)||((e,t)=>{e.set({}),t.on("NodeChange",n=>{GS(t,n.element,e.get())}),t.on("FormatApply FormatRemove",n=>{const o=I.from(n.node).map(e=>ig(e)?e:e.startContainer).bind(e=>es(e)?I.some(e):I.from(e.parentElement)).getOrThunk(()=>WS(t));GS(t,o,e.get())})})(n,e),{get:t.get,has:t.has,register:t.register,unregister:t.unregister,apply:(t,n,o)=>{((e,t,n,o)=>{_E(e).formatter.apply(t,n,o)})(e,t,n,o)},remove:(t,n,o,r)=>{((e,t,n,o,r)=>{_E(e).formatter.remove(t,n,o,r)})(e,t,n,o,r)},toggle:(t,n,o)=>{((e,t,n,o)=>{_E(e).formatter.toggle(t,n,o)})(e,t,n,o)},match:(t,n,o,r)=>((e,t,n,o,r)=>_E(e).formatter.match(t,n,o,r))(e,t,n,o,r),closest:t=>((e,t)=>_E(e).formatter.closest(t))(e,t),matchAll:(t,n)=>((e,t,n)=>_E(e).formatter.matchAll(t,n))(e,t,n),matchNode:(t,n,o,r)=>((e,t,n,o,r)=>_E(e).formatter.matchNode(t,n,o,r))(e,t,n,o,r),canApply:t=>((e,t)=>_E(e).formatter.canApply(t))(e,t),formatChanged:(t,o,r,s)=>((e,t,n,o,r,s)=>_E(e).formatter.formatChanged(t,n,o,r,s))(e,n,t,o,r,s),getCssText:D(jx,e)}},Hx=e=>{switch(e.toLowerCase()){case"undo":case"redo":case"mcefocus":return!0;default:return!1}},Vx=e=>{const t=Ke(),n=Ae(0),o=Ae(0),r={data:[],typing:!1,beforeChange:()=>{((e,t,n)=>{_E(e).undoManager.beforeChange(t,n)})(e,n,t)},add:(s,a)=>((e,t,n,o,r,s,a)=>_E(e).undoManager.add(t,n,o,r,s,a))(e,r,o,n,t,s,a),dispatchChange:()=>{e.setDirty(!0);const t=gE(e);t.bookmark=gc(e.selection),e.dispatch("change",{level:t,lastLevel:le(r.data,o.get()).getOrUndefined()})},undo:()=>((e,t,n,o)=>_E(e).undoManager.undo(t,n,o))(e,r,n,o),redo:()=>((e,t,n)=>_E(e).undoManager.redo(t,n))(e,o,r.data),clear:()=>{((e,t,n)=>{_E(e).undoManager.clear(t,n)})(e,r,o)},reset:()=>{((e,t)=>{_E(e).undoManager.reset(t)})(e,r)},hasUndo:()=>((e,t,n)=>_E(e).undoManager.hasUndo(t,n))(e,r,o),hasRedo:()=>((e,t,n)=>_E(e).undoManager.hasRedo(t,n))(e,r,o),transact:t=>((e,t,n,o)=>_E(e).undoManager.transact(t,n,o))(e,r,n,t),ignore:t=>{((e,t,n)=>{_E(e).undoManager.ignore(t,n)})(e,n,t)},extra:(t,n)=>{((e,t,n,o,r)=>{_E(e).undoManager.extra(t,n,o,r)})(e,r,o,t,n)}};return EE(e)||((e,t,n)=>{const o=Ae(!1),r=e=>{CE(t,!1,n),t.add({},e)};e.on("init",()=>{t.add()}),e.on("BeforeExecCommand",e=>{const o=e.command;Hx(o)||(wE(t,n),t.beforeChange())}),e.on("ExecCommand",e=>{const t=e.command;Hx(t)||r(e)}),e.on("ObjectResizeStart cut",()=>{t.beforeChange()}),e.on("SaveContent ObjectResized blur",r),e.on("dragend",r),e.on("keyup",n=>{const s=n.keyCode;if(n.isDefaultPrevented())return;const a=sn.os.isMacOS()&&"Meta"===n.key;(s>=33&&s<=36||s>=37&&s<=40||45===s||n.ctrlKey||a)&&(r(),e.nodeChanged()),46!==s&&8!==s||e.nodeChanged(),o.get()&&t.typing&&!yE(e.readonly,gE(e),t.data[0])&&(e.isDirty()||e.setDirty(!0),e.dispatch("TypingUndo"),o.set(!1),e.nodeChanged())}),e.on("keydown",e=>{const s=e.keyCode;if(e.isDefaultPrevented())return;if(s>=33&&s<=36||s>=37&&s<=40||45===s)return void(t.typing&&r(e));const a=e.ctrlKey&&!e.altKey||e.metaKey;if((s<16||s>20)&&224!==s&&91!==s&&!t.typing&&!a)return t.beforeChange(),CE(t,!0,n),t.add({},e),void o.set(!0);!(sn.os.isMacOS()?e.metaKey:e.ctrlKey&&!e.altKey)||"Backspace"!==e.key&&"Delete"!==e.key||t.beforeChange()}),e.on("mousedown",e=>{t.typing&&r(e)}),e.on("input",e=>{var t;e.inputType&&("insertReplacementText"===e.inputType||"insertText"===(t=e).inputType&&null===t.data||(e=>"insertFromPaste"===e.inputType||"insertFromDrop"===e.inputType)(e))&&r(e)}),e.on("AddUndo Undo Redo ClearUndos",t=>{t.isDefaultPrevented()||e.nodeChanged()})})(e,r,n),(e=>{e.addShortcut("meta+z","","Undo"),e.addShortcut("meta+y,meta+shift+z","","Redo")})(e),r},qx=[9,27,Rp.HOME,Rp.END,19,20,44,144,145,33,34,45,16,17,18,91,92,93,Rp.DOWN,Rp.UP,Rp.LEFT,Rp.RIGHT].concat(sn.browser.isFirefox()?[224]:[]),Wx="data-mce-placeholder",Kx=e=>"keydown"===e.type||"keyup"===e.type,Yx=e=>{const t=e.keyCode;return t===Rp.BACKSPACE||t===Rp.DELETE},Gx=e=>(t,n,o={})=>{const r=t.getBody(),s={bubbles:!0,composed:!0,data:null,isComposing:!1,detail:0,view:null,target:r,currentTarget:r,eventPhase:Event.AT_TARGET,originalTarget:r,explicitOriginalTarget:r,isTrusted:!1,srcElement:r,cancelable:!1,preventDefault:x,inputType:n},a=Qa(new InputEvent(e));return t.dispatch(e,{...a,...s,...o})},Xx=Gx("input"),Qx=Gx("beforeinput"),Zx=(e,t,n)=>{let o=!0;const r=()=>o=!1;if(Qx(e,t?"deleteContentForward":"deleteContentBackward").isDefaultPrevented())return!1;e.on("input",r);try{n()}finally{e.off("input",r)}return o&&e.dispatch("input"),!0},Jx=e=>t=>C(t)&&e.test(t.nodeName),e_=e=>C(e)&&3===e.nodeType,t_=e=>C(e)&&1===e.nodeType,n_=Jx(/^(OL|UL|DL)$/),o_=Jx(/^(OL|UL)$/),r_=Jx(/^(LI|DT|DD)$/),s_=Jx(/^(DT|DD)$/),a_=Jx(/^(TH|TD)$/),i_=e=>C(e)&&"br"===e.nodeName.toLowerCase(),l_=(e,t)=>C(t)&&t.nodeName in e.schema.getTextBlockElements(),c_=(e,t)=>C(e)&&e.nodeName in t,d_=(e,t)=>C(t)&&t.nodeName in e.schema.getVoidElements(),m_=(e,t,n)=>{const o=e.isEmpty(t);return!(n&&e.select("span[data-mce-type=bookmark]",t).length>0)&&o},u_=(e,t)=>e.isChildOf(t,e.getRoot()),f_=gi.DOM,g_=(e,t)=>{const n=dn.grep(e.select("ol,ul",t));dn.each(n,t=>{((e,t)=>{const n=t.parentElement;if(n&&"LI"===n.nodeName&&n.firstChild===t){const o=n.previousSibling;o&&"LI"===o.nodeName?(o.appendChild(t),m_(e,n)&&f_.remove(n)):f_.setStyle(n,"listStyleType","none")}if(n_(n)){const e=n.previousSibling;e&&"LI"===e.nodeName&&e.appendChild(t)}})(e,t)})},p_=(e,t)=>{if(e_(e))return{container:e,offset:t};const n=Kp.getNode(e,t);return e_(n)?{container:n,offset:t>=e.childNodes.length?n.data.length:0}:n.previousSibling&&e_(n.previousSibling)?{container:n.previousSibling,offset:n.previousSibling.data.length}:n.nextSibling&&e_(n.nextSibling)?{container:n.nextSibling,offset:0}:{container:e,offset:t}},h_=e=>{const t=e.cloneRange(),n=p_(e.startContainer,e.startOffset);t.setStart(n.container,n.offset);const o=p_(e.endContainer,e.endOffset);return t.setEnd(o.container,o.offset),t},b_=e=>wn(e,"OL,UL"),y_=e=>wn(e,"LI"),v_=e=>Wn(e).exists(b_),C_=["OL","UL","DL"],w_=C_.join(","),S_=(e,t)=>{const n=t||e.selection.getStart(!0);return e.dom.getParent(n,w_,__(e,n,e.selection.isCollapsed()))},E_=e=>{const t=e.selection.getSelectedBlocks();return Y(((e,t,n)=>{const o=dn.map(t,t=>e.dom.getParent(t,"li,dd,dt",__(e,t,n))||t);return fe(o)})(e,t,e.selection.isCollapsed()),r_)},x_=(e,t)=>{const n=e.dom.getParents(t,"TD,TH");return n.length>0?n[0]:e.getBody()},__=(e,t,n)=>{const o=e.dom.getParents(t,e.dom.isBlock);let r=!(e=>ue(e,e=>y_(un.fromDom(e))?I.some(!0):a_(e)?I.some(!1):I.none()).getOr(!1))(o);const s=Z(o,t=>{return(y_(un.fromDom(a=t))||b_(un.fromDom(a)))&&(r=!0),r&&(!n||(t=>t.nodeName.toLowerCase()!==Ed(e))(t))&&(o=e.schema,!n_(s=t)&&!r_(s)&&H(C_,e=>o.isValidChild(s.nodeName,e)));var o,s,a});return s.getOr(e.getBody())},k_=(e,t)=>{const n=e.dom.getParents(t,"ol,ul",__(e,t,!0));return de(n)},N_=(e,t)=>{const n=V(t,t=>k_(e,t).getOr(t));return fe(n)},A_=e=>/\btox\-/.test(e.className),R_=(e,t)=>null!==t&&!e.dom.isEditable(t),D_=(e,t)=>{const n=e.dom.getParent(t,"ol,ul,dl");return R_(e,n)||!e.selection.isEditable()},T_=(e,t,n)=>e.dispatch("ListMutation",{action:t,element:n}),O_=(e,t,n={})=>{const o=e.dom,r=e.schema.getBlockElements(),s=o.createFragment(),a=Ed(e),i=xd(e);let l,c,d=!1;for(c=o.create(a,{...i,...n.style?{style:n.style}:{}}),c_(t.firstChild,r)||s.appendChild(c);l=t.firstChild;){const e=l.nodeName;d||"SPAN"===e&&"bookmark"===l.getAttribute("data-mce-type")||(d=!0),c_(l,r)?(s.appendChild(l),c=null):(c||(c=o.create(a,i),s.appendChild(c)),c.appendChild(l))}return!d&&c&&c.appendChild(o.create("br",{"data-mce-bogus":"1"})),s},B_=e=>"listAttributes"in e,P_=e=>"isComment"in e,L_=e=>e.depth>0,M_=e=>e.isSelected,I_=e=>{const t=Vn(e),n=Kn(e).exists(b_)?t.slice(0,-1):t;return V(n,Oo)},F_=(e,t)=>{go(e.item,t.list)},U_=(e,t)=>{const n={list:un.fromTag(t,e),item:un.fromTag("li",e)};return go(n.list,n.item),n},z_=(e,t,n)=>{const o=t.slice(0,n.depth);return de(o).each(t=>{if(B_(n)){const o=((e,t,n)=>{const o=un.fromTag("li",e);return Co(o,t),bo(o,n),o})(e,n.itemAttributes,n.content);((e,t)=>{go(e.list,t),e.item=t})(t,o),((e,t)=>{En(e.list)!==t.listType&&(e.list=Bo(e.list,t.listType)),Co(e.list,t.listAttributes)})(t,n)}else if((e=>"isFragment"in e)(n))bo(t.item,n.content);else{const e=un.fromHtml(`\x3c!--${n.content}--\x3e`);go(t.list,e)}}),o},j_=e=>(q(e,(t,n)=>{((e,t)=>{const n=e[t].depth,o=e=>e.depth===n&&!e.dirty,r=e=>e.depthQ(e.slice(t+1),o,r))})(e,n).fold(()=>{t.dirty&&B_(t)&&(e=>{e.listAttributes=we(e.listAttributes,(e,t)=>"start"!==t)})(t)},e=>{return o=e,void(B_(n=t)&&B_(o)&&(n.listType=o.listType,n.listAttributes={...o.listAttributes}));var n,o})}),e),$_=(e,t,n,o)=>{if(kn(o))return[{depth:e+1,content:o.dom.nodeValue??"",dirty:!1,isSelected:!1,isComment:!0}];t.each(e=>{vn(e.start,o)&&n.set(!0)});const r=((e,t,n)=>Mn(e).filter(An).map(o=>({depth:t,dirty:!1,isSelected:n,content:I_(e),itemAttributes:ko(e),listAttributes:ko(o),listType:En(o),isInPreviousLi:!1})))(o,e,n.get());t.each(e=>{vn(e.end,o)&&n.set(!1)});const s=Kn(o).filter(b_).map(o=>V_(e,t,n,o)).getOr([]);return r.toArray().concat(s)},H_=(e,t,n,o)=>Wn(o).filter(b_).fold(()=>$_(e,t,n,o),r=>{const s=X(Vn(o),(o,s,a)=>{if(0===a)return o;if(y_(s))return o.concat($_(e,t,n,s));{const t={isFragment:!0,depth:e,content:[s],isSelected:!1,dirty:!1,parentListType:En(r)};return o.concat(t)}},[]);return V_(e,t,n,r).concat(s)}),V_=(e,t,n,o)=>ne(Vn(o),o=>(b_(o)?V_:H_)(e+1,t,n,o)),q_=(e,t)=>{const n=j_(t);return((e,t)=>{let n=I.none();const o=X(t,(t,o,r)=>P_(o)?0===r?(n=I.some(o),t):z_(e,t,o):o.depth>t.length?((e,t,n)=>{const o=((e,t,n)=>{const o=[];for(let r=0;r{for(let t=1;t{for(let t=0;t{B_(t)&&(Co(e.list,t.listAttributes),Co(e.item,t.itemAttributes)),bo(e.item,t.content)})})(o,n),r=o,$e(de(t),ce(r),F_),t.concat(o)})(e,t,o):z_(e,t,o),[]);return n.each(e=>{const t=un.fromHtml(`\x3c!--${e.content}--\x3e`);ce(o).each(e=>{fo(e.list,t)})}),ce(o).map(e=>e.list)})(e.contentDocument,n).toArray()},W_=(e,t,n)=>{const o=((e,t)=>{const n=Ae(!1);return V(e,e=>({sourceList:e,entries:V_(0,t,n,e)}))})(t,(e=>{const t=V(E_(e),un.fromDom);return $e(Z(t,T(v_)),Z(re(t),T(v_)),(e,t)=>({start:e,end:t}))})(e));q(o,t=>{((e,t,n)=>{q(Y(t,M_),t=>((e,t,n)=>{switch(t){case"Indent":if(!((e,t)=>bu(e).map(e=>e>=t).getOr(!0))(e,n.depth))return;n.depth++;break;case"Outdent":n.depth--;break;case"Flatten":n.depth=0}n.dirty=!0})(e,n,t))})(e,t.entries,n);const o=((e,t)=>ne(((e,t)=>{if(0===e.length)return[];{let n=t(e[0]);const o=[];let r=[];for(let s=0,a=e.length;sce(t).exists(L_)?q_(e,t):((e,t)=>{const n=j_(t);return V(n,t=>{const n=P_(t)?tr([un.fromHtml(`\x3c!--${t.content}--\x3e`)]):tr(t.content),o=B_(t)?t.itemAttributes:{};return un.fromDom(O_(e,n.dom,o))})})(e,t)))(e,t.entries);var r;q(o,t=>{T_(e,"Indent"===n?"IndentList":"OutdentList",t.dom)}),r=t.sourceList,q(o,e=>{mo(r,e)}),Ao(t.sourceList)})},K_=gi.DOM,Y_=On("dd"),G_=On("dt"),X_=e=>{G_(e)&&Bo(e,"dd")},Q_=(e,t,n)=>{q(n,"Indent"===t?X_:t=>((e,t)=>{Y_(t)?Bo(t,"dt"):G_(t)&&In(t).each(n=>((e,t,n)=>{const o=K_.select('span[data-mce-type="bookmark"]',t),r=O_(e,n),s=K_.createRng();s.setStartAfter(n),s.setEndAfter(t);const a=s.extractContents();for(let t=a.firstChild;t;t=t.firstChild)if("LI"===t.nodeName&&e.dom.isEmpty(t)){K_.remove(t);break}e.dom.isEmpty(a)||K_.insertAfter(a,t),K_.insertAfter(r,t);const i=n.parentElement;i&&m_(e.dom,i)&&(e=>{const t=e.parentNode;t&&dn.each(o,e=>{t.insertBefore(e,n.parentNode)}),K_.remove(e)})(i),K_.remove(n),m_(e.dom,t)&&K_.remove(t)})(e,n.dom,t.dom))})(e,t))},Z_=(e,t)=>{const n=Po((e=>{const t=(e=>{const t=k_(e,e.selection.getStart()),n=Y(e.selection.getSelectedBlocks(),o_);return t.toArray().concat(n)})(e),n=(e=>{const t=e.selection.getStart();return e.dom.getParents(t,"ol,ul",__(e,t,e.selection.isCollapsed()))})(e);return Z(n,e=>{return t=un.fromDom(e),Mn(t).exists(e=>r_(e.dom)&&Wn(e).exists(e=>!n_(e.dom))&&Kn(e).exists(e=>!n_(e.dom)));var t}).fold(()=>N_(e,t),e=>[e])})(e)),o=Po((e=>Y(E_(e),s_))(e));let r=!1;if(n.length||o.length){const s=e.selection.getBookmark();W_(e,n,t),Q_(e,t,o),e.selection.moveToBookmark(s),e.selection.setRng(h_(e.selection.getRng())),e.nodeChanged(),r=!0}return r},J_=(e,t)=>!(e=>{const t=S_(e);return R_(e,t)||!e.selection.isEditable()})(e)&&Z_(e,t),ek=e=>J_(e,"Indent"),tk=e=>J_(e,"Outdent"),nk=e=>J_(e,"Flatten"),ok=e=>{switch(e){case"UL":return"ToggleUlList";case"OL":return"ToggleOlList";case"DL":return"ToggleDLList"}},rk=(e,t)=>{dn.each(t,(t,n)=>{e.setAttribute(n,t)})},sk=(e,t,n)=>{((e,t,n)=>{const o=n["list-style-type"]?n["list-style-type"]:null;e.setStyle(t,"list-style-type",o)})(e,t,n),((e,t,n)=>{rk(t,n["list-attributes"]),dn.each(e.select("li",t),e=>{rk(e,n["list-item-attributes"])})})(e,t,n)},ak=(e,t)=>C(t)&&!c_(t,e.schema.getBlockElements()),ik=(e,t,n,o)=>{let r=t[n?"startContainer":"endContainer"];const s=t[n?"startOffset":"endOffset"];t_(r)&&(r=r.childNodes[Math.min(s,r.childNodes.length-1)]||r),!n&&i_(r.nextSibling)&&(r=r.nextSibling);const a=(t,n)=>{const r=new Kr(t,(t=>{for(;!e.dom.isBlock(t)&&t.parentNode&&o!==t;)t=t.parentNode;return t})(t)),s=n?"next":"prev";let a;for(;a=r[s]();)if(!d_(e,a)&&!mt(a.textContent)&&0!==a.textContent?.length)return I.some(a);return I.none()};if(n&&e_(r))if(mt(r.textContent))r=a(r,!1).getOr(r);else for(null!==r.parentNode&&ak(e,r.parentNode)&&(r=r.parentNode);null!==r.previousSibling&&(ak(e,r.previousSibling)||e_(r.previousSibling));)r=r.previousSibling;if(!n&&e_(r))if(mt(r.textContent))r=a(r,!0).getOr(r);else for(null!==r.parentNode&&ak(e,r.parentNode)&&(r=r.parentNode);null!==r.nextSibling&&(ak(e,r.nextSibling)||e_(r.nextSibling));)r=r.nextSibling;for(;r.parentNode!==o;){const t=r.parentNode;if(l_(e,r))return r;if(/^(TD|TH)$/.test(t.nodeName))return r;r=t}return r},lk=(e,t,n)=>{const o=e.selection.getRng();let r="LI";const s=__(e,((e,t)=>{const n=e.selection.getStart(!0),o=ik(e,t,!0,e.getBody());return r=un.fromDom(o),s=un.fromDom(t.commonAncestorContainer),Rr(r,D(vn,s))?t.commonAncestorContainer:n;var r,s})(e,o),o.collapsed),a=e.dom;if("false"===a.getContentEditable(e.selection.getNode()))return;"DL"===(t=t.toUpperCase())&&(r="DT");const i=Yy(o),l=Y(((e,t,n)=>{const o=[],r=e.dom,s=ik(e,t,!0,n),a=ik(e,t,!1,n);let i;const l=[];for(let e=s;e&&(l.push(e),e!==a);e=e.nextSibling);return dn.each(l,t=>{if(l_(e,t))return o.push(t),void(i=null);if(r.isBlock(t)||i_(t))return i_(t)&&r.remove(t),void(i=null);const s=t.nextSibling;sp.isBookmarkNode(t)&&(n_(s)||l_(e,s)||!s&&t.parentNode===n)?i=null:(i||(i=r.create("p"),t.parentNode?.insertBefore(i,t),o.push(i)),i.appendChild(t))}),o})(e,o,s),e.dom.isEditable);dn.each(l,o=>{let s;const i=o.previousSibling,l=o.parentNode;r_(l)||(i&&n_(i)&&i.nodeName===t&&((e,t,n)=>{const o=e.getStyle(t,"list-style-type");let r=n?n["list-style-type"]:"";return r=null===r?"":r,o===r})(a,i,n)?(s=i,o=a.rename(o,r),i.appendChild(o)):(s=a.create(t),l.insertBefore(s,o),s.appendChild(o),o=a.rename(o,r)),((e,t)=>{dn.each(["margin","margin-right","margin-bottom","margin-left","margin-top","padding","padding-right","padding-bottom","padding-left","padding-top"],n=>e.setStyle(t,n,""))})(a,o),sk(a,s,n),dk(e.dom,s))}),e.selection.setRng(Gy(i))},ck=(e,t,n)=>{return((e,t)=>n_(e)&&e.nodeName===t?.nodeName)(t,n)&&((e,t,n)=>e.getStyle(t,"list-style-type",!0)===e.getStyle(n,"list-style-type",!0))(e,t,n)&&(o=n,t.className===o.className);var o},dk=(e,t)=>{let n,o=t.nextSibling;if(ck(e,t,o)){const r=o;for(;n=r.firstChild;)t.appendChild(n);e.remove(r)}if(o=t.previousSibling,ck(e,t,o)){const r=o;for(;n=r.lastChild;)t.insertBefore(n,t.firstChild);e.remove(r)}},mk=(e,t,n,o)=>{if(t.nodeName!==n){const r=e.dom.rename(t,n);sk(e.dom,r,o),T_(e,ok(n),r)}else sk(e.dom,t,o),T_(e,ok(n),t)},uk=(e,t,n,o)=>{if(t.classList.forEach((e,n,o)=>{e.startsWith("tox-")&&(o.remove(e),0===o.length&&t.removeAttribute("class"))}),t.nodeName!==n){const r=e.dom.rename(t,n);sk(e.dom,r,o),T_(e,ok(n),r)}else sk(e.dom,t,o),T_(e,ok(n),t)},fk=e=>"list-style-type"in e,gk=(e,t,n)=>{const o=S_(e);if(D_(e,o))return;const r=(e=>{const t=S_(e),n=e.selection.getSelectedBlocks();return((e,t)=>C(e)&&1===t.length&&t[0]===e)(t,n)?(e=>Y(e.querySelectorAll(w_),n_))(t):Y(n,e=>n_(e)&&t!==e)})(e),s=f(n)?n:{};r.length>0?((e,t,n,o,r)=>{const s=n_(t);if(!s||t.nodeName!==o||fk(r)||A_(t)){lk(e,o,r);const a=Yy(e.selection.getRng()),i=s?[t,...n]:n,l=s&&A_(t)?uk:mk;dn.each(i,t=>{l(e,t,o,r)}),e.selection.setRng(Gy(a))}else nk(e)})(e,o,r,t,s):((e,t,n,o)=>{if(t!==e.getBody())if(t)if(t.nodeName!==n||fk(o)||A_(t)){const r=Yy(e.selection.getRng());A_(t)&&t.classList.forEach((e,n,o)=>{e.startsWith("tox-")&&(o.remove(e),0===o.length&&t.removeAttribute("class"))}),sk(e.dom,t,o);const s=e.dom.rename(t,n);dk(e.dom,s),e.selection.setRng(Gy(r)),lk(e,n,o),T_(e,ok(n),s)}else nk(e);else lk(e,n,o),T_(e,ok(n),t)})(e,o,t,s)},pk=(e,t,n,o)=>{let r=t.startContainer;const s=t.startOffset;if(e_(r)&&(n?s0))return r;const a=e.schema.getNonEmptyElements();t_(r)&&(r=Kp.getNode(r,s));const i=new Kr(r,o);n&&((e,t)=>!!i_(t)&&e.isBlock(t.nextSibling)&&!i_(t.previousSibling))(e.dom,r)&&i.next();const l=n?i.next.bind(i):i.prev2.bind(i);for(;r=l();){if("LI"===r.nodeName&&!r.hasChildNodes())return r;if(a[r.nodeName])return r;if(e_(r)&&r.data.length>0)return r}return null},hk=(e,t)=>{const n=t.childNodes;return 1===n.length&&!n_(n[0])&&e.isBlock(n[0])},bk=(e,t,n)=>{let o;const r=hk(e,n)?n.firstChild:n;if(((e,t)=>{var n;hk(e,t)&&(n=t.firstChild,I.from(n).map(un.fromDom).filter(Nn).exists(e=>Sr(e)&&!$(["details"],En(e))))&&e.remove(t.firstChild,!0)})(e,t),!m_(e,t,!0))for(;o=t.firstChild;)r.appendChild(o)},yk=(e,t,n)=>{let o;const r=t.parentNode;if(!u_(e,t)||!u_(e,n))return;n_(n.lastChild)&&(o=n.lastChild),r===n.lastChild&&i_(r.previousSibling)&&e.remove(r.previousSibling);const s=n.lastChild;s&&i_(s)&&t.hasChildNodes()&&e.remove(s),m_(e,n,!0)&&No(un.fromDom(n)),bk(e,t,n),o&&n.appendChild(o);const a=Cn(un.fromDom(n),un.fromDom(t))?e.getParents(t,n_,n):[];e.remove(t),q(a,t=>{m_(e,t)&&t!==e.getRoot()&&e.remove(t)})},vk=(e,t)=>{const n=e.dom,o=e.selection,r=o.getStart(),s=x_(e,r),a=n.getParent(o.getStart(),"LI",s);if(a){const r=a.parentElement;if(r===e.getBody()&&m_(n,r))return!0;const i=h_(o.getRng()),l=n.getParent(pk(e,i,t,s),"LI",s),c=l&&(t?n.isChildOf(a,l):n.isChildOf(l,a));if(l&&l!==a&&!c)return e.undoManager.transact(()=>{var n;t?((e,t,n,o)=>{const r=e.dom;if(r.isEmpty(o))((e,t,n)=>{No(un.fromDom(n)),yk(e.dom,t,n),e.selection.setCursorLocation(n,0)})(e,n,o);else{const s=Yy(t);yk(r,n,o),e.selection.setRng(Gy(s))}})(e,i,l,a):(n=a,n.parentNode?.firstChild===n?tk(e):((e,t,n,o)=>{const r=Yy(t);yk(e.dom,n,o);const s=Gy(r);e.selection.setRng(s)})(e,i,a,l))}),!0;if(c&&!t&&l!==a){const t=i.commonAncestorContainer.parentElement;return!(!t||n.isChildOf(l,t)||(e.undoManager.transact(()=>{const o=Yy(i);bk(n,t,l),t.remove();const r=Gy(o);e.selection.setRng(r)}),0))}if(!l&&!t&&0===i.startOffset&&0===i.endOffset)return e.undoManager.transact(()=>{nk(e)}),!0}return!1},Ck=e=>{const t=e.selection.getStart(),n=x_(e,t),o=e.dom.getParent(t,"LI,DT,DD",n);return C(o)||E_(e).length>0},wk=(e,t)=>{const n=e.selection;return!D_(e,n.getNode())&&(n.isCollapsed()?((e,t)=>vk(e,t)||((e,t)=>{const n=e.dom,o=e.selection.getStart(),r=x_(e,o),s=n.getParent(o,n.isBlock,r);if(s&&n.isEmpty(s,void 0,{checkRootAsContent:!0})){const o=h_(e.selection.getRng()),a=pk(e,o,t,r),i=n.getParent(a,"LI",r);if(a&&i&&(t||!n.isChildOf(a,s))){const l=e=>$(["td","th","caption"],En(e)),c=e=>e.dom===r,d=lr(un.fromDom(i),l,c),m=lr(un.fromDom(o.startContainer),l,c);return!!je(d,m,vn)&&(e.undoManager.transact(()=>{const o=i.parentNode;((e,t,n)=>{const o=e.getParent(t.parentNode,e.isBlock,n);e.remove(t),o&&e.isEmpty(o)&&e.remove(o)})(n,s,r),dk(n,o),e.selection.select(a,!0),e.selection.collapse(t)}),!0)}}return!1})(e,t))(e,t):((e,t)=>!!Ck(e)&&(e.undoManager.transact(()=>{Zx(e,t,()=>e.execCommand("Delete"))&&g_(e.dom,e.getBody())}),!0))(e,t))},Sk=(e,t)=>({from:e,to:t}),Ek=(e,t)=>{const n=un.fromDom(e),o=un.fromDom(t.container());return iy(n,o).map(e=>((e,t)=>({block:e,position:t}))(e,t))},xk=(e,t)=>lr(t,e=>Hi(e)||ys(e.dom),t=>vn(t,e)).filter(An).getOr(e),_k=(e,t)=>{const n=((e,t)=>{const n=Vn(e);return J(n,e=>t.isBlock(En(e))).fold(N(n),e=>n.slice(0,e))})(e,t);return q(n,Ao),n},kk=(e,t,n)=>{const o=cb(n,t);return Z(o.reverse(),t=>Ls(e,t)).each(Ao)},Nk=(e,t,n,o,r)=>{if(Ls(o,n))return Wi(n),Af(n.dom);((e,t)=>0===Y($n(t),t=>!Ls(e,t)).length)(o,r)&&Ls(o,t)&&mo(r,un.fromTag("br"));const s=Nf(n.dom,Kl.before(r.dom));return q(_k(t,o),e=>{mo(r,e)}),kk(o,e,t),s},Ak=(e,t,n,o)=>{if(Ls(o,n)){if(Ls(o,t)){const e=e=>{const t=(e,n)=>Wn(e).fold(()=>n,e=>((e,t)=>e.isInline(En(t)))(o,e)?t(e,n.concat(To(e))):n);return t(e,[])},r=G(e(n),(e,t)=>(po(e,t),t),qi());No(t),go(t,r)}return Ao(n),Af(t.dom)}const r=Rf(n.dom);return q(_k(t,o),e=>{go(n,e)}),kk(o,e,t),r},Rk=(e,t)=>{_f(e,t.dom).bind(e=>I.from(e.getNode())).map(un.fromDom).filter(Mi).each(Ao)},Dk=(e,t,n,o)=>(Rk(!0,t),Rk(!1,n),((e,t)=>Cn(t,e)?((e,t)=>{const n=cb(t,e);return I.from(n[n.length-1])})(t,e):I.none())(t,n).fold(D(Ak,e,t,n,o),D(Nk,e,t,n,o))),Tk=(e,t,n,o,r)=>t?Dk(e,o,n,r):Dk(e,n,o,r),Ok=(e,t)=>{const n=un.fromDom(e.getBody()),o=((e,t,n,o)=>o.collapsed?((e,t,n,o)=>{const r=Ek(t,Kl.fromRangeStart(o)),s=r.bind(o=>Sf(n,t,o.position).bind(o=>Ek(t,o).map(o=>((e,t,n,o)=>ps(o.position.getNode())&&!Ls(e,o.block)?_f(!1,o.block.dom).bind(e=>e.isEqual(o.position)?Sf(n,t,e).bind(e=>Ek(t,e)):I.some(o)).getOr(o):o)(e,t,n,o))));return $e(r,s,Sk).filter(e=>(e=>!vn(e.from.block,e.to.block))(e)&&((e,t)=>{const n=un.fromDom(e);return vn(xk(n,t.from.block),xk(n,t.to.block))})(t,e)&&(e=>!1===vs(e.from.block.dom)&&!1===vs(e.to.block.dom))(e)&&(e=>{const t=e=>Ui(e)||Gs(e.dom)||ji(e);return t(e.from.block)&&t(e.to.block)})(e)&&(e=>!(Cn(e.to.block,e.from.block)||Cn(e.from.block,e.to.block)))(e))})(e,t,n,o):I.none())(e.schema,n.dom,t,e.selection.getRng()).map(o=>()=>{Tk(n,t,o.from.block,o.to.block,e.schema).each(t=>{e.selection.setRng(t.toRange())})});return o},Bk=(e,t)=>{const n=un.fromDom(t),o=D(vn,e);return ir(n,Hi,o).isSome()},Pk=e=>{const t=un.fromDom(e.getBody());return((e,t)=>{const n=Nf(e.dom,Kl.fromRangeStart(t)).isNone(),o=kf(e.dom,Kl.fromRangeEnd(t)).isNone();return!((e,t)=>Bk(e,t.startContainer)||Bk(e,t.endContainer))(e,t)&&n&&o})(t,e.selection.getRng())?(e=>I.some(()=>{e.setContent(""),e.selection.setCursorLocation()}))(e):((e,t,n)=>{const o=t.getRng();return $e(iy(e,un.fromDom(o.startContainer)),iy(e,un.fromDom(o.endContainer)),(r,s)=>vn(r,s)?I.none():I.some(()=>{o.deleteContents(),Tk(e,!0,r,s,n).each(e=>{t.setRng(e.toRange())})})).getOr(I.none())})(t,e.selection,e.schema)},Lk=(e,t)=>e.selection.isCollapsed()?I.none():Pk(e),Mk=(e,t,n,o,r)=>I.from(t._selectionOverrides.showCaret(e,n,o,r)),Ik=(e,t)=>e.dispatch("BeforeObjectSelected",{target:t}).isDefaultPrevented()?I.none():I.some((e=>{const t=e.ownerDocument.createRange();return t.selectNode(e),t})(t)),Fk=(e,t,n)=>t.collapsed?((e,t,n)=>{const o=tf(1,e.getBody(),t),r=Kl.fromRangeStart(o),s=r.getNode();if(Ou(s))return Mk(1,e,s,!r.isAtEnd(),!1);const a=r.getNode(!0);if(Ou(a))return Mk(1,e,a,!1,!1);const i=Fy(e.dom.getRoot(),r.getNode());return Ou(i)?Mk(1,e,i,!1,n):I.none()})(e,t,n).getOr(t):t,Uk=e=>ab(e)||nb(e),zk=e=>ib(e)||ob(e),jk=(e,t,n,o,r,s)=>{Mk(o,e,s.getNode(!r),r,!0).each(n=>{if(t.collapsed){const e=t.cloneRange();r?e.setEnd(n.startContainer,n.startOffset):e.setStart(n.endContainer,n.endOffset),e.deleteContents()}else t.deleteContents();e.selection.setRng(n)}),((e,t)=>{cs(t)&&0===t.data.length&&e.remove(t)})(e.dom,n)},$k=(e,t)=>((e,t)=>{const n=e.selection.getRng();if(!cs(n.commonAncestorContainer))return I.none();const o=t?1:-1,r=yf(e.getBody()),s=D(sf,t?r.next:r.prev),a=t?Uk:zk,i=of(o,e.getBody(),n),l=s(i),c=l?ey(t,l):l;if(!c||!af(i,c))return I.none();if(a(c))return I.some(()=>jk(e,n,i.getNode(),o,t,c));const d=s(c);return d&&a(d)&&af(c,d)?I.some(()=>jk(e,n,i.getNode(),o,t,d)):I.none()})(e,t),Hk=(e,t)=>{const n=e.getBody();return t?Af(n).filter(ab):Rf(n).filter(ib)},Vk=e=>{const t=e.selection.getRng();return!t.collapsed&&(Hk(e,!0).exists(e=>e.isEqual(Kl.fromRangeStart(t)))||Hk(e,!1).exists(e=>e.isEqual(Kl.fromRangeEnd(t))))},qk=Ne([{remove:["element"]},{moveToElement:["element"]},{moveToPosition:["position"]}]),Wk=(e,t,n,o)=>Sf(t,e,n).bind(r=>{return s=r.getNode(),C(s)&&(Hi(un.fromDom(s))||ji(un.fromDom(s)))||((e,t,n,o,r)=>{const s=t=>r.isInline(t.nodeName.toLowerCase())&&!Yu(n,o,e);return nf(!t,n).fold(()=>nf(t,o).fold(L,s),s)})(e,t,n,r,o)?I.none():t&&vs(r.getNode())||!t&&vs(r.getNode(!0))?((e,t,n,o,r)=>{const s=r.getNode(!n);return iy(un.fromDom(t),un.fromDom(o.getNode())).map(t=>Ls(e,t)?qk.remove(t.dom):qk.moveToElement(s)).orThunk(()=>I.some(qk.moveToElement(s)))})(o,e,t,n,r):t&&ib(n)||!t&&ab(n)?I.some(qk.moveToPosition(r)):I.none();var s}),Kk=(e,t)=>I.from(Fy(e.getBody(),t)),Yk=(e,t)=>{const n=e.selection.getNode();return Kk(e,n).filter(vs).fold(()=>((e,t,n,o)=>{const r=tf(t?1:-1,e,n),s=Kl.fromRangeStart(r),a=un.fromDom(e);return!t&&ib(s)?I.some(qk.remove(s.getNode(!0))):t&&ab(s)?I.some(qk.remove(s.getNode())):!t&&ab(s)&&wb(a,s,o)?Sb(a,s,o).map(e=>qk.remove(e.getNode())):t&&ib(s)&&Cb(a,s,o)?Eb(a,s,o).map(e=>qk.remove(e.getNode())):((e,t,n,o)=>((e,t)=>{const n=t.getNode(!e),o=e?"after":"before";return es(n)&&n.getAttribute("data-mce-caret")===o})(t,n)?((e,t)=>v(t)?I.none():e&&vs(t.nextSibling)?I.some(qk.moveToElement(t.nextSibling)):!e&&vs(t.previousSibling)?I.some(qk.moveToElement(t.previousSibling)):I.none())(t,n.getNode(!t)).orThunk(()=>Wk(e,t,n,o)):Wk(e,t,n,o).bind(t=>((e,t,n)=>n.fold(e=>I.some(qk.remove(e)),e=>I.some(qk.moveToElement(e)),n=>Yu(t,n,e)?I.none():I.some(qk.moveToPosition(n))))(e,n,t)))(e,t,s,o)})(e.getBody(),t,e.selection.getRng(),e.schema).map(n=>()=>n.fold(((e,t)=>n=>(e._selectionOverrides.hideFakeCaret(),Gb(e,t,un.fromDom(n)),!0))(e,t),((e,t)=>n=>{const o=t?Kl.before(n):Kl.after(n);return e.selection.setRng(o.toRange()),!0})(e,t),(e=>t=>(e.selection.setRng(t.toRange()),!0))(e))),()=>I.some(x))},Gk=e=>{const t=e.dom,n=e.selection,o=Fy(e.getBody(),n.getNode());if(ys(o)&&t.isBlock(o)&&t.isEmpty(o)){const e=t.create("br",{"data-mce-bogus":"1"});t.setHTML(o,""),o.appendChild(e),n.setRng(Kl.before(e).toRange())}return!0},Xk=(e,t)=>e.selection.isCollapsed()?Yk(e,t):((e,t)=>{const n=e.selection.getNode();return vs(n)&&!ws(n)?Kk(e,n.parentNode).filter(vs).fold(()=>I.some(()=>{var n;n=un.fromDom(e.getBody()),q(Ar(n,".mce-offscreen-selection"),Ao),Gb(e,t,un.fromDom(e.selection.getNode())),ly(e)}),()=>I.some(x)):Vk(e)?I.some(()=>{my(e,e.selection.getRng(),un.fromDom(e.getBody()))}):I.none()})(e,t),Qk=(e,t)=>{const n=e.dom,o=n.getParent(e.selection.getStart(),n.isBlock),r=n.getParent(e.selection.getEnd(),n.isBlock),s=e.getBody(),a=o?.nodeName?.toLowerCase();if("div"===a&&o&&r&&o===s.firstChild&&r===s.lastChild&&!n.isEmpty(s)){const n=o.cloneNode(!1),r=()=>{if(t?sy(e):ry(e),s.firstChild!==o){const t=Yy(e.selection.getRng(),()=>document.createElement("span"));Array.from(s.childNodes).forEach(e=>n.appendChild(e)),s.appendChild(n),e.selection.setRng(Gy(t))}};return I.some(r)}return I.none()},Zk=(e,t)=>e.selection.isCollapsed()?((e,t)=>{const n=Kl.fromRangeStart(e.selection.getRng());return Sf(t,e.getBody(),n).filter(e=>t?eb(e):tb(e)).bind(e=>Gu(t?0:-1,e)).map(t=>()=>e.selection.select(t))})(e,t):I.none(),Jk=cs,eN=e=>Jk(e)&&e.data[0]===Ki,tN=e=>Jk(e)&&e.data[e.data.length-1]===Ki,nN=e=>(e.ownerDocument??document).createTextNode(Ki),oN=(e,t)=>e?(e=>{if(Jk(e.previousSibling))return tN(e.previousSibling)||e.previousSibling.appendData(Ki),e.previousSibling;if(Jk(e))return eN(e)||e.insertData(0,Ki),e;{const t=nN(e);return e.parentNode?.insertBefore(t,e),t}})(t):(e=>{if(Jk(e.nextSibling))return eN(e.nextSibling)||e.nextSibling.insertData(0,Ki),e.nextSibling;if(Jk(e))return tN(e)||e.appendData(Ki),e;{const t=nN(e);return e.nextSibling?e.parentNode?.insertBefore(t,e.nextSibling):e.parentNode?.appendChild(t),t}})(t),rN=D(oN,!0),sN=D(oN,!1),aN=(e,t)=>cs(e.container())?oN(t,e.container()):oN(t,e.getNode()),iN=(e,t)=>{const n=t.get();return n&&e.container()===n&&Ji(n)},lN=(e,t)=>t.fold(t=>{_u(e.get());const n=rN(t);return e.set(n),I.some(Kl(n,n.length-1))},t=>Af(t).map(t=>{if(iN(t,e)){const t=e.get();return Kl(t,1)}{_u(e.get());const n=aN(t,!0);return e.set(n),Kl(n,1)}}),t=>Rf(t).map(t=>{if(iN(t,e)){const t=e.get();return Kl(t,t.length-1)}{_u(e.get());const n=aN(t,!1);return e.set(n),Kl(n,n.length-1)}}),t=>{_u(e.get());const n=sN(t);return e.set(n),I.some(Kl(n,1))}),cN=(e,t)=>{for(let n=0;nKu(t,e)||e,uN=(e,t,n)=>{const o=ty(n),r=mN(t,o.container());return Jb(e,r,o).fold(()=>kf(r,o).bind(D(Jb,e,r)).map(e=>dN.before(e)),I.none)},fN=(e,t)=>null===Of(e,t),gN=(e,t,n)=>Jb(e,t,n).filter(D(fN,t)),pN=(e,t,n)=>{const o=ny(n);return gN(e,t,o).bind(e=>Nf(e,o).isNone()?I.some(dN.start(e)):I.none())},hN=(e,t,n)=>{const o=ty(n);return gN(e,t,o).bind(e=>kf(e,o).isNone()?I.some(dN.end(e)):I.none())},bN=(e,t,n)=>{const o=ny(n),r=mN(t,o.container());return Jb(e,r,o).fold(()=>Nf(r,o).bind(D(Jb,e,r)).map(e=>dN.after(e)),I.none)},yN=e=>!Zb(CN(e)),vN=(e,t,n)=>cN([uN,pN,hN,bN],[e,t,n]).filter(yN),CN=e=>e.fold(A,A,A,A),wN=e=>e.fold(N("before"),N("start"),N("end"),N("after")),SN=e=>e.fold(dN.before,dN.before,dN.after,dN.after),EN=e=>e.fold(dN.start,dN.start,dN.end,dN.end),xN=(e,t,n,o,r,s)=>$e(Jb(t,n,o),Jb(t,n,r),(t,o)=>t!==o&&((e,t,n)=>{const o=Ku(t,e),r=Ku(n,e);return C(o)&&o===r})(n,t,o)?dN.after(e?t:o):s).getOr(s),_N=(e,t)=>e.fold(M,e=>{return o=t,!(wN(n=e)===wN(o)&&CN(n)===CN(o));var n,o}),kN=(e,t)=>e?t.fold(_(I.some,dN.start),I.none,_(I.some,dN.after),I.none):t.fold(I.none,_(I.some,dN.before),I.none,_(I.some,dN.end)),NN=(e,t,n)=>{const o=e?1:-1;return t.setRng(Kl(n.container(),n.offset()+o).toRange()),t.getSel().modify("move",e?"forward":"backward","word"),!0};var AN;!function(e){e[e.Br=0]="Br",e[e.Block=1]="Block",e[e.Wrap=2]="Wrap",e[e.Eol=3]="Eol"}(AN||(AN={}));const RN=(e,t)=>-1===e?re(t):t,DN=(e,t,n)=>1===e?t.next(n):t.prev(n),TN=(e,t,n,o)=>ps(o.getNode(1===t))?AN.Br:!1===Yu(n,o)?AN.Block:AN.Wrap,ON=(e,t,n,o)=>{const r=yf(n);let s=o;const a=[];for(;s;){const n=DN(t,r,s);if(!n)break;if(ps(n.getNode(!1)))return 1===t?{positions:RN(t,a).concat([n]),breakType:AN.Br,breakAt:I.some(n)}:{positions:RN(t,a),breakType:AN.Br,breakAt:I.some(n)};if(n.isVisible()){if(e(s,n)){const e=TN(0,t,s,n);return{positions:RN(t,a),breakType:e,breakAt:I.some(n)}}a.push(n),s=n}else s=n}return{positions:RN(t,a),breakType:AN.Eol,breakAt:I.none()}},BN=(e,t,n,o)=>t(n,o).breakAt.map(o=>{const r=t(n,o).positions;return-1===e?r.concat(o):[o].concat(r)}).getOr([]),PN=(e,t)=>X(e,(e,n)=>e.fold(()=>I.some(n),o=>$e(ce(o.getClientRects()),ce(n.getClientRects()),(e,r)=>{const s=Math.abs(t-e.left);return Math.abs(t-r.left)<=s?n:o}).or(e)),I.none()),LN=(e,t)=>ce(t.getClientRects()).bind(t=>PN(e,t.left)),MN=D(ON,Kl.isAbove,-1),IN=D(ON,Kl.isBelow,1),FN=D(BN,-1,MN),UN=D(BN,1,IN),zN=(e,t)=>MN(e,t).breakAt.isNone(),jN=(e,t)=>IN(e,t).breakAt.isNone(),$N=(e,t)=>LN(FN(e,t),t),HN=(e,t)=>LN(UN(e,t),t),VN=vs,qN=(e,t)=>Math.abs(e.left-t),WN=(e,t)=>Math.abs(e.right-t),KN=(e,t)=>yt(e,(e,n)=>{const o=Math.min(qN(e,t),WN(e,t)),r=Math.min(qN(n,t),WN(n,t));return r===o&&ke(n,"node")&&VN(n.node)||r{const t=t=>V(t,t=>{const n=cl(t);return n.node=e,n});if(es(e))return t(e.getClientRects());if(cs(e)){const n=e.ownerDocument.createRange();return n.setStart(e,0),n.setEnd(e,e.data.length),t(n.getClientRects())}return[]},GN=e=>ne(e,YN);var XN;!function(e){e[e.Up=-1]="Up",e[e.Down=1]="Down"}(XN||(XN={}));const QN=(e,t,n,o,r,s)=>{let a=0;const i=[],l=o=>{let s=GN([o]);e===XN.Up&&(s=s.reverse());for(let e=0;e0&&t(o,Ct(i))&&a++,o.line=a,r(o))return!0;i.push(o)}}return!1},c=Ct(s.getClientRects());if(!c)return i;const d=s.getNode();return d&&(l(d),((e,t,n,o)=>{let r=o;for(;r=Vu(r,e,Rl,t);)if(n(r))return})(e,o,l,d)),i},ZN=D(QN,XN.Up,ul,fl),JN=D(QN,XN.Down,fl,ul),eA=e=>Ct(e.getClientRects()),tA=e=>t=>((e,t)=>t.line>e)(e,t),nA=e=>t=>((e,t)=>t.line===e)(e,t),oA=(e,t)=>{e.selection.setRng(t),mh(e,e.selection.getRng())},rA=(e,t,n)=>I.some(Fk(e,t,n)),sA=(e,t)=>{const n=e.getNode(-1===t);return C(n)&&qu(n)?I.some(n):I.none()},aA=(e,t)=>{const n=e.dom.createRng();return n.selectNode(t),n},iA=(e,t,n,o,r,s)=>{const a=1===t,i=yf(e.getBody()),l=D(sf,a?i.next:i.prev),c=a?o:r;if(!n.collapsed){const o=pl(n);if(s(o)){if(qu(o)){const o=of(t,e.getBody(),n);return I.from(l(o)).map(e=>e.toRange())}return Mk(t,e,o,-1===t,!1)}if(Vk(e)){const e=n.cloneRange();return e.collapse(-1===t),I.from(e)}}const d=of(t,e.getBody(),n);if(c(d))return Ik(e,d.getNode(!a));let m=l(d);const u=il(n);if(!m)return u?I.some(n):I.none();if(m=ey(a,m),c(m))return sA(m,t).fold(()=>Mk(t,e,m?.getNode(!a),a,!1),t=>I.some(aA(e,t)));const f=l(m);return f&&c(f)&&af(m,f)?sA(m,t).fold(()=>Mk(t,e,f.getNode(!a),a,!1),t=>I.some(aA(e,t))):u?rA(e,m.toRange(),!1):I.none()},lA=(e,t,n,o,r,s)=>{const a=of(t,e.getBody(),n),i=Ct(a.getClientRects()),l=t===XN.Down,c=e.getBody();if(!i)return I.none();if(Vk(e)){const e=l?Kl.fromRangeEnd(n):Kl.fromRangeStart(n);return(l?HN:$N)(c,e).orThunk(()=>I.from(e)).map(e=>e.toRange())}const d=(l?JN:ZN)(c,tA(1),a),m=Y(d,nA(1)),u=i.left,f=KN(m,u);if(f&&s(f.node)){const n=Math.abs(u-f.left),o=Math.abs(u-f.right);return Mk(t,e,f.node,n{const r=yf(t);let s,a,i,l;const c=[];let d=0;e===XN.Down?(s=r.next,a=fl,i=ul,l=Kl.after(o)):(s=r.prev,a=ul,i=fl,l=Kl.before(o));const m=eA(l);do{if(!l.isVisible())continue;const e=eA(l);if(i(e,m))continue;c.length>0&&a(e,Ct(c))&&d++;const t=cl(e);if(t.position=l,t.line=d,n(t))return c;c.push(t)}while(l=s(l));return c})(t,c,tA(1),g);let o=KN(Y(n,nA(1)),u);if(o)return rA(e,o.position.toRange(),!1);if(o=Ct(Y(n,nA(0))),o)return rA(e,o.position.toRange(),!1)}return 0===m.length?cA(e,l).filter(l?r:o).map(t=>Fk(e,t.toRange(),!1)):I.none()},cA=(e,t)=>{const n=e.selection.getRng(),o=t?Kl.fromRangeEnd(n):Kl.fromRangeStart(n),r=(s=o.container(),a=e.getBody(),ir(un.fromDom(s),e=>Pu(e.dom),e=>e.dom===a).map(e=>e.dom).getOr(a));var s,a;if(t){const e=IN(r,o);return de(e.positions)}{const e=MN(r,o);return ce(e.positions)}},dA=(e,t,n)=>cA(e,t).filter(n).exists(t=>(e.selection.setRng(t.toRange()),!0)),mA=(e,t)=>{const n=e.dom.createRng();n.setStart(t.container(),t.offset()),n.setEnd(t.container(),t.offset()),e.selection.setRng(n)},uA=(e,t)=>{e?t.setAttribute("data-mce-selected","inline-boundary"):t.removeAttribute("data-mce-selected")},fA=(e,t,n)=>lN(t,n).map(t=>(mA(e,t),n)),gA=(e,t,n)=>{const o=e.getBody(),r=((e,t,n)=>{const o=Kl.fromRangeStart(e);if(e.collapsed)return o;{const r=Kl.fromRangeEnd(e);return n?Nf(t,r).getOr(r):kf(t,o).getOr(o)}})(e.selection.getRng(),o,n);return((e,t,n,o)=>{const r=ey(e,o),s=vN(t,n,r);return vN(t,n,r).bind(D(kN,e)).orThunk(()=>((e,t,n,o,r)=>{const s=ey(e,r);return Sf(e,n,s).map(D(ey,e)).fold(()=>o.map(SN),r=>vN(t,n,r).map(D(xN,e,t,n,s,r)).filter(D(_N,o))).filter(yN)})(e,t,n,s,o))})(n,D(Qb,e),o,r).bind(n=>fA(e,t,n))},pA=(e,t,n)=>!!im(e)&&gA(e,t,n).isSome(),hA=(e,t,n)=>!!im(t)&&((e,t)=>{const n=t.selection.getRng(),o=e?Kl.fromRangeEnd(n):Kl.fromRangeStart(n);return!!(e=>w(e.selection.getSel().modify))(t)&&(e&&nl(o)?NN(!0,t.selection,o):!(e||!ol(o))&&NN(!1,t.selection,o))})(e,t),bA=e=>{const t=Ae(null),n=D(Qb,e);return e.on("NodeChange",o=>{im(e)&&(((e,t,n)=>{const o=V(Ar(un.fromDom(t.getRoot()),'*[data-mce-selected="inline-boundary"]'),e=>e.dom),r=Y(o,e),s=Y(n,e);q(se(r,s),D(uA,!1)),q(se(s,r),D(uA,!0))})(n,e.dom,o.parents),((e,t)=>{const n=t.get();if(e.selection.isCollapsed()&&!e.composing&&n){const o=Kl.fromRangeStart(e.selection.getRng());Kl.isTextPosition(o)&&!(e=>nl(e)||ol(e))(o)&&(mA(e,xu(n,o)),t.set(null))}})(e,t),((e,t,n,o)=>{if(t.selection.isCollapsed()){const r=Y(o,e);q(r,o=>{const r=Kl.fromRangeStart(t.selection.getRng());vN(e,t.getBody(),r).bind(e=>fA(t,n,e))})}})(n,e,t,o.parents))}),t},yA=D(hA,!0),vA=D(hA,!1),CA=(e,t,n)=>{if(im(e)){const o=cA(e,t).getOrThunk(()=>{const n=e.selection.getRng();return t?Kl.fromRangeEnd(n):Kl.fromRangeStart(n)});return vN(D(Qb,e),e.getBody(),o).exists(t=>{const o=SN(t);return lN(n,o).exists(t=>(mA(e,t),!0))})}return!1},wA=(e,t)=>n=>lN(t,n).map(t=>()=>mA(e,t)),SA=(e,t,n,o)=>{const r=e.getBody(),s=D(Qb,e);e.undoManager.ignore(()=>{e.selection.setRng(((e,t)=>{const n=document.createRange();return n.setStart(e.container(),e.offset()),n.setEnd(t.container(),t.offset()),n})(n,o)),ry(e),vN(s,r,Kl.fromRangeStart(e.selection.getRng())).map(EN).bind(wA(e,t)).each(P)}),e.nodeChanged()},EA=(e,t,n)=>{if(e.selection.isCollapsed()&&im(e)){const o=Kl.fromRangeStart(e.selection.getRng());return((e,t,n,o)=>{const r=((e,t)=>Ku(t,e)||e)(e.getBody(),o.container()),s=D(Qb,e),a=vN(s,r,o);return a.bind(e=>n?e.fold(N(I.some(EN(e))),I.none,N(I.some(SN(e))),I.none):e.fold(I.none,N(I.some(SN(e))),I.none,N(I.some(EN(e))))).map(wA(e,t)).getOrThunk(()=>{const i=Ef(n,r,o),l=i.bind(e=>vN(s,r,e));return $e(a,l,()=>Jb(s,r,o).bind(t=>(e=>$e(Af(e),Rf(e),(t,n)=>{const o=ey(!0,t),r=ey(!1,n);return kf(e,o).forall(e=>e.isEqual(r))}).getOr(!0))(t)?I.some(()=>{Gb(e,n,un.fromDom(t))}):I.none())).getOrThunk(()=>l.bind(()=>i.map(r=>()=>{n?SA(e,t,o,r):SA(e,t,r,o)})))})})(e,t,n,o)}return I.none()},xA=(e,t)=>{const n=un.fromDom(e.getBody()),o=un.fromDom(e.selection.getStart()),r=cb(o,n);return J(r,t).fold(N(r),e=>r.slice(0,e))},_A=e=>1===Yn(e),kA=(e,t)=>{const n=D(bv,e);return ne(t,e=>n(e)?[e.dom]:[])},NA=e=>{const t=(e=>xA(e,t=>e.schema.isBlock(En(t))))(e);return kA(e,t)},AA=(e,t)=>{const n=Y((e=>xA(e,t=>e.schema.isBlock(En(t))||(e=>Yn(e)>1)(t)))(e),_A);return de(n).bind(o=>{const r=Kl.fromRangeStart(e.selection.getRng());return cy(t,r,o.dom)&&!Rg(o)?I.some(()=>((e,t,n,o)=>{const r=kA(t,o);if(0===r.length)Gb(t,e,n);else{const e=hv(n.dom,r);t.selection.setRng(e.toRange())}})(t,e,o,n)):I.none()})},RA=(e,t)=>{const n=e.selection.getStart(),o=((e,t)=>{const n=t.parentElement;return ps(t)&&!h(n)&&e.dom.isEmpty(n)})(e,n)||Rg(un.fromDom(n))?hv(n,t):((e,t)=>{const{caretContainer:n,caretPosition:o}=pv(t);return e.insertNode(n.dom),o})(e.selection.getRng(),t);e.selection.setRng(o.toRange())},DA=(e,t)=>{const n=se(t,NA(e));n.length>0&&RA(e,n)},TA=e=>cs(e.startContainer),OA=e=>{const t=e.selection.getRng();return(e=>0===e.startOffset&&TA(e))(t)&&((e,t)=>{const n=t.startContainer.parentElement;return!h(n)&&bv(e,un.fromDom(n))})(e,t)&&(e=>(e=>(e=>{const t=e.startContainer.parentNode,n=e.endContainer.parentNode;return!h(t)&&!h(n)&&t.isEqualNode(n)})(e)&&(e=>{const t=e.endContainer;return e.endOffset===(cs(t)?t.length:t.childNodes.length)})(e))(e)||(e=>!e.endContainer.isEqualNode(e.commonAncestorContainer))(e))(t)},BA=(e,t)=>e.selection.isCollapsed()?AA(e,t):(e=>{if(OA(e)){const t=NA(e);return I.some(()=>{ry(e),DA(e,t)})}return I.none()})(e),PA=e=>((e=>{const t=e.selection.getRng();return t.collapsed&&(TA(t)||e.dom.isEmpty(t.startContainer))&&!(e=>{return t=un.fromDom(e.selection.getStart()),n=e.schema,Rr(t,e=>Tf(e.dom),e=>n.isBlock(En(e)));var t,n})(e)})(e)&&RA(e,[]),!0),LA=(e,t,n)=>C(n)?I.some(()=>{e._selectionOverrides.hideFakeCaret(),Gb(e,t,un.fromDom(n))}):I.none(),MA=(e,t)=>e.selection.isCollapsed()?((e,t)=>{const n=t?nb:ob,o=of(t?1:-1,e.getBody(),e.selection.getRng());return n(o)?LA(e,t,o.getNode(!t)):I.from(ey(t,o)).filter(e=>n(e)&&af(o,e)).bind(n=>LA(e,t,n.getNode(!t)))})(e,t):((e,t)=>{const n=e.selection.getNode();return xs(n)?LA(e,t,n):I.none()})(e,t),IA=e=>st(e??"").getOr(0),FA=(e,t)=>(e||"table"===En(t)?"margin":"padding")+("rtl"===$o(t,"direction")?"-right":"-left"),UA=e=>{const t=jA(e);return!e.mode.isReadOnly()&&(t.length>1||((e,t)=>oe(t,t=>{const n=FA(Vd(e),t),o=Vo(t,n).map(IA).getOr(0);return"false"!==e.dom.getContentEditable(t.dom)&&o>0}))(e,t))},zA=e=>zi(e)||ji(e),jA=e=>{const t=Qf(e);return 0===t.length?Y(Po(e.selection.getSelectedBlocks()),e=>!zA(e)&&!(e=>Mn(e).exists(zA))(e)&&lr(e,e=>ys(e.dom)||vs(e.dom)).exists(e=>ys(e.dom))):t},$A=(e,t)=>{if(e.mode.isReadOnly())return;const{dom:n}=e,o=qd(e),r=/[a-z%]+$/i.exec(o)?.[0]??"px",s=IA(o),a=Vd(e);q(jA(e),e=>{((e,t,n,o,r,s)=>{const a=FA(n,un.fromDom(s)),i=IA(e.getStyle(s,a));if("outdent"===t){const t=Math.max(0,i-o);e.setStyle(s,a,t?t+r:"")}else{const t=i+o+r;e.setStyle(s,a,t)}})(n,t,a,s,r,e.dom)}),"indent"===t?ek(e):tk(e)},HA=e=>$A(e,"outdent"),VA=e=>{if(e.selection.isCollapsed()&&UA(e)){const t=e.dom,n=e.selection.getRng(),o=Kl.fromRangeStart(n),r=t.getParent(n.startContainer,t.isBlock);if(null!==r&&gb(un.fromDom(r),o,e.schema))return I.some(()=>HA(e))}return I.none()},qA=(e,t)=>e.selection.isCollapsed()?I.none():((e,t)=>{const n=e.selection.getRng();return(e=>ag(e,ts))(uC(n))?I.some(()=>Gb(e,t,un.fromDom(n.startContainer.childNodes[n.startOffset]))):I.none()})(e,t),WA=(e,t,n)=>ue([VA,Xk,$k,(e,n)=>EA(e,t,n),Ok,Iy,Zk,MA,Lk,BA,Qk,qA],t=>t(e,n)).filter(t=>e.selection.isEditable()),KA=(e,t)=>{WA(e,t,!1).fold(()=>{e.selection.isEditable()&&(ry(e),ly(e))},P),Ck(e)&&g_(e.dom,e.getBody())},YA=e=>void 0===e.touches||1!==e.touches.length?I.none():I.some(e.touches[0]),GA=(e,t)=>_e(e,t.nodeName),XA=(e,t)=>!!cs(t)||!!es(t)&&!(GA(e.getBlockElements(),t)||Vf(t)||Zs(e,t)||Us(t)||Es(t)),QA=(e,t)=>{if(cs(t)){if(0===t.data.length)return!0;if(/^\s+$/.test(t.data))return!t.nextSibling||GA(e,t.nextSibling)||Us(t.nextSibling)}return!1},ZA=e=>e.dom.create(Ed(e),xd(e)),JA=(e,t,n)=>{const o=un.fromDom(ZA(e)),r=qi();go(o,r),n(t,o);const s=document.createRange();return s.setStartBefore(r.dom),s.setEndBefore(r.dom),s},eR=e=>t=>-1!==(" "+t.attr("class")+" ").indexOf(e),tR=(e,t,n)=>function(o){const r=arguments,s=r[r.length-2],a=s>0?t.charAt(s-1):"";if('"'===a)return o;if(">"===a){const e=t.lastIndexOf("<",s);if(-1!==e&&-1!==t.substring(e,s).indexOf('contenteditable="false"'))return o}return''+e.dom.encode("string"==typeof r[1]?r[1]:r[0])+""},nR=(e,t)=>oe(e,e=>{const n=t.match(e);return null!==n&&n[0].length===t.length}),oR=(e,t)=>{t.hasAttribute("data-mce-caret")&&(al(t),e.selection.setRng(e.selection.getRng()),e.selection.scrollIntoView(t))},rR=(e,t)=>{const n=(e=>ur(un.fromDom(e.getBody()),"*[data-mce-caret]").map(e=>e.dom).getOrNull())(e);if(n)return"compositionstart"===t.type?(t.preventDefault(),t.stopPropagation(),void oR(e,n)):void(tl(n)&&(oR(e,n),e.undoManager.add()))},sR=vs,aR=(e,t,n)=>{const o=yf(e.getBody()),r=D(sf,1===t?o.next:o.prev);if(n.collapsed){const o=e.dom.getParent(n.startContainer,"PRE");if(!o)return;if(!r(Kl.fromRangeStart(n))){const n=un.fromDom((e=>{const t=e.dom.create(Ed(e));return t.innerHTML='
    ',t})(e));1===t?uo(un.fromDom(o),n):mo(un.fromDom(o),n),e.selection.select(n.dom,!0),e.selection.collapse()}}},iR=(e,t)=>((e,t)=>{const n=t?1:-1,o=e.selection.getRng();return((e,t,n)=>iA(t,e,n,ab,ib,sR))(n,e,o).orThunk(()=>(aR(e,n,o),I.none()))})(e,((e,t)=>{const n=t?e.getEnd(!0):e.getStart(!0);return Zb(n)?!t:t})(e.selection,t)).exists(t=>(oA(e,t),!0)),lR=(e,t)=>((e,t)=>{const n=t?1:-1,o=e.selection.getRng();return((e,t,n)=>lA(t,e,n,e=>ab(e)||rb(e),e=>ib(e)||sb(e),sR))(n,e,o).orThunk(()=>(aR(e,n,o),I.none()))})(e,t).exists(t=>(oA(e,t),!0)),cR=(e,t)=>dA(e,t,t?ib:ab),dR=(e,t)=>Hk(e,!t).map(n=>{const o=n.toRange(),r=e.selection.getRng();return t?o.setStart(r.startContainer,r.startOffset):o.setEnd(r.endContainer,r.endOffset),o}).exists(t=>(oA(e,t),!0)),mR=(e,t)=>{const n=e=>vn(e,t),o=un.fromDom(e.container());return lr(o,e=>ys(e.dom),n).filter(e=>!n(e))},uR=(e,t)=>((e,t)=>{const n=Kl.fromRangeStart(e.selection.getRng()),o=Kl.fromRangeEnd(e.selection.getRng()),r=un.fromDom(e.getBody());return $e(mR(n,r),mR(o,r),(e,t)=>vn(e,t)?I.some(e):I.none()).bind(A).fold(L,r=>!!(t&&jN(r.dom,o)||!t&&zN(r.dom,n))&&((e,t,n)=>(n?HN:$N)(e.getBody(),t).map(e=>e.toRange()))(e,t?o:n,t).exists(t=>(oA(e,t),!0)))})(e,t),fR=e=>$(["figcaption"],En(e)),gR=(e,t)=>!!e.selection.isCollapsed()&&((e,t)=>{const n=un.fromDom(e.getBody()),o=Kl.fromRangeStart(e.selection.getRng());return((e,t,n)=>{const o=D(vn,t);return lr(un.fromDom(e.container()),e=>n.isBlock(En(e)),o).filter(fR)})(o,n,e.schema).exists(()=>{if(((e,t,n)=>t?jN(e.dom,n):zN(e.dom,n))(n,t,o)){const o=JA(e,n,t?go:fo);return e.selection.setRng(o),!0}return!1})})(e,t),pR=(e,t)=>((e,t)=>t?I.from(e.dom.getParent(e.selection.getNode(),"details")).map(t=>((e,t)=>{const n=e.selection.getRng(),o=Kl.fromRangeStart(n);return!(e.getBody().lastChild!==t||!jN(t,o)||(e.execCommand("InsertNewBlockAfter"),0))})(e,t)).getOr(!1):I.from(e.dom.getParent(e.selection.getNode(),"summary")).bind(t=>I.from(e.dom.getParent(t,"details")).map(n=>((e,t,n)=>{const o=e.selection.getRng(),r=Kl.fromRangeStart(o);return!(e.getBody().firstChild!==t||!zN(n,r)||(e.execCommand("InsertNewBlockBefore"),0))})(e,n,t))).getOr(!1))(e,t),hR={shiftKey:!1,altKey:!1,ctrlKey:!1,metaKey:!1,keyCode:0},bR=(e,t)=>t.keyCode===e.keyCode&&t.shiftKey===e.shiftKey&&t.altKey===e.altKey&&t.ctrlKey===e.ctrlKey&&t.metaKey===e.metaKey,yR=(e,...t)=>()=>e.apply(null,t),vR=(e,t)=>Z(((e,t)=>ne((e=>V(e,e=>({...hR,...e})))(e),e=>bR(e,t)?[e]:[]))(e,t),e=>e.action()),CR=(e,t)=>ue(((e,t)=>ne((e=>V(e,e=>({...hR,...e})))(e),e=>bR(e,t)?[e]:[]))(e,t),e=>e.action()),wR=(e,t)=>{const n=t?1:-1,o=e.selection.getRng();return iA(e,n,o,nb,ob,xs).exists(t=>(oA(e,t),!0))},SR=(e,t)=>{const n=t?1:-1,o=e.selection.getRng();return lA(e,n,o,nb,ob,xs).exists(t=>(oA(e,t),!0))},ER=(e,t)=>dA(e,t,t?ob:nb),xR=(e,t,n)=>ne(Vn(e),e=>bn(e,t)?n(e)?[e]:[]:xR(e,t,n)),_R=(e,t)=>fr(e,"table",t),kR=Ne([{none:["current"]},{first:["current"]},{middle:["current","target"]},{last:["current"]}]),NR={...kR,none:e=>kR.none(e)},AR=(e,t,n,o,r=M)=>{const s=1===o;if(!s&&n<=0)return NR.first(e[0]);if(s&&n>=e.length-1)return NR.last(e[e.length-1]);{const s=n+o,a=e[s];return r(a)?NR.middle(t,a):AR(e,t,s,o,r)}},RR=(e,t)=>_R(e,t).bind(t=>{const n=xR(t,"th,td",M);return J(n,t=>vn(e,t)).map(e=>({index:e,all:n}))});var DR=["body","p","div","article","aside","figcaption","figure","footer","header","nav","section","ol","ul","li","table","thead","tbody","tfoot","caption","tr","td","th","h1","h2","h3","h4","h5","h6","blockquote","pre","address"];const TR=(e,t)=>({element:e,offset:t}),OR=(e,t)=>{if(e.property().isText(t))return TR(t,e.property().getText(t).length);{const n=e.property().children(t);return n.length>0?OR(e,n[n.length-1]):TR(t,n.length)}},BR=(e,t,n)=>{const o=e.property().children(t);return o.length>0&&n0&&e.property().isElement(t)&&o.length===n?OR(e,o[o.length-1]):TR(t,n)},PR=BR,LR={up:N({selector:mr,closest:fr,predicate:ir,all:Fn}),down:N({selector:Ar,predicate:Nr}),styles:N({get:$o,getRaw:Vo,set:zo,remove:Wo}),attrs:N({get:wo,set:vo,remove:xo,copyTo:(e,t)=>{const n=ko(e);Co(t,n)}}),insert:N({before:mo,after:uo,afterAll:ho,append:go,appendAll:bo,prepend:fo,wrap:po}),remove:N({unwrap:Ro,remove:Ao}),create:N({nu:un.fromTag,clone:e=>un.fromDom(e.dom.cloneNode(!1)),text:un.fromText}),query:N({comparePosition:(e,t)=>e.dom.compareDocumentPosition(t.dom),prevSibling:zn,nextSibling:jn}),property:N({children:Vn,name:En,parent:Mn,document:e=>Pn(e).dom,isText:Rn,isComment:kn,isElement:An,isSpecial:e=>{const t=En(e);return $(["script","noscript","iframe","noframes","noembed","title","style","textarea","xmp"],t)},getLanguage:e=>An(e)?So(e,"lang"):I.none(),getText:or,setText:rr,isBoundary:e=>!!An(e)&&("body"===En(e)||$(DR,En(e))),isEmptyTag:e=>!!An(e)&&$(["br","img","hr","input"],En(e)),isNonEditable:e=>An(e)&&"false"===wo(e,"contenteditable")}),eq:vn,is:wn},MR=(e,t)=>PR(LR,e,t),IR=Le("image"),FR=Le("event"),UR=e=>t=>{t[FR]=e},zR=UR(0),jR=UR(2),$R=UR(1),HR=e=>{const t=e;return I.from(t[FR]).exists(e=>0===e)};const VR=Le("mode"),qR=e=>t=>{t[VR]=e},WR=(e,t)=>qR(t)(e),KR=qR(0),YR=qR(2),GR=qR(1),XR=e=>t=>{const n=t;return I.from(n[VR]).exists(t=>t===e)},QR=XR(0),ZR=XR(1),JR=["none","copy","link","move"],eD=["none","copy","copyLink","copyMove","link","linkMove","move","all","uninitialized"],tD=()=>{const e=new window.DataTransfer;let t="move",n="all";const o={get dropEffect(){return t},set dropEffect(e){$(JR,e)&&(t=e)},get effectAllowed(){return n},set effectAllowed(e){HR(o)&&$(eD,e)&&(n=e)},get items(){return((e,t)=>({...t,get length(){return t.length},add:(n,o)=>{if(QR(e)){if(!u(n))return t.add(n);if(!y(o))return t.add(n,o)}return null},remove:n=>{QR(e)&&t.remove(n)},clear:()=>{QR(e)&&t.clear()}}))(o,e.items)},get files(){return ZR(o)?Object.freeze({length:0,item:e=>null}):e.files},get types(){return e.types},setDragImage:(t,n,r)=>{var s;QR(o)&&(s={image:t,x:n,y:r},o[IR]=s,e.setDragImage(t,n,r))},getData:t=>ZR(o)?"":e.getData(t),setData:(t,n)=>{QR(o)&&e.setData(t,n)},clearData:t=>{QR(o)&&e.clearData(t)}};return KR(o),o},nD=(e,t)=>e.setData("text/html",t),oD=(e,t,n,o,r)=>{const s=Ar(un.fromDom(n),"td,th,caption").map(e=>e.dom),a=Y(((e,t)=>ne(t,t=>{const n=((e,t)=>({left:e.left-t,top:e.top-t,right:e.right+-2,bottom:e.bottom+-2,width:e.width+t,height:e.height+t}))(cl(t.getBoundingClientRect()),-1);return[{x:n.left,y:e(n),cell:t},{x:n.right,y:e(n),cell:t}]}))(e,s),e=>t(e,r));return((e,t,n)=>X(e,(e,o)=>e.fold(()=>I.some(o),e=>{const r=Math.sqrt(Math.abs(e.x-t)+Math.abs(e.y-n)),s=Math.sqrt(Math.abs(o.x-t)+Math.abs(o.y-n));return I.some(se.cell)},rD=D(oD,e=>e.bottom,(e,t)=>e.ye.top,(e,t)=>e.y>t),aD=(e,t,n)=>{const o=e(t,n);return(e=>e.breakType===AN.Wrap&&0===e.positions.length)(o)||!ps(n.getNode())&&(e=>e.breakType===AN.Br&&1===e.positions.length)(o)?!((e,t,n)=>n.breakAt.exists(n=>e(t,n).breakAt.isSome()))(e,t,o):o.breakAt.isNone()},iD=D(aD,MN),lD=D(aD,IN),cD=(e,t,n,o)=>{const r=e.selection.getRng(),s=t?1:-1;return!(!Tu()||!((e,t,n)=>{const o=Kl.fromRangeStart(t);return _f(!e,n).exists(e=>e.isEqual(o))})(t,r,n)||(Mk(s,e,n,!t,!1).each(t=>{oA(e,t)}),0))},dD=(e,t,n)=>{const o=((e,t)=>{const n=t.getNode(e);return as(n)?I.some(n):I.none()})(!!t,n),r=!1===t;o.fold(()=>oA(e,n.toRange()),o=>_f(r,e.getBody()).filter(e=>e.isEqual(n)).fold(()=>oA(e,n.toRange()),n=>((e,t,n)=>{t.undoManager.transact(()=>{const o=e?uo:mo,r=JA(t,un.fromDom(n),o);oA(t,r)})})(t,e,o)))},mD=(e,t,n,o)=>{const r=e.selection.getRng(),s=Kl.fromRangeStart(r),a=e.getBody();if(!t&&iD(o,s)){const o=((e,t,n)=>((e,t)=>ce(t.getClientRects()).bind(t=>rD(e,t.left,t.top)).bind(e=>{return LN(Rf(n=e).map(e=>MN(n,e).positions.concat(e)).getOr([]),t);var n}))(t,n).orThunk(()=>ce(n.getClientRects()).bind(n=>PN(FN(e,Kl.before(t)),n.left))).getOr(Kl.before(t)))(a,n,s);return dD(e,t,o),!0}if(t&&lD(o,s)){const o=((e,t,n)=>((e,t)=>de(t.getClientRects()).bind(t=>sD(e,t.left,t.top)).bind(e=>{return LN(Af(n=e).map(e=>[e].concat(IN(n,e).positions)).getOr([]),t);var n}))(t,n).orThunk(()=>ce(n.getClientRects()).bind(n=>PN(UN(e,Kl.after(t)),n.left))).getOr(Kl.after(t)))(a,n,s);return dD(e,t,o),!0}return!1},uD=(e,t,n)=>I.from(e.dom.getParent(e.selection.getNode(),"td,th")).bind(o=>I.from(e.dom.getParent(o,"table")).map(r=>n(e,t,r,o))).getOr(!1),fD=(e,t)=>uD(e,t,cD),gD=(e,t)=>uD(e,t,mD),pD=(e,t,n)=>n.fold(I.none,I.none,(e,t)=>{return(n=t,dr(n,Pr)).map(e=>(e=>{const t=Ur.exact(e,0,e,0);return Hr(t)})(e));var n},n=>!e.mode.isReadOnly()&&hD(n)&&(e=>vD(e)||Un(e).some(e=>Nn(e)&&vD(e)))(n)?(e.execCommand("mceTableInsertRowAfter"),bD(e,t,n)):I.none()),hD=e=>lr(e,On("table")).exists(Sr),bD=(e,t,n)=>{return pD(e,t,(r=vD,RR(o=n,void 0).fold(()=>NR.none(o),e=>AR(e.all,o,e.index,1,r))));var o,r},yD=(e,t,n)=>{return pD(e,t,(r=vD,RR(o=n,void 0).fold(()=>NR.none(),e=>AR(e.all,o,e.index,-1,r))));var o,r},vD=e=>Sr(e)||Dr(e,CD),CD=e=>Nn(e)&&Sr(e),wD=(e,t)=>{const n=["table","li","dl"],o=un.fromDom(e.getBody()),r=e=>{const t=En(e);return vn(e,o)||$(n,t)},s=e.selection.getRng();return((e,t)=>((e,t,n=L)=>n(t)?I.none():$(e,En(t))?I.some(t):mr(t,e.join(","),e=>bn(e,"table")||n(e)))(["td","th"],e,t))(un.fromDom(t?s.endContainer:s.startContainer),r).map(n=>(_R(n,r).each(t=>{e.model.table.clearSelectedCells(t.dom)}),e.selection.collapse(!t),(t?bD:yD)(e,r,n).each(t=>{e.selection.setRng(t)}),!0)).getOr(!1)},SD=(e,t)=>({container:e,offset:t}),ED=gi.DOM,xD=e=>t=>e===t?-1:0,_D=(e,t,n)=>{if(cs(e)&&t>=0)return I.some(SD(e,t));{const o=Pi(ED);return I.from(o.backwards(e,t,xD(e),n)).map(e=>SD(e.container,e.container.data.length))}},kD=(e,t,n)=>{if(!cs(e))return I.none();const o=e.data;if(t>=0&&t<=o.length)return I.some(SD(e,t));{const o=Pi(ED);return I.from(o.backwards(e,t,xD(e),n)).bind(e=>{const o=e.container.data;return kD(e.container,t+o.length,n)})}},ND=(e,t,n)=>{if(!cs(e))return I.none();const o=e.data;if(t<=o.length)return I.some(SD(e,t));{const r=Pi(ED);return I.from(r.forwards(e,t,xD(e),n)).bind(e=>ND(e.container,t-o.length,n))}},AD=(e,t,n,o,r)=>{const s=Pi(e,(e=>t=>e.isBlock(t)||$(["BR","IMG","HR","INPUT"],t.nodeName)||"false"===e.getContentEditable(t))(e));return I.from(s.backwards(t,n,o,r))},RD=e=>""!==e&&-1!==" \xa0\ufeff\f\n\r\t\v".indexOf(e),DD=(e,t)=>e.substring(t.length),TD=(e,t,n,o=!1)=>{if(!(r=t).collapsed||!cs(r.startContainer))return I.none();var r;const s={text:"",offset:0},a=e.getParent(t.startContainer,e.isBlock)||e.getRoot();return AD(e,t.startContainer,t.startOffset,(e,t,r)=>(s.text=r+s.text,s.offset+=t,((e,t,n,o=!1)=>{let r;const s=n.charAt(0);for(r=t-1;r>=0;r--){const a=e.charAt(r);if(!o&&RD(a))return I.none();if(s===a&&Xe(e,n,r,t))break}return I.some(r)})(s.text,s.offset,n,o).getOr(t)),a).bind(e=>{const o=t.cloneRange();if(o.setStart(e.container,e.offset),o.setEnd(t.endContainer,t.endOffset),o.collapsed)return I.none();const r=(e=>Gi(e.toString().replace(/\u00A0/g," ")))(o);return 0!==r.lastIndexOf(n)?I.none():I.some({text:DD(r,n),range:o,trigger:n})})},OD=e=>{if((e=>3===e.nodeType)(e))return SD(e,e.data.length);{const t=e.childNodes;return t.length>0?OD(t[t.length-1]):SD(e,t.length)}},BD=(e,t)=>{const n=e.childNodes;return n.length>0&&t0&&(e=>1===e.nodeType)(e)&&n.length===t?OD(n[n.length-1]):SD(e,t)},PD=(e,t,n,o={})=>{const r=t(),s=e.selection.getRng().startContainer.nodeValue??"",a=Y(r.lookupByTrigger(n.trigger),t=>n.text.length>=t.minChars&&t.matches.getOrThunk(()=>(e=>t=>{const n=BD(t.startContainer,t.startOffset);return!((e,t)=>{const n=e.getParent(t.container,e.isBlock)??e.getRoot();return AD(e,t.container,t.offset,(e,t)=>0===t?-1:t,n).filter(e=>{const t=e.container.data.charAt(e.offset-1);return!RD(t)}).isSome()})(e,n)})(e.dom))(n.range,s,n.text));if(0===a.length)return I.none();const i=Promise.all(V(a,e=>e.fetch(n.text,e.maxResults,o).then(t=>({matchText:n.text,items:t,columns:e.columns,onAction:e.onAction,highlightOn:e.highlightOn}))));return I.some({lookupData:i,context:n})},LD=Hc("type"),MD=Vc("fetch"),ID=Vc("onAction");Wc("name"),Wc("text"),Wc("role"),Wc("icon"),Wc("url"),Wc("tooltip"),Wc("chevronTooltip"),Wc("label"),Wc("shortcut");const FD=Mc([LD,Hc("trigger"),Yc("minChars",1),(e=>jc(e,e,Tc(1),kc()))("columns"),Yc("maxResults",10),qc("matches",Dc),MD,ID,(UD=Rc,Kc("highlightOn",[],Ic(UD)))]);var UD;const zD=e=>{const t=Ke(),n=Ae(!1),o=t.isSet,r=()=>{o()&&((e=>{e.dispatch("AutocompleterEnd")})(e),n.set(!1),t.clear())},s=lt(()=>(e=>{const t=e.ui.registry.getAll().popups,n=be(t,e=>{return(t=e,Uc("Autocompleter",FD,t)).fold(e=>{throw new Error(zc(e))},A);var t}),o=ut(Se(n,e=>e.trigger)),r=Ee(n);return{dataset:n,triggers:o,lookupByTrigger:e=>Y(r,t=>t.trigger===e)}})(e)),a=a=>{(n=>t.get().map(t=>TD(e.dom,e.selection.getRng(),t.trigger,!0).bind(t=>PD(e,s,t,n))).getOrThunk(()=>((e,t)=>{const n=t(),o=e.selection.getRng();return((e,t,n)=>ue(n.triggers,n=>TD(e,t,n)))(e.dom,o,n).bind(n=>PD(e,t,n))})(e,s)))(a).fold(r,r=>{(e=>{o()||t.set({trigger:e.trigger,matchLength:e.text.length})})(r.context),r.lookupData.then(o=>{t.get().map(s=>{const a=r.context;s.trigger===a.trigger&&(t.set({...s,matchLength:a.text.length}),n.get()?(id(e,{range:a.range}),((e,t)=>{e.dispatch("AutocompleterUpdate",t)})(e,{lookupData:o})):(n.set(!0),id(e,{range:a.range}),((e,t)=>{e.dispatch("AutocompleterStart",t)})(e,{lookupData:o})))})})})},i=()=>t.get().bind(({trigger:t})=>{const o=e.selection.getRng();return TD(e.dom,o,t,n.get()).filter(({range:e})=>((e,t)=>{const n=e.compareBoundaryPoints(window.Range.START_TO_START,t),o=e.compareBoundaryPoints(window.Range.END_TO_END,t);return n>=0&&o<=0})(o,e)).map(({range:e})=>e)});e.addCommand("mceAutocompleterReload",(e,t)=>{const n=f(t)?t.fetchOptions:{};a(n)}),e.addCommand("mceAutocompleterClose",r),e.addCommand("mceAutocompleterRefreshActiveRange",()=>{i().each(t=>{id(e,{range:t})})}),e.editorCommands.addQueryStateHandler("mceAutoCompleterInRange",()=>i().isSome()),((e,t)=>{const n=it(t.load,50);e.on("input",t=>{("insertCompositionText"!==t.inputType||e.composing)&&n.throttle()}),e.on("keydown",e=>{const o=e.which;8===o?n.throttle():27===o?(n.cancel(),t.cancelIfNecessary()):38!==o&&40!==o||n.cancel()},!0),e.on("remove",n.cancel)})(e,{cancelIfNecessary:r,load:a})},jD=Xt().browser.isSafari(),$D=e=>Wi(un.fromDom(e)),HD=(e,t)=>0===e.startOffset&&e.endOffset===t.textContent?.length,VD=(e,t)=>I.from(e.getParent(t.container(),"details")),qD=(e,t)=>VD(e,t).isSome(),WD=(e,t)=>{const n=t.getNode();y(n)||e.selection.setCursorLocation(n,t.offset())},KD=(e,t,n)=>{const o=e.dom.getParent(t.container(),"details");if(o&&!o.open){const t=e.dom.select("summary",o)[0];t&&(n?Af(t):Rf(t)).each(t=>WD(e,t))}else WD(e,t)},YD=(e,t,n)=>{const{dom:o,selection:r}=e,s=e.getBody();if("character"===n){const n=Kl.fromRangeStart(r.getRng()),a=o.getParent(n.container(),o.isBlock),i=VD(o,n),l=a&&o.isEmpty(a),c=h(a?.previousSibling),d=h(a?.nextSibling);return!!(l&&(t?d:c)&&Ef(!t,s,n).exists(e=>qD(o,e)&&!je(i,VD(o,e))))||Ef(t,s,n).fold(L,n=>{const r=VD(o,n);if(qD(o,n)&&!je(i,r)){if(t||KD(e,n,!1),a&&l){if(t&&c)return!0;if(!t&&d)return!0;KD(e,n,t),e.dom.remove(a)}return!0}return!1})}return!1},GD=(e,t,n,o)=>{const r=e.selection.getRng(),s=Kl.fromRangeStart(r),a=e.getBody();return"selection"===o?((e,t)=>{const n=t.startSummary.exists(t=>t.contains(e.startContainer)),o=t.startSummary.exists(t=>t.contains(e.endContainer)),r=t.startDetails.forall(e=>t.endDetails.forall(t=>e!==t));return(n||o)&&!(n&&o)||r})(r,t):n?((e,t)=>t.startSummary.exists(t=>((e,t)=>Rf(t).exists(n=>ps(n.getNode())&&Nf(t,n).exists(t=>t.isEqual(e))||n.isEqual(e)))(e,t)))(s,t)||((e,t,n)=>n.startDetails.exists(n=>kf(e,t).forall(e=>!n.contains(e.container()))))(a,s,t):((e,t)=>t.startSummary.exists(t=>((e,t)=>Af(t).exists(t=>t.isEqual(e)))(e,t)))(s,t)||((e,t)=>t.startDetails.exists(n=>Nf(n,e).forall(n=>t.startSummary.exists(t=>!t.contains(e.container())&&t.contains(n.container())))))(s,t)},XD=(e,t,n)=>((e,t,n)=>((e,t)=>{const n=I.from(e.getParent(t.startContainer,"details")),o=I.from(e.getParent(t.endContainer,"details"));if(n.isSome()||o.isSome()){const t=n.bind(t=>I.from(e.select("summary",t)[0]));return I.some({startSummary:t,startDetails:n,endDetails:o})}return I.none()})(e.dom,e.selection.getRng()).fold(()=>YD(e,t,n),o=>GD(e,o,t,n)||YD(e,t,n)))(e,t,n)||jD&&((e,t,n)=>{const o=e.selection,r=o.getNode(),s=o.getRng(),a=Kl.fromRangeStart(s);return!!Ns(r)&&("selection"===n&&HD(s,r)||cy(t,a,r)?$D(r):e.undoManager.transact(()=>{const s=o.getSel();let{anchorNode:a,anchorOffset:i,focusNode:l,focusOffset:c}=s??{};const d=()=>{C(a)&&C(i)&&C(l)&&C(c)&&s?.setBaseAndExtent(a,i,l,c)},m=(e,t)=>{q(e.childNodes,e=>{ig(e)&&t.appendChild(e)})},u=e.dom.create("span",{"data-mce-bogus":"1"});m(r,u),r.appendChild(u),d(),"word"!==n&&"line"!==n||s?.modify("extend",t?"right":"left",n),!o.isCollapsed()&&HD(o.getRng(),u)?$D(r):(e.execCommand(t?"ForwardDelete":"Delete"),a=s?.anchorNode,i=s?.anchorOffset,l=s?.focusNode,c=s?.focusOffset,m(u,r),d()),e.dom.remove(u)}),!0)})(e,t,n)?I.some(x):I.none(),QD=Xt(),ZD=QD.os,JD=ZD.isMacOS()||ZD.isiOS(),eT=QD.browser.isFirefox(),tT=(e,t)=>{const n=e.dom,o=e.schema.getMoveCaretBeforeOnEnterElements();if(!t)return;if(ji(un.fromDom(t))){const e=e=>zi(e)?I.from(e):dr(e,zi),o=e=>n.isEmpty(e.dom);(e=>{for(;e;){if(es(e)||cs(e)&&e.data&&/[\r\n\s]/.test(e.data))return I.from(un.fromDom(e));e=e.nextSibling}return I.none()})(t.firstChild).each(t=>{e(t).fold(()=>{if(o(t)){const e=MR(t,0).element;An(e)&&!Mi(e)&&go(e,un.fromHtml('
    '))}},e=>{mo(e,un.fromText(dt))})})}const r=n.createRng();if(t.normalize(),t.hasChildNodes()){const e=new Kr(t,t);let n,s=t;for(;n=e.current();){if(cs(n)){r.setStart(n,0),r.setEnd(n,0);break}if(o[n.nodeName.toLowerCase()]){r.setStartBefore(n),r.setEndBefore(n);break}s=n,n=e.next()}n||(r.setStart(s,0),r.setEnd(s,0))}else ps(t)?t.nextSibling&&n.isBlock(t.nextSibling)?(r.setStartBefore(t),r.setEndBefore(t)):(r.setStartAfter(t),r.setEndAfter(t)):(r.setStart(t,0),r.setEnd(t,0));e.selection.setRng(r),mh(e,r)},nT=(e,t)=>{const n=e.getRoot();let o,r=t;for(;r!==n&&r&&"false"!==e.getContentEditable(r);){if("true"===e.getContentEditable(r)){o=r;break}r=r.parentNode}return r!==n?o:n},oT=e=>I.from(e.dom.getParent(e.selection.getStart(!0),e.dom.isBlock)),rT=e=>{e.innerHTML='
    '},sT=(e,t)=>{Ed(e).toLowerCase()===t.tagName.toLowerCase()&&((e,t,n)=>{const o=e.dom;I.from(n.style).map(o.parseStyle).each(e=>{const n={...qo(un.fromDom(t)),...e};o.setStyles(t,n)});const r=I.from(n.class).map(e=>e.split(/\s+/)),s=I.from(t.className).map(e=>Y(e.split(/\s+/),e=>""!==e));$e(r,s,(e,n)=>{const r=Y(n,t=>!$(e,t)),s=[...e,...r];o.setAttrib(t,"class",s.join(" "))});const a=["style","class"],i=we(n,(e,t)=>!$(a,t));o.setAttribs(t,i)})(e,t,xd(e))},aT=(e,t,n,o,r=!0,s,a)=>{const i=e.dom,l=e.schema,c=Ed(e),d=n?n.nodeName.toUpperCase():"";let m=t;const u=l.getTextInlineElements();let f;f=s||"TABLE"===d||"HR"===d?i.create(s||c,a||{}):n.cloneNode(!1);let g=f;if(r){do{if(u[m.nodeName]){if(Tf(m)||Vf(m))continue;const e=m.cloneNode(!1);i.setAttrib(e,"id",""),f.hasChildNodes()?(e.appendChild(f.firstChild),f.appendChild(e)):(g=e,f.appendChild(e))}}while((m=m.parentNode)&&m!==o);"LI"!==f.nodeName&&((e,t)=>{const n=un.fromDom(e),o=un.fromDom(t),r=On("span"),s=D(vn,n),a=e=>An(e)&&Vo(e,"font-size").isSome(),i=[...a(o)?[o]:[],..._r(o,a,s)];q(i.slice(1),e=>{Wo(e,"font-size"),xo(e,"data-mce-style"),r(e)&&_o(e)&&Ro(e)})})(f,g)}else i.setAttrib(f,"style",null),i.setAttrib(f,"class",null);return sT(e,f),rT(g),f},iT=(e,t)=>{const n=e?.parentNode;return C(n)&&n.nodeName===t},lT=e=>C(e)&&/^(OL|UL|LI)$/.test(e.nodeName),cT=e=>C(e)&&/^(LI|DT|DD)$/.test(e.nodeName),dT=e=>{const t=e.parentNode;return cT(t)?t:e},mT=(e,t,n)=>{let o=e[n?"firstChild":"lastChild"];for(;o&&!es(o);)o=o[n?"nextSibling":"previousSibling"];return o===t},uT=e=>X(Se(qo(un.fromDom(e)),(e,t)=>`${t}: ${e};`),(e,t)=>e+t,""),fT=(e,t)=>t&&"A"===t.nodeName&&e.isEmpty(t),gT=(e,t)=>e.nodeName===t||e.previousSibling&&e.previousSibling.nodeName===t,pT=(e,t)=>C(t)&&e.isBlock(t)&&!/^(TD|TH|CAPTION|FORM)$/.test(t.nodeName)&&!/^(fixed|absolute)/i.test(t.style.position)&&e.isEditable(t.parentNode)&&"false"!==e.getContentEditable(t),hT=(e,t,n)=>cs(t)?e?1===n&&t.data.charAt(n-1)===Ki?0:n:n===t.data.length-1&&t.data.charAt(n)===Ki?t.data.length:n:n,bT={insert:(e,t)=>{let n,o,r,s,a=!1;const i=e.dom,l=e.schema.getNonEmptyElements(),c=e.selection.getRng(),d=Ed(e),m=un.fromDom(c.startContainer),f=qn(m,c.startOffset),g=f.exists(e=>Nn(e)&&!Sr(e)),p=c.collapsed&&g,b=(t,o)=>aT(e,n,_,x,Ad(e),t,o),y=e=>{const t=hT(e,n,o);if(cs(n)&&(e?t>0:t"BR"===e.nodeName||e.nextSibling&&"BR"===e.nextSibling.nodeName)(n)?!e:a&&!e||!a&&e;const r=new Kr(n,_);let s;for(cs(n)&&(e&&0===t?r.prev():e||t!==n.data.length||r.next());s=r.current();){if(es(s)){if(!s.getAttribute("data-mce-bogus")){const e=s.nodeName.toLowerCase();if(l[e]&&"br"!==e)return!1}}else if(cs(s)&&!Gr(s.data))return!1;e?r.prev():r.next()}return!0},w=()=>{let t;return t=/^(H[1-6]|PRE|FIGURE)$/.test(r)&&"HGROUP"!==k?b(d):b(),((e,t)=>{const n=Rd(e);return!v(t)&&(u(n)?$(dn.explode(n),t.nodeName.toLowerCase()):n)})(e,s)&&pT(i,s)&&i.isEmpty(_,void 0,{includeZwsp:!0})?t=i.split(s,_):i.insertAfter(t,_),tT(e,t),t};Vp(i,c).each(e=>{c.setStart(e.startContainer,e.startOffset),c.setEnd(e.endContainer,e.endOffset)}),n=c.startContainer,o=c.startOffset;const S=!(!t||!t.shiftKey),E=!(!t||!t.ctrlKey);es(n)&&n.hasChildNodes()&&!p&&(a=o>n.childNodes.length-1,n=n.childNodes[Math.min(o,n.childNodes.length-1)]||n,o=a&&cs(n)?n.data.length:0);const x=nT(i,n);if(!x||((e,t)=>{const n=e.dom.getParent(t,"ol,ul,dl");return null!==n&&"false"===e.dom.getContentEditableParent(n)})(e,n))return;S||(n=((e,t,n,o,r)=>{const s=e.dom,a=nT(s,o)??s.getRoot();let i=s.getParent(o,s.isBlock);if(!i||!pT(s,i)){if(i=i||a,!i.hasChildNodes()){const o=s.create(t);return sT(e,o),i.appendChild(o),n.setStart(o,0),n.setEnd(o,0),o}let l,c=o;for(;c&&c.parentNode!==i;)c=c.parentNode;for(;c&&!s.isBlock(c);)l=c,c=c.previousSibling;const d=l?.parentElement?.nodeName;if(l&&d&&e.schema.isValidChild(d,t.toLowerCase())){const a=l.parentNode,i=s.create(t);for(sT(e,i),a.insertBefore(i,l),c=l;c&&!s.isBlock(c);){const e=c.nextSibling;i.appendChild(c),c=e}n.setStart(o,r),n.setEnd(o,r)}}return o})(e,d,c,n,o));let _=i.getParent(n,i.isBlock)||i.getRoot();s=C(_?.parentNode)?i.getParent(_.parentNode,i.isBlock):null,r=_?_.nodeName.toUpperCase():"";const k=s?s.nodeName.toUpperCase():"";if("LI"!==k||E||(_=s,s=s.parentNode,r=k),es(s)&&((e,t,n)=>!t&&n.nodeName.toLowerCase()===Ed(e)&&e.dom.isEmpty(n)&&((e,t,n)=>{let o=t;for(;o&&o!==e&&h(o.nextSibling);){const e=o.parentElement;if(!e||!n(e))return ks(e);o=e}return!1})(e.getBody(),n,t=>_e(e.schema.getTextBlockElements(),t.nodeName.toLowerCase())))(e,S,_))return((e,t,n)=>{const o=t(Ed(e)),r=((e,t)=>e.dom.getParent(t,ks))(e,n);r&&(e.dom.insertAfter(o,r),tT(e,o),(n.parentElement?.childNodes?.length??0)>1&&e.dom.remove(n))})(e,b,_);if(/^(LI|DT|DD)$/.test(r)&&es(s)&&i.isEmpty(_))return void((e,t,n,o,r)=>{const s=e.dom,a=e.selection.getRng(),i=n.parentNode;if(n===e.getBody()||!i)return;var l;lT(l=n)&&lT(l.parentNode)&&(r="LI");const c=cT(o)?uT(o):void 0;let d=cT(o)&&c?t(r,{style:uT(o)}):t(r);if(mT(n,o,!0)&&mT(n,o,!1))if(iT(n,"LI")){const e=dT(n);s.insertAfter(d,e),(e=>e.parentNode?.firstChild===e)(n)?s.remove(e):s.remove(n)}else s.replace(d,n);else if(mT(n,o,!0))iT(n,"LI")?(s.insertAfter(d,dT(n)),d.appendChild(s.doc.createTextNode(" ")),d.appendChild(n)):i.insertBefore(d,n),s.remove(o);else if(mT(n,o,!1))s.insertAfter(d,dT(n)),s.remove(o);else{n=dT(n);const e=a.cloneRange();e.setStartAfter(o),e.setEndAfter(n);const t=e.extractContents();if("LI"===r&&(e=>e.firstChild&&"LI"===e.firstChild.nodeName)(t)){const e=Y(V(d.children,un.fromDom),T(On("br")));d=t.firstChild,s.insertAfter(t,n),q(e,e=>fo(un.fromDom(d),e)),c&&d.setAttribute("style",c)}else s.insertAfter(t,n),s.insertAfter(d,n);s.remove(o)}tT(e,d)})(e,b,s,_,d);if(!(p||_!==e.getBody()&&pT(i,_)))return;const N=_.parentNode;let A;if(p)A=b(d),f.fold(()=>{go(m,un.fromDom(A))},e=>{mo(e,un.fromDom(A))}),e.selection.setCursorLocation(A,0);else if(Zi(_))A=al(_),i.isEmpty(_)&&rT(_),sT(e,A),tT(e,A);else if(y(!1))A=w();else if(y(!0)&&N){const t=Kl.fromRangeStart(c),n=sb(t),o=un.fromDom(_),r=wb(o,t,e.schema)?Sb(o,t,e.schema).bind(e=>I.from(e.getNode())):I.none();A=N.insertBefore(b(),_);const s=gT(_,"HR")||n?A:r.getOr(_);tT(e,s)}else{const t=(e=>{const t=e.cloneRange();return t.setStart(e.startContainer,hT(!0,e.startContainer,e.startOffset)),t.setEnd(e.endContainer,hT(!1,e.endContainer,e.endOffset)),t})(c).cloneRange();t.setEndAfter(_);const n=t.extractContents();(e=>{q(Nr(un.fromDom(e),Rn),e=>{const t=e.dom;t.nodeValue=Gi(t.data)})})(n),(e=>{let t=e;do{cs(t)&&(t.data=t.data.replace(/^[\r\n]+/,"")),t=t.firstChild}while(t)})(n),A=n.firstChild,_===A?C(N)&&i.insertAfter(n,N):i.insertAfter(n,_),(e=>{const t=Wn(e).bind(jn);return ji(e)&&t.exists(zi)})(un.fromDom(A))?(e=>{const t=MR(un.fromDom(e),0).element;Rn(t)&&i.isEmpty(t.dom)&&t.dom.remove()})(A):(((e,t,n)=>{const o=[];if(!n)return;let r=n;for(;r=r.firstChild;){if(e.isBlock(r))return;es(r)&&!t[r.nodeName.toLowerCase()]&&o.push(r)}let s=o.length;for(;s--;)r=o[s],(!r.hasChildNodes()||r.firstChild===r.lastChild&&""===r.firstChild?.nodeValue||fT(e,r))&&e.remove(r)})(i,l,A),((e,t)=>{t.normalize();const n=t.lastChild;(!n||es(n)&&/^(left|right)$/gi.test(e.getStyle(n,"float",!0)))&&e.add(t,"br")})(i,_)),i.isEmpty(_)&&rT(_),A.normalize(),i.isEmpty(A)?(i.remove(A),w()):(sT(e,A),tT(e,A))}i.setAttrib(A,"id",""),e.dispatch("NewBlock",{newBlock:A})},fakeEventName:"insertParagraph"},yT=(e,t,n)=>{const o=e.dom.createRng();n?(o.setStartBefore(t),o.setEndBefore(t)):(o.setStartAfter(t),o.setEndAfter(t)),e.selection.setRng(o),mh(e,o)},vT=(e,t)=>{const n=un.fromTag("br");mo(un.fromDom(t),n),e.undoManager.add()},CT=(e,t)=>{wT(e.getBody(),t)||uo(un.fromDom(t),un.fromTag("br"));const n=un.fromTag("br");uo(un.fromDom(t),n),yT(e,n.dom,!1),e.undoManager.add()},wT=(e,t)=>{return n=Kl.after(t),!!ps(n.getNode())||kf(e,Kl.after(t)).map(e=>ps(e.getNode())).getOr(!1);var n},ST=e=>e&&"A"===e.nodeName&&"href"in e,ET=e=>e.fold(L,ST,ST,L),xT=(e,t)=>{t.fold(x,D(vT,e),D(CT,e),x)},_T={insert:(e,t)=>{const n=(e=>{const t=D(Qb,e),n=Kl.fromRangeStart(e.selection.getRng());return vN(t,e.getBody(),n).filter(ET)})(e);n.isSome()?n.each(D(xT,e)):((e,t)=>{const n=e.selection,o=e.dom,r=n.getRng();let s,a=!1;Vp(o,r).each(e=>{r.setStart(e.startContainer,e.startOffset),r.setEnd(e.endContainer,e.endOffset)});let i=r.startOffset,l=r.startContainer;if(es(l)&&l.hasChildNodes()){const e=i>l.childNodes.length-1;l=l.childNodes[Math.min(i,l.childNodes.length-1)]||l,i=e&&cs(l)?l.data.length:0}let c=o.getParent(l,o.isBlock);const d=c&&c.parentNode?o.getParent(c.parentNode,o.isBlock):null,m=d?d.nodeName.toUpperCase():"",u=!(!t||!t.ctrlKey);"LI"!==m||u||(c=d),cs(l)&&i>=l.data.length&&(((e,t,n)=>{const o=new Kr(t,n);let r;const s=e.getNonEmptyElements();for(;r=o.next();)if(s[r.nodeName.toLowerCase()]||cs(r)&&r.length>0)return!0;return!1})(e.schema,l,c||o.getRoot())||(s=o.create("br"),r.insertNode(s),r.setStartAfter(s),r.setEndAfter(s),a=!0)),s=o.create("br"),Gl(o,r,s),yT(e,s,a),e.undoManager.add()})(e,t)},fakeEventName:"insertLineBreak"},kT=(e,t)=>oT(e).filter(e=>t.length>0&&bn(un.fromDom(e),t)).isSome(),NT=Ne([{br:[]},{block:[]},{none:[]}]),AT=(e,t)=>(e=>kT(e,Nd(e)))(e),RT=e=>(t,n)=>(e=>oT(e).filter(e=>ji(un.fromDom(e))).isSome())(t)===e,DT=(e,t)=>(n,o)=>{const r=(e=>oT(e).fold(N(""),e=>e.nodeName.toUpperCase()))(n)===e.toUpperCase();return r===t},TT=e=>{const t=nT(e.dom,e.selection.getStart());return v(t)},OT=e=>DT("pre",e),BT=e=>(t,n)=>Sd(t)===e,PT=(e,t)=>(e=>kT(e,kd(e)))(e),LT=(e,t)=>t,MT=e=>{const t=Ed(e),n=nT(e.dom,e.selection.getStart());return C(n)&&e.schema.isValidChild(n.nodeName,t)},IT=e=>{const t=e.selection.getRng(),n=un.fromDom(t.startContainer),o=qn(n,t.startOffset).map(e=>Nn(e)&&!Sr(e));return t.collapsed&&o.getOr(!0)},FT=(e,t)=>(n,o)=>X(e,(e,t)=>e&&t(n,o),!0)?I.some(t):I.none(),UT=(e,t,n)=>{if(!t.mode.isReadOnly()){if(t.selection.isCollapsed()||(e=>{e.execCommand("delete")})(t),C(n)&&Qx(t,e.fakeEventName).isDefaultPrevented())return;e.insert(t,n),C(n)&&Xx(t,e.fakeEventName)}},zT=(e,t)=>{if(e.mode.isReadOnly())return;const n=()=>UT(_T,e,t),o=()=>UT(bT,e,t),r=((e,t)=>cN([FT([AT],NT.none()),FT([OT(!0),TT],NT.none()),FT([DT("summary",!0)],NT.br()),FT([OT(!0),BT(!1),LT],NT.br()),FT([OT(!0),BT(!1)],NT.block()),FT([OT(!0),BT(!0),LT],NT.block()),FT([OT(!0),BT(!0)],NT.br()),FT([RT(!0),LT],NT.br()),FT([RT(!0)],NT.block()),FT([PT],NT.br()),FT([LT],NT.br()),FT([MT],NT.block()),FT([IT],NT.block())],[e,!(!t||!t.shiftKey)]).getOr(NT.none()))(e,t);switch(_d(e)){case"linebreak":r.fold(n,n,x);break;case"block":r.fold(o,o,x);break;case"invert":r.fold(o,n,x);break;default:r.fold(n,o,x)}},jT=Xt(),$T=jT.os.isiOS()&&jT.browser.isSafari(),HT=(e,t)=>{var n;t.isDefaultPrevented()||(t.preventDefault(),(n=e.undoManager).typing&&(n.typing=!1,n.add()),e.undoManager.transact(()=>{zT(e,t)}))},VT=Xt(),qT=e=>e.stopImmediatePropagation(),WT=e=>e.keyCode===Rp.PAGE_UP||e.keyCode===Rp.PAGE_DOWN,KT=(e,t,n)=>{n&&!e.get()?t.on("NodeChange",qT,!0):!n&&e.get()&&t.off("NodeChange",qT),e.set(n)},YT=(e,t)=>e===t||e.contains(t),GT=(e,t)=>{const n=t.container(),o=t.offset();return cs(n)?(n.insertData(o,e),I.some(Kl(n,o+e.length))):rf(t).map(n=>{const o=un.fromText(e);return t.isAtEnd()?uo(n,o):mo(n,o),Kl(o.dom,e.length)})},XT=D(GT,dt),QT=D(GT," "),ZT=e=>t=>{e.selection.setRng(t.toRange()),e.nodeChanged()},JT=e=>{const t=Kl.fromRangeStart(e.selection.getRng()),n=un.fromDom(e.getBody());if(e.selection.isCollapsed()){const o=D(Qb,e),r=Kl.fromRangeStart(e.selection.getRng());return vN(o,e.getBody(),r).bind((e=>t=>t.fold(t=>Nf(e.dom,Kl.before(t)),e=>Af(e),e=>Rf(e),t=>kf(e.dom,Kl.after(t))))(n)).map(o=>()=>((e,t,n)=>o=>Db(e,o,n)?XT(t):QT(t))(n,t,e.schema)(o).each(ZT(e)))}return I.none()},eO=e=>{return He(sn.browser.isFirefox()&&e.selection.isEditable()&&(t=e.dom,n=e.selection.getRng().startContainer,t.isEditable(t.getParent(n,"summary"))),()=>{const t=un.fromDom(e.getBody());e.selection.isCollapsed()||e.getDoc().execCommand("Delete"),((e,t,n)=>Db(e,t,n)?XT(t):QT(t))(t,Kl.fromRangeStart(e.selection.getRng()),e.schema).each(ZT(e))});var t,n},tO=e=>su(e)?[{keyCode:Rp.TAB,action:yR(wD,e,!0)},{keyCode:Rp.TAB,shiftKey:!0,action:yR(wD,e,!1)}]:[],nO=e=>{if(e.addShortcut("Meta+P","","mcePrint"),zD(e),EE(e))return Ae(null);{const t=bA(e);return(e=>{e.on("beforeinput",t=>{e.selection.isEditable()&&!H(t.getTargetRanges(),t=>!((e,t)=>!YT(e.getBody(),t.startContainer)||!YT(e.getBody(),t.endContainer)||uh(e.dom,t))(e,t))||t.preventDefault()})})(e),(e=>{e.on("keyup compositionstart",D(rR,e))})(e),((e,t)=>{e.on("keydown",n=>{n.isDefaultPrevented()||((e,t,n)=>{const o=sn.os.isMacOS()||sn.os.isiOS(),r=sn.browser.isFirefox();vR([{keyCode:Rp.RIGHT,action:yR(iR,e,!0)},{keyCode:Rp.LEFT,action:yR(iR,e,!1)},{keyCode:Rp.UP,action:yR(lR,e,!1)},{keyCode:Rp.DOWN,action:yR(lR,e,!0)},...o?[{keyCode:Rp.UP,action:yR(dR,e,!1),metaKey:!0,shiftKey:!0},{keyCode:Rp.DOWN,action:yR(dR,e,!0),metaKey:!0,shiftKey:!0}]:[],{keyCode:Rp.RIGHT,action:yR(fD,e,!0)},{keyCode:Rp.LEFT,action:yR(fD,e,!1)},{keyCode:Rp.UP,action:yR(gD,e,!1)},{keyCode:Rp.DOWN,action:yR(gD,e,!0)},{keyCode:Rp.UP,action:yR(gD,e,!1)},{keyCode:Rp.UP,action:yR(pR,e,!1)},{keyCode:Rp.DOWN,action:yR(pR,e,!0)},{keyCode:Rp.RIGHT,action:yR(wR,e,!0)},{keyCode:Rp.LEFT,action:yR(wR,e,!1)},{keyCode:Rp.UP,action:yR(SR,e,!1)},{keyCode:Rp.DOWN,action:yR(SR,e,!0)},{keyCode:Rp.RIGHT,action:yR(pA,e,t,!0)},{keyCode:Rp.LEFT,action:yR(pA,e,t,!1)},{keyCode:Rp.RIGHT,ctrlKey:!o,altKey:o,action:yR(yA,e,t)},{keyCode:Rp.LEFT,ctrlKey:!o,altKey:o,action:yR(vA,e,t)},{keyCode:Rp.UP,action:yR(gR,e,!1)},{keyCode:Rp.DOWN,action:yR(gR,e,!0)},...r?[{keyCode:Rp.UP,action:yR(uR,e,!1)},{keyCode:Rp.DOWN,action:yR(uR,e,!0)}]:[]],n).each(e=>{n.preventDefault()})})(e,t,n)})})(e,t),((e,t)=>{let n=!1,o=[];e.on("init",()=>{e.on("keydown",r=>{n=r.keyCode===Rp.BACKSPACE,o=NA(e),r.isDefaultPrevented()||((e,t,n)=>{const o=n.keyCode===Rp.BACKSPACE?"deleteContentBackward":"deleteContentForward",r=e.selection.isCollapsed(),s=r?"character":"selection",a=e=>r?e?"word":"line":"selection";CR([{keyCode:Rp.BACKSPACE,action:yR(VA,e)},{keyCode:Rp.BACKSPACE,action:yR(Xk,e,!1)},{keyCode:Rp.DELETE,action:yR(Xk,e,!0)},{keyCode:Rp.BACKSPACE,action:yR($k,e,!1)},{keyCode:Rp.DELETE,action:yR($k,e,!0)},{keyCode:Rp.BACKSPACE,action:yR(EA,e,t,!1)},{keyCode:Rp.DELETE,action:yR(EA,e,t,!0)},{keyCode:Rp.BACKSPACE,action:yR(Iy,e,!1)},{keyCode:Rp.DELETE,action:yR(Iy,e,!0)},{keyCode:Rp.BACKSPACE,action:yR(XD,e,!1,s)},{keyCode:Rp.DELETE,action:yR(XD,e,!0,s)},...JD?[{keyCode:Rp.BACKSPACE,altKey:!0,action:yR(XD,e,!1,a(!0))},{keyCode:Rp.DELETE,altKey:!0,action:yR(XD,e,!0,a(!0))},{keyCode:Rp.BACKSPACE,metaKey:!0,action:yR(XD,e,!1,a(!1))}]:[{keyCode:Rp.BACKSPACE,ctrlKey:!0,action:yR(XD,e,!1,a(!0))},{keyCode:Rp.DELETE,ctrlKey:!0,action:yR(XD,e,!0,a(!0))}],{keyCode:Rp.BACKSPACE,action:yR(Zk,e,!1)},{keyCode:Rp.DELETE,action:yR(Zk,e,!0)},{keyCode:Rp.BACKSPACE,action:yR(MA,e,!1)},{keyCode:Rp.DELETE,action:yR(MA,e,!0)},{keyCode:Rp.BACKSPACE,action:yR(Lk,e,!1)},{keyCode:Rp.DELETE,action:yR(Lk,e,!0)},{keyCode:Rp.BACKSPACE,action:yR(Ok,e,!1)},{keyCode:Rp.DELETE,action:yR(Ok,e,!0)},{keyCode:Rp.BACKSPACE,action:yR(BA,e,!1)},{keyCode:Rp.DELETE,action:yR(BA,e,!0)},{keyCode:Rp.BACKSPACE,action:yR(Qk,e,!1)},{keyCode:Rp.DELETE,action:yR(Qk,e,!0)},{keyCode:Rp.BACKSPACE,action:yR(qA,e,!1)},{keyCode:Rp.DELETE,action:yR(qA,e,!0)}],n).filter(t=>e.selection.isEditable()).each(t=>{n.preventDefault(),Qx(e,o).isDefaultPrevented()||(t(),Xx(e,o))})})(e,t,r)}),e.on("keyup",t=>{t.isDefaultPrevented()||(((e,t,n,o)=>{vR([{keyCode:Rp.BACKSPACE,action:yR(Gk,e)},{keyCode:Rp.DELETE,action:yR(Gk,e)},...JD?[{keyCode:Rp.BACKSPACE,altKey:!0,action:yR(PA,e)},{keyCode:Rp.DELETE,altKey:!0,action:yR(PA,e)},...n?[{keyCode:eT?224:91,action:yR(()=>(DA(e,o),PA(e)))}]:[]]:[{keyCode:Rp.BACKSPACE,ctrlKey:!0,action:yR(PA,e)},{keyCode:Rp.DELETE,ctrlKey:!0,action:yR(PA,e)}]],t)})(e,t,n,o),o.length=0),n=!1})})})(e,t),(e=>{let t=I.none();e.on("keydown",n=>{n.keyCode===Rp.ENTER&&($T&&(e=>{if(!e.collapsed)return!1;const t=e.startContainer;if(cs(t)){const n=/^[\uAC00-\uD7AF\u1100-\u11FF\u3130-\u318F\uA960-\uA97F\uD7B0-\uD7FF]$/,o=t.data.charAt(e.startOffset-1);return n.test(o)}return!1})(e.selection.getRng())?(e=>{t=I.some(e.selection.getBookmark()),e.undoManager.add()})(e):HT(e,n))}),e.on("keyup",n=>{n.keyCode===Rp.ENTER&&t.each(()=>((e,n)=>{e.undoManager.undo(),t.fold(x,t=>e.selection.moveToBookmark(t)),HT(e,n),t=I.none()})(e,n))})})(e),(e=>{e.on("keydown",t=>{t.isDefaultPrevented()||((e,t)=>{CR([{keyCode:Rp.SPACEBAR,action:yR(JT,e)},{keyCode:Rp.SPACEBAR,action:yR(eO,e)}],t).each(n=>{t.preventDefault(),Qx(e,"insertText",{data:" "}).isDefaultPrevented()||(n(),Xx(e,"insertText",{data:" "}))})})(e,t)})})(e),(e=>{e.on("input",t=>{t.isComposing||(e=>{const t=un.fromDom(e.getBody());e.selection.isCollapsed()&&Fb(t,Kl.fromRangeStart(e.selection.getRng()),e.schema).each(t=>{e.selection.setRng(t.toRange())})})(e)})})(e),(e=>{e.on("keydown",t=>{t.isDefaultPrevented()||((e,t)=>{vR([...tO(e)],t).each(e=>{t.preventDefault()})})(e,t)})})(e),((e,t)=>{e.on("keydown",n=>{n.isDefaultPrevented()||((e,t,n)=>{const o=sn.os.isMacOS()||sn.os.isiOS();vR([{keyCode:Rp.END,action:yR(cR,e,!0)},{keyCode:Rp.HOME,action:yR(cR,e,!1)},...o?[]:[{keyCode:Rp.HOME,action:yR(dR,e,!1),ctrlKey:!0,shiftKey:!0},{keyCode:Rp.END,action:yR(dR,e,!0),ctrlKey:!0,shiftKey:!0}],{keyCode:Rp.END,action:yR(ER,e,!0)},{keyCode:Rp.HOME,action:yR(ER,e,!1)},{keyCode:Rp.END,action:yR(CA,e,!0,t)},{keyCode:Rp.HOME,action:yR(CA,e,!1,t)}],n).each(e=>{n.preventDefault()})})(e,t,n)})})(e,t),((e,t)=>{if(VT.os.isMacOS())return;const n=Ae(!1);e.on("keydown",t=>{WT(t)&&KT(n,e,!0)}),e.on("keyup",o=>{o.isDefaultPrevented()||((e,t,n)=>{vR([{keyCode:Rp.PAGE_UP,action:yR(CA,e,!1,t)},{keyCode:Rp.PAGE_DOWN,action:yR(CA,e,!0,t)}],n)})(e,t,o),WT(o)&&n.get()&&(KT(n,e,!1),e.nodeChanged())})})(e,t),t}},oO=(e,t)=>()=>{const n=S_(e);return C(n)&&n.nodeName===t},rO=e=>3===e.type,sO=e=>0===e.length,aO=e=>{const t=(t,n)=>{const o=Sh.create("li");q(t,e=>o.append(e)),n?e.insert(o,n,!0):e.append(o)},n=X(e.children(),(e,n)=>rO(n)?[...e,n]:sO(e)||rO(n)?e:(t(e,n),[]),[]);sO(n)||t(n)},iO=e=>{(e=>{e.on("init",()=>{e.on("keydown",t=>{t.defaultPrevented||(t.keyCode===Rp.BACKSPACE?wk(e,!1)&&t.preventDefault():t.keyCode===Rp.DELETE&&wk(e,!0)&&t.preventDefault())})})})(e),(e=>{e.addCommand("InsertUnorderedList",(t,n)=>{gk(e,"UL",n)}),e.addCommand("InsertOrderedList",(t,n)=>{gk(e,"OL",n)}),e.addCommand("InsertDefinitionList",(t,n)=>{gk(e,"DL",n)}),e.addCommand("RemoveList",()=>{nk(e)}),e.addCommand("mceListUpdate",(t,n)=>{f(n)&&((e,t)=>{const n=S_(e);null===n||D_(e,n)||e.undoManager.transact(()=>{f(t.styles)&&e.dom.setStyles(n,t.styles),f(t.attrs)&&he(t.attrs,(t,o)=>e.dom.setAttrib(n,o,t))})})(e,n)}),e.addCommand("mceListBackspaceDelete",(t,n)=>{wk(e,n)}),e.addQueryStateHandler("InsertUnorderedList",oO(e,"UL")),e.addQueryStateHandler("InsertOrderedList",oO(e,"OL")),e.addQueryStateHandler("InsertDefinitionList",oO(e,"DL"))})(e),(e=>{e.on("PreInit",()=>{const{parser:t}=e;t.addNodeFilter("ul,ol",e=>q(e,aO))})})(e),(e=>{hu(e)&&(e=>{e.on("keydown",t=>{t.keyCode!==Rp.TAB||Rp.metaKeyPressed(t)||e.undoManager.transact(()=>{(t.shiftKey?tk(e):ek(e))&&t.preventDefault()})})})(e)})(e)};class lO{editor;lastPath=[];constructor(e){let t;this.editor=e;const n=this;"onselectionchange"in e.getDoc()||e.on("NodeChange click mouseup keyup focus",n=>{const o=e.selection.getRng(),r={startContainer:o.startContainer,startOffset:o.startOffset,endContainer:o.endContainer,endOffset:o.endOffset};"nodechange"!==n.type&&Ip(r,t)||e.dispatch("SelectionChange"),t=r}),e.on("contextmenu",()=>{fp(e),e.dispatch("SelectionChange")}),e.on("SelectionChange",()=>{const t=e.selection.getStart(!0);t&&og(e)&&!n.isSameElementPath(t)&&e.dom.isChildOf(t,e.getBody())&&e.nodeChanged({selectionChange:!0})}),e.on("mouseup",t=>{!t.isDefaultPrevented()&&og(e)&&("IMG"===e.selection.getNode().nodeName?hp.setEditorTimeout(e,()=>{e.nodeChanged()}):e.nodeChanged())})}nodeChanged(e={}){const t=this.editor,n=t.selection;let o;if(t.initialized&&n&&!vm(t)&&!fu(t)){const r=t.getBody();o=n.getStart(!0)||r,o.ownerDocument===t.getDoc()&&t.dom.isChildOf(o,r)||(o=r);const s=[];t.dom.getParent(o,e=>e===r||(s.push(e),!1)),t.dispatch("NodeChange",{...e,element:o,parents:s})}}isSameElementPath(e){let t;const n=this.editor,o=re(n.dom.getParents(e,M,n.getBody()));if(o.length===this.lastPath.length){for(t=o.length;t>=0&&o[t]===this.lastPath[t];t--);if(-1===t)return this.lastPath=o,!0}return this.lastPath=o,!1}}const cO="x-tinymce/html",dO=N(cO),mO="\x3c!-- "+cO+" --\x3e",uO=e=>mO+e,fO=e=>-1!==e.indexOf(mO),gO="%MCEPASTEBIN%",pO=e=>e.dom.get("mcepastebin"),hO=e=>C(e)&&"mcepastebin"===e.id,bO=e=>e===gO,yO=(e,t)=>(dn.each(t,t=>{e=m(t,RegExp)?e.replace(t,""):e.replace(t[0],t[1])}),e),vO=e=>yO(e,[/^[\s\S]*]*>\s*|\s*<\/body[^>]*>[\s\S]*$/gi,/|/g,[/( ?)\u00a0<\/span>( ?)/g,(e,t,n)=>t||n?dt:" "],/
    /g,/
    $/i]),CO=(e,t)=>({content:e,cancelled:t}),wO=(e,t)=>(e.insertContent(t,{merge:Hm(e),paste:!0}),!0),SO=e=>/^https?:\/\/[\w\-\/+=.,!;:&%@^~(){}?#]+$/i.test(e),EO=(e,t,n)=>!(e.selection.isCollapsed()||!SO(t))&&((e,t,n)=>(e.undoManager.extra(()=>{n(e,t)},()=>{e.execCommand("mceInsertLink",!1,t)}),!0))(e,t,n),xO=(e,t,n)=>!!((e,t)=>SO(t)&&H(ru(e),e=>Ze(t.toLowerCase(),`.${e.toLowerCase()}`)))(e,t)&&((e,t,n)=>(e.undoManager.extra(()=>{n(e,t)},()=>{e.insertContent('')}),!0))(e,t,n),_O=(()=>{let e=0;return()=>"mceclip"+e++})(),kO=e=>{const t=tD();return nD(t,e),YR(t),t},NO=(e,t,n,o,r)=>{const s=((e,t,n)=>((e,t,n)=>{const o=((e,t,n)=>e.dispatch("PastePreProcess",{content:t,internal:n}))(e,t,n),r=((e,t)=>{const n=sS({sanitize:nu(e),sandbox_iframes:lu(e),sandbox_iframes_exclusions:cu(e),convert_unsafe_embeds:du(e)},e.schema);n.addNodeFilter("meta",e=>{dn.each(e,e=>{e.remove()})});const o=n.parse(t,{forced_root_block:!1,isRootContent:!0});return jh({validate:!0},e.schema).serialize(o)})(e,o.content);return e.hasEventListeners("PastePostProcess")&&!o.isDefaultPrevented()?((e,t,n)=>{const o=e.dom.create("div",{style:"display:none"},t),r=((e,t,n)=>e.dispatch("PastePostProcess",{node:t,internal:n}))(e,o,n);return CO(r.node.innerHTML,r.isDefaultPrevented())})(e,r,n):CO(r,o.isDefaultPrevented())})(e,t,n))(e,t,n);if(!s.cancelled){const t=s.content,n=()=>((e,t,n)=>{n||!Vm(e)?wO(e,t):((e,t)=>{dn.each([EO,xO,wO],n=>!n(e,t,wO))})(e,t)})(e,t,o);r?Qx(e,"insertFromPaste",{dataTransfer:kO(t)}).isDefaultPrevented()||(n(),Xx(e,"insertFromPaste")):n()}},AO=(e,t,n,o)=>{const r=n||fO(t);NO(e,(e=>e.replace(mO,""))(t),r,!1,o)},RO=(e,t,n)=>{const o=e.dom.encode(t).replace(/\r\n/g,"\n"),r=((e,t,n)=>{const o=e.split(/\n\n/),r=((e,t)=>{let n="<"+e;const o=Se(t,(e,t)=>t+'="'+Sa.encodeAllRaw(e)+'"');return o.length&&(n+=" "+o.join(" ")),n+">"})(t,n),s="",a=V(o,e=>e.split(/\n/).join("
    "));return 1===a.length?a[0]:V(a,e=>r+e+s).join("")})(Qr(o,Wm(e)),Ed(e),xd(e));NO(e,r,!1,!0,n)},DO=e=>{const t={};if(e&&e.types)for(let n=0;nt in e&&e[t].length>0,OO=e=>TO(e,"text/html")||TO(e,"text/plain"),BO=async(e,t)=>bC(t.uri).fold(()=>Promise.resolve(),({data:n,type:o,base64Encoded:r})=>{const s=r?n:btoa(n),a=t.file,i=e.editorUpload.blobCache,l=(i.getByData(s,o)??((e,t,n,o)=>{const r=_O(),s=Td(e)&&C(n.name),a=s?((e,t)=>{const n=t.match(/([\s\S]+?)(?:\.[a-z0-9.]+)$/i);return C(n)?e.dom.encode(n[1]):void 0})(e,n.name):r,i=s?n.name:void 0,l=t.create(r,n,o,a,i);return t.add(l),l})(e,i,a,s)).blobUri();return(c=l,new Promise((e,t)=>{const n=document.createElement("img");n.addEventListener("load",()=>{e({width:n.naturalWidth,height:n.naturalHeight})}),n.addEventListener("error",()=>{t(`Failed to get image dimensions for: ${c}`)}),n.src=c})).then(({width:t,height:n})=>{AO(e,``,!1,!0)}).catch(()=>{AO(e,``,!1,!0)});var c}),PO=(e,t,n)=>{const o="paste"===t.type?t.clipboardData:t.dataTransfer;var r;if(Im(e)&&o){const s=((e,t)=>{const n=t.items?ne(me(t.items),e=>"file"===e.kind?[e.getAsFile()]:[]):[],o=t.files?me(t.files):[];return Y(n.length>0?n:o,(e=>{const t=ru(e);return e=>Qe(e.type,"image/")&&H(t,t=>(e=>{const t=e.toLowerCase(),n={jpg:"jpeg",jpe:"jpeg",jfi:"jpeg",jif:"jpeg",jfif:"jpeg",pjpeg:"jpeg",pjp:"jpeg",svg:"svg+xml"};return dn.hasOwn(n,t)?"image/"+n[t]:"image/"+t})(t)===e.type)})(e))})(e,o);if(s.length>0)return t.preventDefault(),(r=s,Promise.all(V(r,e=>vC(e).then(t=>({file:e,uri:t}))))).then(async t=>{n&&e.selection.setRng(n);for(const n of t)await BO(e,n)}),!0}return!1},LO=(e,t,n,o,r)=>{let s=vO(n);const a=TO(t,dO())||fO(n),i=!a&&(e=>!/<(?:\/?(?!(?:div|p|br|span)>)\w+|(?:(?!(?:span style="white-space:\s?pre;?">)|br\s?\/>))\w+\s[^>]+)>/i.test(e))(s),l=SO(s);(bO(s)||!s.length||i&&!l)&&(o=!0),(o||l)&&(s=TO(t,"text/plain")&&i?t["text/plain"]:(e=>{const t=Ua(),n=sS({},t);let o="";const r=t.getVoidElements(),s=dn.makeMap("script noscript style textarea video audio iframe object"," "),a=t.getBlockElements(),i=e=>{const n=e.name,l=e;if("br"!==n){if("wbr"!==n)if(r[n]&&(o+=" "),s[n])o+=" ";else{if(3===e.type&&(o+=e.value),!(e.name in t.getVoidElements())){let t=e.firstChild;if(t)do{i(t)}while(t=t.next)}a[n]&&l.next&&(o+="\n","p"===n&&(o+="\n"))}}else o+="\n"};return e=yO(e,[//g]),i(n.parse(e)),o})(s)),bO(s)||(o?RO(e,s,r):AO(e,s,a,r))},MO=(e,t,n)=>{((e,t,n)=>{let o;e.on("keydown",e=>{(e=>Rp.metaKeyPressed(e)&&86===e.keyCode||e.shiftKey&&45===e.keyCode)(e)&&!e.isDefaultPrevented()&&(o=e.shiftKey&&86===e.keyCode)}),e.on("paste",r=>{if(r.isDefaultPrevented()||(e=>sn.os.isAndroid()&&0===e.clipboardData?.items?.length)(r))return;const s="text"===n.get()||o;o=!1;const a=DO(r.clipboardData);!OO(a)&&PO(e,r,t.getLastRng()||e.selection.getRng())||(TO(a,"text/html")?(r.preventDefault(),LO(e,a,a["text/html"],s,!0)):TO(a,"text/plain")&&TO(a,"text/uri-list")?(r.preventDefault(),LO(e,a,a["text/plain"],s,!0)):(t.create(),hp.setEditorTimeout(e,()=>{const n=t.getHtml();t.remove(),LO(e,a,n,s,!1)},0)))})})(e,t,n),(e=>{const t=e=>Qe(e,"webkit-fake-url"),n=e=>Qe(e,"data:");e.parser.addNodeFilter("img",(o,r,s)=>{if(!Im(e)&&(e=>!0===e.data?.paste)(s))for(const r of o){const o=r.attr("src");u(o)&&!r.attr("data-mce-object")&&o!==sn.transparentSrc&&(t(o)||!Km(e)&&n(o))&&r.remove()}})})(e)},IO=(e,t,n,o)=>{((e,t,n)=>{if(!e)return!1;try{return e.clearData(),e.setData("text/html",t),e.setData("text/plain",n),e.setData(dO(),t),!0}catch{return!1}})(e.clipboardData,t.html,t.text)?(e.preventDefault(),o()):n(t.html,o)},FO=e=>(t,n)=>{const{dom:o,selection:r}=e,s=o.create("div",{contenteditable:"false","data-mce-bogus":"all"}),a=o.create("div",{contenteditable:"true"},t);o.setStyles(s,{position:"fixed",top:"0",left:"-3000px",width:"1000px",overflow:"hidden"}),s.appendChild(a),o.add(e.getBody(),s);const i=r.getRng();a.focus();const l=o.createRng();l.selectNodeContents(a),r.setRng(l),hp.setEditorTimeout(e,()=>{r.setRng(i),o.remove(s),n()},0)},UO=e=>({html:uO(e.selection.getContent({contextual:!0})),text:e.selection.getContent({format:"text"})}),zO=e=>!e.selection.isCollapsed()||(e=>!!e.dom.getParent(e.selection.getStart(),"td[data-mce-selected],th[data-mce-selected]",e.getBody()))(e),jO=(e,t)=>Kp.getCaretRangeFromPoint(t.clientX??0,t.clientY??0,e.getDoc()),$O=(e,t)=>{t&&e.selection.setRng(t),e.focus()},HO=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi,VO=e=>dn.trim(e).replace(HO,Ya).toLowerCase(),qO=(e,t,n)=>{const o=jm(e);if(n||"all"===o||!$m(e))return t;const r=o?o.split(/[, ]/):[];if(r&&"none"!==o){const n=e.dom,o=e.selection.getNode();t=t.replace(/(<[^>]+) style="([^"]*)"([^>]*>)/gi,(e,t,s,a)=>{const i=n.parseStyle(n.decode(s)),l={};for(let e=0;e]+) style="([^"]*)"([^>]*>)/gi,"$1$3");return t=t.replace(/(<[^>]+) data-mce-style="([^"]+)"([^>]*>)/gi,(e,t,n,o)=>t+' style="'+n+'"'+o),t},WO=(e,t)=>{const n=Ae(!1),o=Ae(qm(e)?"text":"html"),r=(e=>{const t=Ae(null);return{create:()=>((e,t)=>{const{dom:n,selection:o}=e,r=e.getBody();t.set(o.getRng());const s=n.add(e.getBody(),"div",{id:"mcepastebin",class:"mce-pastebin",contentEditable:!0,"data-mce-bogus":"all",style:"position: fixed; top: 50%; width: 10px; height: 10px; overflow: hidden; opacity: 0"},gO);sn.browser.isFirefox()&&n.setStyle(s,"left","rtl"===n.getStyle(r,"direction",!0)?65535:-65535),n.bind(s,"beforedeactivate focusin focusout",e=>{e.stopPropagation()}),s.focus(),o.select(s,!0)})(e,t),remove:()=>((e,t)=>{const n=e.dom;if(pO(e)){let o;const r=t.get();for(;o=pO(e);)n.remove(o),n.unbind(o);r&&e.selection.setRng(r)}t.set(null)})(e,t),getEl:()=>pO(e),getHtml:()=>(e=>{const t=e.dom,n=(e,n)=>{e.appendChild(n),t.remove(n,!0)},[o,...r]=Y(e.getBody().childNodes,hO);q(r,e=>{n(o,e)});const s=t.select("div[id=mcepastebin]",o);for(let e=s.length-1;e>=0;e--){const r=t.create("div");o.insertBefore(r,s[e]),n(r,s[e])}return o?o.innerHTML:""})(e),getLastRng:t.get}})(e);(e=>{(sn.browser.isChromium()||sn.browser.isSafari())&&((e,t)=>{e.on("PastePreProcess",n=>{n.content=t(e,n.content,n.internal)})})(e,qO)})(e),((e,t)=>{e.addCommand("mceTogglePlainTextPaste",()=>{((e,t)=>{"text"===t.get()?(t.set("html"),ld(e,!1)):(t.set("text"),ld(e,!0)),e.focus()})(e,t)}),e.addCommand("mceInsertClipboardContent",(t,n)=>{n.html&&AO(e,n.html,n.internal,!1),n.text&&RO(e,n.text,!1)})})(e,o),(e=>{const t=t=>n=>{t(e,n)},n=Fm(e);w(n)&&e.on("PastePreProcess",t(n));const o=Um(e);w(o)&&e.on("PastePostProcess",t(o))})(e),e.addQueryStateHandler("mceTogglePlainTextPaste",()=>"text"===o.get()),e.on("PreInit",()=>{((e,t)=>{e.on("cut",((e,t)=>n=>{!n.isDefaultPrevented()&&zO(e)&&e.selection.isEditable()&&IO(n,UO(e),FO(e),()=>{if(sn.browser.isChromium()||sn.browser.isFirefox()){const n=e.selection.getRng();hp.setEditorTimeout(e,()=>{e.selection.setRng(n),KA(e,t)},0)}else KA(e,t)})})(e,t)),e.on("copy",(e=>t=>{!t.isDefaultPrevented()&&zO(e)&&IO(t,UO(e),FO(e),x)})(e))})(e,t),((e,t)=>{Mm(e)&&e.on("dragend dragover draggesture dragdrop drop drag",e=>{e.preventDefault(),e.stopPropagation()}),Im(e)||e.on("drop",e=>{const t=e.dataTransfer;t&&(e=>H(e.files,e=>/^image\//.test(e.type)))(t)&&e.preventDefault()}),e.on("drop",n=>{if(n.isDefaultPrevented())return;const o=jO(e,n);if(v(o))return;const r=DO(n.dataTransfer),s=TO(r,dO());if((!OO(r)||(e=>{const t=e["text/plain"];return!!t&&0===t.indexOf("file://")})(r))&&PO(e,n,o))return;const a=r[dO()],i=a||r["text/html"]||r["text/plain"],l=((e,t,n,o)=>{const r=e.getParent(n,e=>Zs(t,e));if(!h(e.getParent(n,"summary")))return!0;if(r&&_e(o,"text/html")){const e=(new DOMParser).parseFromString(o["text/html"],"text/html").body;return!h(e.querySelector(r.nodeName.toLowerCase()))}return!1})(e.dom,e.schema,o.startContainer,r),c=t.get();c&&!l||i&&(n.preventDefault(),hp.setEditorTimeout(e,()=>{e.undoManager.transact(()=>{(a||c&&l)&&e.execCommand("Delete"),$O(e,o);const t=vO(i);r["text/html"]?AO(e,t,s,!0):RO(e,t,!0)})}))}),e.on("dragstart",e=>{t.set(!0)}),e.on("dragover dragend",n=>{Im(e)&&!t.get()&&(n.preventDefault(),$O(e,jO(e,n))),"dragend"===n.type&&t.set(!1)}),(e=>{e.on("input",t=>{const n=e=>h(e.querySelector("summary"));if("deleteByDrag"===t.inputType){const t=Y(e.dom.select("details"),n);q(t,t=>{ps(t.firstChild)&&t.firstChild.remove();const n=e.dom.create("summary");n.appendChild(qi().dom),t.prepend(n)})}})})(e)})(e,n),MO(e,r,o)})},KO=ps,YO=cs,GO=e=>vs(e.dom),XO=e=>t=>vn(un.fromDom(e),t),QO=(e,t)=>lr(un.fromDom(e),GO,XO(t)),ZO=(e,t,n)=>{const o=new Kr(e,t),r=n?o.next.bind(o):o.prev.bind(o);let s=e;for(let t=n?e:r();t&&!KO(t);t=r())Nl(t)&&(s=t);return s},JO=e=>{const t=((e,t,n)=>{const o=Kl.fromRangeStart(e).getNode(),r=((e,t,n)=>lr(un.fromDom(e),e=>(e=>ys(e.dom))(e)||n.isBlock(En(e)),XO(t)).getOr(un.fromDom(t)).dom)(o,t,n),s=ZO(o,r,!1),a=ZO(o,r,!0),i=document.createRange();return QO(s,r).fold(()=>{YO(s)?i.setStart(s,0):i.setStartBefore(s)},e=>i.setStartBefore(e.dom)),QO(a,r).fold(()=>{YO(a)?i.setEnd(a,a.data.length):i.setEndAfter(a)},e=>i.setEndAfter(e.dom)),i})(e.selection.getRng(),e.getBody(),e.schema);e.selection.setRng(uC(t))};var eB;!function(e){e.Before="before",e.After="after"}(eB||(eB={}));const tB=(e,t)=>Math.abs(e.left-t),nB=(e,t)=>Math.abs(e.right-t),oB=(e,t)=>(e=>X(e,(e,t)=>e.fold(()=>I.some(t),e=>{const n=Math.min(t.left,e.left),o=Math.min(t.top,e.top),r=Math.max(t.right,e.right),s=Math.max(t.bottom,e.bottom);return I.some({top:o,right:r,bottom:s,left:n,width:r-n,height:s-o})}),I.none()))(Y(e,e=>{return(n=t)>=(o=e).top&&n<=o.bottom;var n,o})).fold(()=>[[],e],t=>{const{pass:n,fail:o}=K(e,e=>((e,t)=>{const n=((e,t)=>Math.max(0,Math.min(e.bottom,t.bottom)-Math.max(e.top,t.top)))(e,t)/Math.min(e.height,t.height);return((e,t)=>e.topt.top)(e,t)&&n>.5})(e,t));return[n,o]}),rB=(e,t,n)=>t>e.left&&t{const r=e=>Nl(e.node)?I.some(e):es(e.node)?sB(me(e.node.childNodes),t,n,!1):I.none(),s=(e,s)=>{const a=ie(e,(e,o)=>s(e,t,n)-s(o,t,n));return ue(a,r).map(e=>o&&!cs(e.node)&&a.length>1?((e,o,s)=>r(o).filter(o=>Math.abs(s(e,t,n)-s(o,t,n))<2&&cs(o.node)))(e,a[1],s).getOr(e):e)},[a,i]=oB(GN(e),n),{pass:l,fail:c}=K(i,e=>e.tops(c,gl)).orThunk(()=>s(l,gl))},aB=(e,t,n)=>((e,t,n)=>{const o=un.fromDom(e),r=Pn(o),s=un.fromPoint(r,t,n).filter(e=>Cn(o,e)).getOr(o);return((e,t,n,o)=>{const r=(t,s)=>{const a=Y(t.dom.childNodes,T(e=>es(e)&&e.classList.contains("mce-drag-container")));return s.fold(()=>sB(a,n,o,!0),e=>{const t=Y(a,t=>t!==e.dom);return sB(t,n,o,!0)}).orThunk(()=>(vn(t,e)?I.none():In(t)).bind(e=>r(e,I.some(t))))};return r(t,I.none())})(o,s,t,n)})(e,t,n).filter(e=>Bu(e.node)).map(e=>((e,t)=>({node:e.node,position:tB(e,t){const t=e.getBoundingClientRect(),n=e.ownerDocument,o=n.documentElement,r=n.defaultView;return{top:t.top+(r?.scrollY??0)-o.clientTop,left:t.left+(r?.scrollX??0)-o.clientLeft}},lB=e=>({target:e,srcElement:e}),cB=(e,t,n,o)=>{const r=((e,t)=>{const n=(e=>{const t=tD(),n=(e=>{const t=e;return I.from(t[VR])})(e);return YR(e),zR(t),t.dropEffect=e.dropEffect,t.effectAllowed=e.effectAllowed,(e=>{const t=e;return I.from(t[IR])})(e).each(e=>t.setDragImage(e.image,e.x,e.y)),q(e.types,n=>{"Files"!==n&&t.setData(n,e.getData(n))}),q(e.files,e=>t.items.add(e)),(e=>{const t=e;return I.from(t[FR])})(e).each(e=>{((e,t)=>{UR(t)(e)})(t,e)}),n.each(n=>{WR(e,n),WR(t,n)}),t})(e);return"dragstart"===t?(zR(n),KR(n)):"drop"===t?(jR(n),YR(n)):($R(n),GR(n)),n})(n,e);return y(o)?((e,t,n)=>{const o=O("Function not supported on simulated event.");return{bubbles:!0,cancelBubble:!1,cancelable:!0,composed:!1,currentTarget:null,defaultPrevented:!1,eventPhase:0,isTrusted:!0,returnValue:!1,timeStamp:0,type:e,composedPath:o,initEvent:o,preventDefault:x,stopImmediatePropagation:x,stopPropagation:x,AT_TARGET:window.Event.AT_TARGET,BUBBLING_PHASE:window.Event.BUBBLING_PHASE,CAPTURING_PHASE:window.Event.CAPTURING_PHASE,NONE:window.Event.NONE,altKey:!1,button:0,buttons:0,clientX:0,clientY:0,ctrlKey:!1,layerX:0,layerY:0,metaKey:!1,movementX:0,movementY:0,offsetX:0,offsetY:0,pageX:0,pageY:0,relatedTarget:null,screenX:0,screenY:0,shiftKey:!1,x:0,y:0,detail:0,view:null,which:0,initUIEvent:o,initMouseEvent:o,getModifierState:o,dataTransfer:n,...lB(t)}})(e,t,r):((e,t,n,o)=>({...t,dataTransfer:o,type:e,...lB(n)}))(e,o,t,r)},dB=vs,mB=((...e)=>t=>{for(let n=0;n{const r=e.dom,s=t.cloneNode(!0);r.setStyles(s,{width:n,height:o}),r.setAttrib(s,"data-mce-selected",null);const a=r.create("div",{class:"mce-drag-container","data-mce-bogus":"all",unselectable:"on",contenteditable:"false"});return r.setStyles(a,{position:"absolute",opacity:.5,overflow:"hidden",border:0,padding:0,margin:0,width:n,height:o}),r.setStyles(s,{margin:0,boxSizing:"border-box"}),a.appendChild(s),a},fB=(e,t)=>n=>()=>{const o="left"===e?n.scrollX:n.scrollY;n.scroll({[e]:o+t,behavior:"smooth"})},gB=fB("left",-32),pB=fB("left",32),hB=fB("top",-32),bB=fB("top",32),yB=e=>{e&&e.parentNode&&e.parentNode.removeChild(e)},vB=(e,t,n,o,r)=>{"dragstart"===t&&nD(o,e.dom.getOuterHTML(n));const s=cB(t,n,o,r);return e.dispatch(t,s)},CB=(e,t)=>{const n=at((e,n)=>((e,t,n)=>{e._selectionOverrides.hideFakeCaret(),aB(e.getBody(),t,n).fold(()=>e.selection.placeCaretAt(t,n),o=>{const r=e._selectionOverrides.showCaret(1,o.node,o.position===eB.Before,!1);r?e.selection.setRng(r):e.selection.placeCaretAt(t,n)})})(t,e,n),0);t.on("remove",n.cancel);const o=e;return r=>e.on(e=>{const s=Math.max(Math.abs(r.screenX-e.screenX),Math.abs(r.screenY-e.screenY));if(!e.dragging&&s>10){const n=vB(t,"dragstart",e.element,e.dataTransfer,r);if(C(n.dataTransfer)&&(e.dataTransfer=n.dataTransfer),n.isDefaultPrevented())return;e.dragging=!0,t.focus()}if(e.dragging){const s=r.currentTarget===t.getDoc().documentElement,l=((e,t)=>({pageX:t.pageX-e.relX,pageY:t.pageY+5}))(e,((e,t)=>{return n=(e=>e.inline?iB(e.getBody()):{left:0,top:0})(e),o=(e=>{const t=e.getBody();return e.inline?{left:t.scrollLeft,top:t.scrollTop}:{left:0,top:0}})(e),r=((e,t)=>{if(t.target.ownerDocument!==e.getDoc()){const n=iB(e.getContentAreaContainer()),o=(e=>{const t=e.getBody(),n=e.getDoc().documentElement,o={left:t.scrollLeft,top:t.scrollTop},r={left:t.scrollLeft||n.scrollLeft,top:t.scrollTop||n.scrollTop};return e.inline?o:r})(e);return{left:t.pageX-n.left+o.left,top:t.pageY-n.top+o.top}}return{left:t.pageX,top:t.pageY}})(e,t),{pageX:r.left-n.left+o.left,pageY:r.top-n.top+o.top};var n,o,r})(t,r));a=e.ghost,i=t.getBody(),a.parentNode!==i&&i.appendChild(a),((e,t,n,o,r,s,a,i,l,c,d,m)=>{let u=0,f=0;e.style.left=t.pageX+"px",e.style.top=t.pageY+"px",t.pageX+n>r&&(u=t.pageX+n-r),t.pageY+o>s&&(f=t.pageY+o-s),e.style.width=n-u+"px",e.style.height=o-f+"px";const g=l.clientHeight,p=l.clientWidth,h=a+l.getBoundingClientRect().top,b=i+l.getBoundingClientRect().left;d.on(e=>{e.intervalId.clear(),e.dragging&&m&&(a+8>=g?e.intervalId.set(bB(c)):a-8<=0?e.intervalId.set(hB(c)):i+8>=p?e.intervalId.set(pB(c)):i-8<=0?e.intervalId.set(gB(c)):h+16>=window.innerHeight?e.intervalId.set(bB(window)):h-16<=0?e.intervalId.set(hB(window)):b+16>=window.innerWidth?e.intervalId.set(pB(window)):b-16<=0&&e.intervalId.set(gB(window)))})})(e.ghost,l,e.width,e.height,e.maxX,e.maxY,r.clientY,r.clientX,t.getContentAreaContainer(),t.getWin(),o,s),n.throttle(r.clientX,r.clientY)}var a,i})},wB=(e,t,n)=>{e.on(e=>{e.intervalId.clear(),e.dragging&&n.fold(()=>vB(t,"dragend",e.element,e.dataTransfer),n=>vB(t,"dragend",e.element,e.dataTransfer,n))}),SB(e)},SB=e=>{e.on(e=>{e.intervalId.clear(),yB(e.ghost)}),e.clear()},EB=e=>{const t=Ke(),n=gi.DOM,o=document,r=((e,t)=>n=>{if((e=>0===e.button)(n)){const o=Z(t.dom.getParents(n.target),mB).getOr(null);if(C(o)&&((e,t,n)=>dB(n)&&n!==t&&e.isEditable(n.parentElement))(t.dom,t.getBody(),o)){const r=t.dom.getPos(o),s=t.getBody(),a=t.getDoc().documentElement;e.set({element:o,dataTransfer:tD(),dragging:!1,screenX:n.screenX,screenY:n.screenY,maxX:(t.inline?s.scrollWidth:a.offsetWidth)-2,maxY:(t.inline?s.scrollHeight:a.offsetHeight)-2,relX:n.pageX-r.x,relY:n.pageY-r.y,width:o.offsetWidth,height:o.offsetHeight,ghost:uB(t,o,o.offsetWidth,o.offsetHeight),intervalId:We(100)})}}})(t,e),s=CB(t,e),a=((e,t)=>n=>{e.on(e=>{if(e.intervalId.clear(),e.dragging){if(((e,t,n)=>!v(t)&&t!==n&&!e.dom.isChildOf(t,n)&&e.dom.isEditable(t))(t,(e=>{const t=e.getSel();if(C(t)){const e=t.getRangeAt(0).startContainer;return cs(e)?e.parentNode:e}return null})(t.selection),e.element)){const o=t.getDoc().elementFromPoint(n.clientX,n.clientY)??t.getBody();vB(t,"drop",o,e.dataTransfer,n).isDefaultPrevented()||t.undoManager.transact(()=>{((e,t)=>{const n=e.getParent(t.parentNode,e.isBlock);yB(t),n&&n!==e.getRoot()&&e.isEmpty(n)&&Wi(un.fromDom(n))})(t.dom,e.element),(e=>{const t=e.getData("text/html");return""===t?I.none():I.some(t)})(e.dataTransfer).each(e=>t.insertContent(e)),t._selectionOverrides.hideFakeCaret()})}vB(t,"dragend",t.getBody(),e.dataTransfer,n)}}),SB(e)})(t,e),i=((e,t)=>n=>wB(e,t,I.some(n)))(t,e);e.on("mousedown",r),e.on("mousemove",s),e.on("mouseup",a),n.bind(o,"mousemove",s),n.bind(o,"mouseup",i),e.on("remove",()=>{n.unbind(o,"mousemove",s),n.unbind(o,"mouseup",i)}),e.on("keydown",n=>{n.keyCode===Rp.ESC&&wB(t,e,I.none())})},xB=vs,_B=(e,t)=>Fy(e.getBody(),t),kB=e=>{const t=e.selection,n=e.dom,o=e.getBody(),r=Du(e,o,n.isBlock,()=>kp(e)),s="sel-"+n.uniqueId(),a="data-mce-selected";let i;const l=e=>e!==o&&(xB(e)||xs(e))&&n.isChildOf(e,o)&&n.isEditable(e.parentNode),c=(n,o,s,a=!0)=>e.dispatch("ShowCaret",{target:o,direction:n,before:s}).isDefaultPrevented()?null:(a&&t.scrollIntoView(o,-1===n),r.show(s,o)),d=e=>el(e)||rl(e)||sl(e),m=e=>d(e.startContainer)||d(e.endContainer),u=t=>{const o=e.schema.getVoidElements(),r=n.createRng(),s=t.startContainer,a=t.startOffset,i=t.endContainer,l=t.endOffset;return _e(o,s.nodeName.toLowerCase())?0===a?r.setStartBefore(s):r.setStartAfter(s):r.setStart(s,a),_e(o,i.nodeName.toLowerCase())?0===l?r.setEndBefore(i):r.setEndAfter(i):r.setEnd(i,l),r},f=(r,d)=>{if(!r)return null;if(r.collapsed){if(!m(r)){const e=d?1:-1,t=of(e,o,r),s=t.getNode(!d);if(C(s)){if(Bu(s))return c(e,s,!!d&&!t.isAtEnd(),!1);if(Ji(s)&&vs(s.nextSibling)){const e=n.createRng();return e.setStart(s,0),e.setEnd(s,0),e}}const a=t.getNode(d);if(C(a)){if(Bu(a))return c(e,a,!d&&!t.isAtEnd(),!1);if(Ji(a)&&vs(a.previousSibling)){const e=n.createRng();return e.setStart(a,1),e.setEnd(a,1),e}}}return null}let u=r.startContainer,f=r.startOffset;const g=r.endOffset;if(cs(u)&&0===f&&xB(u.parentNode)&&(u=u.parentNode,f=n.nodeIndex(u),u=u.parentNode),!es(u))return null;if(g===f+1&&u===r.endContainer){const o=u.childNodes[f];if(l(o))return(o=>{const r=Rs(o)?(t=>{const n=e.getDoc().createElement("div");n.style.width=t.style.width,n.style.height=t.style.height;const o=t.getAttribute("width");o&&n.setAttribute("width",o);const r=t.getAttribute("height");return r&&n.setAttribute("height",r),n})(o):o.cloneNode(!0),l=e.dispatch("ObjectSelected",{target:o,targetClone:r});if(l.isDefaultPrevented())return null;const c=((o,r)=>{const a=un.fromDom(e.getBody()),i=e.getDoc(),l=ur(a,"#"+s).getOrThunk(()=>{const e=un.fromHtml('
    ',i);return vo(e,"id",s),go(a,e),e}),c=n.createRng();No(l),bo(l,[un.fromText(dt,i),un.fromDom(r),un.fromText(dt,i)]),c.setStart(l.dom.firstChild,1),c.setEnd(l.dom.lastChild,0),jo(l,{top:n.getPos(o,e.getBody()).y+"px"}),io(l);const d=t.getSel();return d&&(d.removeAllRanges(),d.addRange(c)),c})(o,l.targetClone),d=un.fromDom(o);return q(Ar(un.fromDom(e.getBody()),`*[${a}]`),e=>{vn(d,e)||xo(e,a)}),n.getAttrib(o,a)||o.setAttribute(a,"1"),i=o,p(),c})(o)}return null},g=()=>{i&&i.removeAttribute(a),ur(un.fromDom(e.getBody()),"#"+s).each(Ao),i=null},p=()=>{r.hide()};return EE(e)||(e.on("click",t=>{n.isEditable(t.target)||(t.preventDefault(),e.focus())}),e.on("blur NewBlock",g),e.on("ResizeWindow FullscreenStateChanged",r.reposition),e.on("tap",t=>{const n=t.target,o=_B(e,n);xB(o)?(t.preventDefault(),Ik(e,o).each(f)):l(n)&&Ik(e,n).each(f)},!0),e.on("mousedown",r=>{const s=r.target;if(s!==o&&"HTML"!==s.nodeName&&!n.isChildOf(s,o))return;if(!((e,t,n)=>{const o=un.fromDom(e.getBody()),r=e.inline?o:un.fromDom(Pn(o).dom.documentElement),s=((e,t,n,o)=>{const r=(e=>e.dom.getBoundingClientRect())(t);return{x:n-(e?r.left+t.dom.clientLeft+HE(t):0),y:o-(e?r.top+t.dom.clientTop+$E(t):0)}})(e.inline,r,t,n);return((e,t,n)=>{const o=zE(e),r=jE(e);return t>=0&&n>=0&&t<=o&&n<=r})(r,s.x,s.y)})(e,r.clientX,r.clientY))return;g(),p();const a=_B(e,s);xB(a)?(r.preventDefault(),Ik(e,a).each(f)):aB(o,r.clientX,r.clientY).each(n=>{var o;r.preventDefault(),(o=c(1,n.node,n.position===eB.Before,!1))&&t.setRng(o),ts(a)?a.focus():e.getBody().focus()})}),e.on("keypress",e=>{Rp.modifierPressed(e)||xB(t.getNode())&&e.preventDefault()}),e.on("GetSelectionRange",e=>{let t=e.range;if(i){if(!i.parentNode)return void(i=null);t=t.cloneRange(),t.selectNode(i),e.range=t}}),e.on("focusin",t=>{if(!xs(t.target)&&e.getBody().contains(t.target)&&t.target!==e.getBody()&&!e.dom.isEditable(t.target.parentNode)){r.isShowing()&&r.hide(),t.target.contains(e.selection.getNode())||(e.selection.select(t.target,!0),e.selection.collapse(!0));const n=f(e.selection.getRng(),!0);n&&e.selection.setRng(n)}}),e.on("SetSelectionRange",e=>{e.range=u(e.range);const t=f(e.range,e.forward);t&&(e.range=t)}),e.on("AfterSetSelectionRange",e=>{const t=e.range,o=t.startContainer.parentElement;var r;m(t)||es(r=o)&&"mcepastebin"===r.id||p(),(e=>C(e)&&n.hasClass(e,"mce-offscreen-selection"))(o)||g()}),(e=>{EB(e),_m(e)&&(e=>{const t=t=>{if(!t.isDefaultPrevented()){const n=t.dataTransfer;n&&($(n.types,"Files")||n.files.length>0)&&(t.preventDefault(),"drop"===t.type&&GE(e,"Dropped file type is not supported"))}},n=n=>{Cp(e,n.target)&&t(n)},o=()=>{const o=gi.DOM,r=e.dom,s=document,a=e.inline?e.getBody():e.getDoc(),i=["drop","dragover"];q(i,e=>{o.bind(s,e,n),r.bind(a,e,t)}),e.on("remove",()=>{q(i,e=>{o.unbind(s,e,n),r.unbind(a,e,t)})})};e.on("init",()=>{hp.setEditorTimeout(e,o,0)})})(e)})(e),(e=>{const t=at(()=>{if(!e.removed&&e.getBody().contains(document.activeElement)){const t=e.selection.getRng();if(t.collapsed){const n=Fk(e,t,!1);e.selection.setRng(n)}}},0);e.on("focus",()=>{t.throttle()}),e.on("blur",()=>{t.cancel()})})(e),(e=>{e.on("init",()=>{e.on("focusin",t=>{const n=t.target;if(xs(n)){const t=Fy(e.getBody(),n),o=vs(t)?t:n;e.selection.getNode()!==o&&Ik(e,o).each(t=>e.selection.setRng(t))}})})})(e)),{showCaret:c,showBlockCaretContainer:e=>{e.hasAttribute("data-mce-caret")&&(al(e),t.scrollIntoView(e))},hideFakeCaret:p,destroy:()=>{r.destroy(),i=null}}},NB=(e,t)=>{let n=t;for(let t=e.previousSibling;cs(t);t=t.previousSibling)n+=t.data.length;return n},AB=(e,t,n,o,r)=>{if(cs(n)&&(o<0||o>n.data.length))return[];const s=r&&cs(n)?[NB(n,o)]:[o];let a=n;for(;a!==t&&a.parentNode;)s.push(e.nodeIndex(a,r)),a=a.parentNode;return a===t?s.reverse():[]},RB=(e,t,n,o,r,s,a=!1)=>({start:AB(e,t,n,o,a),end:AB(e,t,r,s,a)}),DB=(e,t)=>{const n=t.slice(),o=n.pop();return S(o)?X(n,(e,t)=>e.bind(e=>I.from(e.childNodes[t])),I.some(e)).bind(e=>cs(e)&&(o<0||o>e.data.length)?I.none():I.some({node:e,offset:o})):I.none()},TB=(e,t)=>DB(e,t.start).bind(({node:n,offset:o})=>DB(e,t.end).map(({node:e,offset:t})=>{const r=document.createRange();return r.setStart(n,o),r.setEnd(e,t),r})),OB=(e,t,n)=>{if(t&&e.isEmpty(t)&&!n(t)){const o=t.parentNode;e.remove(t,cs(t.firstChild)&&Gr(t.firstChild.data)),OB(e,o,n)}},BB=(e,t,n,o=!0)=>{const r=t.startContainer.parentNode,s=t.endContainer.parentNode;t.deleteContents(),o&&!n(t.startContainer)&&(cs(t.startContainer)&&0===t.startContainer.data.length&&e.remove(t.startContainer),cs(t.endContainer)&&0===t.endContainer.data.length&&e.remove(t.endContainer),OB(e,r,n),r!==s&&OB(e,s,n))},PB=(e,t)=>I.from(e.dom.getParent(t.startContainer,e.dom.isBlock)),LB=(e,t,n)=>{const o=e.dynamicPatternsLookup({text:n,block:t});return{...e,blockPatterns:Zc(o).concat(e.blockPatterns),inlinePatterns:Jc(o).concat(e.inlinePatterns)}},MB=(e,t,n,o)=>{const r=e.createRng();return r.setStart(t,0),r.setEnd(n,o),r.toString()},IB=(e,t)=>e.create("span",{"data-mce-type":"bookmark",id:t}),FB=(e,t)=>{const n=e.createRng();return n.setStartAfter(t.start),n.setEndBefore(t.end),n},UB=(e,t,n)=>{const o=TB(e.getRoot(),n).getOrDie("Unable to resolve path range"),r=o.startContainer,s=o.endContainer,a=0===o.endOffset?s:s.splitText(o.endOffset),i=0===o.startOffset?r:r.splitText(o.startOffset),l=i.parentNode;return{prefix:t,end:a.parentNode.insertBefore(IB(e,t+"-end"),a),start:l.insertBefore(IB(e,t+"-start"),i)}},zB=(e,t,n)=>{OB(e,e.get(t.prefix+"-end"),n),OB(e,e.get(t.prefix+"-start"),n)},jB=e=>0===e.start.length,$B=(e,t,n,o)=>{const r=t.start;var s;return AD(e,o.container,o.offset,(s=r,(e,t)=>{const n=e.data.substring(0,t),o=n.lastIndexOf(s.charAt(s.length-1)),r=n.lastIndexOf(s);return-1!==r?r+s.length:-1!==o?o+1:-1}),n).bind(o=>{const s=n.textContent?.indexOf(r)??-1;if(-1!==s&&o.offset>=s+r.length){const t=e.createRng();return t.setStart(o.container,o.offset-r.length),t.setEnd(o.container,o.offset),I.some(t)}{const s=o.offset-r.length;return kD(o.container,s,n).map(t=>{const n=e.createRng();return n.setStart(t.container,t.offset),n.setEnd(o.container,o.offset),n}).filter(e=>e.toString()===r).orThunk(()=>$B(e,t,n,SD(o.container,0)))}})},HB=(e,t,n,o)=>{const r=e.dom,s=r.getRoot(),a=n.pattern,i=n.position.container,l=n.position.offset;return kD(i,l-n.pattern.end.length,t).bind(c=>{const d=RB(r,s,c.container,c.offset,i,l,o);if(jB(a))return I.some({matches:[{pattern:a,startRng:d,endRng:d}],position:c});{const i=VB(e,n.remainingPatterns,c.container,c.offset,t,o),l=i.getOr({matches:[],position:c}),m=l.position,u=((e,t,n,o,r,s=!1)=>{if(0===t.start.length&&!s){const t=e.createRng();return t.setStart(n,o),t.setEnd(n,o),I.some(t)}return _D(n,o,r).bind(n=>$B(e,t,r,n).bind(e=>{if(s){if(e.endContainer===n.container&&e.endOffset===n.offset)return I.none();if(0===n.offset&&e.endContainer.textContent?.length===e.endOffset)return I.none()}return I.some(e)}))})(r,a,m.container,m.offset,t,i.isNone());return u.map(e=>{const t=((e,t,n,o=!1)=>RB(e,t,n.startContainer,n.startOffset,n.endContainer,n.endOffset,o))(r,s,e,o);return{matches:l.matches.concat([{pattern:a,startRng:t,endRng:d}]),position:SD(e.startContainer,e.startOffset)}})}})},VB=(e,t,n,o,r,s)=>{const a=e.dom;return _D(n,o,a.getRoot()).bind(i=>{const l=MB(a,r,n,o);for(let a=0;a0)return VB(e,t,n,o-1,r,s);if(m.isSome())return m}return I.none()})},qB=(e,t,n)=>{e.selection.setRng(n),"inline-format"===t.type?q(t.format,t=>{e.formatter.apply(t)}):e.execCommand(t.cmd,!1,t.value)},WB=(e,t,n,o,r,s)=>{var a;return((e,t)=>{const n=oe(e,e=>H(t,t=>e.pattern.start===t.pattern.start&&e.pattern.end===t.pattern.end));return e.length===t.length?n?e:t:e.length>t.length?e:t})(VB(e,r.inlinePatterns,n,o,t,s).fold(()=>[],e=>e.matches),VB(e,(a=r.inlinePatterns,ie(a,(e,t)=>t.end.length-e.end.length)),n,o,t,s).fold(()=>[],e=>e.matches))},KB=(e,t)=>{if(0===t.length)return;const n=e.dom,o=e.selection.getBookmark(),r=((e,t)=>{const n=Le("mce_textpattern"),o=G(t,(t,o)=>{const r=UB(e,n+`_end${t.length}`,o.endRng);return t.concat([{...o,endMarker:r}])},[]);return G(o,(t,r)=>{const s=o.length-t.length-1,a=jB(r.pattern)?r.endMarker:UB(e,n+`_start${s}`,r.startRng);return t.concat([{...r,startMarker:a}])},[])})(n,t);q(r,t=>{const o=n.getParent(t.startMarker.start,n.isBlock),r=e=>e===o;jB(t.pattern)?((e,t,n,o)=>{const r=FB(e.dom,n);BB(e.dom,r,o),qB(e,t,r)})(e,t.pattern,t.endMarker,r):((e,t,n,o,r)=>{const s=e.dom,a=FB(s,o),i=FB(s,n);BB(s,i,r),BB(s,a,r);const l={prefix:n.prefix,start:n.end,end:o.start},c=FB(s,l);qB(e,t,c)})(e,t.pattern,t.startMarker,t.endMarker,r),zB(n,t.endMarker,r),zB(n,t.startMarker,r)}),e.selection.moveToBookmark(o)},YB=(e,t,n)=>((e,t,n)=>{if(cs(e)&&0>=e.length)return I.some(SD(e,0));{const t=Pi(ED);return I.from(t.forwards(e,0,xD(e),n)).map(e=>SD(e.container,0))}})(t,0,t).map(o=>{const r=o.container;return ND(r,n.start.length,t).each(n=>{const o=e.createRng();o.setStart(r,0),o.setEnd(n.container,n.offset),BB(e,o,e=>e===t)}),r}),GB=e=>(t,n)=>{const o=t.dom,r=n.pattern,s=TB(o.getRoot(),n.range).getOrDie("Unable to resolve path range");return PB(t,s).each(n=>{"block-format"===r.type?((e,t)=>{const n=t.get(e);return p(n)&&ce(n).exists(e=>_e(e,"block"))})(r.format,t.formatter)&&t.undoManager.transact(()=>{e(t.dom,n,r),t.formatter.apply(r.format)}):"block-command"===r.type&&t.undoManager.transact(()=>{e(t.dom,n,r),t.execCommand(r.cmd,!1,r.value)})}),!0},XB=e=>(t,n)=>{const o=(e=>ie(e,(e,t)=>t.start.length-e.start.length))(t),r=n.replace(dt," ");return Z(o,t=>e(t,n,r))},QB=(e,t)=>(n,o,r,s,a=o.textContent??"")=>{const i=n.dom,l=Ed(n);return i.is(o,l)?e(r.blockPatterns,a).map(e=>t&&dn.trim(a).length===e.start.length?[]:[{pattern:e,range:RB(i,i.getRoot(),o,0,o,0,s)}]).getOr([]):[]},ZB=GB((e,t,n)=>{YB(e,t,n).each(e=>{const t=un.fromDom(e),n=or(t);/^\s[^\s]/.test(n)&&rr(t,n.slice(1))})}),JB=XB((e,t,n)=>0===t.indexOf(e.start)||0===n.indexOf(e.start)),eP=QB(JB,!0),tP=GB(YB),nP=XB((e,t,n)=>t===e.start||n===e.start),oP=QB(nP,!1),rP=(e,t,n)=>{for(let o=0;o{const t=[",",".",";",":","!","?"],n=[32],o=()=>{return t=Ym(e).filter(t=>"inline-command"!==t.type&&"block-command"!==t.type||e.queryCommandSupported(t.cmd)),n=Gm(e),{inlinePatterns:Jc(t),blockPatterns:Zc(t),dynamicPatternsLookup:n};var t,n},r=()=>(e=>e.options.isSet("text_patterns_lookup"))(e);e.on("keydown",t=>{if(13===t.keyCode&&!Rp.modifierPressed(t)&&e.selection.isCollapsed()&&e.selection.isEditable()){const n=ed(o(),"enter");(n.inlinePatterns.length>0||n.blockPatterns.length>0||r())&&((e,t)=>((e,t)=>{const n=e.selection.getRng();return PB(e,n).map(o=>{const r=Math.max(0,n.startOffset),s=LB(t,o,o.textContent??"");return{inlineMatches:WB(e,o,n.startContainer,r,s,!0),blockMatches:eP(e,o,s,!0)}}).filter(({inlineMatches:e,blockMatches:t})=>t.length>0||e.length>0)})(e,t).fold(L,({inlineMatches:t,blockMatches:n})=>(e.undoManager.add(),e.undoManager.extra(()=>{e.execCommand("mceInsertNewLine")},()=>{(e=>{e.insertContent(Ki,{preserve_zwsp:!0})})(e),KB(e,t),((e,t)=>{if(0===t.length)return;const n=e.selection.getBookmark();q(t,t=>ZB(e,t)),e.selection.moveToBookmark(n)})(e,n);const o=e.selection.getRng(),r=_D(o.startContainer,o.startOffset,e.dom.getRoot());e.execCommand("mceInsertNewLine"),r.each(t=>{const n=t.container;n.data.charAt(t.offset-1)===ct&&(n.deleteData(t.offset-1,1),OB(e.dom,n.parentNode,t=>t===e.dom.getRoot()))})}),!0)))(e,n)&&t.preventDefault()}},!0),e.on("keydown",t=>{if(32===t.keyCode&&e.selection.isCollapsed()&&e.selection.isEditable()){const n=ed(o(),"space");(n.blockPatterns.length>0||r())&&((e,t)=>((e,t)=>{const n=e.selection.getRng();return PB(e,n).map(o=>{const r=Math.max(0,n.startOffset),s=MB(e.dom,o,n.startContainer,r),a=LB(t,o,s);return oP(e,o,a,!1,s)}).filter(e=>e.length>0)})(e,t).fold(L,t=>(e.undoManager.transact(()=>{((e,t)=>{q(t,t=>tP(e,t))})(e,t)}),!0)))(e,n)&&t.preventDefault()}},!0);const s=()=>{if(e.selection.isCollapsed()&&e.selection.isEditable()){const t=ed(o(),"space");(t.inlinePatterns.length>0||r())&&((e,t)=>{const n=e.selection.getRng();PB(e,n).map(o=>{const r=Math.max(0,n.startOffset-1),s=MB(e.dom,o,n.startContainer,r),a=LB(t,o,s),i=WB(e,o,n.startContainer,r,a,!1);i.length>0&&e.undoManager.transact(()=>{KB(e,i)})})})(e,t)}};e.on("keyup",e=>{rP(n,e,(e,t)=>e===t.keyCode&&!Rp.modifierPressed(t))&&s()}),e.on("keypress",n=>{rP(t,n,(e,t)=>e.charCodeAt(0)===t.charCode)&&hp.setEditorTimeout(e,s)})},aP=e=>{const t=dn.each,n=Rp.BACKSPACE,o=Rp.DELETE,r=e.dom,s=e.selection,a=e.parser,i=sn.browser,l=i.isFirefox(),c=i.isChromium()||i.isSafari(),d=i.isSafari(),m=sn.deviceType.isiPhone()||sn.deviceType.isiPad(),u=sn.os.isMacOS()||sn.os.isiOS(),f=(t,n)=>{try{e.getDoc().execCommand(t,!1,String(n))}catch{}},g=e=>e.isDefaultPrevented(),p=()=>{e.shortcuts.add("meta+a",null,"SelectAll")},h=()=>{e.inline||r.bind(e.getDoc(),"mousedown mouseup",t=>{let n;if(t.target===e.getDoc().documentElement)if(n=s.getRng(),null!==e.getDoc().getSelection()?.anchorNode&&e.getBody().focus(),"mousedown"===t.type){if(el(n.startContainer))return;s.placeCaretAt(t.clientX,t.clientY)}else s.setRng(n)})},b=()=>{Range.prototype.getClientRects||e.on("mousedown",t=>{if(!g(t)&&"HTML"===t.target.nodeName){const t=e.getBody();t.blur(),hp.setEditorTimeout(e,()=>{t.focus()})}})},y=()=>{const t=Am(e);e.on("click",n=>{const o=n.target;/^(IMG|HR)$/.test(o.nodeName)&&r.isEditable(o)&&(n.preventDefault(),e.selection.select(o),e.nodeChanged()),"A"===o.nodeName&&r.hasClass(o,t)&&0===o.childNodes.length&&r.isEditable(o.parentNode)&&(n.preventDefault(),s.select(o))})},v=()=>{e.on("keydown",e=>{if(!g(e)&&e.keyCode===n&&s.isCollapsed()&&0===s.getRng().startOffset){const t=s.getNode().previousSibling;if(t&&t.nodeName&&"table"===t.nodeName.toLowerCase())return e.preventDefault(),!1}return!0})},w=()=>{Cm(e)||e.on("BeforeExecCommand mousedown",()=>{f("StyleWithCSS",!1),f("enableInlineTableEditing",!1),Zd(e)||f("enableObjectResizing",!1)})},S=()=>{e.contentStyles.push("img:-moz-broken {-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}")},E=()=>{e.inline||e.on("keydown",()=>{document.activeElement===document.body&&e.getWin().focus()})},_=()=>{e.inline||(e.contentStyles.push("body {min-height: 150px}"),e.on("click",t=>{let n;"HTML"===t.target.nodeName&&(n=e.selection.getRng(),e.getBody().focus(),e.selection.setRng(n),e.selection.normalize(),e.nodeChanged())}))},k=()=>{u&&e.on("keydown",t=>{!Rp.metaKeyPressed(t)||t.shiftKey||37!==t.keyCode&&39!==t.keyCode||(t.preventDefault(),e.selection.getSel().modify("move",37===t.keyCode?"backward":"forward","lineboundary"))})},N=()=>{e.on("click",e=>{let t=e.target;do{if("A"===t.tagName)return void e.preventDefault()}while(t=t.parentNode)}),e.contentStyles.push(".mce-content-body {-webkit-touch-callout: none}")},A=()=>{e.on("init",()=>{e.dom.bind(e.getBody(),"submit",e=>{e.preventDefault()})})},R=e=>GN([e.dom]).length>0,D=x;return EE(e)?(c&&(h(),y(),A(),p(),m&&(E(),_(),N())),l&&(b(),w(),S(),k())):(e.on("keydown",t=>{if(g(t)||t.keyCode!==Rp.BACKSPACE)return;let n=s.getRng();const o=n.startContainer,a=n.startOffset,i=r.getRoot();let l=o;if(n.collapsed&&0===a){for(;l.parentNode&&l.parentNode.firstChild===l&&l.parentNode!==i;)l=l.parentNode;"BLOCKQUOTE"===l.nodeName&&(e.formatter.toggle("blockquote",void 0,l),n=r.createRng(),n.setStart(o,0),n.setEnd(o,0),s.setRng(n))}}),(()=>{const t=e=>{const t=r.create("body"),n=e.cloneContents();return t.appendChild(n),s.serializer.serialize(t,{format:"html"})};e.on("keydown",s=>{const a=s.keyCode;if(!g(s)&&(a===o||a===n)&&e.selection.isEditable()){const n=e.selection.isCollapsed(),i=e.getBody();if(n&&!Ps(e.schema,i))return;if(!n&&!(n=>{const o=t(n),s=r.createRng();return s.selectNode(e.getBody()),o===t(s)})(e.selection.getRng()))return;s.preventDefault(),Zx(e,a===o,()=>e.setContent(""))&&(i.firstChild&&r.isBlock(i.firstChild)?e.selection.setCursorLocation(i.firstChild,0):e.selection.setCursorLocation(i,0))}})})(),sn.windowsPhone||e.on("keyup focusin mouseup",t=>{Rp.modifierPressed(t)||(e=>{const t=e.getBody(),n=e.selection.getRng();return n.startContainer===n.endContainer&&n.startContainer===t&&0===n.startOffset&&n.endOffset===t.childNodes.length})(e)||s.normalize()},!0),c&&(h(),y(),e.on("init",()=>{f("DefaultParagraphSeparator",Ed(e))}),A(),v(),a.addNodeFilter("br",e=>{let t=e.length;for(;t--;)"Apple-interchange-newline"===e[t].attr("class")&&e[t].remove()}),d||e.on("mousedown",t=>{const n=un.fromDom(t.target);ji(n)&&(e=>cr(e,e=>Mi(e)||An(e)&&"block"===$o(e,"display")))(n).each(o=>{var r,s;(r=$n(o),s=R,ee(r,s).map(e=>e.v)).each(r=>{le(GN([r.dom]),0).exists(e=>((e,t,n)=>e>=n.right&&t>=n.top&&t<=n.bottom)(t.clientX,t.clientY,e))&&Nf(n.dom,Kl(o.dom,0)).each(n=>{t.preventDefault(),e.focus(),e.selection.setRng(n.toRange())})})})}),m?(E(),_(),N()):p()),l&&((()=>{const t=On("figcaption");e.on("keydown",n=>{if(n.keyCode===Rp.LEFT||n.keyCode===Rp.RIGHT){const o=un.fromDom(e.selection.getNode());t(o)&&e.selection.isCollapsed()&&Mn(o).bind(t=>0===e.selection.getRng().startOffset&&n.keyCode===Rp.LEFT?zn(t):e.selection.getRng().endOffset===o.dom.textContent?.length&&n.keyCode===Rp.RIGHT?jn(t):I.none()).each(t=>{e.selection.setCursorLocation(t.dom,0)})}})})(),e.on("mousedown",t=>{$e(I.from(t.clientX),I.from(t.clientY),(n,o)=>{const r=e.getDoc().caretPositionFromPoint(n,o),s=r?.offsetNode?.childNodes[r.offset-(r.offset>0?1:0)]||r?.offsetNode;if(C(s)&&"IMG"===(a=s).nodeName&&e.dom.isEditable(a)){const n=s.getBoundingClientRect();t.preventDefault(),e.hasFocus()||e.focus(),e.selection.select(s),t.clientXn.right||t.clientY>n.bottom)&&e.selection.collapse(!1)}var a})}),e.on("keydown",t=>{if(!g(t)&&t.keyCode===n){if(!e.getBody().getElementsByTagName("hr").length)return;if(s.isCollapsed()&&0===s.getRng().startOffset){const e=s.getNode(),n=e.previousSibling;if("HR"===e.nodeName)return r.remove(e),void t.preventDefault();n&&n.nodeName&&"hr"===n.nodeName.toLowerCase()&&(r.remove(n),t.preventDefault())}}}),b(),(()=>{const n=()=>{const n=r.getAttribs(s.getStart().cloneNode(!1));return()=>{const o=s.getStart();o!==e.getBody()&&(r.setAttrib(o,"style",null),t(n,e=>{o.setAttributeNode(e.cloneNode(!0))}))}},o=()=>!s.isCollapsed()&&r.getParent(s.getStart(),r.isBlock)!==r.getParent(s.getEnd(),r.isBlock);e.on("keypress",t=>{let r;return!(!(g(t)||8!==t.keyCode&&46!==t.keyCode)&&o()&&(r=n(),e.getDoc().execCommand("delete",!1),r(),t.preventDefault(),1))}),r.bind(e.getDoc(),"cut",t=>{if(!g(t)&&o()){const t=n();hp.setEditorTimeout(e,()=>{t()})}})})(),w(),e.on("SetContent ExecCommand",e=>{"setcontent"!==e.type&&"mceInsertLink"!==e.command||t(r.select("a:not([data-mce-block])"),e=>{let t=e.parentNode;const n=r.getRoot();if(t?.lastChild===e){for(;t&&!r.isBlock(t);){if(t.parentNode?.lastChild!==t||t===n)return;t=t.parentNode}r.add(t,"br",{"data-mce-bogus":1})}})}),S(),k(),v())),{refreshContentEditable:D,isHidden:()=>{if(!l||e.removed)return!1;const t=e.selection.getSel();return!t||!t.rangeCount||0===t.rangeCount}}};class iP extends Error{url;constructor(e,t){super(e),this.url=t}}const lP={},cP=async(e,t)=>{const n=hi.ScriptLoader.getScriptAttributes(e);return await((e,t,n)=>new Promise((o,r)=>{const s=un.fromTag("script");Co(s,{type:"text/javascript",src:e,...n});const a=()=>{Ao(s)};so(s,"load",()=>{a(),o()}),so(s,"error",()=>{a(),r(new Error(`Failed to load script url: ${e}`))}),go(Gn(t),s)}))(e,t,n).catch(()=>Promise.reject(new iP(`Failed to load component url: ${e}`,e))),e},dP=async e=>{const t=(e=>{const t=e.schema.getComponentUrls();return e.inline?(e=>Se(e,(e,t)=>xe(lP,e).getOrThunk(()=>{if(v(window.customElements.get(t))){const t=cP(e,ao());return lP[e]=t,t}return Promise.resolve(e)}).catch(t=>(delete lP[e],Promise.reject(t)))))(t):((e,t)=>{const n=fe(Ee(e));return V(n,e=>cP(e,un.fromDom(t)))})(t,e.getDoc())})(e),n=Y(await Promise.allSettled(t),e=>"rejected"===e.status);n.length>0&&q(n,t=>{if(t.reason instanceof iP){const{url:n}=t.reason;((e,t)=>{XE(e,"ComponentLoadError",QE("component",t))})(e,n)}})},mP=gi.DOM,uP=e=>e.inline?e.getElement().nodeName.toLowerCase():void 0,fP=e=>we(e,e=>!1===y(e)),gP=e=>{const t=e.options.get,n=e.editorUpload.blobCache;return fP({allow_conditional_comments:t("allow_conditional_comments"),allow_html_data_urls:t("allow_html_data_urls"),allow_svg_data_urls:t("allow_svg_data_urls"),allow_html_in_named_anchor:t("allow_html_in_named_anchor"),allow_script_urls:t("allow_script_urls"),allow_html_in_comments:t("allow_html_in_comments"),allow_mathml_annotation_encodings:t("allow_mathml_annotation_encodings"),allow_unsafe_link_target:t("allow_unsafe_link_target"),convert_unsafe_embeds:t("convert_unsafe_embeds"),convert_fonts_to_spans:t("convert_fonts_to_spans"),extended_mathml_attributes:t("extended_mathml_attributes"),extended_mathml_elements:t("extended_mathml_elements"),fix_list_elements:t("fix_list_elements"),font_size_legacy_values:t("font_size_legacy_values"),forced_root_block:t("forced_root_block"),forced_root_block_attrs:t("forced_root_block_attrs"),preserve_cdata:t("preserve_cdata"),inline_styles:t("inline_styles"),root_name:uP(e),sandbox_iframes:t("sandbox_iframes"),sandbox_iframes_exclusions:cu(e),sanitize:t("xss_sanitization"),validate:!0,blob_cache:n,document:e.getDoc()})},pP=e=>{const t=e.options.get;return fP({custom_elements:t("custom_elements"),extended_valid_elements:t("extended_valid_elements"),invalid_elements:t("invalid_elements"),invalid_styles:t("invalid_styles"),schema:t("schema"),valid_children:t("valid_children"),valid_classes:t("valid_classes"),valid_elements:t("valid_elements"),valid_styles:t("valid_styles"),verify_html:t("verify_html"),padd_empty_block_inline_children:t("format_empty_lines")})},hP=e=>e.inline?e.ui.styleSheetLoader:e.dom.styleSheetLoader,bP=e=>{const t=hP(e),n=Gd(e),o=e.contentCSS,r=()=>{t.unloadAll(o),e.inline||e.ui.styleSheetLoader.unloadAll(n)},s=()=>{e.removed?r():e.on("remove",r)};if(e.contentStyles.length>0){let t="";dn.each(e.contentStyles,e=>{t+=e+"\r\n"}),e.dom.addStyle(t)}const a=Promise.all(((e,t,n)=>{const{pass:o,fail:r}=K(t,e=>tinymce.Resource.has(e)),s=o.map(t=>{const n=tinymce.Resource.get(t);return u(n)?Promise.resolve(hP(e).loadRawCss(t,n)):Promise.resolve()}),a=[...s,hP(e).loadAll(r)];return e.inline?a:a.concat([e.ui.styleSheetLoader.loadAll(n)])})(e,o,n)).then(s).catch(s),i=Kd(e);return i&&((e,t)=>{const n=un.fromDom(e.getBody()),o=Zn(Qn(n)),r=un.fromTag("style");vo(r,"type","text/css"),go(r,un.fromText(t)),go(o,r),e.on("remove",()=>{Ao(r)})})(e,i),a},yP=e=>{!0!==e.removed&&((e=>{EE(e)||e.load({initial:!0,format:"html"}),e.startContent=e.getContent({format:"raw"})})(e),(e=>{e.bindPendingEventDelegates(),e.initialized=!0,(e=>{e.dispatch("Init")})(e),e.focus(!0),(e=>{const t=e.dom.getRoot();e.inline||og(e)&&e.selection.getStart(!0)!==t||Af(t).each(t=>{const n=t.getNode(),o=as(n)?Af(n).getOr(t):t;e.selection.setRng(o.toRange())})})(e),e.nodeChanged({initial:!0});const t=Tm(e);w(t)&&t.call(e,e),(e=>{const t=Bm(e);t&&hp.setEditorTimeout(e,()=>{let n;n=!0===t?e:e.editorManager.get(t),n&&!n.destroyed&&(n.focus(),n.selection.scrollIntoView())},100)})(e),bx(e)&&vx(e,!0)})(e))},vP=e=>{const t=e.getElement();let n=e.getDoc();e.inline&&(mP.addClass(t,"mce-content-body"),e.contentDocument=n=document,e.contentWindow=window,e.bodyElement=t,e.contentAreaContainer=t);const o=Yd(e);if(o){const r=e.inline?t:n.documentElement;mP.setAttrib(r,"lang",o)}const r=e.getBody();r.disabled=!0,e.readonly=Cm(e),e._editableRoot=wm(e),!fu(e)&&e.hasEditableRoot()&&(e.inline&&"static"===mP.getStyle(r,"position",!0)&&(r.style.position="relative"),r.contentEditable="true"),r.disabled=!1,e.editorUpload=Tx(e),e.schema=Ua(pP(e)),e.dom=gi(n,{keep_values:!0,url_converter:e.convertURL,url_converter_scope:e,update_styles:!0,root_element:e.inline?e.getBody():null,collect:e.inline,schema:e.schema,contentCssCors:Ud(e),referrerPolicy:zd(e),crossOrigin:jd(e),onSetAttrib:t=>{e.dispatch("SetAttrib",t)}}),e.parser=(e=>{const t=sS(gP(e),e.schema);return t.addAttributeFilter("data-mce-src,data-mce-href,data-mce-style",(e,t)=>{for(let n=0;n{const o=e.dom,r="data-mce-"+n;let s=t.length;for(;s--;){const a=t[s];let i=a.attr(n);if(i&&!a.attr(r)){if(0===i.indexOf("data:")||0===i.indexOf("blob:"))continue;"style"===n?(i=o.serializeStyle(o.parseStyle(i),a.name),i.length||(i=null),a.attr(r,i),a.attr(n,i)):"tabindex"===n?(a.attr(r,i),a.attr(n,null)):a.attr(r,e.convertURL(i,n,a.name))}}}),t.addNodeFilter("script",e=>{let t=e.length;for(;t--;){const n=e[t],o=n.attr("type")||"no/type";0!==o.indexOf("mce-")&&n.attr("type","mce-"+o)}}),eu(e)&&t.addNodeFilter("#cdata",t=>{let n=t.length;for(;n--;){const o=t[n];o.type=8,o.name="#comment",o.value="[CDATA["+e.dom.encode(o.value??"")+"]]"}}),t.addNodeFilter("p,h1,h2,h3,h4,h5,h6,div",t=>{let n=t.length;const o=e.schema.getNonEmptyElements();for(;n--;){const e=t[n];e.isEmpty(o)&&0===e.getAll("br").length&&e.append(new Sh("br",1))}}),t})(e),e.serializer=OE((e=>{const t=e.options.get;return{...gP(e),...pP(e),...fP({remove_trailing_brs:t("remove_trailing_brs"),pad_empty_with_br:t("pad_empty_with_br"),url_converter:t("url_converter"),url_converter_scope:t("url_converter_scope"),element_format:t("element_format"),entities:t("entities"),entity_encoding:t("entity_encoding"),indent:t("indent"),indent_after:t("indent_after"),indent_before:t("indent_before")})}})(e),e),e.selection=RE(e.dom,e.getWin(),e.serializer,e),e.annotator=Qg(e),e.formatter=$x(e),e.undoManager=Vx(e),e._nodeChangeDispatcher=new lO(e),e._selectionOverrides=kB(e),iO(e),(e=>{const t=Ke(),n=Ae(!1),o=it(t=>{e.dispatch("longpress",{...t,type:"longpress"}),n.set(!0)},400);e.on("touchstart",e=>{YA(e).each(r=>{o.cancel();const s={x:r.clientX,y:r.clientY,target:e.target};o.throttle(e),n.set(!1),t.set(s)})},!0),e.on("touchmove",r=>{o.cancel(),YA(r).each(o=>{t.on(r=>{((e,t)=>{const n=Math.abs(e.clientX-t.x),o=Math.abs(e.clientY-t.y);return n>5||o>5})(o,r)&&(t.clear(),n.set(!1),e.dispatch("longpresscancel"))})})},!0),e.on("touchend touchcancel",r=>{o.cancel(),"touchcancel"!==r.type&&t.get().filter(e=>e.target.isEqualNode(r.target)).each(()=>{n.get()?r.preventDefault():e.dispatch("tap",{...r,type:"tap"})})},!0)})(e),(e=>{(e=>{e.on("click",t=>{e.dom.getParent(t.target,"details")&&t.preventDefault()})})(e),(e=>{e.parser.addNodeFilter("details",t=>{const n=au(e);q(t,e=>{"expanded"===n?e.attr("open","open"):"collapsed"===n&&e.attr("open",null)})}),e.serializer.addNodeFilter("details",t=>{const n=iu(e);q(t,e=>{"expanded"===n?e.attr("open","open"):"collapsed"===n&&e.attr("open",null)})})})(e)})(e),Xm(e)&&(e=>{const t="contenteditable",n=" "+dn.trim(Zm(e))+" ",o=" "+dn.trim(Qm(e))+" ",r=eR(n),s=eR(o),a=Jm(e);a.length>0&&e.on("BeforeSetContent",t=>{((e,t,n)=>{let o=t.length,r=n.content;if("raw"!==n.format){for(;o--;)r=r.replace(t[o],tR(e,r,Qm(e)));n.content=r}})(e,a,t)}),e.parser.addAttributeFilter("class",e=>{let n=e.length;for(;n--;){const o=e[n];r(o)?o.attr(t,"true"):s(o)&&o.attr(t,"false")}}),e.serializer.addAttributeFilter(t,e=>{let n=e.length;for(;n--;){const o=e[n];if(!r(o)&&!s(o))continue;const i=o.attr("data-mce-content");a.length>0&&i?nR(a,i)?(o.name="#text",o.type=3,o.raw=!0,o.value=i):o.remove():o.attr(t,null)}})})(e),EE(e)||((e=>{e.on("mousedown",t=>{t.detail>=3&&(t.preventDefault(),JO(e))})})(e),(e=>{sP(e)})(e));const s=nO(e);((e,t)=>{e.addCommand("delete",()=>{KA(e,t)}),e.addCommand("forwardDelete",()=>{((e,t)=>{WA(e,t,!0).fold(()=>{e.selection.isEditable()&&sy(e)},P),Ck(e)&&g_(e.dom,e.getBody())})(e,t)})})(e,s),(e=>{e.on("NodeChange",()=>(e=>{const t=e.dom,n=e.selection,o=e.schema,r=o.getBlockElements(),s=n.getStart(),a=e.getBody();let i,l,c=null;const d=Ed(e);if(!s||!es(s))return;const m=a.nodeName.toLowerCase();if(!o.isValidChild(m,d.toLowerCase())||((e,t,n)=>H(lb(un.fromDom(n),un.fromDom(t)),t=>GA(e,t.dom)))(r,a,s))return;if(a.firstChild===a.lastChild&&ps(a.firstChild))return i=ZA(e),i.appendChild(qi().dom),a.replaceChild(i,a.firstChild),e.selection.setCursorLocation(i,0),void e.nodeChanged();let u=a.firstChild;for(;u;)if(es(u)&&Ys(o,u),XA(o,u)){if(QA(r,u)){l=u,u=u.nextSibling,t.remove(l);continue}if(!i){if(!c&&e.hasFocus()&&(c=Yy(e.selection.getRng(),()=>document.createElement("span"))),!u.parentNode){u=null;break}i=ZA(e),a.insertBefore(i,u)}l=u,u=u.nextSibling,i.appendChild(l)}else i=null,u=u.nextSibling;c&&(e.selection.setRng(Gy(c)),e.nodeChanged())})(e))})(e),(e=>{const t=e.dom,n=Ed(e),o=em(e)??"",r=(s,a)=>{if((e=>{if(Kx(e)){const t=e.keyCode;return!Yx(e)&&(Rp.metaKeyPressed(e)||e.altKey||t>=112&&t<=123||$(qx,t))}return!1})(s))return;const i=e.getBody(),l=!(e=>Kx(e)&&!(Yx(e)||"keyup"===e.type&&229===e.keyCode))(s)&&((e,t,n)=>{if(e.isEmpty(t,void 0,{skipBogus:!1,includeZwsp:!0})){const o=t.firstElementChild;return!o||!e.getStyle(t.firstElementChild,"padding-left")&&!e.getStyle(t.firstElementChild,"padding-right")&&n===o.nodeName.toLowerCase()}return!1})(t,i,n);(""!==t.getAttrib(i,Wx)!==l||a)&&(t.setAttrib(i,Wx,l?o:null),((e,t)=>{e.dispatch("PlaceholderToggle",{state:t})})(e,l),e.on(l?"keydown":"keyup",r),e.off(l?"keyup":"keydown",r))};ot(o)&&e.on("init",t=>{r(t,!0),e.on("change SetContent ExecCommand",r),e.on("paste",t=>hp.setEditorTimeout(e,()=>r(t)))})})(e),WO(e,s);const a=(e=>{const t=e;return(e=>xe(e.plugins,"rtc").bind(e=>I.from(e.setup)))(e).fold(()=>(t.rtcInstance=SE(e),I.none()),e=>(t.rtcInstance=(()=>{const e=N(null),t=N("");return{init:{bindEvents:x},undoManager:{beforeChange:x,add:e,undo:e,redo:e,clear:x,reset:x,hasUndo:L,hasRedo:L,transact:e,ignore:x,extra:x},formatter:{match:L,matchAll:N([]),matchNode:N(void 0),canApply:L,closest:t,apply:x,remove:x,toggle:x,formatChanged:N({unbind:x})},editor:{getContent:t,setContent:N({content:"",html:""}),insertContent:N(""),addVisual:x},selection:{getContent:t},autocompleter:{addDecoration:x,removeDecoration:x},raw:{getModel:N(I.none())}}})(),I.some(()=>e().then(e=>(t.rtcInstance=(e=>{const t=e=>f(e)?e:{},{init:n,undoManager:o,formatter:r,editor:s,selection:a,autocompleter:i,raw:l}=e;return{init:{bindEvents:n.bindEvents},undoManager:{beforeChange:o.beforeChange,add:o.add,undo:o.undo,redo:o.redo,clear:o.clear,reset:o.reset,hasUndo:o.hasUndo,hasRedo:o.hasRedo,transact:(e,t,n)=>o.transact(n),ignore:(e,t)=>o.ignore(t),extra:(e,t,n,r)=>o.extra(n,r)},formatter:{match:(e,n,o,s)=>r.match(e,t(n),s),matchAll:r.matchAll,matchNode:r.matchNode,canApply:e=>r.canApply(e),closest:e=>r.closest(e),apply:(e,n,o)=>r.apply(e,t(n)),remove:(e,n,o,s)=>r.remove(e,t(n)),toggle:(e,n,o)=>r.toggle(e,t(n)),formatChanged:(e,t,n,o,s)=>r.formatChanged(t,n,o,s)},editor:{getContent:e=>s.getContent(e),setContent:(e,t)=>({content:s.setContent(e,t),html:""}),insertContent:(e,t)=>(s.insertContent(e),""),addVisual:s.addVisual},selection:{getContent:(e,t)=>a.getContent(t)},autocompleter:{addDecoration:i.addDecoration,removeDecoration:i.removeDecoration},raw:{getModel:()=>I.some(l.getRawModel())}}})(e),e.rtc.isRemote)))))})(e);(e=>{const t=e.getDoc(),n=e.getBody();(e=>{e.dispatch("PreInit")})(e),Pm(e)||(t.body.spellcheck=!1,mP.setAttrib(n,"spellcheck","false")),e.quirks=aP(e),(e=>{e.dispatch("PostRender")})(e);const o=Xd(e);void 0!==o&&(n.dir=o);const r=Lm(e);r&&((e,t)=>{((e,t)=>{e.on("BeforeSetContent",e=>{q(t,t=>{e.content=e.content.replace(t,e=>"\x3c!--mce:protected "+escape(e)+"--\x3e")})})})(e,t),((e,t)=>{e.serializer.addNodeFilter("#comment",e=>{let n=e.length;for(;n--;){const o=e[n],r=o.value;if(0===r?.indexOf("mce:protected ")){const e=unescape(r).substr(14);H(t,t=>{const n=e.match(t);return null!==n&&n[0].length===e.length})?(o.name="#text",o.type=3,o.raw=!0,o.value=e):o.remove()}}})})(e,t)})(e,r),e.on("SetContent",()=>{e.addVisual(e.getBody())}),e.on("compositionstart compositionend",t=>{e.composing="compositionstart"===t.type})})(e),(e=>{dP(e)})(e),a.fold(()=>{const t=(e=>{let t=!1;const n=setTimeout(()=>{t||e.setProgressState(!0)},500);return()=>{clearTimeout(n),t=!0,e.setProgressState(!1)}})(e);bP(e).then(()=>{yP(e),t()})},t=>{e.setProgressState(!0),bP(e).then(()=>{t().then(t=>{e.setProgressState(!1),yP(e),kE(e)},t=>{e.notificationManager.open({type:"error",text:String(t)}),yP(e),kE(e)})})})},CP=gi.DOM,wP=(e,t)=>{((e,t)=>{const n=Rm(e),o=e.translate(n),r=So(un.fromDom(e.getElement()),"tabindex").bind(st),s=((e,t,n,o)=>{const r=un.fromTag("iframe");return o.each(e=>vo(r,"tabindex",e)),Co(r,n),Co(r,{id:e+"_ifr",frameBorder:"0",allowTransparency:"true",...sn.browser.isFirefox()?{title:t}:{}}),yr(r,"tox-edit-area__iframe"),r})(e.id,o,hd(e),r).dom;s.onload=()=>{s.onload=null,e.dispatch("load")},e.contentAreaContainer=t.iframeContainer,e.iframeElement=s,e.iframeHTML=(e=>{let t=bd(e)+"";yd(e)!==e.editorManager.documentBaseURL&&(t+=''),t+='';const n=vd(e),o=Cd(e),r=e.translate(Rm(e)),s=sn.browser.isFirefox()?"":`aria-label="${r}"`;return wd(e)&&(t+=''),t+=`
    `,t})(e),CP.add(t.iframeContainer,s)})(e,t),t.editorContainer&&(t.editorContainer.style.display=e.orgDisplay,e.hidden=CP.isHidden(t.editorContainer)),e.getElement().style.display="none",CP.setAttrib(e.id,"aria-hidden","true"),e.getElement().style.visibility=e.orgVisibility,(e=>{const t=e.iframeElement,n=()=>{e.contentDocument=t.contentDocument,vP(e)};if(ou(e)||sn.browser.isFirefox()){const t=e.getDoc();t.open(),t.write(e.iframeHTML),t.close(),n()}else{const o=so(un.fromDom(t),"load",()=>{o.unbind(),n()});t.srcdoc=e.iframeHTML}})(e)},SP=gi.DOM,EP=(e,t)=>({editorContainer:e,iframeContainer:t,api:{}}),xP=e=>{const t=e.getElement();return e.inline?EP(null):(e=>{const t=SP.create("div");return SP.insertAfter(t,e),EP(t,t)})(t)},_P=async e=>{e.dispatch("ScriptsLoaded"),(e=>{const t=dn.trim(Bd(e)),n=e.ui.registry.getAll().icons,o={...ME.get("default").icons,...ME.get(t).icons};he(o,(t,o)=>{_e(n,o)||e.ui.registry.addIcon(o,t)})})(e),(e=>{const t=t=>{t.keyCode!==Rp.ESC||t.defaultPrevented||(e=>e.dispatch("CloseActiveTooltips"))(e).isDefaultPrevented()&&t.preventDefault()};document.addEventListener("keyup",t),e.inline||e.on("keyup",t),e.on("remove",()=>{document.removeEventListener("keyup",t),e.inline||e.off("keyup",t)})})(e),(e=>{const t=om(e);if(u(t)){const n=WE.get(t);e.theme=n(e,WE.urls[t])||{},w(e.theme.init)&&e.theme.init(e,WE.urls[t]||e.editorManager.documentBaseURL.replace(/\/$/,""))}else e.theme={}})(e),(e=>{const t=sm(e),n=IE.get(t);e.model=n(e,IE.urls[t])})(e),(e=>{ux.init(e)})(e),(e=>{const t=[];q(Em(e),n=>{((e,t,n)=>{const o=qE.get(n),r=qE.urls[n]||e.editorManager.documentBaseURL.replace(/\/$/,"");if(n=dn.trim(n),o&&-1===dn.inArray(t,n)){if(e.plugins[n])return;try{const s=o(e,r)||{};e.plugins[n]=s,w(s.init)&&(s.init(e,r),t.push(n))}catch(t){((e,t,n)=>{const o=Ci.translate(["Failed to initialize plugin: {0}",t]);nd(e,"PluginLoadError",{message:o}),ZE(o,n),GE(e,o)})(e,n,t)}}})(e,t,(e=>e.replace(/^\-/,""))(n))})})(e);const t=await(e=>{const t=e.getElement();return e.orgDisplay=t.style.display,u(om(e))?(e=>{const t=e.theme.renderUI;return t?t():xP(e)})(e):w(om(e))?(e=>{const t=e.getElement(),n=om(e)(e,t);return n.editorContainer.nodeType&&(n.editorContainer.id=n.editorContainer.id||e.id+"_parent"),n.iframeContainer&&n.iframeContainer.nodeType&&(n.iframeContainer.id=n.iframeContainer.id||e.id+"_iframecontainer"),n.height=n.iframeHeight?n.iframeHeight:t.offsetHeight,n})(e):xP(e)})(e);((e,t)=>{const n={show:I.from(t.show).getOr(x),hide:I.from(t.hide).getOr(x),isEnabled:I.from(t.isEnabled).getOr(M),setEnabled:n=>{n&&("readonly"===e.mode.get()||bx(e))||I.from(t.setEnabled).each(e=>e(n))}};e.ui={...e.ui,...n}})(e,I.from(t.api).getOr({})),e.editorContainer=t.editorContainer,(e=>{e.contentCSS=e.contentCSS.concat((e=>xx(e,Wd(e)))(e),(e=>xx(e,Gd(e)))(e))})(e),e.inline?vP(e):wP(e,{editorContainer:t.editorContainer,iframeContainer:t.iframeContainer})},kP=gi.DOM,NP=e=>"-"===e.charAt(0),AP=(e,t,n)=>I.from(t).filter(e=>ot(e)&&!ME.has(e)).map(t=>({url:`${e.editorManager.baseURL}/icons/${t}/icons${n}.js`,name:I.some(t)})),RP=(e,t)=>{const n=hi.ScriptLoader,o=()=>{!e.removed&&(e=>{const t=om(e);return!u(t)||C(WE.get(t))})(e)&&(e=>{const t=sm(e);return C(IE.get(t))})(e)&&_P(e)};((e,t)=>{const n=om(e);if(u(n)&&!NP(n)&&!_e(WE.urls,n)){const o=rm(e),r=o?e.documentBaseURI.toAbsolute(o):`themes/${n}/theme${t}.js`;WE.load(n,r).catch(()=>{((e,t,n)=>{XE(e,"ThemeLoadError",QE("theme",t,n))})(e,r,n)})}})(e,t),((e,t)=>{const n=sm(e);if("plugin"!==n&&!_e(IE.urls,n)){const o=am(e),r=u(o)?e.documentBaseURI.toAbsolute(o):`models/${n}/model${t}.js`;IE.load(n,r).catch(()=>{((e,t,n)=>{XE(e,"ModelLoadError",QE("model",t,n))})(e,r,n)})}})(e,t),((e,t)=>{ux.load(e,t)})(e,t),((e,t)=>{const n=$d(t),o=Hd(t);if(!Ci.hasCode(n)&&"en"!==n){const r=ot(o)?o:`${t.editorManager.baseURL}/langs/${n}.js`;e.add(r).catch(()=>{((e,t,n)=>{XE(e,"LanguageLoadError",QE("language",t,n))})(t,r,n)})}})(n,e),((e,t,n)=>{const o=AP(t,"default",n),r=(e=>I.from(Pd(e)).filter(ot).map(e=>({url:e,name:I.none()})))(t).orThunk(()=>AP(t,Bd(t),""));q((e=>{const t=[],n=e=>{t.push(e)};for(let t=0;t{e.add(n.url).catch(()=>{((e,t,n)=>{XE(e,"IconsLoadError",QE("icons",t,n))})(t,n.url,n.name.getOrUndefined())})})})(n,e,t),((e,t)=>{const n=(t,n)=>{"licensekeymanager"!==t&&qE.load(t,n).catch(()=>{((e,t,n)=>{XE(e,"PluginLoadError",QE("plugin",t,n))})(e,n,t)})};he(xm(e),(t,o)=>{n(o,t),e.options.set("plugins",Em(e).concat(o))}),q(Em(e),e=>{!(e=dn.trim(e))||qE.urls[e]||NP(e)||n(e,`plugins/${e}/plugin${t}.js`)})})(e,t),n.loadQueue().then(o,o)},DP=["#E41B60","#AD1457","#1939EC","#001CB5","#648000","#465B00","#006CE7","#0054B4","#00838F","#006064","#00866F","#004D40","#51742F","#385021","#CF4900","#A84600","#CC0000","#6A1B9A","#9C27B0","#6A00AB","#3041BA","#0A1877","#774433","#452B24","#607D8B","#455A64"],TP=(e,t={size:36})=>{return n=(e=>{if(Intl.Segmenter){const t=(new Intl.Segmenter).segment(e)[Symbol.iterator]();return`${t.next().value?.segment}`}return e.trim()[0]})(e.name),o=(e=>{const t=((e,t)=>{let n=5381;for(let t=0;t>>0)%(t+1)})(e??"",DP.length-1);return DP[t]})(e.id),r=t.size,"data:image/svg+xml,"+encodeURIComponent(((e,t,n)=>{const o=n/2;return``+e+""})(n,o,r));var n,o,r},OP=Mc([jc("id","id",{tag:"required",process:{}},kc()),Wc("name"),Wc("avatar"),(e=>jc(e,e,{tag:"option",process:{}},kc()))("custom")]),BP=e=>{const t={};return he(e,(e,n)=>{e.each(e=>{t[n]=e})}),t},PP=e=>{if(!Array.isArray(e))throw new Error("fetch_users must return an array");const t=V(e,e=>Uc("Invalid user object",OP,e)),{errors:n,values:o}=qe(t);if(n.length>0){const e=V(n,(e,t)=>`User at index ${t}: ${zc(e)}`);console.warn("User validation errors:\n"+e.join("\n"))}return V(o,e=>{const{id:t,name:n,avatar:o,...r}=e;return{id:t,name:n.getOr(t),avatar:o.getOr(TP({id:t,name:n.getOr(t)})),...BP(r)}})},LP=Xt().deviceType,MP=LP.isPhone(),IP=LP.isTablet(),FP=e=>{if(v(e))return[];{const t=p(e)?e:e.split(/[ ,]/),n=V(t,et);return Y(n,ot)}},UP=(e,t)=>{const n=(t=>{const n={},o={};return Ce(t,(t,n)=>$(e,n),ve(n),ve(o)),{t:n,f:o}})(t);return o=n.t,r=n.f,{sections:N(o),options:N(r)};var o,r},zP=(e,t)=>_e(e.sections(),t),jP=(e,t)=>({table_grid:!1,object_resizing:!1,resize:!1,toolbar_mode:xe(e,"toolbar_mode").getOr("scrolling"),toolbar_sticky:!1,...t?{menubar:!1}:{}}),$P=(e,t)=>{const n=t.external_plugins??{};return e&&e.external_plugins?dn.extend({},e.external_plugins,n):n},HP=(e,t,n,o,r)=>{const s=e?{mobile:jP(r.mobile??{},t)}:{},a=UP(["mobile"],Fe(s,r)),i=dn.extend(n,o,a.options(),((e,t)=>e&&zP(t,"mobile"))(e,a)?((e,t,n={})=>{const o=e.sections(),r=xe(o,t).getOr({});return dn.extend({},n,r)})(a,"mobile"):{},{external_plugins:$P(o,a.options())});return((e,t,n,o)=>{const r=FP(n.forced_plugins),s=FP(o.plugins),a=((e,t)=>zP(e,t)?e.sections()[t]:{})(t,"mobile"),i=((e,t,n,o)=>e&&zP(t,"mobile")?o:n)(e,t,s,a.plugins?FP(a.plugins):s),l=((e,t)=>[...FP(e),...FP(t)])(r,i);return dn.extend(o,{forced_plugins:r,plugins:l})})(e,a,o,i)},VP=e=>{(e=>{const t=t=>()=>{q("left,center,right,justify".split(","),n=>{t!==n&&e.formatter.remove("align"+n)}),"none"!==t&&(t=>{e.formatter.toggle(t,void 0),e.nodeChanged()})("align"+t)};e.editorCommands.addCommands({JustifyLeft:t("left"),JustifyCenter:t("center"),JustifyRight:t("right"),JustifyFull:t("justify"),JustifyNone:t("none")})})(e),(e=>{const t=t=>()=>{const n=e.selection,o=n.isCollapsed()?[e.dom.getParent(n.getNode(),e.dom.isBlock)]:n.getSelectedBlocks();return H(o,n=>C(e.formatter.matchNode(n,t)))};e.editorCommands.addCommands({JustifyLeft:t("alignleft"),JustifyCenter:t("aligncenter"),JustifyRight:t("alignright"),JustifyFull:t("alignjustify")},"state")})(e)},qP=(e,t)=>{const n=e.selection,o=e.dom;return/^ | $/.test(t)?((e,t,n,o)=>{const r=un.fromDom(e.getRoot());return n=Tb(r,Kl.fromRangeStart(t),o)?n.replace(/^ /," "):n.replace(/^ /," "),Ob(r,Kl.fromRangeEnd(t),o)?n.replace(/( | )()?$/," "):n.replace(/ ()?$/," ")})(o,n.getRng(),t,e.schema):t},WP=(e,t)=>{if(e.selection.isEditable()){const{content:n,details:o}=(e=>{if("string"!=typeof e){const t=dn.extend({paste:e.paste,data:{paste:e.paste}},e);return{content:e.content,details:t}}return{content:e,details:{}}})(t);mS(e,{...o,content:qP(e,n),format:"html",set:!1,selection:!0}).each(t=>{const n=((e,t,n)=>xE(e).editor.insertContent(t,n))(e,t.content,o);uS(e,n,t),e.addVisual()})}},KP={"font-size":"size","font-family":"face"},YP=On("font"),GP=e=>(t,n)=>I.from(n).map(un.fromDom).filter(An).bind(n=>((e,t,n)=>Or(un.fromDom(n),t=>(t=>Vo(t,e).orThunk(()=>YP(t)?xe(KP,e).bind(e=>So(t,e)):I.none()))(t),e=>vn(un.fromDom(t),e)))(e,t,n.dom).or(((e,t)=>I.from(gi.DOM.getStyle(t,e,!0)))(e,n.dom))).getOr(""),XP=GP("font-size"),QP=_(e=>e.replace(/[\'\"\\]/g,"").replace(/,\s+/g,","),GP("font-family")),ZP=e=>Af(e.getBody()).bind(e=>{const t=e.container();return I.from(cs(t)?t.parentNode:t)}),JP=(e,t)=>((e,t)=>(e=>I.from(e.selection.getRng()).bind(t=>{const n=e.getBody();return t.startContainer===n&&0===t.startOffset?I.none():I.from(e.selection.getStart(!0))}))(e).orThunk(D(ZP,e)).map(un.fromDom).filter(An).bind(t))(e,k(I.some,t)),eL=(e,t)=>{if(/^[0-9.]+$/.test(t)){const n=parseInt(t,10);if(n>=1&&n<=7){const o=(e=>dn.explode(e.options.get("font_size_style_values")))(e),r=(e=>dn.explode(e.options.get("font_size_classes")))(e);return r.length>0?r[n-1]||t:o[n-1]||t}return t}return t},tL=e=>{const t=e.split(/\s*,\s*/);return V(t,e=>-1===e.indexOf(" ")||Qe(e,'"')||Qe(e,"'")?e:`'${e}'`).join(",")},nL=e=>{e.editorCommands.addCommands({Indent:()=>{(e=>{$A(e,"indent")})(e)},Outdent:()=>{HA(e)}}),e.editorCommands.addCommands({Outdent:()=>UA(e),Indent:()=>(e=>!e.mode.isReadOnly()&&(e=>bu(e).forall(t=>{const n=e.selection.getSelectedBlocks();return H(n,e=>fr(un.fromDom(e),"li").forall(e=>{return(n=e,_r(n,e=>bn(e,"ol,ul"),void 0)).length<=t;var n}))}))(e))(e)},"state")},oL=(e,t)=>{if(e.mode.isReadOnly())return;const n=e.dom,o=e.selection.getRng(),r=t?e.selection.getStart():e.selection.getEnd(),s=t?o.startContainer:o.endContainer,a=nT(n,s);if(!a||!a.isContentEditable)return;const i=t?mo:uo,l=Ed(e);((e,t,n,o)=>{const r=e.dom,s=e=>r.isBlock(e)&&e.parentElement===n,a=s(t)?t:r.getParent(o,s,n);return I.from(a).map(un.fromDom)})(e,r,a,s).each(t=>{const n=aT(e,s,t.dom,a,!1,l);i(t,un.fromDom(n)),e.selection.setCursorLocation(n,0),e.dispatch("NewBlock",{newBlock:n}),Xx(e,"insertParagraph")})},rL=e=>{VP(e),(e=>{e.editorCommands.addCommands({"Cut,Copy,Paste":t=>{const n=e.getDoc();let o;try{n.execCommand(t)}catch{o=!0}if("paste"!==t||n.queryCommandEnabled(t)||(o=!0),o||!n.queryCommandSupported(t)){let t=e.translate("Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X/C/V keyboard shortcuts instead.");(sn.os.isMacOS()||sn.os.isiOS())&&(t=t.replace(/Ctrl\+/g,"\u2318+")),e.notificationManager.open({text:t,type:"error"})}}})})(e),(e=>{e.editorCommands.addCommands({mceAddUndoLevel:()=>{e.undoManager.add()},mceEndUndoLevel:()=>{e.undoManager.add()},Undo:()=>{e.undoManager.undo()},Redo:()=>{e.undoManager.redo()}})})(e),(e=>{e.editorCommands.addCommands({mceSelectNodeDepth:(t,n,o)=>{let r=0;e.dom.getParent(e.selection.getNode(),t=>!es(t)||r++!==o||(e.selection.select(t),!1),e.getBody())},mceSelectNode:(t,n,o)=>{e.selection.select(o)},selectAll:()=>{const t=e.dom.getParent(e.selection.getStart(),ys);if(t){const n=e.dom.createRng();n.selectNodeContents(t),e.selection.setRng(n)}}})})(e),(e=>{e.editorCommands.addCommands({mceCleanup:()=>{const t=e.selection.getBookmark();e.setContent(e.getContent()),e.selection.moveToBookmark(t)},insertImage:(t,n,o)=>{WP(e,e.dom.createHTML("img",{src:o}))},insertHorizontalRule:()=>{e.execCommand("mceInsertContent",!1,"
    ")},insertText:(t,n,o)=>{WP(e,e.dom.encode(o))},insertHTML:(t,n,o)=>{WP(e,o)},mceInsertContent:(t,n,o)=>{WP(e,o)},mceSetContent:(t,n,o)=>{e.setContent(o)},mceReplaceContent:(t,n,o)=>{e.execCommand("mceInsertContent",!1,o.replace(/\{\$selection\}/g,e.selection.getContent({format:"text"})))},mceNewDocument:()=>{e.setContent(zm(e))}})})(e),(e=>{const t=(t,n,o)=>{if(e.mode.isReadOnly())return;const r=u(o)?{href:o}:o,s=e.dom.getParent(e.selection.getNode(),"a");f(r)&&u(r.href)&&(r.href=r.href.replace(/ /g,"%20").replace(/&/g,"&"),s&&r.href||e.formatter.remove("link"),r.href&&e.formatter.apply("link",r,s))};e.editorCommands.addCommands({unlink:()=>{if(e.selection.isEditable()){if(e.selection.isCollapsed()){const t=e.dom.getParent(e.selection.getStart(),"a");return void(t&&e.dom.remove(t,!0))}e.formatter.remove("link")}},mceInsertLink:t,createLink:t})})(e),nL(e),(e=>{e.editorCommands.addCommands({InsertNewBlockBefore:()=>{(e=>{oL(e,!0)})(e)},InsertNewBlockAfter:()=>{(e=>{oL(e,!1)})(e)}})})(e),(e=>{e.editorCommands.addCommands({insertParagraph:()=>{UT(bT,e)},mceInsertNewLine:(t,n,o)=>{zT(e,o)},InsertLineBreak:(t,n,o)=>{UT(_T,e)}})})(e),(e=>{(e=>{const t=(t,n)=>{e.formatter.toggle(t,n),e.nodeChanged()};e.editorCommands.addCommands({"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":e=>{t(e)},"ForeColor,HiliteColor":(e,n,o)=>{t(e,{value:o})},BackColor:(e,n,o)=>{t("hilitecolor",{value:o})},FontName:(t,n,o)=>{((e,t)=>{const n=eL(e,t);e.formatter.toggle("fontname",{value:tL(n)}),e.nodeChanged()})(e,o)},FontSize:(t,n,o)=>{((e,t)=>{e.formatter.toggle("fontsize",{value:eL(e,t)}),e.nodeChanged()})(e,o)},LineHeight:(t,n,o)=>{((e,t)=>{e.formatter.toggle("lineheight",{value:String(t)}),e.nodeChanged()})(e,o)},Lang:(e,n,o)=>{t(e,{value:o.code,customValue:o.customCode??null})},RemoveFormat:t=>{e.formatter.remove(t)},mceBlockQuote:()=>{t("blockquote")},FormatBlock:(e,n,o)=>{t(u(o)?o:"p")},mceToggleFormat:(e,n,o)=>{t(o)}})})(e),(e=>{const t=t=>e.formatter.match(t);e.editorCommands.addCommands({"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":e=>t(e),mceBlockQuote:()=>t("blockquote")},"state"),e.editorCommands.addQueryValueHandler("FontName",()=>(e=>JP(e,t=>QP(e.getBody(),t.dom)).getOr(""))(e)),e.editorCommands.addQueryValueHandler("FontSize",()=>(e=>JP(e,t=>XP(e.getBody(),t.dom)).getOr(""))(e)),e.editorCommands.addQueryValueHandler("LineHeight",()=>(e=>JP(e,t=>{const n=un.fromDom(e.getBody()),o=Or(t,e=>Vo(e,"line-height"),D(vn,n));return o.getOrThunk(()=>{const e=parseFloat($o(t,"line-height")),n=parseFloat($o(t,"font-size"));return String(e/n)})}).getOr(""))(e))})(e)})(e),(e=>{e.editorCommands.addCommands({mceRemoveNode:(t,n,o)=>{const r=o??e.selection.getNode();if(r!==e.getBody()){const t=e.selection.getBookmark();e.dom.remove(r,!0),e.selection.moveToBookmark(t)}},mcePrint:()=>{e.getWin().print()},mceFocus:(t,n,o)=>{((e,t)=>{e.removed||(t?Ap(e):(e=>{const t=e.selection,n=e.getBody();let o=t.getRng();e.quirks.refreshContentEditable();const r=e=>{gp(e).each(t=>{e.selection.setRng(t),o=t})};!kp(e)&&e.hasEditableRoot()&&r(e);const s=((e,t)=>e.dom.getParent(t,t=>"true"===e.dom.getContentEditable(t)))(e,t.getNode());if(s&&e.dom.isChildOf(s,n))return((e,t)=>null!==e.dom.getParent(t,t=>"false"===e.dom.getContentEditable(t)))(e,s)||_p(n),_p(s),e.hasEditableRoot()||r(e),xp(e,o),void Ap(e);e.inline||(sn.browser.isOpera()||_p(n),e.getWin().focus()),(sn.browser.isFirefox()||e.inline)&&(_p(n),xp(e,o)),Ap(e)})(e))})(e,!0===o)},mceToggleVisualAid:()=>{e.hasVisual=!e.hasVisual,e.addVisual()}})})(e)},sL=["toggleview"],aL=e=>$(sL,e.toLowerCase());class iL{editor;commands={state:{},exec:{},value:{}};constructor(e){this.editor=e}execCommand(e,t=!1,n,o){const r=this.editor,s=e.toLowerCase(),a=o?.skip_focus;if(r.removed)return!1;if("mcefocus"!==s&&(/^(mceAddUndoLevel|mceEndUndoLevel)$/i.test(s)||a?(e=>{gp(e).each(t=>e.selection.setRng(t))})(r):r.focus()),r.dispatch("BeforeExecCommand",{command:e,ui:t,value:n}).isDefaultPrevented())return!1;const i=this.commands.exec[s];return!!w(i)&&(i(s,t,n,o),r.dispatch("ExecCommand",{command:e,ui:t,value:n,args:o}),!0)}queryCommandState(e){if(!aL(e)&&this.editor.quirks.isHidden()||this.editor.removed)return!1;const t=e.toLowerCase(),n=this.commands.state[t];return!!w(n)&&n(t)}queryCommandValue(e){if(!aL(e)&&this.editor.quirks.isHidden()||this.editor.removed)return"";const t=e.toLowerCase(),n=this.commands.value[t];return w(n)?n(t):""}addCommands(e,t="exec"){const n=this.commands;he(e,(e,o)=>{q(o.toLowerCase().split(","),o=>{n[t][o]=e})})}addCommand(e,t,n){const o=e.toLowerCase();this.commands.exec[o]=(e,o,r,s)=>t.call(n??this.editor,o,r,s)}removeCommand(e,t){const n=e.toLowerCase();t?delete this.commands[t][n]:(delete this.commands.exec[n],delete this.commands.state[n],delete this.commands.value[n])}queryCommandSupported(e){const t=e.toLowerCase();return!!this.commands.exec[t]}addQueryStateHandler(e,t,n){this.commands.state[e.toLowerCase()]=()=>t.call(n??this.editor)}addQueryValueHandler(e,t,n){this.commands.value[e.toLowerCase()]=()=>t.call(n??this.editor)}}const lL=dn.makeMap("focus blur focusin focusout click dblclick mousedown mouseup mousemove mouseover beforepaste paste cut copy selectionchange mouseout mouseenter mouseleave wheel keydown keypress keyup input beforeinput contextmenu dragstart dragend dragover draggesture dragdrop drop drag submit compositionstart compositionend compositionupdate touchstart touchmove touchend touchcancel"," ");class cL{static isNative(e){return!!lL[e.toLowerCase()]}settings;scope;toggleEvent;bindings={};constructor(e){this.settings=e||{},this.scope=this.settings.scope||this,this.toggleEvent=this.settings.toggleEvent||L}fire(e,t){return this.dispatch(e,t)}dispatch(e,t){const n=e.toLowerCase(),o=Za(n,t??{},this.scope);this.settings.beforeFire&&this.settings.beforeFire(o);const r=this.bindings[n];if(r)for(let e=0,t=r.length;e{this.toggleEvent(t,!1),delete this.bindings[t]}),this;if(s){if(t){const e=K(s,e=>e.func===t);s=e.fail,this.bindings[r]=s,q(e.pass,e=>{e.removed=!0})}else s.length=0;s.length||(this.toggleEvent(e,!1),delete this.bindings[r])}}}else he(this.bindings,(e,t)=>{this.toggleEvent(t,!1)}),this.bindings={};return this}once(e,t,n){return this.on(e,t,n,{once:!0})}has(e){e=e.toLowerCase();const t=this.bindings[e];return!(!t||0===t.length)}}const dL=e=>(e._eventDispatcher||(e._eventDispatcher=new cL({scope:e,toggleEvent:(t,n)=>{cL.isNative(t)&&e.toggleNativeEvent&&e.toggleNativeEvent(t,n)}})),e._eventDispatcher),mL={fire(e,t,n){return _S("fire"),this.dispatch(e,t,n)},dispatch(e,t,n){const o=this;if(o.removed&&"remove"!==e&&"detach"!==e)return Za(e.toLowerCase(),t??{},o);const r=dL(o).dispatch(e,t);if(!1!==n&&o.parent){let t=o.parent();for(;t&&!r.isPropagationStopped();)t.dispatch(e,r,!1),t=t.parent?t.parent():void 0}return r},on(e,t,n){return dL(this).on(e,t,n)},off(e,t){return dL(this).off(e,t)},once(e,t){return dL(this).once(e,t)},hasEventListeners(e){return dL(this).has(e)}},uL=gi.DOM;let fL;const gL=(e,t)=>{if("selectionchange"===t)return e.getDoc();if(!e.inline&&/^(?:mouse|touch|click|contextmenu|drop|dragover|dragend)/.test(t))return e.getDoc().documentElement;const n=tm(e);return n?(e.eventRoot||(e.eventRoot=uL.select(n)[0]),e.eventRoot):e.getBody()},pL=(e,t,n)=>{(e=>!e.hidden&&!bx(e))(e)?e.dispatch(t,n):bx(e)&&((e,t)=>{if((e=>"click"===e.type)(t)&&!Rp.metaKeyPressed(t)){const n=un.fromDom(t.target);((e,t)=>fr(t,"a",t=>vn(t,un.fromDom(e.getBody()))).bind(e=>So(e,"href")))(e,n).fold(()=>{Sx(e,n)&&t.preventDefault()},n=>{if(t.preventDefault(),/^#/.test(n)){const t=e.dom.select(`${n},[name="${Ge(n,"#")}"]`);t.length&&e.selection.scrollIntoView(t[0],!0)}else window.open(n,"_blank","rel=noopener noreferrer,menubar=yes,toolbar=yes,location=yes,status=yes,resizable=yes,scrollbars=yes")})}else(e=>$(wx,e.type))(t)&&e.dispatch(t.type,t)})(e,n)},hL=(e,t)=>{if(e.delegates||(e.delegates={}),e.delegates[t]||e.removed)return;const n=gL(e,t);if(tm(e)){if(fL||(fL={},e.editorManager.on("removeEditor",()=>{e.editorManager.activeEditor||fL&&(he(fL,(t,n)=>{e.dom.unbind(gL(e,n))}),fL=null)})),fL[t])return;const o=n=>{const o=n.target,r=e.editorManager.get();let s=r.length;for(;s--;){const e=r[s].getBody();(e===o||uL.isChildOf(o,e))&&pL(r[s],t,n)}};fL[t]=o,uL.bind(n,t,o)}else{const o=n=>{pL(e,t,n)};uL.bind(n,t,o),e.delegates[t]=o}},bL={...mL,bindPendingEventDelegates(){const e=this;dn.each(e._pendingNativeEvents,t=>{hL(e,t)})},toggleNativeEvent(e,t){const n=this;"focus"!==e&&"blur"!==e&&(n.removed||(t?n.initialized?hL(n,e):n._pendingNativeEvents?n._pendingNativeEvents.push(e):n._pendingNativeEvents=[e]:n.initialized&&n.delegates&&(n.dom.unbind(gL(n,e),e,n.delegates[e]),delete n.delegates[e])))},unbindAllNativeEvents(){const e=this,t=e.getBody(),n=e.dom;e.delegates&&(he(e.delegates,(t,n)=>{e.dom.unbind(gL(e,n),n,t)}),delete e.delegates),!e.inline&&t&&n&&(t.onload=null,n.unbind(e.getWin()),n.unbind(e.getDoc())),n&&(n.unbind(t),n.unbind(e.getContainer()))}},yL=e=>u(e)?{value:e.split(/[ ,]/),valid:!0}:E(e,u)?{value:e,valid:!0}:{valid:!1,message:"The value must be a string[] or a comma/space separated string."},vL=(e,t)=>e+(rt(t.message)?"":`. ${t.message}`),CL=e=>e.valid,wL=(e,t,n="")=>{const o=t(e);return b(o)?o?{value:e,valid:!0}:{valid:!1,message:n}:o},SL=e=>e.readonly,EL=["design","readonly"],xL=(e,t,n,o)=>{const r=n[t.get()],s=n[o];try{s.activate()}catch(e){return void console.error(`problem while activating editor mode ${o}:`,e)}r.deactivate(),r.editorReadOnly!==s.editorReadOnly&&((e,t)=>{const n=un.fromDom(e.getBody());t?(e.readonly=!0,e.hasEditableRoot()&&(n.dom.contentEditable="true"),px(e)):(e.readonly=!1,hx(e))})(e,s.editorReadOnly),t.set(o),((e,t)=>{e.dispatch("SwitchMode",{mode:t})})(e,o)},_L=e=>{const t=Ae("design"),n=Ae({design:{activate:x,deactivate:x,editorReadOnly:!1},readonly:{activate:x,deactivate:x,editorReadOnly:!0}});return(e=>{const t=t=>{SL(e)&&(e=>H(e,e=>"characterData"===e.type||"childList"===e.type))(t)&&(e=>{const t=e.undoManager.add();C(t)&&(e.undoManager.undo(),e.undoManager.reset())})(e)},n=new MutationObserver(t);e.on("beforeinput paste cut dragend dragover draggesture dragdrop drop drag",t=>{SL(e)&&t.preventDefault()}),e.on("BeforeExecCommand",t=>{"Undo"!==t.command&&"Redo"!==t.command||!SL(e)||t.preventDefault()}),e.on("compositionstart",()=>{SL(e)&&n.observe(e.getBody(),{characterData:!0,childList:!0,subtree:!0})}),e.on("compositionend",()=>{if(SL(e)){const e=n.takeRecords();t(e)}n.disconnect()})})(e),(e=>{(e=>{e.serializer?Cx(e):e.on("PreInit",()=>{Cx(e)})})(e),(e=>{e.on("ShowCaret ObjectSelected",t=>{bx(e)&&t.preventDefault()}),e.on("DisabledStateChange",t=>{t.isDefaultPrevented()||vx(e,t.state)})})(e)})(e),{isReadOnly:()=>SL(e),set:o=>((e,t,n,o)=>{if(!(o===n.get()||e.initialized&&bx(e))){if(!_e(t,o))throw new Error(`Editor mode '${o}' is invalid`);e.initialized?xL(e,n,t,o):e.on("init",()=>xL(e,n,t,o))}})(e,n.get(),t,o),get:()=>t.get(),register:(e,t)=>{n.set(((e,t,n)=>{if($(EL,t))throw new Error(`Cannot override default mode ${t}`);return{...e,[t]:{...n,deactivate:()=>{try{n.deactivate()}catch(e){console.error(`problem while deactivating editor mode ${t}:`,e)}}}}})(n.get(),e,t))}}},kL=dn.each,NL=dn.explode,AL={f1:112,f2:113,f3:114,f4:115,f5:116,f6:117,f7:118,f8:119,f9:120,f10:121,f11:122,f12:123},RL=dn.makeMap("alt,ctrl,shift,meta,access"),DL=e=>{const t={},n=sn.os.isMacOS()||sn.os.isiOS();kL(NL(e.toLowerCase(),"+"),e=>{(e=>e in RL)(e)?t[e]=!0:/^[0-9]{2,}$/.test(e)?t.keyCode=parseInt(e,10):(t.charCode=e.charCodeAt(0),t.keyCode=AL[e]||e.toUpperCase().charCodeAt(0))});const o=[t.keyCode];let r;for(r in RL)t[r]?o.push(r):t[r]=!1;return t.id=o.join(","),t.access&&(t.alt=!0,n?t.ctrl=!0:t.shift=!0),t.meta&&(n?t.meta=!0:(t.ctrl=!0,t.meta=!1)),t};class TL{editor;shortcuts={};pendingPatterns=[];constructor(e){this.editor=e;const t=this;e.on("keyup keypress keydown",e=>{!t.hasModifier(e)&&!t.isFunctionKey(e)||e.isDefaultPrevented()||(kL(t.shortcuts,n=>{t.matchShortcut(e,n)&&(t.pendingPatterns=n.subpatterns.slice(0),"keydown"===e.type&&t.executeShortcutAction(n))}),t.matchShortcut(e,t.pendingPatterns[0])&&(1===t.pendingPatterns.length&&"keydown"===e.type&&t.executeShortcutAction(t.pendingPatterns[0]),t.pendingPatterns.shift()))})}add(e,t,n,o){const r=this,s=r.normalizeCommandFunc(n);return kL(NL(dn.trim(e)),e=>{const n=r.createShortcut(e,t,s,o);r.shortcuts[n.id]=n}),!0}remove(e){const t=this.createShortcut(e);return!!this.shortcuts[t.id]&&(delete this.shortcuts[t.id],!0)}normalizeCommandFunc(e){const t=this,n=e;return"string"==typeof n?()=>{t.editor.execCommand(n,!1,null)}:dn.isArray(n)?()=>{t.editor.execCommand(n[0],n[1],n[2])}:n}createShortcut(e,t,n,o){const r=dn.map(NL(e,">"),DL);return r[r.length-1]=dn.extend(r[r.length-1],{func:n,scope:o||this.editor}),dn.extend(r[0],{desc:this.editor.translate(t),subpatterns:r.slice(1)})}hasModifier(e){return e.altKey||e.ctrlKey||e.metaKey}isFunctionKey(e){return"keydown"===e.type&&e.keyCode>=112&&e.keyCode<=123}matchShortcut(e,t){return!!t&&t.ctrl===e.ctrlKey&&t.meta===e.metaKey&&t.alt===e.altKey&&t.shift===e.shiftKey&&!!(e.keyCode===t.keyCode||e.charCode&&e.charCode===t.charCode)&&(e.preventDefault(),!0)}executeShortcutAction(e){return e.func?e.func.call(e.scope):null}}const OL=()=>{const e=(()=>{const e={},t={},n={},o={},r={},s={},a={},i={},l={},c=(e,t)=>(n,o)=>{e[n.toLowerCase()]={...o,type:t}};return{addButton:c(e,"button"),addGroupToolbarButton:c(e,"grouptoolbarbutton"),addToggleButton:c(e,"togglebutton"),addMenuButton:c(e,"menubutton"),addSplitButton:c(e,"splitbutton"),addMenuItem:c(t,"menuitem"),addNestedMenuItem:c(t,"nestedmenuitem"),addToggleMenuItem:c(t,"togglemenuitem"),addAutocompleter:c(n,"autocompleter"),addContextMenu:c(r,"contextmenu"),addContextToolbar:c(s,"contexttoolbar"),addContextForm:(d=s,(e,t)=>{d[e.toLowerCase()]={type:"contextform",...t}}),addSidebar:c(i,"sidebar"),addView:c(l,"views"),addIcon:(e,t)=>o[e.toLowerCase()]=t,addContext:(e,t)=>a[e.toLowerCase()]=t,getAll:()=>({buttons:e,menuItems:t,icons:o,popups:n,contextMenus:r,contextToolbars:s,sidebars:i,views:l,contexts:a})};var d})();return{addAutocompleter:e.addAutocompleter,addButton:e.addButton,addContextForm:e.addContextForm,addContextMenu:e.addContextMenu,addContextToolbar:e.addContextToolbar,addIcon:e.addIcon,addMenuButton:e.addMenuButton,addMenuItem:e.addMenuItem,addNestedMenuItem:e.addNestedMenuItem,addSidebar:e.addSidebar,addSplitButton:e.addSplitButton,addToggleButton:e.addToggleButton,addGroupToolbarButton:e.addGroupToolbarButton,addToggleMenuItem:e.addToggleMenuItem,addView:e.addView,addContext:e.addContext,getAll:e.getAll}},BL=gi.DOM,PL=dn.extend,LL=dn.each;class ML{baseUri;id;editorUid;plugins={};documentBaseURI;baseURI;contentCSS=[];contentStyles=[];ui;mode;options;editorUpload;userLookup;shortcuts;loadedCSS={};editorCommands;suffix;editorManager;hidden;inline;hasVisual;isNotDirty=!1;annotator;bodyElement;bookmark;composing=!1;container;contentAreaContainer;contentDocument;contentWindow;delegates;destroyed=!1;dom;editorContainer;eventRoot;formatter;formElement;formEventDelegate;hasHiddenInput=!1;iframeElement=null;iframeHTML;initialized=!1;notificationManager;orgDisplay;orgVisibility;parser;quirks;readonly=!1;removed=!1;schema;selection;serializer;startContent="";targetElm;theme;model;undoManager;windowManager;licenseKeyManager;_beforeUnload;_eventDispatcher;_nodeChangeDispatcher;_pendingNativeEvents=[];_selectionOverrides;_skinLoaded=!1;_editableRoot=!0;bindPendingEventDelegates;toggleNativeEvent;unbindAllNativeEvents;fire;dispatch;on;off;once;hasEventListeners;constructor(e,t,n){this.editorManager=n,PL(this,bL);const o=this;this.id=e,this.editorUid=Me(),this.hidden=!1;const r=((e,t)=>{const n=Ue(t);return HP(MP||IP,MP,n,e,n)})(n.defaultOptions,t);this.options=((e,t,n=t)=>{const o={},r={},s=(e,t,n)=>{const o=wL(t,n);return CL(o)?(r[e]=o.value,!0):(console.warn(vL(`Invalid value passed for the ${e} option`,o)),!1)},a=e=>_e(o,e);return{register:(e,n)=>{const a=(e=>u(e.processor))(n)?(e=>{const t=(()=>{switch(e){case"array":return p;case"boolean":return b;case"function":return w;case"number":return S;case"object":return f;case"string":return u;case"string[]":return yL;case"object[]":return e=>E(e,f);case"regexp":return e=>m(e,RegExp);default:return M}})();return n=>wL(n,t,`The value must be a ${e}.`)})(n.processor):n.processor,i=((e,t,n)=>{if(!y(t)){const o=wL(t,n);if(CL(o))return o.value;console.error(vL(`Invalid default value passed for the "${e}" option`,o))}})(e,n.default,a);o[e]={...n,default:i,processor:a},xe(r,e).orThunk(()=>xe(t,e)).each(t=>s(e,t,a))},isRegistered:a,get:e=>xe(r,e).orThunk(()=>xe(o,e).map(e=>e.default)).getOrUndefined(),set:(e,t)=>{if(a(e)){const n=o[e];return n.immutable?(console.error(`"${e}" is an immutable option and cannot be updated`),!1):s(e,t,n.processor)}return console.warn(`"${e}" is not a registered option. Ensure the option has been registered before setting a value.`),!1},unset:e=>{const t=a(e);return t&&delete r[e],t},isSet:e=>_e(r,e),debug:()=>{try{console.log(JSON.parse(JSON.stringify(n,(e,t)=>b(t)||S(t)||u(t)||h(t)||p(t)||g(t)?t:Object.prototype.toString.call(t))))}catch(e){console.error(e)}}}})(0,r,t),(e=>{const t=e.options.register;t("id",{processor:"string",default:e.id}),t("selector",{processor:"string"}),t("target",{processor:"object"}),t("suffix",{processor:"string"}),t("cache_suffix",{processor:"string"}),t("base_url",{processor:"string"}),t("referrer_policy",{processor:"string",default:""}),t("crossorigin",{processor:"function",default:N(void 0)}),t("language_load",{processor:"boolean",default:!0}),t("inline",{processor:"boolean",default:!1}),t("iframe_attrs",{processor:"object",default:{}}),t("doctype",{processor:"string",default:""}),t("document_base_url",{processor:"string",default:e.editorManager.documentBaseURL}),t("body_id",{processor:pd(e,"tinymce"),default:"tinymce"}),t("body_class",{processor:pd(e),default:""}),t("content_security_policy",{processor:"string",default:""}),t("br_in_pre",{processor:"boolean",default:!0}),t("forced_root_block",{processor:e=>{const t=u(e)&&ot(e);return t?{value:e,valid:t}:{valid:!1,message:"Must be a non-empty string."}},default:"p"}),t("forced_root_block_attrs",{processor:"object",default:{}}),t("newline_behavior",{processor:e=>{const t=$(["block","linebreak","invert","default"],e);return t?{value:e,valid:t}:{valid:!1,message:"Must be one of: block, linebreak, invert or default."}},default:"default"}),t("br_newline_selector",{processor:"string",default:".mce-toc h2,figcaption,caption"}),t("no_newline_selector",{processor:"string",default:""}),t("keep_styles",{processor:"boolean",default:!0}),t("end_container_on_empty_block",{processor:e=>b(e)||u(e)?{valid:!0,value:e}:{valid:!1,message:"Must be boolean or a string"},default:"blockquote"}),t("font_size_style_values",{processor:"string",default:"xx-small,x-small,small,medium,large,x-large,xx-large"}),t("font_size_legacy_values",{processor:"string",default:"xx-small,small,medium,large,x-large,xx-large,300%"}),t("font_size_classes",{processor:"string",default:""}),t("automatic_uploads",{processor:"boolean",default:!0}),t("images_reuse_filename",{processor:"boolean",default:!1}),t("images_replace_blob_uris",{processor:"boolean",default:!0}),t("icons",{processor:"string",default:""}),t("icons_url",{processor:"string",default:""}),t("images_upload_url",{processor:"string",default:""}),t("images_upload_base_path",{processor:"string",default:""}),t("images_upload_credentials",{processor:"boolean",default:!1}),t("images_upload_handler",{processor:"function"}),t("language",{processor:"string",default:"en"}),t("language_url",{processor:"string",default:""}),t("entity_encoding",{processor:"string",default:"named"}),t("indent",{processor:"boolean",default:!0}),t("indent_before",{processor:"string",default:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,details,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist"}),t("indent_after",{processor:"string",default:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,details,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist"}),t("indent_use_margin",{processor:"boolean",default:!1}),t("indentation",{processor:"string",default:"40px"}),t("content_css",{processor:e=>{const t=!1===e||u(e)||E(e,u);return t?u(e)?{value:V(e.split(","),et),valid:t}:p(e)?{value:e,valid:t}:!1===e?{value:[],valid:t}:{value:e,valid:t}:{valid:!1,message:"Must be false, a string or an array of strings."}},default:fm(e)?[]:["default"]}),t("content_style",{processor:"string"}),t("content_language",{processor:"string"}),t("content_css_cors",{processor:"boolean",default:!1}),t("font_css",{processor:e=>{const t=u(e)||E(e,u);return t?{value:p(e)?e:V(e.split(","),et),valid:t}:{valid:!1,message:"Must be a string or an array of strings."}},default:[]}),t("extended_mathml_attributes",{processor:"string[]"}),t("extended_mathml_elements",{processor:"string[]"}),t("inline_boundaries",{processor:"boolean",default:!0}),t("inline_boundaries_selector",{processor:"string",default:"a[href],code,span.mce-annotation"}),t("object_resizing",{processor:e=>{const t=b(e)||u(e);return t?!1===e||cd.isiPhone()||cd.isiPad()?{value:"",valid:t}:{value:!0===e?"table,img,figure.image,div,video,iframe":e,valid:t}:{valid:!1,message:"Must be boolean or a string"}},default:!dd}),t("resize_img_proportional",{processor:"boolean",default:!0}),t("event_root",{processor:"string"}),t("service_message",{processor:"string"}),t("onboarding",{processor:"boolean",default:!0}),t("tiny_cloud_entry_url",{processor:"string"}),t("theme",{processor:e=>!1===e||u(e)||w(e),default:"silver"}),t("theme_url",{processor:"string"}),t("formats",{processor:"object"}),t("format_empty_lines",{processor:"boolean",default:!1}),t("format_noneditable_selector",{processor:"string",default:""}),t("preview_styles",{processor:e=>{const t=!1===e||u(e);return t?{value:!1===e?"":e,valid:t}:{valid:!1,message:"Must be false or a string"}},default:"font-family font-size font-weight font-style text-decoration text-transform color background-color border border-radius outline text-shadow"}),t("custom_ui_selector",{processor:"string",default:""}),t("hidden_input",{processor:"boolean",default:!0}),t("submit_patch",{processor:"boolean",default:!0}),t("encoding",{processor:"string"}),t("add_form_submit_trigger",{processor:"boolean",default:!0}),t("add_unload_trigger",{processor:"boolean",default:!0}),t("custom_undo_redo_levels",{processor:"number",default:0}),t("disable_nodechange",{processor:"boolean",default:!1}),t("disabled",{processor:t=>b(t)?(e.initialized&&fu(e)!==t&&Promise.resolve().then(()=>{((e,t)=>{e.dispatch("DisabledStateChange",{state:t})})(e,t)}),{valid:!0,value:t}):{valid:!1,message:"The value must be a boolean."},default:!1}),t("readonly",{processor:"boolean",default:!1}),t("editable_root",{processor:"boolean",default:!0}),t("plugins",{processor:"string[]",default:[]}),t("external_plugins",{processor:"object"}),t("forced_plugins",{processor:"string[]"}),t("model",{processor:"string",default:e.hasPlugin("rtc")?"plugin":"dom"}),t("model_url",{processor:"string"}),t("block_unsupported_drop",{processor:"boolean",default:!0}),t("visual",{processor:"boolean",default:!0}),t("visual_table_class",{processor:"string",default:"mce-item-table"}),t("visual_anchor_class",{processor:"string",default:"mce-item-anchor"}),t("iframe_aria_text",{processor:"string",default:"Rich Text Area".concat(e.hasPlugin("help")?". Press ALT-0 for help.":"")}),t("setup",{processor:"function"}),t("init_instance_callback",{processor:"function"}),t("url_converter",{processor:"function",default:e.convertURL}),t("url_converter_scope",{processor:"object",default:e}),t("urlconverter_callback",{processor:"function"}),t("allow_conditional_comments",{processor:"boolean",default:!1}),t("allow_html_data_urls",{processor:"boolean",default:!1}),t("allow_svg_data_urls",{processor:"boolean"}),t("allow_html_in_named_anchor",{processor:"boolean",default:!1}),t("allow_html_in_comments",{processor:"boolean",default:!1}),t("allow_script_urls",{processor:"boolean",default:!1}),t("allow_unsafe_link_target",{processor:"boolean",default:!1}),t("allow_mathml_annotation_encodings",{processor:e=>{const t=E(e,u);return t?{value:e,valid:t}:{valid:!1,message:"Must be an array of strings."}},default:[]}),t("convert_fonts_to_spans",{processor:"boolean",default:!0,deprecated:!0}),t("fix_list_elements",{processor:"boolean",default:!1}),t("preserve_cdata",{processor:"boolean",default:!1}),t("remove_trailing_brs",{processor:"boolean",default:!0}),t("pad_empty_with_br",{processor:"boolean",default:!1}),t("inline_styles",{processor:"boolean",default:!0,deprecated:!0}),t("element_format",{processor:"string",default:"html"}),t("entities",{processor:"string"}),t("schema",{processor:"string",default:"html5"}),t("convert_urls",{processor:"boolean",default:!0}),t("relative_urls",{processor:"boolean",default:!0}),t("remove_script_host",{processor:"boolean",default:!0}),t("custom_elements",{processor:gd}),t("extended_valid_elements",{processor:"string"}),t("invalid_elements",{processor:"string"}),t("invalid_styles",{processor:gd}),t("valid_children",{processor:"string"}),t("valid_classes",{processor:gd}),t("valid_elements",{processor:"string"}),t("valid_styles",{processor:gd}),t("verify_html",{processor:"boolean",default:!0}),t("auto_focus",{processor:e=>u(e)||!0===e}),t("browser_spellcheck",{processor:"boolean",default:!1}),t("protect",{processor:"array"}),t("images_file_types",{processor:"string",default:"jpeg,jpg,jpe,jfi,jif,jfif,png,gif,bmp,webp"}),t("deprecation_warnings",{processor:"boolean",default:!0}),t("a11y_advanced_options",{processor:"boolean",default:!1}),t("api_key",{processor:"string"}),t("license_key",{processor:"string"}),t("paste_block_drop",{processor:"boolean",default:!1}),t("paste_data_images",{processor:"boolean",default:!0}),t("paste_preprocess",{processor:"function"}),t("paste_postprocess",{processor:"function"}),t("paste_webkit_styles",{processor:"string",default:"none"}),t("paste_remove_styles_if_webkit",{processor:"boolean",default:!0}),t("paste_merge_formats",{processor:"boolean",default:!0}),t("smart_paste",{processor:"boolean",default:!0}),t("paste_as_text",{processor:"boolean",default:!1}),t("paste_tab_spaces",{processor:"number",default:4}),t("text_patterns",{processor:e=>E(e,f)||!1===e?{value:td(!1===e?[]:e),valid:!0}:{valid:!1,message:"Must be an array of objects or false."},default:[{start:"*",end:"*",format:"italic"},{start:"**",end:"**",format:"bold"},{start:"#",format:"h1",trigger:"space"},{start:"##",format:"h2",trigger:"space"},{start:"###",format:"h3",trigger:"space"},{start:"####",format:"h4",trigger:"space"},{start:"#####",format:"h5",trigger:"space"},{start:"######",format:"h6",trigger:"space"},{start:"1.",cmd:"InsertOrderedList",trigger:"space"},{start:"*",cmd:"InsertUnorderedList",trigger:"space"},{start:"-",cmd:"InsertUnorderedList",trigger:"space"},{start:">",cmd:"mceBlockQuote",trigger:"space"},{start:"---",cmd:"InsertHorizontalRule",trigger:"space"}]}),t("text_patterns_lookup",{processor:e=>{return w(e)?{value:(t=e,e=>{const n=t(e);return td(n)}),valid:!0}:{valid:!1,message:"Must be a single function"};var t},default:e=>[]}),t("allow_noneditable",{processor:"boolean",default:!0}),t("noneditable_class",{processor:"string",default:"mceNonEditable"}),t("editable_class",{processor:"string",default:"mceEditable"}),t("noneditable_regexp",{processor:e=>E(e,ud)?{value:e,valid:!0}:ud(e)?{value:[e],valid:!0}:{valid:!1,message:"Must be a RegExp or an array of RegExp."},default:[]}),t("table_tab_navigation",{processor:"boolean",default:!0}),t("highlight_on_focus",{processor:"boolean",default:!0}),t("xss_sanitization",{processor:"boolean",default:!0}),t("details_initial_state",{processor:e=>{const t=$(["inherited","collapsed","expanded"],e);return t?{value:e,valid:t}:{valid:!1,message:"Must be one of: inherited, collapsed, or expanded."}},default:"inherited"}),t("details_serialized_state",{processor:e=>{const t=$(["inherited","collapsed","expanded"],e);return t?{value:e,valid:t}:{valid:!1,message:"Must be one of: inherited, collapsed, or expanded."}},default:"inherited"}),t("init_content_sync",{processor:"boolean",default:!1}),t("newdocument_content",{processor:"string",default:""}),t("sandbox_iframes",{processor:"boolean",default:!0}),t("sandbox_iframes_exclusions",{processor:"string[]",default:["youtube.com","youtu.be","vimeo.com","player.vimeo.com","dailymotion.com","embed.music.apple.com","open.spotify.com","giphy.com","dai.ly","codepen.io"]}),t("convert_unsafe_embeds",{processor:"boolean",default:!0}),t("user_id",{processor:"string",default:"Anonymous"}),t("content_id",{processor:"string"}),t("fetch_users",{processor:e=>void 0===e?{valid:!0,value:void 0}:w(e)?{valid:!0,value:e}:{valid:!1,message:"fetch_users must be a function that returns a Promise"}});const n=Fc([Hc("mimeType"),(o="extensions",s=e=>u(e)?Te.value(e):Te.error("Extensions must be an array of strings"),r=xc(e=>s(e).fold(Cc,vc)),jc(o,o,{tag:"required",process:{}},Ic(r)))]);var o,r,s;t("documents_file_types",{processor:e=>Uc("documents_file_types",n,e).fold(e=>({valid:!1,message:"Must be a non-empty array of objects matching the configuration schema: https://www.tiny.cloud/docs/tinymce/latest/uploadcare-documents/#documents-file-types"}),e=>({valid:!0,value:e}))}),e.on("ScriptsLoaded",()=>{t("directionality",{processor:"string",default:Ci.isRtl()?"rtl":void 0}),t("placeholder",{processor:"string",default:md.getAttrib(e.getElement(),"placeholder")})}),t("lists_indent_on_tab",{processor:"boolean",default:!0}),t("list_max_depth",{processor:e=>{const t=S(e);if(t){if(e<0)throw new Error("list_max_depth cannot be set to lower than 0");return{value:e,valid:t}}return{valid:!1,message:"Must be a number"}}})})(o),this.userLookup=(e=>{const t=new Map,n=new Map,o=e=>I.from(t.get(e)),r=(e,t)=>I.from(n.get(e)).each(({reject:o})=>{o(t),n.delete(e)}),s=gu(e);return Object.freeze({userId:s,fetchUsers:s=>{const a=pu(e);if(!Array.isArray(s))return{};if(!a)return ae(s,e=>Promise.resolve({id:e,name:e,avatar:TP({id:e,name:e})}));const i=fe(Y(s,e=>!o(e).isSome()));return q(i,e=>{const o=new Promise((t,o)=>{n.set(e,{resolve:t,reject:o})});((e,n)=>{t.set(n,e)})(o,e)}),i.length>0&&a(i).then(PP).then(e=>{const t=new Set(V(e,e=>e.id));q(e,e=>((e,t)=>I.from(n.get(e)).each(({resolve:o})=>{o(t),n.delete(e)}))(e.id,e)),q(i,e=>{t.has(e)||r(e,new Error(`User ${e} not found`))})}).catch(e=>{q(i,t=>r(t,e instanceof Error?e:new Error("Network error")))}),X(s,(e,t)=>(e[t]=o(t).getOr(Promise.resolve({id:t,name:t,avatar:TP({id:t,name:t})})),e),{})}})})(this);const s=this.options.get;s("deprecation_warnings")&&((e,t)=>{((e,t)=>{const n=yS(e),o=wS(t),r=o.length>0,s=n.length>0,a="mobile"===t.theme;if(r||s||a){const e="\n- ",t=a?`\n\nThemes:${e}mobile`:"",i=r?`\n\nPlugins:${e}${o.join(e)}`:"",l=s?`\n\nOptions:${e}${n.join(e)}`:"";console.warn("The following deprecated features are currently enabled and have been removed in TinyMCE 8.0. These features will no longer work and should be removed from the TinyMCE configuration. See https://www.tiny.cloud/docs/tinymce/8/migration-from-7x/ for more information."+t+i+l)}})(e,t),((e,t)=>{const n=vS(e),o=SS(t),r=o.length>0,s=n.length>0;if(r||s){const e="\n- ",t=r?`\n\nPlugins:${e}${o.map(ES).join(e)}`:"",a=s?`\n\nOptions:${e}${n.join(e)}`:"";console.warn("The following deprecated features are currently enabled but will be removed soon."+t+a)}})(e,t)})(t,r);const a=s("suffix");a&&(n.suffix=a),this.suffix=n.suffix;const i=s("base_url");i&&n._setBaseUrl(i),this.baseUri=n.baseURI;const l=zd(o);l&&(hi.ScriptLoader._setReferrerPolicy(l),gi.DOM.styleSheetLoader._setReferrerPolicy(l)),hi.ScriptLoader._setCrossOrigin(e=>jd(o)(e,"script")),gi.DOM.styleSheetLoader._setCrossOrigin(e=>jd(o)(e,"stylesheet"));const c=Sm(o);C(c)&&gi.DOM.styleSheetLoader._setContentCssCors(c),wi.languageLoad=s("language_load"),wi.baseURL=n.baseURL,this.setDirty(!1),this.documentBaseURI=new $w(yd(o),{base_uri:this.baseUri}),this.baseURI=this.baseUri,this.inline=fm(o),this.hasVisual=km(o),this.shortcuts=new TL(this),this.editorCommands=new iL(this),rL(this);const d=s("cache_suffix");d&&(sn.cacheSuffix=d.replace(/^[\?\&]+/,"")),this.ui={registry:OL(),styleSheetLoader:void 0,show:x,hide:x,setEnabled:x,isEnabled:M},this.mode=_L(o),Object.defineProperty(this,"editorUid",{writable:!1,configurable:!1,enumerable:!0}),n.dispatch("SetupEditor",{editor:this});const v=Dm(o);w(v)&&v.call(o,o)}render(){(e=>{const t=e.id;Ci.setCode($d(e));const n=()=>{kP.unbind(window,"ready",n),e.render()};if(!ri.Event.domLoaded)return void kP.bind(window,"ready",n);if(!e.getElement())return;const o=un.fromDom(e.getElement()),r=ko(o);e.on("remove",()=>{W(o.dom.attributes,e=>xo(o,e.name)),Co(o,r)}),e.ui.styleSheetLoader=((e,t)=>sa.forElement(e,{contentCssCors:Sm(t),referrerPolicy:zd(t)}))(o,e),fm(e)?e.inline=!0:(e.orgVisibility=e.getElement().style.visibility,e.getElement().style.visibility="hidden");const s=e.getElement().form||kP.getParent(t,"form");s&&(e.formElement=s,gm(e)&&!ls(e.getElement())&&(kP.insertAfter(kP.create("input",{type:"hidden",name:t}),t),e.hasHiddenInput=!0),e.formEventDelegate=t=>{e.dispatch(t.type,t)},kP.bind(s,"submit reset",e.formEventDelegate),e.on("reset",()=>{e.resetContent()}),!pm(e)||s.submit.nodeType||s.submit.length||s._mceOldSubmit||(s._mceOldSubmit=s.submit,s.submit=()=>(e.editorManager.triggerSave(),e.setDirty(!1),s._mceOldSubmit(s)))),e.windowManager=KE(e),e.notificationManager=VE(e),(e=>"xml"===e.options.get("encoding"))(e)&&e.on("GetContent",e=>{e.save&&(e.content=kP.encode(e.content))}),hm(e)&&e.on("submit",()=>{e.initialized&&e.save()}),bm(e)&&(e._beforeUnload=()=>{!e.initialized||e.destroyed||e.isHidden()||e.save({format:"raw",no_events:!0,set_dirty:!1})},e.editorManager.on("BeforeUnload",e._beforeUnload)),e.editorManager.add(e),RP(e,e.suffix)})(this)}focus(e){this.execCommand("mceFocus",!1,e)}hasFocus(){return kp(this)}translate(e){return Ci.translate(e)}getParam(e,t,n){const o=this.options;return o.isRegistered(e)||(C(n)?o.register(e,{processor:n,default:t}):o.register(e,{processor:M,default:t})),o.isSet(e)||y(t)?o.get(e):t}hasPlugin(e,t){return!(!$(Em(this),e)||t&&void 0===qE.get(e))}nodeChanged(e){this._nodeChangeDispatcher.nodeChanged(e)}addCommand(e,t,n){this.editorCommands.addCommand(e,t,n)}addQueryStateHandler(e,t,n){this.editorCommands.addQueryStateHandler(e,t,n)}addQueryValueHandler(e,t,n){this.editorCommands.addQueryValueHandler(e,t,n)}addShortcut(e,t,n,o){this.shortcuts.add(e,t,n,o)}execCommand(e,t,n,o){return this.editorCommands.execCommand(e,t,n,o)}queryCommandState(e){return this.editorCommands.queryCommandState(e)}queryCommandValue(e){return this.editorCommands.queryCommandValue(e)}queryCommandSupported(e){return this.editorCommands.queryCommandSupported(e)}show(){const e=this;e.hidden&&(e.hidden=!1,e.inline?e.getBody().contentEditable="true":(BL.show(e.getContainer()),BL.hide(e.id)),e.load(),e.dispatch("show"))}hide(){const e=this;e.hidden||(e.save(),e.inline?(e.getBody().contentEditable="false",e===e.editorManager.focusedEditor&&(e.editorManager.focusedEditor=null)):(BL.hide(e.getContainer()),BL.setStyle(e.id,"display",e.orgDisplay)),e.hidden=!0,e.dispatch("hide"))}isHidden(){return this.hidden}setProgressState(e,t){this.dispatch("ProgressState",{state:e,time:t})}load(e={}){const t=this,n=t.getElement();if(!t.removed&&n){const o={...e,load:!0},r=ls(n)?n.value:n.innerHTML;t.setContent(r,o),o.no_events||t.dispatch("LoadContent",{...o,element:n})}}save(e={}){const t=this;let n=t.getElement();if(!n||!t.initialized||t.removed)return"";const o={...e,save:!0,element:n};let r=t.getContent(o);const s={...o,content:r};if(s.no_events||t.dispatch("SaveContent",s),"raw"===s.format&&t.dispatch("RawSaveContent",s),r=s.content,ls(n))n.value=r;else{!e.is_removing&&t.inline||(n.innerHTML=r);const o=BL.getParent(t.id,"form");o&&LL(o.elements,e=>e.name!==t.id||(e.value=r,!1))}return s.element=o.element=n=null,!1!==s.set_dirty&&t.setDirty(!1),r}setContent(e,t){BE(this,e,t)}getContent(e){return((e,t={})=>{const n=((e,t)=>({...e,format:t,get:!0,getInner:!0}))(t,t.format?t.format:"html");return cS(e,n).fold(A,t=>{const n=((e,t)=>xE(e).editor.getContent(t))(e,t);return dS(e,n,t)})})(this,e)}insertContent(e,t){t&&(e=PL({content:e},t)),this.execCommand("mceInsertContent",!1,e)}resetContent(e){void 0===e?BE(this,this.startContent,{initial:!0,format:"raw"}):BE(this,e,{initial:!0}),this.undoManager.reset(),this.setDirty(!1),this.nodeChanged()}isDirty(){return!this.isNotDirty}setDirty(e){const t=!this.isNotDirty;this.isNotDirty=!e,e&&e!==t&&this.dispatch("dirty")}getContainer(){const e=this;return e.container||(e.container=e.editorContainer||BL.get(e.id+"_parent")),e.container}getContentAreaContainer(){return this.contentAreaContainer}getElement(){return this.targetElm||(this.targetElm=BL.get(this.id)),this.targetElm}getWin(){const e=this;if(!e.contentWindow){const t=e.iframeElement;t&&(e.contentWindow=t.contentWindow)}return e.contentWindow}getDoc(){const e=this;if(!e.contentDocument){const t=e.getWin();t&&(e.contentDocument=t.document)}return e.contentDocument}getBody(){const e=this.getDoc();return this.bodyElement??e?.body??null}convertURL(e,t,n){const o=this,r=o.options.get,s=Om(o);if(w(s))return s.call(o,e,n,!0,t);if(!r("convert_urls")||"link"===n||f(n)&&"LINK"===n.nodeName||0===e.indexOf("file:")||0===e.length)return e;const a=new $w(e);return"http"!==a.protocol&&"https"!==a.protocol&&""!==a.protocol?e:r("relative_urls")?o.documentBaseURI.toRelative(e):e=o.documentBaseURI.toAbsolute(e,r("remove_script_host"))}addVisual(e){((e,t)=>{((e,t)=>{_E(e).editor.addVisual(t)})(e,t)})(this,e)}setEditableRoot(e){((e,t)=>{e._editableRoot!==t&&(e._editableRoot=t,bx(e)||(e.getBody().contentEditable=String(e.hasEditableRoot()),e.nodeChanged()),((e,t)=>{e.dispatch("EditableRootStateChange",{state:t})})(e,t))})(this,e)}hasEditableRoot(){return this._editableRoot}announce(e,t){rp.announce(e,t)}remove(){(e=>{if(!e.removed){const{_selectionOverrides:t,editorUpload:n}=e,o=e.getBody(),r=e.getElement();o&&e.save({is_removing:!0}),e.removed=!0,e.unbindAllNativeEvents(),e.hasHiddenInput&&C(r?.nextSibling)&&PE.remove(r.nextSibling),(e=>{e.dispatch("remove")})(e),e.editorManager.remove(e),!e.inline&&o&&(e=>{PE.setStyle(e.id,"display",e.orgDisplay)})(e),(e=>{e.dispatch("detach")})(e),PE.remove(e.getContainer()),LE(t),LE(n),e.destroy()}})(this)}destroy(e){((e,t)=>{const{selection:n,dom:o}=e;e.destroyed||(t||e.removed?(t||(e.editorManager.off("beforeunload",e._beforeUnload),e.theme&&e.theme.destroy&&e.theme.destroy(),LE(n),LE(o)),(e=>{const t=e.formElement;t&&(t._mceOldSubmit&&(t.submit=t._mceOldSubmit,delete t._mceOldSubmit),PE.unbind(t,"submit reset",e.formEventDelegate))})(e),(e=>{const t=e;t.contentAreaContainer=t.formElement=t.container=t.editorContainer=null,t.bodyElement=t.contentDocument=t.contentWindow=null,t.iframeElement=t.targetElm=null;const n=e.selection;if(n){const e=n.dom;t.selection=n.win=n.dom=e.doc=null}})(e),e.destroyed=!0):e.remove())})(this,e)}uploadImages(){return this.editorUpload.uploadImages()}_scanForImages(){return this.editorUpload.scanForImages()}}const IL=gi.DOM,FL=dn.each;let UL,zL=!1,jL=[];const $L=e=>{const t=e.type;FL(WL.get(),n=>{switch(t){case"scroll":n.dispatch("ScrollWindow",e);break;case"resize":n.dispatch("ResizeWindow",e)}})},HL=e=>{if(e!==zL){const t=gi.DOM;e?(t.bind(window,"resize",$L),t.bind(window,"scroll",$L)):(t.unbind(window,"resize",$L),t.unbind(window,"scroll",$L)),zL=e}},VL=e=>{const t=jL;return jL=Y(jL,t=>e!==t),WL.activeEditor===e&&(WL.activeEditor=jL.length>0?jL[0]:null),WL.focusedEditor===e&&(WL.focusedEditor=null),t.length!==jL.length},qL="CSS1Compat"!==document.compatMode,WL={...mL,baseURI:null,baseURL:null,defaultOptions:{},documentBaseURL:null,suffix:null,pageUid:Me(),majorVersion:"8",minorVersion:"7.0",releaseDate:"2026-07-01",i18n:Ci,activeEditor:null,focusedEditor:null,setup(){const e=this;let t="",n="",o=$w.getDocumentBaseUrl(document.location);/^[^:]+:\/\/\/?[^\/]+\//.test(o)&&(o=o.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,""),/[\/\\]$/.test(o)||(o+="/"));const r=window.tinymce||window.tinyMCEPreInit;if(r)t=r.base||r.baseURL,n=r.suffix;else{const e=document.getElementsByTagName("script");for(let o=0;oObject.defineProperty(e,t,{writable:!1,configurable:!1,enumerable:!0}))},overrideDefaults(e){const t=e.base_url;t&&this._setBaseUrl(t);const n=e.suffix;n&&(this.suffix=n),this.defaultOptions=e;const o=e.plugin_base_urls;void 0!==o&&he(o,(e,t)=>{wi.PluginManager.urls[t]=e})},init(e){const t=this;let n;const o=dn.makeMap("area base basefont br col frame hr img input isindex link meta param embed source wbr track colgroup option table tbody tfoot thead tr th td script noscript style textarea video audio iframe object menu"," ");let r=e=>{n=e};const s=()=>{let n=0;const a=[];let i;IL.unbind(window,"ready",s),(()=>{const n=e.onpageload;n&&n.apply(t,[])})(),i=fe((e=>sn.browser.isIE()||sn.browser.isEdge()?(ZE("TinyMCE does not support the browser you are using. For a list of supported browsers please see: https://www.tiny.cloud/docs/tinymce/8/support/#supportedwebbrowsers"),[]):qL?(ZE("Failed to initialize the editor as the document is not in standards mode. TinyMCE requires standards mode."),[]):u(e.selector)?IL.select(e.selector):C(e.target)?[e.target]:[])(e)),dn.each(i,e=>{var n;(n=t.get(e.id))&&n.initialized&&!(n.getContainer()||n.getBody()).parentNode&&(VL(n),n.unbindAllNativeEvents(),n.destroy(!0),n.removed=!0)}),i=dn.grep(i,e=>!t.get(e.id)),0===i.length?r([]):FL(i,s=>{((e,t)=>e.inline&&t.tagName.toLowerCase()in o)(e,s)?ZE("Could not initialize inline editor on invalid inline target element",s):((e,o,s)=>{const l=new ML(e,o,t);a.push(l),l.on("init",()=>{++n===i.length&&r(a)}),l.targetElm=l.targetElm||s,l.render()})((e=>{let t=e.id;return t||(t=xe(e,"name").filter(e=>!IL.get(e)).getOrThunk(IL.uniqueId),e.setAttribute("id",t)),t})(s),e,s)})};return IL.bind(window,"ready",s),new Promise(e=>{n?e(n):r=t=>{e(t)}})},get(e){return 0===arguments.length?jL.slice(0):u(e)?Z(jL,t=>t.id===e).getOr(null):S(e)&&jL[e]?jL[e]:null},add(e){const t=this,n=t.get(e.id);return n===e||(null===n&&jL.push(e),HL(!0),t.activeEditor=e,t.dispatch("AddEditor",{editor:e}),UL||(UL=e=>{const n=t.dispatch("BeforeUnload");if(n.returnValue)return e.preventDefault(),e.returnValue=n.returnValue,n.returnValue},window.addEventListener("beforeunload",UL))),e},createEditor(e,t){return this.add(new ML(e,t,this))},remove(e){const t=this;let n;if(e){if(!u(e))return n=e,h(t.get(n.id))?null:(VL(n)&&t.dispatch("RemoveEditor",{editor:n}),0===jL.length&&window.removeEventListener("beforeunload",UL),n.remove(),HL(jL.length>0),n);FL(IL.select(e),e=>{n=t.get(e.id),n&&t.remove(n)})}else for(let e=jL.length-1;e>=0;e--)t.remove(jL[e])},execCommand(e,t,n){const o=this,r=f(n)?n.id??n.index:n;switch(e){case"mceAddEditor":if(!o.get(r)){const e=n.options;new ML(r,e,o).render()}return!0;case"mceRemoveEditor":{const e=o.get(r);return e&&e.remove(),!0}case"mceToggleEditor":{const e=o.get(r);return e?(e.isHidden()?e.show():e.hide(),!0):(o.execCommand("mceAddEditor",!1,n),!0)}}return!!o.activeEditor&&o.activeEditor.execCommand(e,t,n)},triggerSave:()=>{FL(jL,e=>{e.save()})},addI18n:(e,t)=>{Ci.add(e,t)},translate:e=>Ci.translate(e),setActive(e){const t=this.activeEditor;this.activeEditor!==e&&(t&&t.dispatch("deactivate",{relatedTarget:e}),e.dispatch("activate",{relatedTarget:t})),this.activeEditor=e},_setBaseUrl(e){this.baseURL=new $w(this.documentBaseURL).toAbsolute(e.replace(/\/+$/,"")),this.baseURI=new $w(this.baseURL)},_addLicenseKeyManager:e=>ux.add(e)};WL.setup();const KL=(()=>{const e=Ke();return{FakeClipboardItem:e=>({items:e,types:ge(e),getType:t=>xe(e,t).getOrUndefined()}),write:t=>{e.set(t)},read:()=>e.get().getOrUndefined(),clear:e.clear}})(),YL=Math.min,GL=Math.max,XL=Math.round,QL=(e,t,n)=>{let o=t.x,r=t.y;const s=e.w,a=e.h,i=t.w,l=t.h,c=(n||"").split("");return"b"===c[0]&&(r+=l),"r"===c[1]&&(o+=i),"c"===c[0]&&(r+=XL(l/2)),"c"===c[1]&&(o+=XL(i/2)),"b"===c[3]&&(r-=a),"r"===c[4]&&(o-=s),"c"===c[3]&&(r-=XL(a/2)),"c"===c[4]&&(o-=XL(s/2)),ZL(o,r,s,a)},ZL=(e,t,n,o)=>({x:e,y:t,w:n,h:o}),JL={inflate:(e,t,n)=>ZL(e.x-t,e.y-n,e.w+2*t,e.h+2*n),relativePosition:QL,findBestRelativePosition:(e,t,n,o)=>{for(let r=0;r=n.x&&s.x+s.w<=n.w+n.x&&s.y>=n.y&&s.y+s.h<=n.h+n.y)return o[r]}return null},intersect:(e,t)=>{const n=GL(e.x,t.x),o=GL(e.y,t.y),r=YL(e.x+e.w,t.x+t.w),s=YL(e.y+e.h,t.y+t.h);return r-n<0||s-o<0?null:ZL(n,o,r-n,s-o)},clamp:(e,t,n)=>{let o=e.x,r=e.y,s=e.x+e.w,a=e.y+e.h;const i=t.x+t.w,l=t.y+t.h,c=GL(0,t.x-o),d=GL(0,t.y-r),m=GL(0,s-i),u=GL(0,a-l);return o+=c,r+=d,n&&(s+=c,a+=d,o-=m,r-=u),s-=m,a-=u,ZL(o,r,s-o,a-r)},create:ZL,fromClientRect:e=>ZL(e.left,e.top,e.width,e.height)},eM=(()=>{const e={},t={},n={};return{load:(n,o)=>{const r=`Script at URL "${o}" failed to load`,s=`Script at URL "${o}" did not call \`tinymce.Resource.add('${n}', data)\` within 1 second`;if(void 0!==e[n])return e[n];{const a=new Promise((e,a)=>{const i=((e,t,n=1e3)=>{let o=!1,r=null;const s=e=>(...t)=>{o||(o=!0,null!==r&&(window.clearTimeout(r),r=null),e.apply(null,t))},a=s(e),i=s(t);return{start:(...e)=>{o||null!==r||(r=window.setTimeout(()=>i.apply(null,e),n))},resolve:a,reject:i}})(e,a);t[n]=i.resolve,hi.ScriptLoader.loadScript(o).then(()=>i.start(s),()=>i.reject(r))});return e[n]=a,a}},add:(o,r)=>{void 0!==t[o]&&(t[o](r),delete t[o]),e[o]=Promise.resolve(r),n[o]=r},has:e=>e in n,get:e=>n[e],unload:t=>{delete e[t],delete n[t]}}})();let tM;try{const e="__storage_test__";tM=window.localStorage,tM.setItem(e,e),tM.removeItem(e)}catch{tM=(()=>{let e={},t=[];const n={getItem:t=>e[t]||null,setItem:(n,o)=>{t.push(n),e[n]=String(o)},key:e=>t[e],removeItem:n=>{t=t.filter(e=>e===n),delete e[n]},clear:()=>{t=[],e={}},length:0};return Object.defineProperty(n,"length",{get:()=>t.length,configurable:!1,enumerable:!1}),n})()}const nM={geom:{Rect:JL},util:{Delay:hp,Tools:dn,VK:Rp,URI:$w,EventDispatcher:cL,Observable:mL,I18n:Ci,LocalStorage:tM,ImageUploader:e=>{const t=kx(),n=Dx(e,t);return{upload:(t,o=!0)=>n.upload(t,o?Rx(e):void 0)}}},dom:{EventUtils:ri,TreeWalker:Kr,TextSeeker:Pi,DOMUtils:gi,ScriptLoader:hi,RangeUtils:Kp,Serializer:OE,StyleSheetLoader:ra,ControlSelection:Lp,BookmarkManager:sp,Selection:RE,AriaAnnouncer:rp,Event:ri.Event},html:{Styles:Ga,Entities:Sa,Node:Sh,Schema:Ua,DomParser:sS,Writer:zh,Serializer:jh},Env:sn,AddOnManager:wi,Annotator:Qg,Formatter:$x,UndoManager:Vx,EditorCommands:iL,WindowManager:KE,NotificationManager:VE,EditorObservable:bL,Shortcuts:TL,Editor:ML,FocusManager:pp,EditorManager:WL,DOM:gi.DOM,ScriptLoader:hi.ScriptLoader,PluginManager:qE,ThemeManager:WE,ModelManager:IE,IconManager:ME,Resource:eM,FakeClipboard:KL,trim:dn.trim,isArray:dn.isArray,is:dn.is,toArray:dn.toArray,makeMap:dn.makeMap,each:dn.each,map:dn.map,grep:dn.grep,inArray:dn.inArray,extend:dn.extend,walk:dn.walk,resolve:dn.resolve,explode:dn.explode,_addCacheSuffix:dn._addCacheSuffix},oM=dn.extend(WL,nM);(e=>{window.tinymce=e,window.tinyMCE=e})(oM),(e=>{if("object"==typeof module)try{module.exports=e}catch{}})(oM)}(); \ No newline at end of file +!function(){"use strict";var e=function(e){if(null===e)return"null";if(void 0===e)return"undefined";var t=typeof e;return"object"===t&&(Array.prototype.isPrototypeOf(e)||e.constructor&&"Array"===e.constructor.name)?"array":"object"===t&&(String.prototype.isPrototypeOf(e)||e.constructor&&"String"===e.constructor.name)?"string":t},t=function(e){return{eq:e}},n=t(function(e,t){return e===t}),o=function(e){return t(function(t,n){if(t.length!==n.length)return!1;for(var o=t.length,r=0;r!!n(e,t.prototype)||e.constructor?.name===t.name,l=e=>t=>(e=>{const t=typeof e;return null===e?"null":"object"===t&&Array.isArray(e)?"array":"object"===t&&i(e,String,(e,t)=>t.isPrototypeOf(e))?"string":t})(t)===e,c=e=>t=>typeof t===e,d=e=>t=>e===t,m=(e,t)=>f(e)&&i(e,t,(e,t)=>a(e)===t),u=l("string"),f=l("object"),g=e=>m(e,Object),p=l("array"),h=d(null),b=c("boolean"),y=d(void 0),v=e=>null==e,C=e=>!v(e),w=c("function"),S=c("number"),E=(e,t)=>{if(p(e)){for(let n=0,o=e.length;n{},_=(e,t)=>(...n)=>e(t.apply(null,n)),k=(e,t)=>n=>e(t(n)),N=e=>()=>e,A=e=>e,R=(e,t)=>e===t;function D(e,...t){return(...n)=>{const o=t.concat(n);return e.apply(null,o)}}const T=e=>t=>!e(t),O=e=>()=>{throw new Error(e)},B=e=>e(),P=e=>{e()},L=N(!1),M=N(!0);class I{tag;value;static singletonNone=new I(!1);constructor(e,t){this.tag=e,this.value=t}static some(e){return new I(!0,e)}static none(){return I.singletonNone}fold(e,t){return this.tag?t(this.value):e()}isSome(){return this.tag}isNone(){return!this.tag}map(e){return this.tag?I.some(e(this.value)):I.none()}bind(e){return this.tag?e(this.value):I.none()}exists(e){return this.tag&&e(this.value)}forall(e){return!this.tag||e(this.value)}filter(e){return!this.tag||e(this.value)?this:I.none()}getOr(e){return this.tag?this.value:e}or(e){return this.tag?this:e}getOrThunk(e){return this.tag?this.value:e()}orThunk(e){return this.tag?this:e()}getOrDie(e){if(this.tag)return this.value;throw new Error(e??"Called getOrDie on None")}static from(e){return C(e)?I.some(e):I.none()}getOrNull(){return this.tag?this.value:null}getOrUndefined(){return this.value}each(e){this.tag&&e(this.value)}toArray(){return this.tag?[this.value]:[]}toString(){return this.tag?`some(${this.value})`:"none()"}}const F=Array.prototype.slice,U=Array.prototype.indexOf,z=Array.prototype.push,j=(e,t)=>U.call(e,t),$=(e,t)=>j(e,t)>-1,H=(e,t)=>{for(let n=0,o=e.length;n{const n=e.length,o=new Array(n);for(let r=0;r{for(let n=0,o=e.length;n{for(let n=e.length-1;n>=0;n--)t(e[n],n)},K=(e,t)=>{const n=[],o=[];for(let r=0,s=e.length;r{const n=[];for(let o=0,r=e.length;o(W(e,(e,o)=>{n=t(n,e,o)}),n),X=(e,t,n)=>(q(e,(e,o)=>{n=t(n,e,o)}),n),Q=(e,t,n)=>{for(let o=0,r=e.length;oQ(e,t,L),J=(e,t)=>{for(let n=0,o=e.length;n{for(let n=e.length-1;n>=0;n--)if(t(e[n],n))return I.some({v:e[n],i:n});return I.none()},te=e=>{const t=[];for(let n=0,o=e.length;nte(V(e,t)),oe=(e,t)=>{for(let n=0,o=e.length;n{const t=F.call(e,0);return t.reverse(),t},se=(e,t)=>Y(e,e=>!$(t,e)),ae=(e,t)=>{const n={};for(let o=0,r=e.length;o{const n=F.call(e,0);return n.sort(t),n},le=(e,t)=>t>=0&&tle(e,0),de=e=>le(e,e.length-1),me=w(Array.from)?Array.from:e=>F.call(e),ue=(e,t)=>{for(let n=0;n{const n=[],o=w(t)?e=>H(n,n=>t(n,e)):e=>$(n,e);for(let t=0,r=e.length;t{const n=ge(e);for(let o=0,r=n.length;oye(e,(e,n)=>({k:n,v:t(e,n)})),ye=(e,t)=>{const n={};return he(e,(e,o)=>{const r=t(e,o);n[r.k]=r.v}),n},ve=e=>(t,n)=>{e[n]=t},Ce=(e,t,n,o)=>{he(e,(e,r)=>{(t(e,r)?n:o)(e,r)})},we=(e,t)=>{const n={};return Ce(e,t,ve(n),x),n},Se=(e,t)=>{const n=[];return he(e,(e,o)=>{n.push(t(e,o))}),n},Ee=e=>Se(e,A),xe=(e,t)=>_e(e,t)?I.from(e[t]):I.none(),_e=(e,t)=>pe.call(e,t),ke=(e,t)=>_e(e,t)&&void 0!==e[t]&&null!==e[t],Ne=e=>{if(!p(e))throw new Error("cases must be an array");if(0===e.length)throw new Error("there must be at least one case");const t=[],n={};return q(e,(o,r)=>{const s=ge(o);if(1!==s.length)throw new Error("one and only one name per case");const a=s[0],i=o[a];if(void 0!==n[a])throw new Error("duplicate key detected:"+a);if("cata"===a)throw new Error("cannot have a case named cata (sorry)");if(!p(i))throw new Error("case arguments must be an array");t.push(a),n[a]=(...n)=>{const o=n.length;if(o!==i.length)throw new Error("Wrong number of arguments to case "+a+". Expected "+i.length+" ("+i+"), got "+o);return{fold:(...t)=>{if(t.length!==e.length)throw new Error("Wrong number of arguments to fold. Expected "+e.length+", got "+t.length);return t[r].apply(null,n)},match:e=>{const o=ge(e);if(t.length!==o.length)throw new Error("Wrong number of arguments to match. Expected: "+t.join(",")+"\nActual: "+o.join(","));if(!oe(t,e=>$(o,e)))throw new Error("Not all branches were specified when using match. Specified: "+o.join(", ")+"\nRequired: "+t.join(", "));return e[a].apply(null,n)},log:e=>{console.log(e,{constructors:t,constructor:a,params:n})}}}}),n},Ae=e=>{let t=e;return{get:()=>t,set:e=>{t=e}}},Re=e=>{const t=t=>t(e),n=N(e),o=()=>r,r={tag:!0,inner:e,fold:(t,n)=>n(e),isValue:M,isError:L,map:t=>Te.value(t(e)),mapError:o,bind:t,exists:t,forall:t,getOr:n,or:o,getOrThunk:n,orThunk:o,getOrDie:n,each:t=>{t(e)},toOptional:()=>I.some(e)};return r},De=e=>{const t=()=>n,n={tag:!1,inner:e,fold:(t,n)=>t(e),isValue:L,isError:M,map:t,mapError:t=>Te.error(t(e)),bind:t,exists:L,forall:M,getOr:A,or:A,getOrThunk:B,orThunk:B,getOrDie:O(String(e)),each:x,toOptional:I.none};return n},Te={value:Re,error:De,fromOption:(e,t)=>e.fold(()=>De(t),Re)},Oe="undefined"!=typeof window?window:Function("return this;")(),Be=()=>window.crypto.getRandomValues(new Uint32Array(1))[0]/4294967295;let Pe=0;const Le=e=>{const t=(new Date).getTime(),n=Math.floor(1e9*Be());return Pe++,e+"_"+n+Pe+String(t)},Me=()=>window.isSecureContext?window.crypto.randomUUID():(()=>{const e=(()=>{const e=window.crypto.getRandomValues(new Uint8Array(16));return e[6]=15&e[6]|64,e[8]=63&e[8]|128,e})(),t=(t,n)=>{let o="";for(let r=t;r<=n;++r)o+=e[r].toString(16).padStart(2,"0");return o};return`${t(0,3)}-${t(4,5)}-${t(6,7)}-${t(8,9)}-${t(10,15)}`})(),Ie=e=>(...t)=>{if(0===t.length)throw new Error("Can't merge zero objects");const n={};for(let o=0;og(e)&&g(t)?Fe(e,t):t),Ue=Ie((e,t)=>t),ze=(e,t,n=R)=>e.exists(e=>n(e,t)),je=(e,t,n=R)=>$e(e,t,n).getOr(e.isNone()&&t.isNone()),$e=(e,t,n)=>e.isSome()&&t.isSome()?I.some(n(e.getOrDie(),t.getOrDie())):I.none(),He=(e,t)=>e?I.some(t):I.none(),Ve=(e,t)=>((e,t)=>{let n=null!=t?t:Oe;for(let t=0;t{const t=[],n=[];return q(e,e=>{e.fold(e=>{t.push(e)},e=>{n.push(e)})}),{errors:t,values:n}},We=e=>{const t=Ae(I.none()),n=()=>t.get().each(e=>clearInterval(e));return{clear:()=>{n(),t.set(I.none())},isSet:()=>t.get().isSome(),get:()=>t.get(),set:o=>{n(),t.set(I.some(setInterval(o,e)))}}},Ke=()=>{const e=(e=>{const t=Ae(I.none()),n=()=>t.get().each(e);return{clear:()=>{n(),t.set(I.none())},isSet:()=>t.get().isSome(),get:()=>t.get(),set:e=>{n(),t.set(I.some(e))}}})(x);return{...e,on:t=>e.get().each(t)}},Ye=(e,t,n)=>""===t||e.length>=t.length&&e.substr(n,n+t.length)===t,Ge=(e,t)=>Qe(e,t)?((e,t)=>e.substring(t))(e,t.length):e,Xe=(e,t,n=0,o)=>{const r=e.indexOf(t,n);return-1!==r&&(!!y(o)||r+t.length<=o)},Qe=(e,t)=>Ye(e,t,0),Ze=(e,t)=>Ye(e,t,e.length-t.length),Je=e=>t=>t.replace(e,""),et=Je(/^\s+|\s+$/g),tt=Je(/^\s+/g),nt=Je(/\s+$/g),ot=e=>e.length>0,rt=e=>!ot(e),st=(e,t=10)=>{const n=parseInt(e,t);return isNaN(n)?I.none():I.some(n)},at=(e,t)=>{let n=null;return{cancel:()=>{h(n)||(clearTimeout(n),n=null)},throttle:(...o)=>{h(n)&&(n=setTimeout(()=>{n=null,e.apply(null,o)},t))}}},it=(e,t)=>{let n=null;const o=()=>{h(n)||(clearTimeout(n),n=null)};return{cancel:o,throttle:(...r)=>{o(),n=setTimeout(()=>{n=null,e.apply(null,r)},t)}}},lt=e=>{let t,n=!1;return(...o)=>(n||(n=!0,t=e.apply(null,o)),t)},ct="\ufeff",dt="\xa0",mt=e=>e===ct,ut=e=>{const t={};return q(e,e=>{t[e]={}}),ge(t)},ft=e=>void 0!==e.length,gt=Array.isArray,pt=(e,t,n)=>{if(!e)return!1;if(n=n||e,ft(e)){for(let o=0,r=e.length;o{const n=[];return pt(e,(o,r)=>{n.push(t(o,r,e))}),n},bt=(e,t)=>{const n=[];return pt(e,(o,r)=>{t&&!t(o,r,e)||n.push(o)}),n},yt=(e,t,n,o)=>{let r=y(n)?e[0]:n;for(let n=0;n{for(let o=0,r=e.length;oe[e.length-1],wt=()=>St(0,0),St=(e,t)=>({major:e,minor:t}),Et={nu:St,detect:(e,t)=>{const n=String(t).toLowerCase();return 0===e.length?wt():((e,t)=>{const n=((e,t)=>{for(let n=0;nNumber(t.replace(n,"$"+e));return St(o(1),o(2))})(e,n)},unknown:wt},xt=(e,t)=>{const n=String(t).toLowerCase();return Z(e,e=>e.search(n))},_t=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,kt=e=>t=>Xe(t,e),Nt=[{name:"Edge",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:e=>Xe(e,"edge/")&&Xe(e,"chrome")&&Xe(e,"safari")&&Xe(e,"applewebkit")},{name:"Chromium",brand:"Chromium",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,_t],search:e=>Xe(e,"chrome")&&!Xe(e,"chromeframe")},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:e=>Xe(e,"msie")||Xe(e,"trident")},{name:"Opera",versionRegexes:[_t,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:kt("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:kt("firefox")},{name:"Safari",versionRegexes:[_t,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:e=>(Xe(e,"safari")||Xe(e,"mobile/"))&&Xe(e,"applewebkit")}],At=[{name:"Windows",search:kt("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:e=>Xe(e,"iphone")||Xe(e,"ipad"),versionRegexes:[/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,/.*cpu os ([0-9]+)_([0-9]+).*/,/.*cpu iphone os ([0-9]+)_([0-9]+).*/]},{name:"Android",search:kt("android"),versionRegexes:[/.*?android\ ?([0-9]+)\.([0-9]+).*/]},{name:"macOS",search:kt("mac os x"),versionRegexes:[/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]},{name:"Linux",search:kt("linux"),versionRegexes:[]},{name:"Solaris",search:kt("sunos"),versionRegexes:[]},{name:"FreeBSD",search:kt("freebsd"),versionRegexes:[]},{name:"ChromeOS",search:kt("cros"),versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/]}],Rt={browsers:N(Nt),oses:N(At)},Dt="Edge",Tt="Chromium",Ot="Opera",Bt="Firefox",Pt="Safari",Lt=e=>{const t=e.current,n=e.version,o=e=>()=>t===e;return{current:t,version:n,isEdge:o(Dt),isChromium:o(Tt),isIE:o("IE"),isOpera:o(Ot),isFirefox:o(Bt),isSafari:o(Pt)}},Mt=()=>Lt({current:void 0,version:Et.unknown()}),It=Lt,Ft=(N(Dt),N(Tt),N("IE"),N(Ot),N(Bt),N(Pt),"Windows"),Ut="Android",zt="Linux",jt="macOS",$t="Solaris",Ht="FreeBSD",Vt="ChromeOS",qt=e=>{const t=e.current,n=e.version,o=e=>()=>t===e;return{current:t,version:n,isWindows:o(Ft),isiOS:o("iOS"),isAndroid:o(Ut),isMacOS:o(jt),isLinux:o(zt),isSolaris:o($t),isFreeBSD:o(Ht),isChromeOS:o(Vt)}},Wt=()=>qt({current:void 0,version:Et.unknown()}),Kt=qt,Yt=(N(Ft),N("iOS"),N(Ut),N(zt),N(jt),N($t),N(Ht),N(Vt),e=>window.matchMedia(e).matches);let Gt=lt(()=>((e,t,n)=>{const o=Rt.browsers(),r=Rt.oses(),s=t.bind(e=>((e,t)=>ue(t.brands,t=>{const n=t.brand.toLowerCase();return Z(e,e=>n===e.brand?.toLowerCase()).map(e=>({current:e.name,version:Et.nu(parseInt(t.version,10),0)}))}))(o,e)).orThunk(()=>((e,t)=>xt(e,t).map(e=>{const n=Et.detect(e.versionRegexes,t);return{current:e.name,version:n}}))(o,e)).fold(Mt,It),a=((e,t)=>xt(e,t).map(e=>{const n=Et.detect(e.versionRegexes,t);return{current:e.name,version:n}}))(r,e).fold(Wt,Kt),i=((e,t,n,o)=>{const r=e.isiOS()&&!0===/ipad/i.test(n),s=e.isiOS()&&!r,a=e.isiOS()||e.isAndroid(),i=a||o("(pointer:coarse)"),l=r||!s&&a&&o("(min-device-width:768px)"),c=s||a&&!l,d=t.isSafari()&&e.isiOS()&&!1===/safari/i.test(n),m=!c&&!l&&!d;return{isiPad:N(r),isiPhone:N(s),isTablet:N(l),isPhone:N(c),isTouch:N(i),isAndroid:e.isAndroid,isiOS:e.isiOS,isWebView:N(d),isDesktop:N(m)}})(a,s,e,n);return{browser:s,os:a,deviceType:i}})(window.navigator.userAgent,I.from(window.navigator.userAgentData),Yt));const Xt=()=>Gt(),Qt=Object.getPrototypeOf,Zt=e=>{const t=Ve("ownerDocument.defaultView",e);return f(e)&&((e=>((e,t)=>{const n=((e,t)=>Ve(e,t))(e,t);if(null==n)throw new Error(e+" not available on this browser");return n})("HTMLElement",e))(t).prototype.isPrototypeOf(e)||/^HTML\w*Element$/.test(Qt(e).constructor.name))},Jt=window.navigator.userAgent,en=Xt(),tn=en.browser,nn=en.os,on=en.deviceType,rn=-1!==Jt.indexOf("Windows Phone"),sn={transparentSrc:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",documentMode:tn.isIE()?document.documentMode||7:10,cacheSuffix:null,container:null,canHaveCSP:!tn.isIE(),windowsPhone:rn,browser:{current:tn.current,version:tn.version,isChromium:tn.isChromium,isEdge:tn.isEdge,isFirefox:tn.isFirefox,isIE:tn.isIE,isOpera:tn.isOpera,isSafari:tn.isSafari},os:{current:nn.current,version:nn.version,isAndroid:nn.isAndroid,isChromeOS:nn.isChromeOS,isFreeBSD:nn.isFreeBSD,isiOS:nn.isiOS,isLinux:nn.isLinux,isMacOS:nn.isMacOS,isSolaris:nn.isSolaris,isWindows:nn.isWindows},deviceType:{isDesktop:on.isDesktop,isiPad:on.isiPad,isiPhone:on.isiPhone,isPhone:on.isPhone,isTablet:on.isTablet,isTouch:on.isTouch,isWebView:on.isWebView}},an=/^\s*|\s*$/g,ln=e=>v(e)?"":(""+e).replace(an,""),cn=function(e,t,n,o){o=o||this,e&&(n&&(e=e[n]),pt(e,(e,r)=>!1!==t.call(o,e,r,n)&&(cn(e,t,n,o),!0)))},dn={trim:ln,isArray:gt,is:(e,t)=>t?!("array"!==t||!gt(e))||typeof e===t:void 0!==e,toArray:e=>{if(gt(e))return e;{const t=[];for(let n=0,o=e.length;n{const o=u(e)?e.split(t||","):e||[];let r=o.length;for(;r--;)n[o[r]]={};return n},each:pt,map:ht,grep:bt,inArray:(e,t)=>{if(e)for(let n=0,o=e.length;n{for(let n=0;n{const n=e.split(".");for(let e=0,o=n.length;ep(e)?e:""===e?[]:ht(e.split(t||","),ln),_addCacheSuffix:e=>{const t=sn.cacheSuffix;return t&&(e+=(-1===e.indexOf("?")?"?":"&")+t),e}},mn=e=>{if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}},un={fromHtml:(e,t)=>{const n=(t||document).createElement("div");if(n.innerHTML=e,!n.hasChildNodes()||n.childNodes.length>1){const t="HTML does not have a single root node";throw console.error(t,e),new Error(t)}return mn(n.childNodes[0])},fromTag:(e,t)=>{const n=(t||document).createElement(e);return mn(n)},fromText:(e,t)=>{const n=(t||document).createTextNode(e);return mn(n)},fromDom:mn,fromPoint:(e,t,n)=>I.from(e.dom.elementFromPoint(t,n)).map(mn)},fn=(e,t,n)=>{const o=e.document.createRange();var r;return r=o,t.fold(e=>{r.setStartBefore(e.dom)},(e,t)=>{r.setStart(e.dom,t)},e=>{r.setStartAfter(e.dom)}),((e,t)=>{t.fold(t=>{e.setEndBefore(t.dom)},(t,n)=>{e.setEnd(t.dom,n)},t=>{e.setEndAfter(t.dom)})})(o,n),o},gn=(e,t,n,o,r)=>{const s=e.document.createRange();return s.setStart(t.dom,n),s.setEnd(o.dom,r),s},pn=Ne([{ltr:["start","soffset","finish","foffset"]},{rtl:["start","soffset","finish","foffset"]}]),hn=(e,t,n)=>t(un.fromDom(n.startContainer),n.startOffset,un.fromDom(n.endContainer),n.endOffset);pn.ltr,pn.rtl;const bn=(e,t)=>{const n=e.dom;if(1!==n.nodeType)return!1;{const e=n;if(void 0!==e.matches)return e.matches(t);if(void 0!==e.msMatchesSelector)return e.msMatchesSelector(t);if(void 0!==e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if(void 0!==e.mozMatchesSelector)return e.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")}},yn=e=>1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType||0===e.childElementCount,vn=(e,t)=>e.dom===t.dom,Cn=(e,t)=>{const n=e.dom,o=t.dom;return n!==o&&n.contains(o)},wn=bn,Sn=(e,t)=>{const n=[],o=e=>(n.push(e),t(e));let r=t(e);do{r=r.bind(o)}while(r.isSome());return n},En=e=>e.dom.nodeName.toLowerCase(),xn=e=>e.dom.nodeType,_n=e=>t=>xn(t)===e,kn=e=>8===xn(e)||"#comment"===En(e),Nn=e=>An(e)&&Zt(e.dom),An=_n(1),Rn=_n(3),Dn=_n(9),Tn=_n(11),On=e=>t=>An(t)&&En(t)===e,Bn=e=>un.fromDom(e.dom.ownerDocument),Pn=e=>Dn(e)?e:Bn(e),Ln=e=>un.fromDom(Pn(e).dom.defaultView),Mn=e=>I.from(e.dom.parentNode).map(un.fromDom),In=e=>I.from(e.dom.parentElement).map(un.fromDom),Fn=(e,t)=>{const n=w(t)?t:L;let o=e.dom;const r=[];for(;null!==o.parentNode&&void 0!==o.parentNode;){const e=o.parentNode,t=un.fromDom(e);if(r.push(t),!0===n(t))break;o=e}return r},Un=e=>Mn(e).map(Vn).map(t=>Y(t,t=>!vn(e,t))).getOr([]),zn=e=>I.from(e.dom.previousSibling).map(un.fromDom),jn=e=>I.from(e.dom.nextSibling).map(un.fromDom),$n=e=>re(Sn(e,zn)),Hn=e=>Sn(e,jn),Vn=e=>V(e.dom.childNodes,un.fromDom),qn=(e,t)=>{const n=e.dom.childNodes;return I.from(n[t]).map(un.fromDom)},Wn=e=>qn(e,0),Kn=e=>qn(e,e.dom.childNodes.length-1),Yn=e=>e.dom.childNodes.length,Gn=e=>{const t=e.dom.head;if(null==t)throw new Error("Head is not available yet");return un.fromDom(t)},Xn=e=>Tn(e)&&C(e.dom.host),Qn=e=>un.fromDom(e.dom.getRootNode()),Zn=e=>Xn(e)?e:Gn(Pn(e)),Jn=e=>un.fromDom(e.dom.host),eo=e=>{if(C(e.target)){const t=un.fromDom(e.target);if(An(t)&&to(t)&&e.composed&&e.composedPath){const t=e.composedPath();if(t)return ce(t)}}return I.from(e.target)},to=e=>C(e.dom.shadowRoot),no=(e,t,n,o)=>((e,t,n,o,r)=>{const s=((e,t)=>n=>{e(n)&&t((e=>{const t=un.fromDom(eo(e).getOr(e.target)),n=()=>e.stopPropagation(),o=()=>e.preventDefault(),r=_(o,n);return((e,t,n,o,r,s,a)=>({target:e,x:t,y:n,stop:o,prevent:r,kill:s,raw:a}))(t,e.clientX,e.clientY,n,o,r,e)})(n))})(n,o);return e.dom.addEventListener(t,s,r),{unbind:D(oo,e,t,s,r)}})(e,t,n,o,!1),oo=(e,t,n,o)=>{e.dom.removeEventListener(t,n,o)},ro=M,so=(e,t,n)=>no(e,t,ro,n),ao=()=>un.fromDom(document),io=(e,t=!1)=>e.dom.focus({preventScroll:t}),lo=e=>{const t=Qn(e).dom;return e.dom===t.activeElement},co=(e=ao())=>I.from(e.dom.activeElement).map(un.fromDom),mo=(e,t)=>{Mn(e).each(n=>{n.dom.insertBefore(t.dom,e.dom)})},uo=(e,t)=>{jn(e).fold(()=>{Mn(e).each(e=>{go(e,t)})},e=>{mo(e,t)})},fo=(e,t)=>{Wn(e).fold(()=>{go(e,t)},n=>{e.dom.insertBefore(t.dom,n.dom)})},go=(e,t)=>{e.dom.appendChild(t.dom)},po=(e,t)=>{mo(e,t),go(t,e)},ho=(e,t)=>{q(t,(n,o)=>{const r=0===o?e:t[o-1];uo(r,n)})},bo=(e,t)=>{q(t,t=>{go(e,t)})},yo=(e,t,n)=>{if(!(u(n)||b(n)||S(n)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",n,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,n+"")},vo=(e,t,n)=>{yo(e.dom,t,n)},Co=(e,t)=>{const n=e.dom;he(t,(e,t)=>{yo(n,t,e)})},wo=(e,t)=>{const n=e.dom.getAttribute(t);return null===n?void 0:n},So=(e,t)=>I.from(wo(e,t)),Eo=(e,t)=>{const n=e.dom;return!(!n||!n.hasAttribute)&&n.hasAttribute(t)},xo=(e,t)=>{e.dom.removeAttribute(t)},_o=e=>{const t=e.dom.attributes;return null==t||0===t.length},ko=e=>X(e.dom.attributes,(e,t)=>(e[t.name]=t.value,e),{}),No=e=>{e.dom.textContent="",q(Vn(e),e=>{Ao(e)})},Ao=e=>{const t=e.dom;null!==t.parentNode&&t.parentNode.removeChild(t)},Ro=e=>{const t=Vn(e);t.length>0&&ho(e,t),Ao(e)},Do=(e,t)=>un.fromDom(e.dom.cloneNode(t)),To=e=>Do(e,!1),Oo=e=>Do(e,!0),Bo=(e,t)=>{const n=((e,t)=>{const n=un.fromTag(t),o=ko(e);return Co(n,o),n})(e,t);uo(e,n);const o=Vn(e);return bo(n,o),Ao(e),n},Po=e=>V(e,un.fromDom),Lo=e=>e.dom.innerHTML,Mo=(e,t)=>{const n=Bn(e).dom,o=un.fromDom(n.createDocumentFragment()),r=((e,t)=>{const n=(t||document).createElement("div");return n.innerHTML=e,Vn(un.fromDom(n))})(t,n);bo(o,r),No(e),go(e,o)},Io=e=>void 0!==e.style&&w(e.style.getPropertyValue),Fo=e=>{const t=Rn(e)?e.dom.parentNode:e.dom;if(null==t||null===t.ownerDocument)return!1;const n=t.ownerDocument;return(e=>{const t=Qn(e);return Xn(t)?I.some(t):I.none()})(un.fromDom(t)).fold(()=>n.body.contains(t),k(Fo,Jn))},Uo=(e,t,n)=>{if(!u(n))throw console.error("Invalid call to CSS.set. Property ",t,":: Value ",n,":: Element ",e),new Error("CSS value must be a string: "+n);Io(e)&&e.style.setProperty(t,n)},zo=(e,t,n)=>{const o=e.dom;Uo(o,t,n)},jo=(e,t)=>{const n=e.dom;he(t,(e,t)=>{Uo(n,t,e)})},$o=(e,t)=>{const n=e.dom,o=window.getComputedStyle(n).getPropertyValue(t);return""!==o||Fo(e)?o:Ho(n,t)},Ho=(e,t)=>Io(e)?e.style.getPropertyValue(t):"",Vo=(e,t)=>{const n=e.dom,o=Ho(n,t);return I.from(o).filter(e=>e.length>0)},qo=e=>{const t={},n=e.dom;if(Io(n))for(let e=0;e{((e,t)=>{Io(e)&&e.style.removeProperty(t)})(e.dom,t),ze(So(e,"style").map(et),"")&&xo(e,"style")},Ko=(e=>{const t=t=>{const n=(e=>{const t=e.dom;return Fo(e)?t.getBoundingClientRect().height:t.offsetHeight})(t);if(n<=0||null===n){const n=$o(t,e);return parseFloat(n)||0}return n},n=(e,t)=>X(t,(t,n)=>{const o=$o(e,n),r=void 0===o?0:parseInt(o,10);return isNaN(r)?t:t+r},0);return{set:(t,n)=>{if(!S(n)&&!n.match(/^[0-9]+$/))throw new Error(e+".set accepts only positive integer values. Value was "+n);const o=t.dom;Io(o)&&(o.style[e]=n+"px")},get:t,getOuter:t,aggregate:n,max:(e,t,o)=>{const r=n(e,o);return t>r?t-r:0}}})("height"),Yo=(e,t)=>({left:e,top:t,translate:(n,o)=>Yo(e+n,t+o)}),Go=Yo,Xo=(e,t)=>void 0!==e?e:void 0!==t?t:0,Qo=e=>{const t=e.dom,n=t.ownerDocument.body;return n===t?Go(n.offsetLeft,n.offsetTop):Fo(e)?(e=>{const t=e.getBoundingClientRect();return Go(t.left,t.top)})(t):Go(0,0)},Zo=e=>{const t=void 0!==e?e.dom:document,n=t.body.scrollLeft||t.documentElement.scrollLeft,o=t.body.scrollTop||t.documentElement.scrollTop;return Go(n,o)},Jo=(e,t,n)=>{const o=(void 0!==n?n.dom:document).defaultView;o&&o.scrollTo(e,t)},er=(e,t)=>{Xt().browser.isSafari()&&w(e.dom.scrollIntoViewIfNeeded)?e.dom.scrollIntoViewIfNeeded(!1):e.dom.scrollIntoView(t)},tr=(e,t)=>{const n=(t||document).createDocumentFragment();return q(e,e=>{n.appendChild(e.dom)}),un.fromDom(n)},nr=(e=>{const t=t=>e(t)?I.from(t.dom.nodeValue):I.none();return{get:n=>{if(!e(n))throw new Error("Can only get text value of a text node");return t(n).getOr("")},getOption:t,set:(t,n)=>{if(!e(t))throw new Error("Can only set raw text value of a text node");t.dom.nodeValue=n}}})(Rn),or=e=>nr.get(e),rr=(e,t)=>nr.set(e,t),sr=(e,t)=>{const n=wo(e,t);return void 0===n||""===n?[]:n.split(" ")};var ar=(e,t,n,o,r)=>e(n,o)?I.some(n):w(r)&&r(n)?I.none():t(n,o,r);const ir=(e,t,n)=>{let o=e.dom;const r=w(n)?n:L;for(;o.parentNode;){o=o.parentNode;const e=un.fromDom(o);if(t(e))return I.some(e);if(r(e))break}return I.none()},lr=(e,t,n)=>ar((e,t)=>t(e),ir,e,t,n),cr=(e,t)=>Z(e.dom.childNodes,e=>t(un.fromDom(e))).map(un.fromDom),dr=(e,t)=>{const n=e=>{for(let o=0;oir(e,e=>bn(e,t),n),ur=(e,t)=>((e,t)=>{const n=void 0===t?document:t.dom;return yn(n)?I.none():I.from(n.querySelector(e)).map(un.fromDom)})(t,e),fr=(e,t,n)=>ar((e,t)=>bn(e,t),mr,e,t,n),gr=e=>void 0!==e.dom.classList,pr=e=>sr(e,"class"),hr=(e,t)=>((e,t,n)=>{const o=sr(e,t).concat([n]);return vo(e,t,o.join(" ")),!0})(e,"class",t),br=(e,t)=>((e,t,n)=>{const o=Y(sr(e,t),e=>e!==n);return o.length>0?vo(e,t,o.join(" ")):xo(e,t),!1})(e,"class",t),yr=(e,t)=>{gr(e)?e.dom.classList.add(t):hr(e,t)},vr=e=>{0===(gr(e)?e.dom.classList:pr(e)).length&&xo(e,"class")},Cr=(e,t)=>{gr(e)?e.dom.classList.remove(t):br(e,t),vr(e)},wr=(e,t)=>gr(e)&&e.dom.classList.contains(t),Sr=(e,t=!1)=>{return Fo(e)?e.dom.isContentEditable:(n=e,fr(n,"[contenteditable]")).fold(N(t),e=>"true"===Er(e));var n},Er=e=>e.dom.contentEditable,xr=(e,t)=>{e.dom.contentEditable=t?"true":"false"},_r=(e,t,n)=>Y(Fn(e,n),t),kr=(e,t)=>Y(Vn(e),t),Nr=(e,t)=>{let n=[];return q(Vn(e),e=>{t(e)&&(n=n.concat([e])),n=n.concat(Nr(e,t))}),n},Ar=(e,t)=>((e,t)=>{const n=void 0===t?document:t.dom;return yn(n)?[]:V(n.querySelectorAll(e),un.fromDom)})(t,e),Rr=(e,t,n)=>ir(e,t,n).isSome(),Dr=(e,t)=>dr(e,t).isSome(),Tr=e=>w(e)?e:L,Or=(e,t,n)=>{const o=t(e),r=Tr(n);return o.orThunk(()=>r(e)?I.none():((e,t,n)=>{let o=e.dom;const r=Tr(n);for(;o.parentNode;){o=o.parentNode;const e=un.fromDom(o),n=t(e);if(n.isSome())return n;if(r(e))break}return I.none()})(e,t,r))},Br=["img","br"],Pr=e=>{return(t=e,nr.getOption(t)).filter(e=>0!==e.trim().length||e.indexOf(dt)>-1).isSome()||$(Br,En(e))||(e=>Nn(e)&&"false"===wo(e,"contenteditable"))(e);var t},Lr=(e,t,n,o)=>({start:e,soffset:t,finish:n,foffset:o}),Mr=Ne([{before:["element"]},{on:["element","offset"]},{after:["element"]}]),Ir={before:Mr.before,on:Mr.on,after:Mr.after,cata:(e,t,n,o)=>e.fold(t,n,o),getStart:e=>e.fold(A,A,A)},Fr=Ne([{domRange:["rng"]},{relative:["startSitu","finishSitu"]},{exact:["start","soffset","finish","foffset"]}]),Ur={domRange:Fr.domRange,relative:Fr.relative,exact:Fr.exact,exactFromRange:e=>Fr.exact(e.start,e.soffset,e.finish,e.foffset),getWin:e=>{const t=(e=>e.match({domRange:e=>un.fromDom(e.startContainer),relative:(e,t)=>Ir.getStart(e),exact:(e,t,n,o)=>e}))(e);return Ln(t)},range:Lr},zr=(e,t)=>{const n=En(e);return"input"===n?Ir.after(e):$(["br","img"],n)?0===t?Ir.before(e):Ir.after(e):Ir.on(e,t)},jr=(e,t)=>{const n=e.fold(Ir.before,zr,Ir.after),o=t.fold(Ir.before,zr,Ir.after);return Ur.relative(n,o)},$r=(e,t,n,o)=>{const r=zr(e,t),s=zr(n,o);return Ur.relative(r,s)},Hr=e=>{const t=Ur.getWin(e).dom,n=(e,n,o,r)=>gn(t,e,n,o,r),o=(e=>e.match({domRange:e=>{const t=un.fromDom(e.startContainer),n=un.fromDom(e.endContainer);return $r(t,e.startOffset,n,e.endOffset)},relative:jr,exact:$r}))(e);return((e,t)=>{const n=((e,t)=>t.match({domRange:e=>({ltr:N(e),rtl:I.none}),relative:(t,n)=>({ltr:lt(()=>fn(e,t,n)),rtl:lt(()=>I.some(fn(e,n,t)))}),exact:(t,n,o,r)=>({ltr:lt(()=>gn(e,t,n,o,r)),rtl:lt(()=>I.some(gn(e,o,r,t,n)))})}))(e,t);return((e,t)=>{const n=t.ltr();return n.collapsed?t.rtl().filter(e=>!1===e.collapsed).map(e=>pn.rtl(un.fromDom(e.endContainer),e.endOffset,un.fromDom(e.startContainer),e.startOffset)).getOrThunk(()=>hn(0,pn.ltr,n)):hn(0,pn.ltr,n)})(0,n)})(t,o).match({ltr:n,rtl:n})},Vr=(e,t,n)=>((e,t,n)=>((e,t,n)=>e.caretPositionFromPoint?((e,t,n)=>I.from(e.caretPositionFromPoint?.(t,n)).bind(t=>{if(null===t.offsetNode)return I.none();const n=e.createRange();return n.setStart(t.offsetNode,t.offset),n.collapse(),I.some(n)}))(e,t,n):e.caretRangeFromPoint?((e,t,n)=>I.from(e.caretRangeFromPoint?.(t,n)))(e,t,n):I.none())(e.document,t,n).map(e=>Lr(un.fromDom(e.startContainer),e.startOffset,un.fromDom(e.endContainer),e.endOffset)))(e,t,n),qr=(e,t,n,o)=>({x:e,y:t,width:n,height:o,right:e+n,bottom:t+o}),Wr=e=>{const t=void 0===e?window:e,n=t.document,o=Zo(un.fromDom(n));return(e=>{const t=void 0===e?window:e;return Xt().browser.isFirefox()?I.none():I.from(t.visualViewport)})(t).fold(()=>{const e=t.document.documentElement,n=e.clientWidth,r=e.clientHeight;return qr(o.left,o.top,n,r)},e=>qr(Math.max(e.pageLeft,o.left),Math.max(e.pageTop,o.top),e.width,e.height))};class Kr{rootNode;node;constructor(e,t){this.node=e,this.rootNode=t,this.current=this.current.bind(this),this.next=this.next.bind(this),this.prev=this.prev.bind(this),this.prev2=this.prev2.bind(this)}current(){return this.node}next(e){return this.node=this.findSibling(this.node,"firstChild","nextSibling",e),this.node}prev(e){return this.node=this.findSibling(this.node,"lastChild","previousSibling",e),this.node}prev2(e){return this.node=this.findPreviousNode(this.node,e),this.node}findSibling(e,t,n,o){if(e){if(!o&&e[t])return e[t];if(e!==this.rootNode){let t=e[n];if(t)return t;for(let o=e.parentNode;o&&o!==this.rootNode;o=o.parentNode)if(t=o[n],t)return t}}}findPreviousNode(e,t){if(e){const n=e.previousSibling;if(this.rootNode&&n===this.rootNode)return;if(n){if(!t)for(let e=n.lastChild;e;e=e.lastChild)if(!e.lastChild)return e;return n}const o=e.parentNode;if(o&&o!==this.rootNode)return o}}}const Yr=/^[ \t\r\n]*$/,Gr=e=>Yr.test(e),Xr=e=>"\n"===e||"\r"===e,Qr=(e,t=4,n=!0,o=!0)=>{const r=((e,t)=>t<=0?"":new Array(t+1).join(" "))(0,t),s=e.replace(/\t/g,r),a=X(s,(e,t)=>(e=>-1!==" \f\t\v".indexOf(e))(t)||t===dt?e.pcIsSpace||""===e.str&&n||e.str.length===s.length-1&&o||((e,t)=>t=0&&Xr(e[t]))(s,e.str.length+1)?{pcIsSpace:!1,str:e.str+dt}:{pcIsSpace:!0,str:e.str+" "}:{pcIsSpace:Xr(t),str:e.str+t},{pcIsSpace:!1,str:""});return a.str},Zr=e=>t=>!!t&&t.nodeType===e,Jr=e=>!!e&&!Object.getPrototypeOf(e),es=Zr(1),ts=e=>es(e)&&Nn(un.fromDom(e)),ns=e=>{const t=e.toLowerCase();return e=>C(e)&&e.nodeName.toLowerCase()===t},os=e=>{const t=e.map(e=>e.toLowerCase());return e=>{if(e&&e.nodeName){const n=e.nodeName.toLowerCase();return $(t,n)}return!1}},rs=(e,t)=>{const n=t.toLowerCase().split(" ");return t=>{if(es(t)){const o=t.ownerDocument.defaultView;if(o)for(let r=0;res(e)&&e.hasAttribute("data-mce-bogus"),as=e=>es(e)&&"TABLE"===e.tagName,is=e=>t=>{if(ts(t)){if(t.contentEditable===e)return!0;if(t.getAttribute("data-mce-contenteditable")===e)return!0}return!1},ls=os(["textarea","input"]),cs=Zr(3),ds=Zr(4),ms=Zr(7),us=Zr(8),fs=Zr(9),gs=Zr(11),ps=ns("br"),hs=ns("img"),bs=ns("a"),ys=is("true"),vs=is("false"),Cs=e=>ts(e)&&e.isContentEditable&&C(e.parentElement)&&!e.parentElement.isContentEditable,ws=os(["td","th"]),Ss=os(["td","th","caption"]),Es=ns("template"),xs=os(["video","audio","object","embed"]),_s=ns("li"),ks=ns("details"),Ns=ns("summary"),As="uc-video",Rs=ns(As),Ds={skipBogus:!0,includeZwsp:!1,checkRootAsContent:!1},Ts=e=>es(e)&&e.hasAttribute("data-mce-bookmark");const Os=(e,t,n,o)=>cs(e)&&!((e,t,n)=>Gr(e.data)&&!((e,t,n)=>{const o=un.fromDom(t),r=un.fromDom(e),s=n.getWhitespaceElements();return Rr(r,e=>_e(s,En(e)),D(vn,o))})(e,t,n))(e,t,n)&&(!o.includeZwsp||!(e=>{for(const t of e)if(!mt(t))return!1;return!0})(e.data)),Bs=(e,t,n,o)=>w(o.isContent)&&o.isContent(t)||((e,t)=>es(e)&&_e(t.getNonEmptyElements(),e.nodeName))(t,e)||Ts(t)||(e=>es(e)&&"A"===e.nodeName&&!e.hasAttribute("href")&&(e.hasAttribute("name")||e.hasAttribute("id")))(t)||Os(t,n,e,o)||vs(t)||ys(t)&&(e=>In(un.fromDom(e)).exists(e=>!Sr(e)))(t),Ps=(e,t,n)=>{const o={...Ds,...n};if(o.checkRootAsContent&&Bs(e,t,t,o))return!1;let r=t.firstChild,s=0;if(!r)return!0;const a=new Kr(r,t);do{if(o.skipBogus&&es(r)){const e=r.getAttribute("data-mce-bogus");if(e){r=a.next("all"===e);continue}}if(us(r))r=a.next(!0);else if(ps(r))s++,r=a.next();else{if(Bs(e,r,t,o))return!1;r=a.next()}}while(r);return s<=1},Ls=(e,t,n)=>Ps(e,t.dom,{checkRootAsContent:!0,...n}),Ms=(e,t,n)=>Bs(e,t,t,{includeZwsp:Ds.includeZwsp,...n}),Is=e=>{const t=e.toLowerCase();return"svg"===t?"svg":"math"===t?"math":"html"},Fs=e=>"html"!==Is(e),Us=e=>Fs(e.nodeName),zs=e=>Is(e.nodeName),js=["svg","math"],$s="data-mce-block",Hs=e=>V((e=>Y(ge(e),e=>!/[A-Z]/.test(e)))(e),e=>{const t=CSS.escape(e);return`${t}:`+V(js,e=>`not(${e} ${t})`).join(":")}).join(","),Vs=(e,t)=>C(t.querySelector(e))?(t.setAttribute($s,"true"),"inline-boundary"===t.getAttribute("data-mce-selected")&&t.removeAttribute("data-mce-selected"),!0):(t.removeAttribute($s),!1),qs=(e,t)=>{const n=Hs(e.getTransparentElements()),o=Hs(e.getBlockElements());return Y(t.querySelectorAll(n),e=>Vs(o,e))},Ws=(e,t,n)=>{const o=n?"lastChild":"firstChild";for(let n=t[o];n;n=n[o])if(Ps(e,n,{checkRootAsContent:!0}))return void n.parentNode?.removeChild(n)},Ks=(e,t)=>{const n=qs(e,t);((e,t,n)=>{const o=e.getBlockElements(),r=un.fromDom(t),s=e=>En(e)in o,a=e=>vn(e,r);q(Po(n),t=>{ir(t,s,a).each(n=>{const o=kr(t,t=>s(t)&&!e.isValidChild(En(n),En(t)));if(o.length>0){const t=In(n);q(o,t=>{ir(t,s,a).each(n=>{((e,t,n)=>{const o=document.createRange(),r=t.parentNode;if(r){o.setStartBefore(t),o.setEndBefore(n);const s=o.extractContents();Ws(e,s,!0),o.setStartAfter(n),o.setEndAfter(t);const a=o.extractContents();Ws(e,a,!1),Ps(e,s,{checkRootAsContent:!0})||r.insertBefore(s,t),Ps(e,n,{checkRootAsContent:!0})||r.insertBefore(n,t),Ps(e,a,{checkRootAsContent:!0})||r.insertBefore(a,t),r.removeChild(t)}})(e,n.dom,t.dom)})}),t.each(t=>qs(e,t.dom))}})})})(e,t,n),((e,t,n)=>{q([...n,...Zs(e,t)?[t]:[]],t=>q(Ar(un.fromDom(t),t.nodeName.toLowerCase()),t=>{Js(e,t.dom)&&Ro(t)}))})(e,t,n)},Ys=(e,t)=>{if(Qs(e,t)){const n=Hs(e.getBlockElements());Vs(n,t)}},Gs=e=>e.hasAttribute($s),Xs=(e,t)=>_e(e.getTransparentElements(),t),Qs=(e,t)=>es(t)&&Xs(e,t.nodeName),Zs=(e,t)=>Qs(e,t)&&Gs(t),Js=(e,t)=>Qs(e,t)&&!Gs(t),ea=(e,t)=>1===t.type&&Xs(e,t.name)&&u(t.attr($s)),ta=Xt().browser,na=e=>Z(e,An),oa=(e,t)=>e.children&&$(e.children,t),ra=(e,t={})=>{let n=0;const o={},r=un.fromDom(e),s=Pn(r),a=e=>{go(Zn(r),e)},i=e=>{const t=Zn(r);ur(t,"#"+e).each(Ao)},l=e=>xe(o,e).getOrThunk(()=>({id:"mce-u"+n++,passed:[],failed:[],count:0})),c=e=>new Promise((n,r)=>{let i;const c=dn._addCacheSuffix(e),d=l(c);o[c]=d,d.count++;const m=(e,t)=>{q(e,P),d.status=t,d.passed=[],d.failed=[],i&&(i.onload=null,i.onerror=null,i=null)},u=()=>m(d.passed,2),f=()=>m(d.failed,3);if(n&&d.passed.push(n),r&&d.failed.push(r),1===d.status)return;if(2===d.status)return void u();if(3===d.status)return void f();d.status=1;const g=un.fromTag("link",s.dom);Co(g,{rel:"stylesheet",type:"text/css",id:d.id});const p=((e,t)=>{const n=t.crossOrigin;return t.contentCssCors?"anonymous":w(n)?n(e):void 0})(e,t);void 0!==p&&vo(g,"crossOrigin",p),t.referrerPolicy&&vo(g,"referrerpolicy",t.referrerPolicy),i=g.dom,i.onload=u,i.onerror=f,a(g),vo(g,"href",c)}),d=e=>{const t=dn._addCacheSuffix(e);xe(o,t).each(e=>{0===--e.count&&(delete o[t],i(e.id))})};return{load:c,loadRawCss:(e,t)=>{const n=l(e);o[e]=n,n.count++;const r=un.fromTag("style",s.dom);Co(r,{rel:"stylesheet",type:"text/css",id:n.id,"data-mce-key":e}),r.dom.innerHTML=t,a(r)},loadAll:e=>Promise.allSettled(V(e,e=>c(e).then(N(e)))).then(e=>{const t=K(e,e=>"fulfilled"===e.status);return t.fail.length>0?Promise.reject(V(t.fail,e=>e.reason)):V(t.pass,e=>e.value)}),unload:d,unloadRawCss:e=>{xe(o,e).each(t=>{0===--t.count&&(delete o[e],i(t.id))})},unloadAll:e=>{q(e,e=>{d(e)})},_setReferrerPolicy:e=>{t.referrerPolicy=e},_setContentCssCors:e=>{t.contentCssCors=e},_setCrossOrigin:e=>{t.crossOrigin=e}}},sa=(()=>{const e=new WeakMap;return{forElement:(t,n)=>{const o=Qn(t).dom;return I.from(e.get(o)).getOrThunk(()=>{const t=ra(o,n);return e.set(o,t),t})}}})(),aa=(e,t)=>C(e)&&(Ms(t,e)||t.isInline(e.nodeName.toLowerCase())),ia=e=>(e=>"span"===e.nodeName.toLowerCase())(e)&&"bookmark"===e.getAttribute("data-mce-type"),la=(e,t,n,o)=>{const r=o||t;if(es(t)&&ia(t))return t;const s=t.childNodes;for(let t=s.length-1;t>=0;t--)la(e,s[t],n,r);if(es(t)){const e=t.childNodes;1===e.length&&ia(e[0])&&t.parentNode?.insertBefore(e[0],t)}return(e=>gs(e)||fs(e))(t)||Ms(n,t)||(e=>!!es(e)&&e.childNodes.length>0)(t)||((e,t,n)=>cs(e)&&e.data.length>0&&((e,t,n)=>{const o=new Kr(e,t).prev(!1),r=new Kr(e,t).next(!1),s=y(o)||aa(o,n),a=y(r)||aa(r,n);return s&&a})(e,t,n))(t,r,n)||e.remove(t),t},ca=dn.makeMap,da=/[&<>\"\u0060\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,ma=/[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,ua=/[<>&\"\']/g,fa=/&#([a-z0-9]+);?|&([a-z0-9]+);/gi,ga={128:"\u20ac",130:"\u201a",131:"\u0192",132:"\u201e",133:"\u2026",134:"\u2020",135:"\u2021",136:"\u02c6",137:"\u2030",138:"\u0160",139:"\u2039",140:"\u0152",142:"\u017d",145:"\u2018",146:"\u2019",147:"\u201c",148:"\u201d",149:"\u2022",150:"\u2013",151:"\u2014",152:"\u02dc",153:"\u2122",154:"\u0161",155:"\u203a",156:"\u0153",158:"\u017e",159:"\u0178"},pa={'"':""","'":"'","<":"<",">":">","&":"&","`":"`"},ha={"<":"<",">":">","&":"&",""":'"',"'":"'"},ba=(e,t)=>{const n={};if(e){const o=e.split(",");t=t||10;for(let e=0;ee.replace(t?da:ma,e=>pa[e]||e),Ca=(e,t)=>e.replace(t?da:ma,e=>e.length>1?"&#"+(1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536)+";":pa[e]||"&#"+e.charCodeAt(0)+";"),wa=(e,t,n)=>{const o=n||ya;return e.replace(t?da:ma,e=>pa[e]||o[e]||e)},Sa={encodeRaw:va,encodeAllRaw:e=>(""+e).replace(ua,e=>pa[e]||e),encodeNumeric:Ca,encodeNamed:wa,getEncodeFunc:(e,t)=>{const n=ba(t)||ya,o=ca(e.replace(/\+/g,","));return o.named&&o.numeric?(e,t)=>e.replace(t?da:ma,e=>void 0!==pa[e]?pa[e]:void 0!==n[e]?n[e]:e.length>1?"&#"+(1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536)+";":"&#"+e.charCodeAt(0)+";"):o.named?t?(e,t)=>wa(e,t,n):wa:o.numeric?Ca:va},decode:e=>e.replace(fa,(e,t)=>t?(t="x"===t.charAt(0).toLowerCase()?parseInt(t.substr(1),16):parseInt(t,10))>65535?(t-=65536,String.fromCharCode(55296+(t>>10),56320+(1023&t))):ga[t]||String.fromCharCode(t):ha[e]||ya[e]||(e=>{const t=un.fromTag("div").dom;return t.innerHTML=e,t.textContent||t.innerText||e})(e))},Ea=(e,t)=>(e=dn.trim(e))?e.split(t||" "):[],xa=e=>new RegExp("^"+e.replace(/([?+*])/g,".$1")+"$"),_a=e=>Object.freeze(["id","accesskey","class","dir","lang","style","tabindex","title","role",..."html4"!==e?["contenteditable","contextmenu","draggable","dropzone","hidden","spellcheck","translate","itemprop","itemscope","itemtype"]:[],..."html5-strict"!==e?["xml:lang"]:[]]),ka=e=>{let t,n;t="address blockquote div dl fieldset form h1 h2 h3 h4 h5 h6 hr menu ol p pre table ul",n="a abbr b bdo br button cite code del dfn em embed i iframe img input ins kbd label map noscript object q s samp script select small span strong sub sup textarea u var #text #comment","html4"!==e&&(t+=" article aside details dialog figure main header footer hgroup section nav a ins del canvas map",n+=" audio canvas command data datalist mark meter output picture progress template time wbr video ruby bdi keygen svg"),"html5-strict"!==e&&(n=[n,"acronym applet basefont big font strike tt"].join(" "),t=[t,"center dir isindex noframes"].join(" "));const o=[t,n].join(" ");return{blockContent:t,phrasingContent:n,flowContent:o}},Na=e=>{const{blockContent:t,phrasingContent:n,flowContent:o}=ka(e),r=e=>Object.freeze(e.split(" "));return Object.freeze({blockContent:r(t),phrasingContent:r(n),flowContent:r(o)})},Aa={html4:lt(()=>Na("html4")),html5:lt(()=>Na("html5")),"html5-strict":lt(()=>Na("html5-strict"))},Ra=(e,t)=>{const{blockContent:n,phrasingContent:o,flowContent:r}=Aa[e]();return"blocks"===t?I.some(n):"phrasing"===t?I.some(o):"flow"===t?I.some(r):I.none()},Da=e=>I.from(/^(@?)([A-Za-z0-9_\-.\u00b7\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u037d\u037f-\u1fff\u200c-\u200d\u203f-\u2040\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd]+)$/.exec(e)).map(e=>({preset:"@"===e[1],name:e[2]})),Ta={},Oa=dn.makeMap,Ba=dn.each,Pa=dn.extend,La=dn.explode,Ma=(e,t={})=>{const n=Oa(e," ",Oa(e.toUpperCase()," "));return Pa(n,t)},Ia=e=>Ma("td th li dt dd figcaption caption details summary",e.getTextBlockElements()),Fa=(e,t)=>{if(e){const n={};return u(e)&&(e={"*":e}),Ba(e,(e,o)=>{n[o]=n[o.toUpperCase()]="map"===t?Oa(e,/[, ]/):La(e,/[, ]/)}),n}},Ua=(e={})=>{const t={},n={};let o=[];const r={},s={},a={},i=(t,n,o)=>{const r=e[t];if(r)return Oa(r,/[, ]/,Oa(r.toUpperCase(),/[, ]/));{let e=Ta[t];return e||(e=Ma(n,o),Ta[t]=e),e}},l=e.schema??"html5",c=(e=>{const t=_a(e),{phrasingContent:n,flowContent:o}=ka(e),r={},s=(e,t,n)=>{r[e]={attributes:ae(t,N({})),attributesOrder:t,children:ae(n,N({}))}},a=(e,n="",o="")=>{const r=Ea(o),a=Ea(e);let i=a.length;const l=[...t,...Ea(n)];for(;i--;)s(a[i],l.slice(),r)},i=(e,t)=>{const n=Ea(e),o=Ea(t);let s=n.length;for(;s--;){const e=r[n[s]];for(let t=0,n=o.length;t{a(e,"",n)}),q(Ea("center dir isindex noframes"),e=>{a(e,"",o)})),a("html","manifest","head body"),a("head","","base command link meta noscript script style title"),a("title hr noscript br"),a("base","href target"),a("link","href rel media hreflang type sizes hreflang"),a("meta","name http-equiv content charset property"),a("style","media type scoped"),a("script","src async defer type charset"),a("body","onafterprint onbeforeprint onbeforeunload onblur onerror onfocus onhashchange onload onmessage onoffline ononline onpagehide onpageshow onpopstate onresize onscroll onstorage onunload",o),a("dd div","",o),a("address dt caption","","html4"===e?n:o),a("h1 h2 h3 h4 h5 h6 pre p abbr code var samp kbd sub sup i b u bdo span legend em strong small s cite dfn","",n),a("blockquote","cite",o),a("ol","reversed start type","li"),a("ul","","li"),a("li","value",o),a("dl","","dt dd"),a("a","href target rel media hreflang type","html4"===e?n:o),a("q","cite",n),a("ins del","cite datetime",o),a("img","src sizes srcset alt usemap ismap width height"),a("iframe","src name width height",o),a("embed","src type width height"),a("object","data type typemustmatch name usemap form width height",[o,"param"].join(" ")),a("param","name value"),a("map","name",[o,"area"].join(" ")),a("area","alt coords shape href target rel media hreflang type"),a("table","border","caption colgroup thead tfoot tbody tr"+("html4"===e?" col":"")),a("colgroup","span","col"),a("col","span"),a("tbody thead tfoot","","tr"),a("tr","","td th"),a("td","colspan rowspan headers",o),a("th","colspan rowspan headers scope abbr",o),a("form","accept-charset action autocomplete enctype method name novalidate target",o),a("fieldset","disabled form name",[o,"legend"].join(" ")),a("label","form for",n),a("input","accept alt autocomplete checked dirname disabled form formaction formenctype formmethod formnovalidate formtarget height list max maxlength min multiple name pattern readonly required size src step type value width"),a("button","disabled form formaction formenctype formmethod formnovalidate formtarget name type value","html4"===e?o:n),a("select","disabled form multiple name required size","option optgroup"),a("optgroup","disabled label","option"),a("option","disabled label selected value"),a("textarea","cols dirname disabled form maxlength name readonly required rows wrap"),a("menu","type label",[o,"li"].join(" ")),a("noscript","",o),"html4"!==e&&(a("wbr"),a("ruby","",[n,"rt rp"].join(" ")),a("figcaption","",o),a("mark rt rp bdi","",n),a("summary","",[n,"h1 h2 h3 h4 h5 h6"].join(" ")),a("canvas","width height",o),a("data","value",n),a("video","src crossorigin poster preload autoplay mediagroup loop controlslist disablepictureinpicture disableremoteplayback playsinline muted controls width height buffered",[o,"track source"].join(" ")),a("audio","src crossorigin preload autoplay mediagroup loop muted controls buffered volume",[o,"track source"].join(" ")),a("picture","","img source"),a("source","src srcset type media sizes"),a("track","kind src srclang label default"),a("datalist","",[n,"option"].join(" ")),a("article section nav aside main header footer","",o),a("hgroup","","h1 h2 h3 h4 h5 h6"),a("figure","",[o,"figcaption"].join(" ")),a("time","datetime",n),a("dialog","open",o),a("command","type label icon disabled checked radiogroup command"),a("output","for form name",n),a("progress","value max",n),a("meter","value min max low high optimum",n),a("details","open",[o,"summary"].join(" ")),a("keygen","autofocus challenge disabled form keytype name"),s("svg","id tabindex lang xml:space class style x y width height viewBox preserveAspectRatio zoomAndPan transform".split(" "),[])),"html5-strict"!==e&&(i("script","language xml:space"),i("style","xml:space"),i("object","declare classid code codebase codetype archive standby align border hspace vspace"),i("embed","align name hspace vspace"),i("param","valuetype type"),i("a","charset name rev shape coords"),i("br","clear"),i("applet","codebase archive code object alt name width height align hspace vspace"),i("img","name longdesc align border hspace vspace"),i("iframe","longdesc frameborder marginwidth marginheight scrolling align"),i("font basefont","size color face"),i("input","usemap align"),i("select"),i("textarea"),i("h1 h2 h3 h4 h5 h6 div p legend caption","align"),i("ul","type compact"),i("li","type"),i("ol dl menu dir","compact"),i("pre","width xml:space"),i("hr","align noshade size width"),i("isindex","prompt"),i("table","summary width frame rules cellspacing cellpadding align bgcolor"),i("col","width align char charoff valign"),i("colgroup","width align char charoff valign"),i("thead","align char charoff valign"),i("tr","align char charoff valign bgcolor"),i("th","axis align char charoff valign nowrap bgcolor width height"),i("form","accept"),i("td","abbr axis scope align char charoff valign nowrap bgcolor width height"),i("tfoot","align char charoff valign"),i("tbody","align char charoff valign"),i("area","nohref"),i("body","background bgcolor text link vlink alink")),"html4"!==e&&(i("input button select textarea","autofocus"),i("input textarea","placeholder"),i("a","download"),i("link script img","crossorigin"),i("img","loading"),i("iframe","sandbox seamless allow allowfullscreen loading referrerpolicy")),"html4"!==e&&q([r.video,r.audio],e=>{delete e.children.audio,delete e.children.video}),q(Ea("a form meter progress dfn"),e=>{r[e]&&delete r[e].children[e]}),delete r.caption.children.table,delete r.script,r})(l);!1===e.verify_html&&(e.valid_elements="*[*]");const d=Fa(e.valid_styles),m=Fa(e.invalid_styles,"map"),g=Fa(e.valid_classes,"map"),h=i("whitespace_elements","pre script noscript style textarea video audio iframe object code"),y=i("self_closing_elements","colgroup dd dt li option p td tfoot th thead tr"),v=i("void_elements","area base basefont br col frame hr img input isindex link meta param embed source wbr track"),C=i("boolean_attributes","checked compact declare defer disabled ismap multiple nohref noresize noshade nowrap readonly selected autoplay loop controls allowfullscreen"),w="td th iframe video audio object script code",S=i("non_empty_elements",w+" pre svg textarea summary",v),E=i("move_caret_before_on_enter_elements",w+" table",v),x="h1 h2 h3 h4 h5 h6",_=i("text_block_elements",x+" p div address pre form blockquote center dir fieldset header footer article section hgroup aside main nav figure"),k=i("block_elements","hr table tbody thead tfoot th tr td li ol ul caption dl dt dd noscript menu isindex option datalist select optgroup figcaption details summary html body multicol listing colgroup col",_),A=i("text_inline_elements","span strong b em i font s strike u var cite dfn code mark q sup sub samp"),R=i("transparent_elements","a ins del canvas map"),D=i("wrap_block_elements","pre "+x);Ba("script noscript iframe noframes noembed title style textarea xmp plaintext".split(" "),e=>{s[e]=new RegExp("]*>","gi")});const T=e=>{const n=I.from(t["@"]),r=/[*?+]/;q(((e,t)=>{const n=/^([#+\-])?([^\[!\/]+)(?:\/([^\[!]+))?(?:(!?)\[([^\]]+)])?$/;return ne(Ea(t,","),t=>{const o=n.exec(t);if(o){const t=o[1],n=o[2],r=o[3],s=o[4],a=o[5],i={attributes:{},attributesOrder:[]};if(e.each(e=>((e,t)=>{he(e.attributes,(e,n)=>{t.attributes[n]=e}),t.attributesOrder.push(...e.attributesOrder)})(e,i)),"#"===t?i.paddEmpty=!0:"-"===t&&(i.removeEmpty=!0),"!"===s&&(i.removeEmptyAttrs=!0),a&&((e,t)=>{const n=/^([!\-])?(\w+[\\:]:\w+|[^=~<]+)?(?:([=~<])(.*))?$/,o=/[*?+]/,{attributes:r,attributesOrder:s}=t;q(Ea(e,"|"),e=>{const a=n.exec(e);if(a){const e={},n=a[1],i=a[2].replace(/[\\:]:/g,":"),l=a[3],c=a[4];if("!"===n&&(t.attributesRequired=t.attributesRequired||[],t.attributesRequired.push(i),e.required=!0),"-"===n)return delete r[i],void s.splice(dn.inArray(s,i),1);if(l&&("="===l?(t.attributesDefault=t.attributesDefault||[],t.attributesDefault.push({name:i,value:c}),e.defaultValue=c):"~"===l?(t.attributesForced=t.attributesForced||[],t.attributesForced.push({name:i,value:c}),e.forcedValue=c):"<"===l&&(e.validValues=dn.makeMap(c,"?"))),o.test(i)){const n=e;t.attributePatterns=t.attributePatterns||[],n.pattern=xa(i),t.attributePatterns.push(n)}else r[i]||s.push(i),r[i]=e}})})(a,i),r&&(i.outputName=n),"@"===n){if(!e.isNone())return[];e=I.some(i)}return[r?{name:n,element:i,aliasName:r}:{name:n,element:i}]}return[]})})(n,e??""),({name:e,element:n,aliasName:s})=>{if(s&&(t[s]=n),r.test(e)){const t=n;t.pattern=xa(e),o.push(t)}else t[e]=n})},O=e=>{o=[],q(ge(t),e=>{delete t[e]}),T(e)},B=(e,o)=>{delete Ta.text_block_elements,delete Ta.block_elements;const s=!!o.extends&&!oe(o.extends),a=o.extends;if(n[e]=a?n[a]:{},r[e]=a??e,S[e.toUpperCase()]={},S[e]={},s||(k[e.toUpperCase()]={},k[e]={}),a&&!t[e]&&t[a]){const n=(e=>{const t=e=>p(e)?V(e,t):(e=>f(e)&&e.source&&"[object RegExp]"===Object.prototype.toString.call(e))(e)?new RegExp(e.source,e.flags):f(e)?be(e,t):e;return t(e)})(t[a]);delete n.removeEmptyAttrs,delete n.removeEmpty,t[e]=n}else t[e]={attributesOrder:[],attributes:{}};if(p(o.attributes)){const n=e=>{r.attributesOrder.push(e),r.attributes[e]={}},r=t[e]??{};delete r.attributesDefault,delete r.attributesForced,delete r.attributePatterns,delete r.attributesRequired,r.attributesOrder=[],r.attributes={},q(o.attributes,e=>{const t=_a(l);Da(e).each(({preset:e,name:o})=>{e?"global"===o&&q(t,n):n(o)})}),t[e]=r}if(b(o.padEmpty)){const n=t[e]??{};n.paddEmpty=o.padEmpty,t[e]=n}if(p(o.children)){const t={},r=e=>{t[e]={}},s=e=>{Ra(l,e).each(e=>{q(e,r)})};q(o.children,e=>{Da(e).each(({preset:e,name:t})=>{e?s(t):r(t)})}),n[e]=t}a&&he(n,(t,o)=>{t[a]&&(n[o]=t=Pa({},n[o]),t[e]=t[a])})},P=e=>{f(e)?he(e,(e,t)=>{const n=e.componentUrl;u(n)&&((e,t)=>{a[e]=t})(t,n),B(t,e)}):u(e)&&(e=>{q((e=>{const t=/^(~)?(.+)$/;return ne(Ea(e,","),e=>{const n=t.exec(e);return n?[{cloneName:"~"===n[1]?"span":"div",name:n[2]}]:[]})})(e??""),({name:e,cloneName:t})=>{B(e,{extends:t})})})(e)},L=e=>{q((e=>{const t=/^([+\-]?)([A-Za-z0-9_\-.\u00b7\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u037d\u037f-\u1fff\u200c-\u200d\u203f-\u2040\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd]+)\[([^\]]+)]$/;return ne(Ea(e,","),e=>{const n=t.exec(e);if(n){const e=n[1],t=e?(e=>"-"===e?"remove":"add")(e):"replace";return[{operation:t,name:n[2],validChildren:ne(Ea(n[3],"|"),e=>Da(e).toArray())}]}return[]})})(e??""),({operation:e,name:t,validChildren:o})=>{const r="replace"===e?{"#comment":{}}:n[t],s=t=>{"remove"===e?delete r[t]:r[t]={}};q(o,({preset:e,name:t})=>{e?(e=>{Ra(l,e).each(e=>{q(e,s)})})(t):s(t)}),n[t]=r})},M=e=>{const n=t[e];if(n)return n;let r=o.length;for(;r--;){const t=o[r];if(t.pattern.test(e))return t}},F=N(d),U=N(m),z=N(g),j=N(C),$=N(k),H=N(_),W=N(A),K=N(Object.seal(v)),Y=N(y),G=N(S),X=N(E),Q=N(h),Z=N(R),J=N(D),ee=N(Object.seal(s)),te=(e,t)=>{const n=M(e);if(n){if(!t)return!0;{if(n.attributes[t])return!0;const e=n.attributePatterns;if(e){let n=e.length;for(;n--;)if(e[n].pattern.test(t))return!0}}}return!1},oe=e=>_e($(),e),re=e=>!Qe(e,"#")&&te(e)&&!oe(e),se=N(r),ie=N(a);return e.valid_elements?(O(e.valid_elements),Ba(c,(e,t)=>{n[t]=e.children})):(Ba(c,(e,o)=>{t[o]={attributes:e.attributes,attributesOrder:e.attributesOrder},n[o]=e.children}),Ba(Ea("strong/b em/i"),e=>{const n=Ea(e,"/");t[n[1]].outputName=n[0]}),Ba(A,(n,o)=>{t[o]&&(e.padd_empty_block_inline_children&&(t[o].paddInEmptyBlock=!0),t[o].removeEmpty=!0)}),Ba(Ea("ol ul blockquote a table tbody"),e=>{t[e]&&(t[e].removeEmpty=!0)}),Ba(Ea("p h1 h2 h3 h4 h5 h6 th td pre div address caption li summary"),e=>{t[e]&&(t[e].paddEmpty=!0)}),Ba(Ea("span"),e=>{t[e].removeEmptyAttrs=!0})),delete t.svg,P(e.custom_elements),L(e.valid_children),T(e.extended_valid_elements),L("+ol[ul|ol],+ul[ul|ol]"),Ba({dd:"dl",dt:"dl",li:"ul ol",td:"tr",th:"tr",tr:"tbody thead tfoot",tbody:"table",thead:"table",tfoot:"table",legend:"fieldset",area:"map",param:"video audio object"},(e,n)=>{t[n]&&(t[n].parentsRequired=Ea(e))}),e.invalid_elements&&Ba(La(e.invalid_elements),e=>{t[e]&&delete t[e]}),M("span")||T("span[!data-mce-type|*]"),{type:l,children:n,elements:t,getValidStyles:F,getValidClasses:z,getBlockElements:$,getInvalidStyles:U,getVoidElements:K,getTextBlockElements:H,getTextInlineElements:W,getBoolAttrs:j,getElementRule:M,getSelfClosingElements:Y,getNonEmptyElements:G,getMoveCaretBeforeOnEnterElements:X,getWhitespaceElements:Q,getTransparentElements:Z,getSpecialElements:ee,getComponentUrls:ie,isValidChild:(e,t)=>{const o=n[e.toLowerCase()];return!(!o||!o[t.toLowerCase()])},isValid:te,isBlock:oe,isInline:re,isWrapper:e=>_e(J(),e)||re(e),getCustomElements:se,addValidElements:T,setValidElements:O,addCustomElements:P,addValidChildren:L}},za=e=>{const t=e.toString(16);return(1===t.length?"0"+t:t).toUpperCase()},ja=e=>(e=>{return{value:(t=e,Ge(t,"#").toUpperCase())};var t})(za(e.red)+za(e.green)+za(e.blue)),$a=/^\s*rgb\s*\(\s*(\d+)\s*[,\s]\s*(\d+)\s*[,\s]\s*(\d+)\s*\)\s*$/i,Ha=/^\s*rgba\s*\(\s*(\d+)\s*[,\s]\s*(\d+)\s*[,\s]\s*(\d+)\s*[,\s]\s*((?:\d?\.\d+|\d+)%?)\s*\)\s*$/i,Va=(e,t,n,o)=>((e,t,n,o)=>({red:e,green:t,blue:n,alpha:o}))(parseInt(e,10),parseInt(t,10),parseInt(n,10),parseFloat(o)),qa=e=>$a.test(e)?"rgb":Ha.test(e)?"rgba":"other",Wa=e=>{const t=$a.exec(e);if(null!==t)return I.some(Va(t[1],t[2],t[3],"1"));const n=Ha.exec(e);return null!==n?I.some(Va(n[1],n[2],n[3],n[4])):I.none()},Ka=e=>`rgba(${e.red},${e.green},${e.blue},${e.alpha})`,Ya=e=>Wa(e).map(ja).map(e=>"#"+e.value).getOr(e),Ga=(e={},t)=>{const n=/(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi,o=/\s*([^:]+):\s*([^;]+);?/g,r=/\s+$/,s={};let a,i;const l=ct;t&&(a=t.getValidStyles(),i=t.getInvalidStyles());const c="\\\" \\' \\; \\: ; : \ufeff".split(" ");for(let e=0;e{const a={};let i=!1;const c=e.url_converter,m=e.url_converter_scope||d,u=(e,t,n)=>{const o=a[e+"-top"+t];if(!o)return;const r=a[e+"-right"+t];if(!r)return;const s=a[e+"-bottom"+t];if(!s)return;const i=a[e+"-left"+t];if(!i)return;const l=[o,r,s,i];let c=l.length-1;for(;c--&&l[c]===l[c+1];);c>-1&&n||(a[e+t]=-1===c?l[0]:l.join(" "),delete a[e+"-top"+t],delete a[e+"-right"+t],delete a[e+"-bottom"+t],delete a[e+"-left"+t])},f=e=>{const t=a[e];if(!t)return;const n=t.indexOf(",")>-1?[t]:t.split(" ");let o=n.length;for(;o--;)if(n[o]!==n[0])return!1;return a[e]=n[0],!0},g=e=>(i=!0,s[e]),p=(e,t)=>(i&&(e=e.replace(/\uFEFF[0-9]/g,e=>s[e])),t||(e=e.replace(/\\([\'\";:])/g,"$1")),e),h=e=>String.fromCharCode(parseInt(e.slice(1),16)),b=e=>e.replace(/\\[0-9a-f]+/gi,h),y=(t,n,o,r,s,a)=>{if(s=s||a)return"'"+(s=p(s)).replace(/\'/g,"\\'")+"'";if(n=p(n||o||r||""),!e.allow_script_urls){const t=n.replace(/[\s\r\n]+/g,"");if(/(java|vb)script:/i.test(t))return"";if(!e.allow_svg_data_urls&&/^data:image\/svg/i.test(t))return""}return c&&(n=c.call(m,n,"style")),"url('"+n.replace(/\'/g,"\\'")+"')"};if(t){let s;for(t=(t=t.replace(/[\u0000-\u001F]/g,"")).replace(/\\[\"\';:\uFEFF]/g,g).replace(/\"[^\"]+\"|\'[^\']+\'/g,e=>e.replace(/[;:]/g,g));s=o.exec(t);){o.lastIndex=s.index+s[0].length;let t=s[1].replace(r,""),c=s[2].replace(r,"");if(t&&c){if(t=b(t),c=b(c),t.startsWith("--")||(t=t.toLowerCase()),-1!==t.indexOf(l)||-1!==t.indexOf('"'))continue;if(!e.allow_script_urls&&("behavior"===t||/expression\s*\(|\/\*|\*\//.test(c)))continue;"font-weight"===t&&"700"===c&&(c="bold"),"rgb"===qa(c)&&Wa(c).each(e=>{c=Ya(Ka(e)).toLowerCase()}),c=c.replace(n,y),a[t]=i?p(c,!0):c}}u("border","",!0),u("border","-width"),u("border","-color"),u("border","-style"),u("padding",""),u("margin",""),/(#.* rgb(a?)\(.*)|(rgb(a?)\(.*\) )/.test(a["border-color"])||(C="border-style",w="border-color",f(v="border-width")&&f(C)&&f(w)&&(a.border=a[v]+" "+a[C]+" "+a[w],delete a[v],delete a[C],delete a[w])),"medium none"===a.border&&delete a.border,"none"===a["border-image"]&&delete a["border-image"]}var v,C,w;return a},serialize:(e,t)=>{let n="";const o=(t,o)=>{const r=o[t];if(r)for(let t=0,o=r.length;t0?" ":"")+o+": "+s+";")}};return t&&a?(o("*",a),o(t,a)):he(e,(e,o)=>{e&&((e,t)=>{if(!i||!t)return!0;let n=i["*"];return!(n&&n[e]||(n=i[t],n&&n[e]))})(o,t)&&(n+=(n.length>0?" ":"")+o+": "+e+";")}),n}};return d},Xa={keyLocation:!0,layerX:!0,layerY:!0,returnValue:!0,webkitMovementX:!0,webkitMovementY:!0,keyIdentifier:!0,mozPressure:!0,mozInputSource:!0},Qa=(e,t)=>{const n=t??{};for(const t in e)_e(Xa,t)||(n[t]=e[t]);return C(e.composedPath)&&(n.composedPath=()=>e.composedPath()),C(e.getModifierState)&&(n.getModifierState=t=>e.getModifierState(t)),C(e.getTargetRanges)&&(n.getTargetRanges=()=>e.getTargetRanges()),n},Za=(e,t,n,o)=>{const r=Qa(t,o);return r.type=e,v(r.target)&&(r.target=r.srcElement??n),(e=>v(e.preventDefault)||(e=>e instanceof Event||w(e.initEvent))(e))(t)&&(r.preventDefault=()=>{r.defaultPrevented=!0,r.isDefaultPrevented=M,w(t.preventDefault)&&t.preventDefault()},r.stopPropagation=()=>{r.cancelBubble=!0,r.isPropagationStopped=M,w(t.stopPropagation)&&t.stopPropagation()},r.stopImmediatePropagation=()=>{r.isImmediatePropagationStopped=M,r.stopPropagation()},(e=>e.isDefaultPrevented===M||e.isDefaultPrevented===L)(r)||(r.isDefaultPrevented=!0===r.defaultPrevented?M:L,r.isPropagationStopped=!0===r.cancelBubble?M:L,r.isImmediatePropagationStopped=L)),r},Ja=/^(?:mouse|contextmenu)|click/,ei=(e,t,n,o)=>{e.addEventListener(t,n,o||!1)},ti=(e,t,n,o)=>{e.removeEventListener(t,n,o||!1)},ni=(e,t)=>{const n=Za(e.type,e,document,t);if((e=>C(e)&&Ja.test(e.type))(e)&&y(e.pageX)&&!y(e.clientX)){const t=n.target.ownerDocument||document,o=t.documentElement,r=t.body,s=n;s.pageX=e.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),s.pageY=e.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)}return n},oi=(e,t,n)=>{const o=e.document,r={type:"ready"};if(n.domLoaded)return void t(r);const s=()=>{ti(e,"DOMContentLoaded",s),ti(e,"load",s),n.domLoaded||(n.domLoaded=!0,t(r)),e=null};"complete"===o.readyState||"interactive"===o.readyState&&o.body?s():ei(e,"DOMContentLoaded",s),n.domLoaded||ei(e,"load",s)};class ri{static Event=new ri;domLoaded=!1;events={};expando;hasFocusIn;count=1;constructor(){this.expando="mce-data-"+(+new Date).toString(32),this.hasFocusIn="onfocusin"in document.documentElement,this.count=1}bind(e,t,n,o){const r=this;let s;const a=window,i=e=>{r.executeHandlers(ni(e||a.event),l)};if(!e||cs(e)||us(e))return n;let l;e[r.expando]?l=e[r.expando]:(l=r.count++,e[r.expando]=l,r.events[l]={}),o=o||e;const c=t.split(" ");let d=c.length;for(;d--;){let t=c[d],m=i,u=!1,f=!1;"DOMContentLoaded"===t&&(t="ready"),r.domLoaded&&"ready"===t&&"complete"===e.readyState?n.call(o,ni({type:t})):(r.hasFocusIn||"focusin"!==t&&"focusout"!==t||(u=!0,f="focusin"===t?"focus":"blur",m=e=>{const t=ni(e||a.event);t.type="focus"===t.type?"focusin":"focusout",r.executeHandlers(t,l)}),s=r.events[l][t],s?"ready"===t&&r.domLoaded?n(ni({type:t})):s.push({func:n,scope:o}):(r.events[l][t]=s=[{func:n,scope:o}],s.fakeName=f,s.capture=u,s.nativeHandler=m,"ready"===t?oi(e,m,r):ei(e,f||t,m,u)))}return e=s=null,n}unbind(e,t,n){if(!e||cs(e)||us(e))return this;const o=e[this.expando];if(o){let r=this.events[o];if(t){const o=t.split(" ");let s=o.length;for(;s--;){const t=o[s],a=r[t];if(a){if(n){let e=a.length;for(;e--;)if(a[e].func===n){const n=a.nativeHandler,o=a.fakeName,s=a.capture,i=a.slice(0,e).concat(a.slice(e+1));i.nativeHandler=n,i.fakeName=o,i.capture=s,r[t]=i}}n&&0!==a.length||(delete r[t],ti(e,a.fakeName||t,a.nativeHandler,a.capture))}}}else he(r,(t,n)=>{ti(e,t.fakeName||n,t.nativeHandler,t.capture)}),r={};for(const e in r)if(_e(r,e))return this;delete this.events[o];try{delete e[this.expando]}catch{e[this.expando]=null}}return this}fire(e,t,n){return this.dispatch(e,t,n)}dispatch(e,t,n){if(!e||cs(e)||us(e))return this;const o=ni({type:t,target:e},n);do{const t=e[this.expando];t&&this.executeHandlers(o,t),e=e.parentNode||e.ownerDocument||e.defaultView||e.parentWindow}while(e&&!o.isPropagationStopped());return this}clean(e){if(!e||cs(e)||us(e))return this;if(e[this.expando]&&this.unbind(e),e.getElementsByTagName||(e=e.document),e&&e.getElementsByTagName){this.unbind(e);const t=e.getElementsByTagName("*");let n=t.length;for(;n--;)(e=t[n])[this.expando]&&this.unbind(e)}return this}destroy(){this.events={}}cancel(e){return e&&(e.preventDefault(),e.stopImmediatePropagation()),!1}executeHandlers(e,t){const n=this.events[t],o=n&&n[e.type];if(o)for(let t=0,n=o.length;t{v(n)||""===n?xo(e,t):vo(e,t,n)},di=e=>e.replace(/[A-Z]/g,e=>"-"+e.toLowerCase()),mi=(e,t)=>{let n=0;if(e)for(let o=e.nodeType,r=e.previousSibling;r;r=r.previousSibling){const e=r.nodeType;(!t||!cs(r)||e!==o&&r.data.length)&&(n++,o=e)}return n},ui=(e,t)=>{const n=wo(t,"style"),o=e.serialize(e.parse(n),En(t));ci(t,ii,o)},fi=(e,t,n)=>{const o=di(t);v(n)||""===n?Wo(e,o):zo(e,o,((e,t)=>S(e)?_e(li,t)?e+"":e+"px":e)(n,o))},gi=(e,t={})=>{const n={},o=window,r={};let s=0;const a=sa.forElement(un.fromDom(e),{contentCssCors:t.contentCssCors,referrerPolicy:t.referrerPolicy,crossOrigin:e=>{const n=t.crossOrigin;return w(n)?n(e,"stylesheet"):void 0}}),i=[],l=t.schema?t.schema:Ua({}),c=Ga({url_converter:t.url_converter,url_converter_scope:t.url_converter_scope},t.schema),d=t.ownEvents?new ri:ri.Event,m=l.getBlockElements(),f=t=>t&&e&&u(t)?e.getElementById(t):t,h=e=>{const t=f(e);return C(t)?un.fromDom(t):null},b=(e,t,n="")=>{let o;const r=h(e);if(C(r)&&An(r)){const e=G[t];o=e&&e.get?e.get(r.dom,t):wo(r,t)}return C(o)?o:n},y=e=>{const t=f(e);return v(t)?[]:t.attributes},S=(e,n,o)=>{O(e,e=>{if(es(e)){const r=un.fromDom(e),s=""===o?null:o,a=wo(r,n),i=G[n];i&&i.set?i.set(r.dom,s,n):ci(r,n,s),a!==s&&t.onSetAttrib&&t.onSetAttrib({attrElm:r.dom,attrName:n,attrValue:s})}})},E=()=>t.root_element||e.body,_=(t,n)=>((e,t,n)=>{let o=0,r=0;const s=e.ownerDocument;if(n=n||e,t){if(n===e&&t.getBoundingClientRect&&"static"===$o(un.fromDom(e),"position")){const n=t.getBoundingClientRect();return o=n.left+(s.documentElement.scrollLeft||e.scrollLeft)-s.documentElement.clientLeft,r=n.top+(s.documentElement.scrollTop||e.scrollTop)-s.documentElement.clientTop,{x:o,y:r}}let a=t;for(;a&&a!==n&&a.nodeType&&!oa(a,n);){const e=a;o+=e.offsetLeft||0,r+=e.offsetTop||0,a=e.offsetParent}for(a=t.parentNode;a&&a!==n&&a.nodeType&&!oa(a,n);)o-=a.scrollLeft||0,r-=a.scrollTop||0,a=a.parentNode;r+=(e=>ta.isFirefox()&&"table"===En(e)?na(Vn(e)).filter(e=>"caption"===En(e)).bind(e=>na(Hn(e)).map(t=>{const n=t.dom.offsetTop,o=e.dom.offsetTop,r=e.dom.offsetHeight;return n<=o?-r:0})).getOr(0):0)(un.fromDom(t))}return{x:o,y:r}})(e.body,f(t),n),k=(e,t,n)=>{const o=f(e);var r;if(!v(o)&&(ts(o)||es(r=o)&&"http://www.w3.org/2000/svg"===r.namespaceURI))return n?$o(un.fromDom(o),di(t)):("float"===(t=t.replace(/-(\D)/g,(e,t)=>t.toUpperCase()))&&(t="cssFloat"),o.style?o.style[t]:void 0)},A=e=>{const t=f(e);if(!t)return{w:0,h:0};let n=k(t,"width"),o=k(t,"height");return n&&-1!==n.indexOf("px")||(n="0"),o&&-1!==o.indexOf("px")||(o="0"),{w:parseInt(n,10)||t.offsetWidth||t.clientWidth,h:parseInt(o,10)||t.offsetHeight||t.clientHeight}},R=(e,t)=>{if(!e)return!1;const n=p(e)?e:[e];return H(n,e=>bn(un.fromDom(e),t))},D=(e,t,n,o)=>{const r=[];let s=f(e);o=void 0===o;const a=n||("BODY"!==E().nodeName?E().parentNode:null);if(u(t))if("*"===t)t=es;else{const e=t;t=t=>R(t,e)}for(;s&&!(s===a||v(s.nodeType)||fs(s)||gs(s));){if(!t||t(s)){if(!o)return[s];r.push(s)}s=s.parentNode}return o?r:null},T=(e,t,n)=>{let o=t;if(e){u(t)&&(o=e=>R(e,t));for(let t=e[n];t;t=t[n])if(w(o)&&o(t))return t}return null},O=function(e,t,n){const o=n??this;if(p(e)){const n=[];return si(e,(e,r)=>{const s=f(e);s&&n.push(t.call(o,s,r))}),n}{const n=f(e);return!!n&&t.call(o,n)}},B=(e,t)=>{O(e,e=>{he(t,(t,n)=>{S(e,n,t)})})},P=(e,t)=>{O(e,e=>{const n=un.fromDom(e);Mo(n,t)})},L=(t,n,o,r,s)=>O(t,t=>{const a=u(n)?e.createElement(n):n;return C(o)&&B(a,o),r&&(!u(r)&&r.nodeType?a.appendChild(r):u(r)&&P(a,r)),s?a:t.appendChild(a)}),M=(t,n,o)=>L(e.createElement(t),t,n,o,!0),I=Sa.encodeAllRaw,F=(e,t)=>O(e,e=>{const n=un.fromDom(e);return t&&q(Vn(n),e=>{Rn(e)&&0===e.dom.length?Ao(e):mo(n,e)}),Ao(n),n.dom}),U=(e,t,n)=>{O(e,e=>{if(es(e)){const o=un.fromDom(e),r=t.split(" ");q(r,e=>{C(n)?(n?yr:Cr)(o,e):((e,t)=>{const n=gr(e)?e.dom.classList.toggle(t):((e,t)=>$(pr(e),t)?br(e,t):hr(e,t))(e,t);vr(e)})(o,e)})}})},z=(e,t,n)=>O(t,o=>{const r=p(t)?e.cloneNode(!0):e;return n&&si(ai(o.childNodes),e=>{r.appendChild(e)}),o.parentNode?.replaceChild(r,o),o}),j=()=>e.createRange(),V=(n,r,s,a)=>{if(p(n)){let e=n.length;const t=[];for(;e--;)t[e]=V(n[e],r,s,a);return t}return!t.collect||n!==e&&n!==o||i.push([n,r,s,a]),d.bind(n,r,s,a||Y)},W=(t,n,r)=>{if(p(t)){let e=t.length;const o=[];for(;e--;)o[e]=W(t[e],n,r);return o}if(i.length>0&&(t===e||t===o)){let e=i.length;for(;e--;){const[o,s,a]=i[e];t!==o||n&&n!==s||r&&r!==a||d.unbind(o,s,a)}}return d.unbind(t,n,r)},K=e=>{if(e&&ts(e)){const t=e.getAttribute("data-mce-contenteditable");return t&&"inherit"!==t?t:"inherit"!==e.contentEditable?e.contentEditable:null}return null},Y={doc:e,settings:t,win:o,files:r,stdMode:!0,boxModel:!0,styleSheetLoader:a,boundEvents:i,styles:c,schema:l,events:d,isBlock:e=>u(e)?_e(m,e):es(e)&&(_e(m,e.nodeName)||Zs(l,e)),root:null,clone:(e,t)=>e.cloneNode(t),getRoot:E,getViewPort:e=>{const t=Wr(e);return{x:t.x,y:t.y,w:t.width,h:t.height}},getRect:e=>{const t=f(e),n=_(t),o=A(t);return{x:n.x,y:n.y,w:o.w,h:o.h}},getSize:A,getParent:(e,t,n)=>{const o=D(e,t,n,!1);return o&&o.length>0?o[0]:null},getParents:D,get:f,getNext:(e,t)=>T(e,t,"nextSibling"),getPrev:(e,t)=>T(e,t,"previousSibling"),select:(n,o)=>{const r=f(o)??t.root_element??e;return w(r.querySelectorAll)?me(r.querySelectorAll(n)):[]},is:R,add:L,create:M,createHTML:(e,t,n="")=>{let o="<"+e;for(const e in t)ke(t,e)&&(o+=" "+e+'="'+I(t[e])+'"');return rt(n)&&_e(l.getVoidElements(),e)?o+" />":o+">"+n+""},createFragment:t=>{const n=e.createElement("div"),o=e.createDocumentFragment();let r;for(o.appendChild(n),t&&(n.innerHTML=t);r=n.firstChild;)o.appendChild(r);return o.removeChild(n),o},remove:F,setStyle:(e,n,o)=>{O(e,e=>{const r=un.fromDom(e);fi(r,n,o),t.update_styles&&ui(c,r)})},getStyle:k,setStyles:(e,n)=>{O(e,e=>{const o=un.fromDom(e);he(n,(e,t)=>{fi(o,t,e)}),t.update_styles&&ui(c,o)})},removeAllAttribs:e=>O(e,e=>{const t=e.attributes;for(let n=t.length-1;n>=0;n--)e.removeAttributeNode(t.item(n))}),setAttrib:S,setAttribs:B,getAttrib:b,getPos:_,parseStyle:e=>c.parse(e),serializeStyle:(e,t)=>c.serialize(e,t),addStyle:t=>{if(Y!==gi.DOM&&e===document){if(n[t])return;n[t]=!0}let o=e.getElementById("mceDefaultStyles");if(!o){o=e.createElement("style"),o.id="mceDefaultStyles",o.type="text/css";const t=e.head;t.firstChild?t.insertBefore(o,t.firstChild):t.appendChild(o)}o.styleSheet?o.styleSheet.cssText+=t:o.appendChild(e.createTextNode(t))},loadCSS:e=>{e||(e=""),q(e.split(","),e=>{r[e]=!0,a.load(e).catch(x)})},addClass:(e,t)=>{U(e,t,!0)},removeClass:(e,t)=>{U(e,t,!1)},hasClass:(e,t)=>{const n=h(e),o=t.split(" ");return C(n)&&oe(o,e=>wr(n,e))},toggleClass:U,show:e=>{O(e,e=>Wo(un.fromDom(e),"display"))},hide:e=>{O(e,e=>zo(un.fromDom(e),"display","none"))},isHidden:e=>{const t=h(e);return C(t)&&ze(Vo(t,"display"),"none")},uniqueId:e=>(e||"mce_")+s++,setHTML:P,getOuterHTML:e=>{const t=h(e);return C(t)?es(t.dom)?t.dom.outerHTML:(e=>{const t=un.fromTag("div"),n=un.fromDom(e.dom.cloneNode(!0));return go(t,n),Lo(t)})(t):""},setOuterHTML:(e,t)=>{O(e,e=>{es(e)&&(e.outerHTML=t)})},decode:Sa.decode,encode:I,insertAfter:(e,t)=>{const n=f(t);return O(e,e=>{const t=n?.parentNode,o=n?.nextSibling;return t&&(o?t.insertBefore(e,o):t.appendChild(e)),e})},replace:z,rename:(e,t)=>{if(e.nodeName!==t.toUpperCase()){const n=M(t);return si(y(e),t=>{S(n,t.nodeName,b(e,t.nodeName))}),z(n,e,!0),n}return e},findCommonAncestor:(e,t)=>{let n=e;for(;n;){let e=t;for(;e&&n!==e;)e=e.parentNode;if(n===e)break;n=n.parentNode}return!n&&e.ownerDocument?e.ownerDocument.documentElement:n},run:O,getAttribs:y,isEmpty:(e,t,n)=>{if(g(t)){const o=e=>{const n=e.nodeName.toLowerCase();return Boolean(t[n])};return Ps(l,e,{...n,isContent:o})}return Ps(l,e,n)},createRng:j,nodeIndex:mi,split:(e,t,n)=>{let o,r,s=j();if(e&&t&&e.parentNode&&t.parentNode){const a=e.parentNode;return s.setStart(a,mi(e)),s.setEnd(t.parentNode,mi(t)),o=s.extractContents(),s=j(),s.setStart(t.parentNode,mi(t)+1),s.setEnd(a,mi(e)+1),r=s.extractContents(),a.insertBefore(la(Y,o,l),e),n?a.insertBefore(n,e):a.insertBefore(t,e),a.insertBefore(la(Y,r,l),e),F(e),n||t}},bind:V,unbind:W,fire:(e,t,n)=>d.dispatch(e,t,n),dispatch:(e,t,n)=>d.dispatch(e,t,n),getContentEditable:K,getContentEditableParent:e=>{const t=E();let n=null;for(let o=e;o&&o!==t&&(n=K(o),null===n);o=o.parentNode);return n},isEditable:e=>{if(C(e)){const t=es(e)?e:e.parentElement;return C(t)&&ts(t)&&Sr(un.fromDom(t))}return!1},destroy:()=>{if(i.length>0){let e=i.length;for(;e--;){const[t,n,o]=i[e];d.unbind(t,n,o)}}he(r,(e,t)=>{a.unload(t),delete r[t]})},isChildOf:(e,t)=>e===t||t.contains(e),dumpRng:e=>"startContainer: "+e.startContainer.nodeName+", startOffset: "+e.startOffset+", endContainer: "+e.endContainer.nodeName+", endOffset: "+e.endOffset},G=((e,t,n)=>{const o=t.keep_values,r={set:(e,o,r)=>{const s=un.fromDom(e);w(t.url_converter)&&C(o)&&(o=t.url_converter.call(t.url_converter_scope||n(),String(o),r,e)),ci(s,"data-mce-"+r,o),ci(s,r,o)},get:(e,t)=>{const n=un.fromDom(e);return wo(n,"data-mce-"+t)||wo(n,t)}},s={style:{set:(t,n)=>{const r=un.fromDom(t);o&&ci(r,ii,n),xo(r,"style"),u(n)&&jo(r,e.parse(n))},get:t=>{const n=un.fromDom(t),o=wo(n,ii)||wo(n,"style");return e.serialize(e.parse(o),En(n))}}};return o&&(s.href=s.src=r),s})(c,t,N(Y));return Y};gi.DOM=gi(document),gi.nodeIndex=mi;const pi=gi.DOM;class hi{static ScriptLoader=new hi;settings;states={};queue=[];scriptLoadedCallbacks={};queueLoadedCallbacks=[];loading=!1;constructor(e={}){this.settings=e}_setReferrerPolicy(e){this.settings.referrerPolicy=e}_setCrossOrigin(e){this.settings.crossOrigin=e}loadScript(e){return new Promise((t,n)=>{const o=pi,r=document;let s;const a=()=>{o.remove(i),s&&(s.onerror=s.onload=s=null)},i=o.uniqueId();s=r.createElement("script"),s.id=i,s.type="text/javascript",s.src=dn._addCacheSuffix(e),this.settings.referrerPolicy&&o.setAttrib(s,"referrerpolicy",this.settings.referrerPolicy);const l=this.settings.crossOrigin;if(w(l)){const t=l(e);void 0!==t&&o.setAttrib(s,"crossorigin",t)}s.onload=()=>{a(),t()},s.onerror=()=>{a(),n("Failed to load script: "+e)},(r.head||r.body).appendChild(s)})}isDone(e){return 2===this.states[e]}markDone(e){this.states[e]=2}add(e){const t=this;return t.queue.push(e),void 0===t.states[e]&&(t.states[e]=0),new Promise((n,o)=>{t.scriptLoadedCallbacks[e]||(t.scriptLoadedCallbacks[e]=[]),t.scriptLoadedCallbacks[e].push({resolve:n,reject:o})})}load(e){return this.add(e)}remove(e){delete this.states[e],delete this.scriptLoadedCallbacks[e]}loadQueue(){const e=this.queue;return this.queue=[],this.loadScripts(e)}loadScripts(e){const t=this,n=(e,n)=>{xe(t.scriptLoadedCallbacks,n).each(t=>{q(t,t=>t[e](n))}),delete t.scriptLoadedCallbacks[n]},o=e=>{const t=Y(e,e=>"rejected"===e.status);return t.length>0?Promise.reject(ne(t,({reason:e})=>p(e)?e:[e])):Promise.resolve()},r=e=>Promise.allSettled(V(e,e=>2===t.states[e]?(n("resolve",e),Promise.resolve()):3===t.states[e]?(n("reject",e),Promise.reject(e)):(t.states[e]=1,t.loadScript(e).then(()=>{t.states[e]=2,n("resolve",e);const s=t.queue;return s.length>0?(t.queue=[],r(s).then(o)):Promise.resolve()},()=>(t.states[e]=3,n("reject",e),Promise.reject(e)))))),s=e=>(t.loading=!0,r(e).then(e=>{t.loading=!1;const n=t.queueLoadedCallbacks.shift();return I.from(n).each(P),o(e)})),a=ut(e);return t.loading?new Promise((e,n)=>{t.queueLoadedCallbacks.push(()=>{s(a).then(e,n)})}):s(a)}getScriptAttributes(e){const t={};this.settings.referrerPolicy&&(t.referrerpolicy=this.settings.referrerPolicy);const n=this.settings.crossOrigin;if(w(n)){const o=n(e);u(o)&&(t.crossorigin=o)}return t}}const bi={},yi=Ae("en"),vi=()=>xe(bi,yi.get()),Ci={getData:()=>be(bi,e=>({...e})),setCode:e=>{e&&yi.set(e)},getCode:()=>yi.get(),add:(e,t)=>{let n=bi[e];n||(bi[e]=n={});const o=V(ge(t),e=>e.toLowerCase());he(t,(e,r)=>{const s=r.toLowerCase();s!==r&&((e,t)=>{const n=e.indexOf(t);return-1!==n&&e.indexOf(t,n+1)>n})(o,s)?(_e(t,s)||(n[s]=e),n[r]=e):n[s]=e})},translate:e=>{const t=vi().getOr({}),n=e=>w(e)?Object.prototype.toString.call(e):o(e)?"":""+e,o=e=>""===e||null==e,r=e=>{const o=n(e);return _e(t,o)?n(t[o]):xe(t,o.toLowerCase()).map(n).getOr(o)},s=e=>e.replace(/{context:\w+}$/,""),a=e=>e.replaceAll("...","\u2026");if(o(e))return"";if(f(i=e)&&_e(i,"raw"))return a(n(e.raw));var i;if((e=>p(e)&&e.length>1)(e)){const t=e.slice(1);return a(s(r(e[0]).replace(/\{([0-9]+)\}/g,(e,o)=>_e(t,o)?n(t[o]):e)))}return a(s(r(e)))},isRtl:()=>vi().bind(e=>xe(e,"_dir")).exists(e=>"rtl"===e),hasCode:e=>_e(bi,e)},wi=()=>{const e=[],t={},n={},o=[],r=(e,t)=>{const n=Y(o,n=>n.name===e&&n.state===t);q(n,e=>e.resolve())},s=e=>_e(t,e),a=(e,n)=>{const o=Ci.getCode();!o||n&&-1===(","+(n||"")+",").indexOf(","+o+",")||hi.ScriptLoader.add(t[e]+"/langs/"+o+".js")},i=(e,t="added")=>"added"===t&&(e=>_e(n,e))(e)||"loaded"===t&&s(e)?Promise.resolve():new Promise(n=>{o.push({name:e,state:t,resolve:n})});return{items:e,urls:t,lookup:n,get:e=>{if(n[e])return n[e].instance},requireLangPack:(e,t)=>{!1!==wi.languageLoad&&(s(e)?a(e,t):i(e,"loaded").then(()=>a(e,t)))},add:(t,o)=>(e.push(o),n[t]={instance:o},r(t,"added"),o),remove:e=>{delete t[e],delete n[e]},createUrl:(e,t)=>u(t)?u(e)?{prefix:"",resource:t,suffix:""}:{prefix:e.prefix,resource:t,suffix:e.suffix}:t,load:(e,o)=>{if(t[e])return Promise.resolve();let s=u(o)?o:o.prefix+o.resource+o.suffix;0!==s.indexOf("/")&&-1===s.indexOf("://")&&(s=wi.baseURL+"/"+s),t[e]=s.substring(0,s.lastIndexOf("/"));const a=()=>(r(e,"loaded"),Promise.resolve());return n[e]?a():hi.ScriptLoader.add(s).then(a)},waitFor:i}};wi.languageLoad=!0,wi.baseURL="",wi.PluginManager=wi(),wi.ThemeManager=wi(),wi.ModelManager=wi();const Si=N("mce-annotation"),Ei=N("data-mce-annotation"),xi=N("data-mce-annotation-uid"),_i=N("data-mce-annotation-active"),ki=N("data-mce-annotation-classes"),Ni=N("data-mce-annotation-attrs"),Ai=e=>t=>vn(t,e),Ri=(e,t)=>{const n=e.selection.getRng(),o=un.fromDom(n.startContainer),r=un.fromDom(e.getBody()),s=t.fold(()=>"."+Si(),e=>`[${Ei()}="${e}"]`),a=qn(o,n.startOffset).getOr(o);return fr(a,s,Ai(r)).bind(t=>So(t,`${xi()}`).bind(n=>So(t,`${Ei()}`).map(t=>{const o=Ti(e,n);return{uid:n,name:t,elements:o}})))},Di=(e,t)=>Eo(e,"data-mce-bogus")||((e,t,n)=>mr(e,'[data-mce-bogus="all"]',n).isSome())(e,0,Ai(t)),Ti=(e,t)=>{const n=un.fromDom(e.getBody()),o=Ar(n,`[${xi()}="${t}"]`);return Y(o,e=>!Di(e,n))},Oi=(e,t)=>{const n=un.fromDom(e.getBody()),o=Ar(n,`[${Ei()}="${t}"]`),r={};return q(o,e=>{if(!Di(e,n)){const t=wo(e,xi()),n=xe(r,t).getOr([]);r[t]=n.concat([e])}}),r},Bi=(e,t,n=L)=>{const o=new Kr(e,t),r=e=>{let t;do{t=o[e]()}while(t&&!cs(t)&&!n(t));return I.from(t).filter(cs)};return{current:()=>I.from(o.current()).filter(cs),next:()=>r("next"),prev:()=>r("prev"),prev2:()=>r("prev2")}},Pi=(e,t)=>{const n=t||(t=>e.isBlock(t)||ps(t)||vs(t)),o=(e,t,n,r)=>{if(cs(e)){const n=r(e,t,e.data);if(-1!==n)return I.some({container:e,offset:n})}return n().bind(e=>o(e.container,e.offset,n,r))};return{backwards:(t,r,s,a)=>{const i=Bi(t,a??e.getRoot(),n);return o(t,r,()=>i.prev().map(e=>({container:e,offset:e.length})),s).getOrNull()},forwards:(t,r,s,a)=>{const i=Bi(t,a??e.getRoot(),n);return o(t,r,()=>i.next().map(e=>({container:e,offset:0})),s).getOrNull()}}},Li=e=>{let t;return n=>(t=t||ae(e,M),_e(t,En(n)))},Mi=e=>An(e)&&"br"===En(e),Ii=e=>An(e)&&"script"===En(e),Fi=e=>An(e)&&"style"===En(e),Ui=Li(["h1","h2","h3","h4","h5","h6","p","div","address","pre","form","blockquote","center","dir","fieldset","header","footer","article","section","hgroup","aside","nav","figure"]),zi=Li(["ul","ol","dl"]),ji=Li(["li","dd","dt"]),$i=Li(["thead","tbody","tfoot"]),Hi=Li(["td","th"]),Vi=Li(["pre","script","textarea","style"]),qi=()=>{const e=un.fromTag("br");return vo(e,"data-mce-bogus","1"),e},Wi=e=>{No(e),go(e,qi())},Ki=ct,Yi=mt,Gi=e=>e.replace(/\uFEFF/g,""),Xi=es,Qi=cs,Zi=e=>(Qi(e)&&(e=e.parentNode),Xi(e)&&e.hasAttribute("data-mce-caret")),Ji=e=>Qi(e)&&Yi(e.data),el=e=>Zi(e)||Ji(e),tl=e=>e.firstChild!==e.lastChild||!ps(e.firstChild),nl=e=>{const t=e.container();return!!cs(t)&&(t.data.charAt(e.offset())===Ki||e.isAtStart()&&Ji(t.previousSibling))},ol=e=>{const t=e.container();return!!cs(t)&&(t.data.charAt(e.offset()-1)===Ki||e.isAtEnd()&&Ji(t.nextSibling))},rl=e=>Qi(e)&&e.data[0]===Ki,sl=e=>Qi(e)&&e.data[e.data.length-1]===Ki,al=e=>e&&e.hasAttribute("data-mce-caret")?((e=>{const t=e.getElementsByTagName("br"),n=t[t.length-1];ss(n)&&n.parentNode?.removeChild(n)})(e),e.removeAttribute("data-mce-caret"),e.removeAttribute("data-mce-bogus"),e.removeAttribute("style"),e.removeAttribute("data-mce-style"),e.removeAttribute("_moz_abspos"),e):null,il=e=>Zi(e.startContainer),ll=Math.round,cl=e=>e?{left:ll(e.left),top:ll(e.top),bottom:ll(e.bottom),right:ll(e.right),width:ll(e.width),height:ll(e.height)}:{left:0,top:0,bottom:0,right:0,width:0,height:0},dl=(e,t)=>(e=cl(e),t||(e.left=e.left+e.width),e.right=e.left,e.width=0,e),ml=(e,t,n)=>e>=0&&e<=Math.min(t.height,n.height)/2,ul=(e,t)=>{const n=Math.min(t.height/2,e.height/2);return e.bottom-nt.bottom)&&ml(t.top-e.bottom,e,t)},fl=(e,t)=>e.top>t.bottom||!(e.bottom{const o=Math.max(Math.min(t,e.left+e.width),e.left),r=Math.max(Math.min(n,e.top+e.height),e.top);return Math.sqrt((t-o)*(t-o)+(n-r)*(n-r))},pl=e=>{const t=e.startContainer,n=e.startOffset;return t===e.endContainer&&t.hasChildNodes()&&e.endOffset===n+1?t.childNodes[n]:null},hl=(e,t)=>{if(es(e)&&e.hasChildNodes()){const n=e.childNodes,o=((e,t,n)=>Math.min(Math.max(e,0),n))(t,0,n.length-1);return n[o]}return e},bl=new RegExp("[\u0300-\u036f\u0483-\u0487\u0488-\u0489\u0591-\u05bd\u05bf\u05c1-\u05c2\u05c4-\u05c5\u05c7\u0610-\u061a\u064b-\u065f\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7-\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08e3-\u0902\u093a\u093c\u0941-\u0948\u094d\u0951-\u0957\u0962-\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2-\u09e3\u0a01-\u0a02\u0a3c\u0a41-\u0a42\u0a47-\u0a48\u0a4b-\u0a4d\u0a51\u0a70-\u0a71\u0a75\u0a81-\u0a82\u0abc\u0ac1-\u0ac5\u0ac7-\u0ac8\u0acd\u0ae2-\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62-\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c00\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55-\u0c56\u0c62-\u0c63\u0c81\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc-\u0ccd\u0cd5-\u0cd6\u0ce2-\u0ce3\u0d01\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62-\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb-\u0ebc\u0ec8-\u0ecd\u0f18-\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86-\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039-\u103a\u103d-\u103e\u1058-\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085-\u1086\u108d\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752-\u1753\u1772-\u1773\u17b4-\u17b5\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927-\u1928\u1932\u1939-\u193b\u1a17-\u1a18\u1a1b\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1ab0-\u1abd\u1abe\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80-\u1b81\u1ba2-\u1ba5\u1ba8-\u1ba9\u1bab-\u1bad\u1be6\u1be8-\u1be9\u1bed\u1bef-\u1bf1\u1c2c-\u1c33\u1c36-\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8-\u1cf9\u1dc0-\u1df5\u1dfc-\u1dff\u200c-\u200d\u20d0-\u20dc\u20dd-\u20e0\u20e1\u20e2-\u20e4\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302d\u302e-\u302f\u3099-\u309a\ua66f\ua670-\ua672\ua674-\ua67d\ua69e-\ua69f\ua6f0-\ua6f1\ua802\ua806\ua80b\ua825-\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\ua9e5\uaa29-\uaa2e\uaa31-\uaa32\uaa35-\uaa36\uaa43\uaa4c\uaa7c\uaab0\uaab2-\uaab4\uaab7-\uaab8\uaabe-\uaabf\uaac1\uaaec-\uaaed\uaaf6\uabe5\uabe8\uabed\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\uff9e-\uff9f]"),yl=e=>u(e)&&e.charCodeAt(0)>=768&&bl.test(e),vl=ys,Cl=vs,wl=ps,Sl=cs,El=os(["script","style","textarea"]),xl=os(["img","input","textarea","hr","iframe","video","audio","object","embed"]),_l=os(["table"]),kl=el,Nl=e=>!kl(e)&&(Sl(e)?!El(e.parentNode):xl(e)||wl(e)||_l(e)||Al(e)),Al=e=>!(e=>es(e)&&"true"===e.getAttribute("unselectable"))(e)&&Cl(e),Rl=(e,t)=>Nl(e)&&((e,t)=>{for(let n=e.parentNode;n&&n!==t;n=n.parentNode){if(Al(n))return!1;if(vl(n))return!0}return!0})(e,t),Dl=es,Tl=Nl,Ol=rs("display","block table"),Bl=rs("float","left right"),Pl=((...e)=>t=>{for(let n=0;nt<0&&es(e)&&e.hasChildNodes()?void 0:hl(e,t),zl=e=>e?e.createRange():gi.DOM.createRng(),jl=e=>u(e)&&/[\r\n\t ]/.test(e),$l=e=>!!e.setStart&&!!e.setEnd,Hl=e=>{const t=e.startContainer,n=e.startOffset;if(jl(e.toString())&&Ll(t.parentNode)&&cs(t)){const e=t.data;if(jl(e[n-1])||jl(e[n+1]))return!0}return!1},Vl=e=>0===e.left&&0===e.right&&0===e.top&&0===e.bottom,ql=e=>{let t;const n=e.getClientRects();return t=n.length>0?cl(n[0]):cl(e.getBoundingClientRect()),!$l(e)&&Il(e)&&Vl(t)?(e=>{const t=e.ownerDocument,n=zl(t),o=t.createTextNode(dt),r=e.parentNode;r.insertBefore(o,e),n.setStart(o,0),n.setEnd(o,1);const s=cl(n.getBoundingClientRect());return r.removeChild(o),s})(e):Vl(t)&&$l(e)?(e=>{const t=e.startContainer,n=e.endContainer,o=e.startOffset,r=e.endOffset;if(t===n&&cs(n)&&0===o&&1===r){const t=e.cloneRange();return t.setEndAfter(n),ql(t)}return null})(e)??t:t},Wl=(e,t)=>{const n=dl(e,t);return n.width=1,n.right=n.left+1,n},Kl=(e,t,n)=>{const o=()=>(n||(n=(e=>{const t=[],n=e=>{var n,o;0!==e.height&&(t.length>0&&(n=e,o=t[t.length-1],n.left===o.left&&n.top===o.top&&n.bottom===o.bottom&&n.right===o.right)||t.push(e))},o=(e,t)=>{const o=zl(e.ownerDocument);if(t0&&(o.setStart(e,t-1),o.setEnd(e,t),Hl(o)||n(Wl(ql(o),!1))),t{const n=zl(e.ownerDocument);return n.setStart(e,t),n.setEnd(e,t),n},getClientRects:o,isVisible:()=>o().length>0,isAtStart:()=>(Ml(e),0===t),isAtEnd:()=>Ml(e)?t>=e.data.length:t>=e.childNodes.length,isEqual:n=>n&&e===n.container()&&t===n.offset(),getNode:n=>Ul(e,n?t-1:t)}};Kl.fromRangeStart=e=>Kl(e.startContainer,e.startOffset),Kl.fromRangeEnd=e=>Kl(e.endContainer,e.endOffset),Kl.after=e=>Kl(e.parentNode,Fl(e)+1),Kl.before=e=>Kl(e.parentNode,Fl(e)),Kl.isAbove=(e,t)=>$e(ce(t.getClientRects()),de(e.getClientRects()),ul).getOr(!1),Kl.isBelow=(e,t)=>$e(de(t.getClientRects()),ce(e.getClientRects()),fl).getOr(!1),Kl.isAtStart=e=>!!e&&e.isAtStart(),Kl.isAtEnd=e=>!!e&&e.isAtEnd(),Kl.isTextPosition=e=>!!e&&cs(e.container()),Kl.isElementPosition=e=>!Kl.isTextPosition(e);const Yl=(e,t)=>{cs(t)&&0===t.data.length&&e.remove(t)},Gl=(e,t,n)=>{gs(n)?((e,t,n)=>{const o=I.from(n.firstChild),r=I.from(n.lastChild);t.insertNode(n),o.each(t=>Yl(e,t.previousSibling)),r.each(t=>Yl(e,t.nextSibling))})(e,t,n):((e,t,n)=>{t.insertNode(n),Yl(e,n.previousSibling),Yl(e,n.nextSibling)})(e,t,n)},Xl=cs,Ql=ss,Zl=gi.nodeIndex,Jl=e=>{const t=e.parentNode;return Ql(t)?Jl(t):t},ec=e=>e?yt(e.childNodes,(e,t)=>(Ql(t)&&"BR"!==t.nodeName?e=e.concat(ec(t)):e.push(t),e),[]):[],tc=e=>t=>e===t,nc=e=>(Xl(e)?"text()":e.nodeName.toLowerCase())+"["+(e=>{let t,n;t=ec(Jl(e)),n=vt(t,tc(e),e),t=t.slice(0,n+1);const o=yt(t,(e,n,o)=>(Xl(n)&&Xl(t[o-1])&&e++,e),0);return t=bt(t,os([e.nodeName])),n=vt(t,tc(e),e),n-o})(e)+"]",oc=(e,t)=>{let n,o=[],r=t.container(),s=t.offset();if(Xl(r))n=((e,t)=>{let n=e;for(;(n=n.previousSibling)&&Xl(n);)t+=n.data.length;return t})(r,s);else{const e=r.childNodes;s>=e.length?(n="after",s=e.length-1):n="before",r=e[s]}o.push(nc(r));let a=((e,t)=>{const n=[];for(let o=t.parentNode;o&&o!==e;o=o.parentNode)n.push(o);return n})(e,r);return a=bt(a,T(ss)),o=o.concat(ht(a,e=>nc(e))),o.reverse().join("/")+","+n},rc=(e,t)=>{if(!t)return null;const n=t.split(","),o=n[0].split("/"),r=n.length>1?n[1]:"before",s=yt(o,(e,t)=>{const n=/([\w\-\(\)]+)\[([0-9]+)\]/.exec(t);return n?("text()"===n[1]&&(n[1]="#text"),((e,t,n)=>{let o=ec(e);return o=bt(o,(e,t)=>!Xl(e)||!Xl(o[t-1])),o=bt(o,os([t])),o[n]})(e,n[1],parseInt(n[2],10))):null},e);if(!s)return null;if(!Xl(s)&&s.parentNode){let e;return e="after"===r?Zl(s)+1:Zl(s),Kl(s.parentNode,e)}return((e,t)=>{let n=e,o=0;for(;Xl(n);){const r=n.data.length;if(t>=o&&t<=o+r){e=n,t-=o;break}if(!Xl(n.nextSibling)){e=n,t=r;break}o+=r,n=n.nextSibling}return Xl(e)&&t>e.data.length&&(t=e.data.length),Kl(e,t)})(s,parseInt(r,10))},sc=vs,ac=(e,t,n,o,r)=>{const s=r?o.startContainer:o.endContainer;let a=r?o.startOffset:o.endOffset;const i=[],l=e.getRoot();if(cs(s))i.push(n?((e,t,n)=>{let o=e(t.data.slice(0,n)).length;for(let n=t.previousSibling;n&&cs(n);n=n.previousSibling)o+=e(n.data).length;return o})(t,s,a):a);else{let t=0;const o=s.childNodes;a>=o.length&&o.length&&(t=1,a=Math.max(0,o.length-1)),i.push(e.nodeIndex(o[a],n)+t)}for(let t=s;t&&t!==l;t=t.parentNode)i.push(e.nodeIndex(t,n));return i},ic=(e,t,n)=>{let o=0;return dn.each(e.select(t),e=>"all"===e.getAttribute("data-mce-bogus")?void 0:e!==n&&void o++),o},lc=(e,t)=>{let n=t?e.startContainer:e.endContainer,o=t?e.startOffset:e.endOffset;if(es(n)&&"TR"===n.nodeName){const r=n.childNodes;n=r[Math.min(t?o:o-1,r.length-1)],n&&(o=t?0:n.childNodes.length,t?e.setStart(n,o):e.setEnd(n,o))}},cc=e=>(lc(e,!0),lc(e,!1),e),dc=(e,t)=>{if(es(e)&&(e=hl(e,t),sc(e)))return e;if(el(e)){cs(e)&&Zi(e)&&(e=e.parentNode);let t=e.previousSibling;if(sc(t))return t;if(t=e.nextSibling,sc(t))return t}},mc=(e,t,n)=>{const o=n.getNode(),r=n.getRng();if("IMG"===o.nodeName||sc(o)){const e=o.nodeName;return{name:e,index:ic(n.dom,e,o)}}const s=(e=>dc(e.startContainer,e.startOffset)||dc(e.endContainer,e.endOffset))(r);if(s){const e=s.tagName;return{name:e,index:ic(n.dom,e,s)}}return((e,t,n,o)=>{const r=t.dom,s=ac(r,e,n,o,!0),a=t.isForward(),i=il(o)?{isFakeCaret:!0}:{};return t.isCollapsed()?{start:s,forward:a,...i}:{start:s,end:ac(r,e,n,o,!1),forward:a,...i}})(e,n,t,r)},uc=(e,t,n)=>{const o={"data-mce-type":"bookmark",id:t,style:"overflow:hidden;line-height:0px"};return n?e.create("span",o,""):e.create("span",o)},fc=(e,t)=>{const n=e.dom;let o=e.getRng();const r=n.uniqueId(),s=e.isCollapsed(),a=e.getNode(),i=a.nodeName,l=e.isForward();if("IMG"===i)return{name:i,index:ic(n,i,a)};const c=cc(o.cloneRange());if(!s){c.collapse(!1);const e=uc(n,r+"_end",t);Gl(n,c,e)}o=cc(o),o.collapse(!0);const d=uc(n,r+"_start",t);return Gl(n,o,d),e.moveToBookmark({id:r,keep:!0,forward:l}),{id:r,forward:l}},gc=D(mc,A,!0),pc=e=>1===e,hc=e=>-1===e;var bc;!function(e){e[e.Error=0]="Error",e[e.Value=1]="Value"}(bc||(bc={}));const yc=(e,t,n)=>e.stype===bc.Error?t(e.serror):n(e.svalue),vc=e=>({stype:bc.Value,svalue:e}),Cc=e=>({stype:bc.Error,serror:e}),wc=yc,Sc=e=>f(e)&&ge(e).length>100?" removed due to size":JSON.stringify(e,null,2),Ec=(e,t)=>Cc([{path:e,getErrorInfo:t}]),xc=e=>({extract:(t,n)=>{return o=e(n),r=e=>((e,t)=>Ec(e,N(t)))(t,e),o.stype===bc.Error?r(o.serror):o;var o,r},toString:N("val")}),_c=xc(vc),kc=N(_c),Nc=(e,t)=>xc(n=>{const o=typeof n;return e(n)?vc(n):Cc(`Expected type: ${t} but got: ${o}`)}),Ac=Nc(S,"number"),Rc=Nc(u,"string"),Dc=Nc(w,"function"),Tc=e=>({tag:"defaultedThunk",process:N(e)}),Oc=(e,t,n)=>{switch(e.tag){case"field":return t(e.key,e.newKey,e.presence,e.prop);case"custom":return n(e.newKey,e.instantiator)}},Bc=e=>{const t=(e=>{const t=[],n=[];return q(e,e=>{yc(e,e=>n.push(e),e=>t.push(e))}),{values:t,errors:n}})(e);return t.errors.length>0?(n=t.errors,_(Cc,te)(n)):vc(t.values);var n},Pc=(e,t,n,o)=>o(xe(e,t).getOrThunk(()=>n(e))),Lc=(e,t,n,o,r)=>{const s=e=>r.extract(t.concat([o]),e),a=e=>e.fold(()=>vc(I.none()),e=>{const n=r.extract(t.concat([o]),e);return s=n,a=I.some,s.stype===bc.Value?{stype:bc.Value,svalue:a(s.svalue)}:s;var s,a});switch(e.tag){case"required":return((e,t,n,o)=>xe(t,n).fold(()=>((e,t,n)=>Ec(e,()=>'Could not find valid *required* value for "'+t+'" in '+Sc(n)))(e,n,t),o))(t,n,o,s);case"defaultedThunk":return Pc(n,o,e.process,s);case"option":return((e,t,n)=>n(xe(e,t)))(n,o,a);case"defaultedOptionThunk":return((e,t,n,o)=>o(xe(e,t).map(t=>!0===t?n(e):t)))(n,o,e.process,a);case"mergeWithThunk":return Pc(n,o,N({}),t=>{const o=Fe(e.process(n),t);return s(o)})}},Mc=e=>({extract:(t,n)=>((e,t,n)=>{const o={},r=[];for(const s of n)Oc(s,(n,s,a,i)=>{const l=Lc(a,e,t,n,i);wc(l,e=>{r.push(...e)},e=>{o[s]=e})},(e,n)=>{o[e]=n(t)});return r.length>0?Cc(r):vc(o)})(t,n,e),toString:()=>{const t=V(e,e=>Oc(e,(e,t,n,o)=>e+" -> "+o.toString(),(e,t)=>"state("+e+")"));return"obj{\n"+t.join("\n")+"}"}}),Ic=e=>({extract:(t,n)=>{const o=V(n,(n,o)=>e.extract(t.concat(["["+o+"]"]),n));return Bc(o)},toString:()=>"array("+e.toString()+")"}),Fc=_(Ic,Mc),Uc=(e,t,n)=>{return o=((e,t,n)=>((e,t)=>e.stype===bc.Error?{stype:bc.Error,serror:t(e.serror)}:e)(t.extract([e],n),e=>({input:n,errors:e})))(e,t,n),yc(o,Te.error,Te.value);var o},zc=e=>"Errors: \n"+(e=>{const t=e.length>10?e.slice(0,10).concat([{path:[],getErrorInfo:N("... (only showing first ten failures)")}]):e;return V(t,e=>"Failed path: ("+e.path.join(" > ")+")\n"+e.getErrorInfo())})(e.errors).join("\n")+"\n\nInput object: "+Sc(e.input),jc=(e,t,n,o)=>({tag:"field",key:e,newKey:t,presence:n,prop:o}),$c=(e,t)=>jc(e,e,{tag:"required",process:{}},t),Hc=e=>$c(e,Rc),Vc=e=>$c(e,Dc),qc=(e,t)=>jc(e,e,{tag:"option",process:{}},t),Wc=e=>qc(e,Rc),Kc=(e,t,n)=>jc(e,e,Tc(t),n),Yc=(e,t)=>Kc(e,t,Ac),Gc=e=>"inline-command"===e.type||"inline-format"===e.type,Xc=e=>"block-command"===e.type||"block-format"===e.type,Qc=e=>{const t=t=>Te.error({message:t,pattern:e}),n=(n,o,r)=>{if(void 0!==e.format){let r;if(p(e.format)){if(!oe(e.format,u))return t(n+" pattern has non-string items in the `format` array");r=e.format}else{if(!u(e.format))return t(n+" pattern has non-string `format` parameter");r=[e.format]}return Te.value(o(r))}return void 0!==e.cmd?u(e.cmd)?Te.value(r(e.cmd,e.value)):t(n+" pattern has non-string `cmd` parameter"):t(n+" pattern is missing both `format` and `cmd` parameters")};if(!f(e))return t("Raw pattern is not an object");if(!u(e.start))return t("Raw pattern is missing `start` parameter");if(void 0!==e.end){if(!u(e.end))return t("Inline pattern has non-string `end` parameter");if(0===e.start.length&&0===e.end.length)return t("Inline pattern has empty `start` and `end` parameters");let o=e.start,r=e.end;return 0===r.length&&(r=o,o=""),n("Inline",e=>({type:"inline-format",start:o,end:r,format:e}),(e,t)=>({type:"inline-command",start:o,end:r,cmd:e,value:t}))}if(void 0!==e.replacement)return u(e.replacement)?0===e.start.length?t("Replacement pattern has empty `start` parameter"):Te.value({type:"inline-command",start:"",end:e.start,cmd:"mceInsertContent",value:e.replacement}):t("Replacement pattern has non-string `replacement` parameter");{const o=e.trigger??"space";return 0===e.start.length?t("Block pattern has empty `start` parameter"):n("Block",t=>({type:"block-format",start:e.start,format:t[0],trigger:o}),(t,n)=>({type:"block-command",start:e.start,cmd:t,value:n,trigger:o}))}},Zc=e=>Y(e,Xc),Jc=e=>Y(e,Gc),ed=(e,t)=>({...e,blockPatterns:Y(e.blockPatterns,e=>((e,t)=>("block-command"===e.type||"block-format"===e.type)&&e.trigger===t)(e,t))}),td=e=>{const t=qe(V(e,Qc));return q(t.errors,e=>console.error(e.message,e.pattern)),t.values},nd=(e,t,n)=>{e.dispatch(t,n)},od=(e,t,n,o)=>{e.dispatch("FormatApply",{format:t,node:n,vars:o})},rd=(e,t,n,o)=>{e.dispatch("FormatRemove",{format:t,node:n,vars:o})},sd=(e,t)=>e.dispatch("SetContent",t),ad=(e,t)=>e.dispatch("GetContent",t),id=(e,t)=>{e.dispatch("AutocompleterUpdateActiveRange",t)},ld=(e,t)=>e.dispatch("PastePlainTextToggle",{state:t}),cd=Xt().deviceType,dd=cd.isTouch(),md=gi.DOM,ud=e=>m(e,RegExp),fd=e=>t=>t.options.get(e),gd=e=>u(e)||f(e),pd=(e,t="")=>n=>{const o=u(n);if(o){if(-1!==n.indexOf("=")){const r=(e=>{const t=e.indexOf("=")>0?e.split(/[;,](?![^=;,]*(?:[;,]|$))/):e.split(",");return X(t,(e,t)=>{const n=t.split("="),o=n[0],r=n.length>1?n[1]:o;return e[et(o)]=et(r),e},{})})(n);return{value:xe(r,e.id).getOr(t),valid:o}}return{value:n,valid:o}}return{valid:!1,message:"Must be a string."}},hd=fd("iframe_attrs"),bd=fd("doctype"),yd=fd("document_base_url"),vd=fd("body_id"),Cd=fd("body_class"),wd=fd("content_security_policy"),Sd=fd("br_in_pre"),Ed=fd("forced_root_block"),xd=fd("forced_root_block_attrs"),_d=fd("newline_behavior"),kd=fd("br_newline_selector"),Nd=fd("no_newline_selector"),Ad=fd("keep_styles"),Rd=fd("end_container_on_empty_block"),Dd=fd("automatic_uploads"),Td=fd("images_reuse_filename"),Od=fd("images_replace_blob_uris"),Bd=fd("icons"),Pd=fd("icons_url"),Ld=fd("images_upload_url"),Md=fd("images_upload_base_path"),Id=fd("images_upload_credentials"),Fd=fd("images_upload_handler"),Ud=fd("content_css_cors"),zd=fd("referrer_policy"),jd=fd("crossorigin"),$d=fd("language"),Hd=fd("language_url"),Vd=fd("indent_use_margin"),qd=fd("indentation"),Wd=fd("content_css"),Kd=fd("content_style"),Yd=fd("content_language"),Gd=fd("font_css"),Xd=fd("directionality"),Qd=fd("inline_boundaries_selector"),Zd=fd("object_resizing"),Jd=fd("resize_img_proportional"),em=fd("placeholder"),tm=fd("event_root"),nm=fd("service_message"),om=fd("theme"),rm=fd("theme_url"),sm=fd("model"),am=fd("model_url"),im=fd("inline_boundaries"),lm=fd("formats"),cm=fd("preview_styles"),dm=fd("format_empty_lines"),mm=fd("format_noneditable_selector"),um=fd("custom_ui_selector"),fm=fd("inline"),gm=fd("hidden_input"),pm=fd("submit_patch"),hm=fd("add_form_submit_trigger"),bm=fd("add_unload_trigger"),ym=fd("custom_undo_redo_levels"),vm=fd("disable_nodechange"),Cm=fd("readonly"),wm=fd("editable_root"),Sm=fd("content_css_cors"),Em=fd("plugins"),xm=fd("external_plugins"),_m=fd("block_unsupported_drop"),km=fd("visual"),Nm=fd("visual_table_class"),Am=fd("visual_anchor_class"),Rm=fd("iframe_aria_text"),Dm=fd("setup"),Tm=fd("init_instance_callback"),Om=fd("urlconverter_callback"),Bm=fd("auto_focus"),Pm=fd("browser_spellcheck"),Lm=fd("protect"),Mm=fd("paste_block_drop"),Im=fd("paste_data_images"),Fm=fd("paste_preprocess"),Um=fd("paste_postprocess"),zm=fd("newdocument_content"),jm=fd("paste_webkit_styles"),$m=fd("paste_remove_styles_if_webkit"),Hm=fd("paste_merge_formats"),Vm=fd("smart_paste"),qm=fd("paste_as_text"),Wm=fd("paste_tab_spaces"),Km=fd("allow_html_data_urls"),Ym=fd("text_patterns"),Gm=fd("text_patterns_lookup"),Xm=fd("allow_noneditable"),Qm=fd("noneditable_class"),Zm=fd("editable_class"),Jm=fd("noneditable_regexp"),eu=fd("preserve_cdata"),tu=fd("highlight_on_focus"),nu=fd("xss_sanitization"),ou=fd("init_content_sync"),ru=e=>dn.explode(e.options.get("images_file_types")),su=fd("table_tab_navigation"),au=fd("details_initial_state"),iu=fd("details_serialized_state"),lu=fd("sandbox_iframes"),cu=e=>e.options.get("sandbox_iframes_exclusions"),du=fd("convert_unsafe_embeds"),mu=fd("license_key"),uu=fd("api_key"),fu=fd("disabled"),gu=fd("user_id"),pu=fd("fetch_users"),hu=fd("lists_indent_on_tab"),bu=e=>I.from(e.options.get("list_max_depth")),yu=es,vu=cs,Cu=e=>{const t=e.parentNode;t&&t.removeChild(e)},wu=e=>{const t=Gi(e);return{count:e.length-t.length,text:t}},Su=e=>{let t;for(;-1!==(t=e.data.lastIndexOf(Ki));)e.deleteData(t,1)},Eu=(e,t)=>(_u(e),t),xu=(e,t)=>Kl.isTextPosition(t)?((e,t)=>vu(e)&&t.container()===e?((e,t)=>{const n=wu(e.data.substr(0,t.offset())),o=wu(e.data.substr(t.offset()));return(n.text+o.text).length>0?(Su(e),Kl(e,t.offset()-n.count)):t})(e,t):Eu(e,t))(e,t):((e,t)=>t.container()===e.parentNode?((e,t)=>{const n=t.container(),o=((e,t)=>{const n=j(e,t);return-1===n?I.none():I.some(n)})(me(n.childNodes),e).map(e=>e{yu(e)&&el(e)&&(tl(e)?e.removeAttribute("data-mce-caret"):Cu(e)),vu(e)&&(Su(e),0===e.data.length&&Cu(e))},ku=vs,Nu=xs,Au=ws,Ru=(e,t,n)=>{const o=dl(t.getBoundingClientRect(),n);let r,s;if("BODY"===e.tagName){const t=e.ownerDocument.documentElement;r=e.scrollLeft||t.scrollLeft,s=e.scrollTop||t.scrollTop}else{const t=e.getBoundingClientRect();r=e.scrollLeft-t.left,s=e.scrollTop-t.top}o.left+=r,o.right+=r,o.top+=s,o.bottom+=s,o.width=1;let a=t.offsetWidth-t.clientWidth;return a>0&&(n&&(a*=-1),o.left+=a,o.right+=a),o},Du=(e,t,n,o)=>{const r=Ke();let s,a;const i=Ed(e),l=e.dom,c=()=>{(e=>{const t=Ar(un.fromDom(e),"*[contentEditable=false],video,audio,embed,object");for(let e=0;e{l.remove(e.caret),r.clear()}),s&&(clearInterval(s),s=void 0)};return{isShowing:r.isSet,show:(e,d)=>{let m;if(c(),Au(d))return null;if(!n(d))return a=((e,t)=>{const n=(e.ownerDocument??document).createTextNode(Ki),o=e.parentNode;if(t){const t=e.previousSibling;if(Qi(t)){if(el(t))return t;if(sl(t))return t.splitText(t.data.length-1)}o?.insertBefore(n,e)}else{const t=e.nextSibling;if(Qi(t)){if(el(t))return t;if(rl(t))return t.splitText(1),t}e.nextSibling?o?.insertBefore(n,e.nextSibling):o?.appendChild(n)}return n})(d,e),m=d.ownerDocument.createRange(),Ou(a.nextSibling)?(m.setStart(a,0),m.setEnd(a,0)):(m.setStart(a,1),m.setEnd(a,1)),m;{const n=((e,t,n)=>{const o=(t.ownerDocument??document).createElement(e);o.setAttribute("data-mce-caret",n?"before":"after"),o.setAttribute("data-mce-bogus","all"),o.appendChild(qi().dom);const r=t.parentNode;return n?r?.insertBefore(o,t):t.nextSibling?r?.insertBefore(o,t.nextSibling):r?.appendChild(o),o})(i,d,e),c=Ru(t,d,e);l.setStyle(n,"top",c.top),l.setStyle(n,"caret-color","transparent"),a=n;const u=l.create("div",{class:"mce-visual-caret","data-mce-bogus":"all"});l.setStyles(u,{...c}),l.add(t,u),r.set({caret:u,element:d,before:e}),e&&l.addClass(u,"mce-visual-caret-before"),s=window.setInterval(()=>{r.on(e=>{o()?l.toggleClass(e.caret,"mce-visual-caret-hidden"):l.addClass(e.caret,"mce-visual-caret-hidden")})},500),m=d.ownerDocument.createRange(),m.setStart(n,0),m.setEnd(n,0)}return m},hide:c,getCss:()=>".mce-visual-caret {position: absolute;background-color: black;background-color: currentcolor;}.mce-visual-caret-hidden {display: none;}*[data-mce-caret] {position: absolute;left: -1000px;right: auto;top: 0;margin: 0;padding: 0;}",reposition:()=>{r.on(e=>{const n=Ru(t,e.element,e.before);l.setStyles(e.caret,{...n})})},destroy:()=>clearInterval(s)}},Tu=()=>sn.browser.isFirefox(),Ou=e=>ku(e)||Nu(e),Bu=e=>(Ou(e)||as(e)&&Tu())&&In(un.fromDom(e)).exists(Sr),Pu=ys,Lu=vs,Mu=xs,Iu=rs("display","block table table-cell table-row table-caption list-item"),Fu=el,Uu=Zi,zu=es,ju=cs,$u=Nl,Hu=(e,t)=>{let n;for(;n=e(t);)if(!Uu(n))return n;return null},Vu=(e,t,n,o,r)=>{const s=new Kr(e,o),a=Lu(e)||Uu(e);let i;if(hc(t)){if(a&&(i=Hu(s.prev.bind(s),!0),n(i)))return i;for(;i=Hu(s.prev.bind(s),r);)if(n(i))return i}if(pc(t)){if(a&&(i=Hu(s.next.bind(s),!0),n(i)))return i;for(;i=Hu(s.next.bind(s),r);)if(n(i))return i}return null},qu=e=>es(e)&&"absolute"===$o(un.fromDom(e),"position"),Wu=(e,t)=>Lu(e)&&qu(e)&&((e,t)=>e.parentNode!==t)(e,t),Ku=(e,t)=>{for(;e&&e!==t;){if(Iu(e)&&!Wu(e,t))return e;e=e.parentNode}return null},Yu=(e,t,n)=>Ku(e.container(),n)===Ku(t.container(),n),Gu=(e,t)=>{if(!t)return I.none();const n=t.container(),o=t.offset();return zu(n)?I.from(n.childNodes[o+e]):I.none()},Xu=(e,t)=>{const n=(t.ownerDocument??document).createRange();return e?(n.setStartBefore(t),n.setEndBefore(t)):(n.setStartAfter(t),n.setEndAfter(t)),n},Qu=(e,t,n)=>Ku(t,e)===Ku(n,e),Zu=(e,t,n)=>{const o=e?"previousSibling":"nextSibling";let r=n;for(;r&&r!==t;){let e=r[o];if(e&&Fu(e)&&(e=e[o]),Lu(e)||Mu(e)){if(Qu(t,e,r))return e;break}if($u(e))break;r=r.parentNode}return null},Ju=D(Xu,!0),ef=D(Xu,!1),tf=(e,t,n)=>{let o;const r=D(Zu,!0,t),s=D(Zu,!1,t),a=n.startContainer,i=n.startOffset;if(Zi(a)){const e=ju(a)?a.parentNode:a,t=e.getAttribute("data-mce-caret");if("before"===t&&(o=e.nextSibling,Bu(o)))return Ju(o);if("after"===t&&(o=e.previousSibling,Bu(o)))return ef(o)}if(!n.collapsed)return n;if(cs(a)){if(Fu(a)){if(1===e){if(o=s(a),o)return Ju(o);if(o=r(a),o)return ef(o)}if(-1===e){if(o=r(a),o)return ef(o);if(o=s(a),o)return Ju(o)}return n}if(sl(a)&&i>=a.data.length-1)return 1===e&&(o=s(a),o)?Ju(o):n;if(rl(a)&&i<=1)return-1===e&&(o=r(a),o)?ef(o):n;if(i===a.data.length)return o=s(a),o?Ju(o):n;if(0===i)return o=r(a),o?ef(o):n}return n},nf=(e,t)=>Gu(e?0:-1,t).filter(Lu),of=(e,t,n)=>{const o=tf(e,t,n);return-1===e?Kl.fromRangeStart(o):Kl.fromRangeEnd(o)},rf=e=>I.from(e.getNode()).map(un.fromDom),sf=(e,t)=>{let n=t;for(;n=e(n);)if(n.isVisible())return n;return n},af=(e,t)=>{const n=Yu(e,t);return!(n||!ps(e.getNode()))||n},lf=vs,cf=cs,df=es,mf=ps,uf=Nl,ff=e=>xl(e)||(e=>!!Al(e)&&!X(me(e.getElementsByTagName("*")),(e,t)=>e||vl(t),!1))(e),gf=Rl,pf=(e,t)=>e.hasChildNodes()&&t{if(pc(e)){if(uf(t.previousSibling)&&!cf(t.previousSibling))return Kl.before(t);if(cf(t))return Kl(t,0)}if(hc(e)){if(uf(t.nextSibling)&&!cf(t.nextSibling))return Kl.after(t);if(cf(t))return Kl(t,t.data.length)}return hc(e)?mf(t)?Kl.before(t):Kl.after(t):Kl.before(t)},bf=(e,t,n)=>{let o,r,s,a;if(!df(n)||!t)return null;if(t.isEqual(Kl.after(n))&&n.lastChild){if(a=Kl.after(n.lastChild),hc(e)&&uf(n.lastChild)&&df(n.lastChild))return mf(n.lastChild)?Kl.before(n.lastChild):a}else a=t;const i=a.container();let l=a.offset();if(cf(i)){if(hc(e)&&l>0)return Kl(i,--l);if(pc(e)&&l0&&(r=pf(i,l-1),uf(r)))return!ff(r)&&(s=Vu(r,e,gf,r),s)?cf(s)?Kl(s,s.data.length):Kl.after(s):cf(r)?Kl(r,r.data.length):Kl.before(r);if(pc(e)&&l{const n=t.nextSibling;return n&&uf(n)?cf(n)?Kl(n,0):Kl.before(n):bf(1,Kl.after(t),e)})(n,r):!ff(r)&&(s=Vu(r,e,gf,r),s)?cf(s)?Kl(s,0):Kl.before(s):cf(r)?Kl(r,0):Kl.after(r);o=r||a.getNode()}if(o&&(pc(e)&&a.isAtEnd()||hc(e)&&a.isAtStart())&&(o=Vu(o,e,M,n,!0),gf(o,n)))return hf(e,o);r=o?Vu(o,e,gf,n):o;const c=Ct(Y(((e,t)=>{const n=[];let o=e;for(;o&&o!==t;)n.push(o),o=o.parentNode;return n})(i,n),lf));return!c||r&&c.contains(r)?r?hf(e,r):null:(a=pc(e)?Kl.after(c):Kl.before(c),a)},yf=e=>({next:t=>bf(1,t,e),prev:t=>bf(-1,t,e)}),vf=e=>Kl.isTextPosition(e)?0===e.offset():Nl(e.getNode()),Cf=e=>{if(Kl.isTextPosition(e)){const t=e.container();return e.offset()===t.data.length}return Nl(e.getNode(!0))},wf=(e,t)=>!Kl.isTextPosition(e)&&!Kl.isTextPosition(t)&&e.getNode()===t.getNode(!0),Sf=(e,t,n)=>{const o=yf(t);return I.from(e?o.next(n):o.prev(n))},Ef=(e,t,n)=>Sf(e,t,n).bind(o=>Yu(n,o,t)&&((e,t,n)=>{return e?!wf(t,n)&&(o=t,!(!Kl.isTextPosition(o)&&ps(o.getNode())))&&Cf(t)&&vf(n):!wf(n,t)&&vf(t)&&Cf(n);var o})(e,n,o)?Sf(e,t,o):I.some(o)),xf=(e,t,n,o)=>Ef(e,t,n).bind(n=>o(n)?xf(e,t,n,o):I.some(n)),_f=(e,t)=>{const n=e?t.firstChild:t.lastChild;return cs(n)?I.some(Kl(n,e?0:n.data.length)):n?Nl(n)?I.some(e?Kl.before(n):ps(o=n)?Kl.before(o):Kl.after(o)):((e,t,n)=>{const o=e?Kl.before(n):Kl.after(n);return Sf(e,t,o)})(e,t,n):I.none();var o},kf=D(Sf,!0),Nf=D(Sf,!1),Af=D(_f,!0),Rf=D(_f,!1),Df="_mce_caret",Tf=e=>es(e)&&e.id===Df,Of=(e,t)=>{let n=t;for(;n&&n!==e;){if(Tf(n))return n;n=n.parentNode}return null},Bf=e=>_e(e,"name"),Pf=e=>dn.isArray(e.start),Lf=e=>!(!Bf(e)&&b(e.forward))||e.forward,Mf=(e,t)=>(es(t)&&e.isBlock(t)&&!t.innerHTML&&(t.innerHTML='
    '),t),If=(e,t)=>Rf(e).fold(L,e=>(t.setStart(e.container(),e.offset()),t.setEnd(e.container(),e.offset()),!0)),Ff=(e,t,n)=>!(!(e=>!e.hasChildNodes())(t)||!Of(e,t)||(((e,t)=>{const n=(e.ownerDocument??document).createTextNode(Ki);e.appendChild(n),t.setStart(n,0),t.setEnd(n,0)})(t,n),0)),Uf=(e,t,n,o)=>{const r=n[t?"start":"end"],s=e.getRoot();if(r){let e=s,n=r[0];for(let t=r.length-1;e&&t>=1;t--){const n=e.childNodes;if(Ff(s,e,o))return!0;if(r[t]>n.length-1)return!!Ff(s,e,o)||If(e,o);e=n[r[t]]}cs(e)&&(n=Math.min(r[0],e.data.length)),es(e)&&(n=Math.min(r[0],e.childNodes.length)),t?o.setStart(e,n):o.setEnd(e,n)}return!0},zf=e=>cs(e)&&e.data.length>0,jf=(e,t,n)=>{const o=e.get(n.id+"_"+t),r=o?.parentNode,s=n.keep;if(o&&r){let a,i;if("start"===t?s?o.hasChildNodes()?(a=o.firstChild,i=1):zf(o.nextSibling)?(a=o.nextSibling,i=0):zf(o.previousSibling)?(a=o.previousSibling,i=o.previousSibling.data.length):(a=r,i=e.nodeIndex(o)+1):(a=r,i=e.nodeIndex(o)):s?o.hasChildNodes()?(a=o.firstChild,i=1):zf(o.previousSibling)?(a=o.previousSibling,i=o.previousSibling.data.length):(a=r,i=e.nodeIndex(o)):(a=r,i=e.nodeIndex(o)),!s){const r=o.previousSibling,s=o.nextSibling;let l;for(dn.each(dn.grep(o.childNodes),e=>{cs(e)&&(e.data=e.data.replace(/\uFEFF/g,""))});l=e.get(n.id+"_"+t);)e.remove(l,!0);if(cs(s)&&cs(r)&&!sn.browser.isOpera()){const t=r.data.length;r.appendData(s.data),e.remove(s),a=r,i=t}}return I.some(Kl(a,i))}return I.none()},$f=(e,t,n)=>((e,t,n=!1)=>2===t?mc(Gi,n,e):3===t?(e=>{const t=e.getRng();return{start:oc(e.dom.getRoot(),Kl.fromRangeStart(t)),end:oc(e.dom.getRoot(),Kl.fromRangeEnd(t)),forward:e.isForward()}})(e):t?(e=>({rng:e.getRng(),forward:e.isForward()}))(e):fc(e,!1))(e,t,n),Hf=(e,t)=>{((e,t)=>{const n=e.dom;if(t){if(Pf(t))return((e,t)=>{const n=e.createRng();return Uf(e,!0,t,n)&&Uf(e,!1,t,n)?I.some({range:n,forward:Lf(t)}):I.none()})(n,t);if((e=>u(e.start))(t))return((e,t)=>{const n=I.from(rc(e.getRoot(),t.start)),o=I.from(rc(e.getRoot(),t.end));return $e(n,o,(n,o)=>{const r=e.createRng();return r.setStart(n.container(),n.offset()),r.setEnd(o.container(),o.offset()),{range:r,forward:Lf(t)}})})(n,t);if((e=>_e(e,"id"))(t))return((e,t)=>{const n=jf(e,"start",t),o=jf(e,"end",t);return $e(n,o.or(n),(n,o)=>{const r=e.createRng();return r.setStart(Mf(e,n.container()),n.offset()),r.setEnd(Mf(e,o.container()),o.offset()),{range:r,forward:Lf(t)}})})(n,t);if(Bf(t))return((e,t)=>I.from(e.select(t.name)[t.index]).map(t=>{const n=e.createRng();return n.selectNode(t),{range:n,forward:!0}}))(n,t);if((e=>_e(e,"rng"))(t))return I.some({range:t.rng,forward:Lf(t)})}return I.none()})(e,t).each(({range:t,forward:n})=>{e.setRng(t,n)})},Vf=e=>es(e)&&"SPAN"===e.tagName&&"bookmark"===e.getAttribute("data-mce-type"),qf=(Wf=dt,e=>Wf===e);var Wf;const Kf=e=>""!==e&&-1!==" \f\n\r\t\v".indexOf(e),Yf=e=>!Kf(e)&&!qf(e)&&!mt(e),Gf=e=>{const t=[];if(e)for(let n=0;n{const n=Ar(t,"td[data-mce-selected],th[data-mce-selected]");return n.length>0?n:(e=>Y((e=>ne(e,e=>{const t=pl(e);return t?[un.fromDom(t)]:[]}))(e),Hi))(e)},Qf=e=>Xf(Gf(e.selection.getSel()),un.fromDom(e.getBody())),Zf=(e,t)=>mr(e,"table",t),Jf=e=>Wn(e).fold(N([e]),t=>[e].concat(Jf(t))),eg=e=>Kn(e).fold(N([e]),t=>"br"===En(t)?zn(t).map(t=>[e].concat(eg(t))).getOr([]):[e].concat(eg(t))),tg=(e,t)=>$e((e=>{const t=e.startContainer,n=e.startOffset;return cs(t)?0===n?I.some(un.fromDom(t)):I.none():I.from(t.childNodes[n]).map(un.fromDom)})(t),(e=>{const t=e.endContainer,n=e.endOffset;return cs(t)?n===t.data.length?I.some(un.fromDom(t)):I.none():I.from(t.childNodes[n-1]).map(un.fromDom)})(t),(t,n)=>{const o=Z(Jf(e),D(vn,t)),r=Z(eg(e),D(vn,n));return o.isSome()&&r.isSome()}).getOr(!1),ng=(e,t,n,o)=>{const r=n,s=new Kr(n,r),a=we(e.schema.getMoveCaretBeforeOnEnterElements(),(e,t)=>!$(["td","th","table"],t.toLowerCase()));let i=n;do{if(cs(i)&&0!==dn.trim(i.data).length)return void(o?t.setStart(i,0):t.setEnd(i,i.data.length));if(a[i.nodeName])return void(o?t.setStartBefore(i):"BR"===i.nodeName?t.setEndBefore(i):t.setEndAfter(i))}while(i=o?s.next():s.prev());"BODY"===r.nodeName&&(o?t.setStart(r,0):t.setEnd(r,r.childNodes.length))},og=e=>{const t=e.selection.getSel();return C(t)&&t.rangeCount>0},rg=(e,t)=>{const n=Qf(e);n.length>0?q(n,n=>{const o=n.dom,r=e.dom.createRng();r.setStartBefore(o),r.setEndAfter(o),t(r,!0)}):t(e.selection.getRng(),!1)},sg=(e,t,n)=>{const o=fc(e,t);n(o),e.moveToBookmark(o)},ag=(e,t)=>e.startContainer===e.endContainer&&e.endOffset-e.startOffset===1&&t(e.startContainer.childNodes[e.startOffset]),ig=e=>S(e?.nodeType),lg=e=>es(e)&&!Vf(e)&&!Tf(e)&&!ss(e),cg=(e,t,n)=>{const{selection:o,dom:r}=e,s=o.getNode(),a=vs(s);sg(o,!0,()=>{t()}),a&&vs(s)&&r.isChildOf(s,e.getBody())?e.selection.select(s):n(o.getStart())&&dg(r,o)},dg=(e,t)=>{const n=t.getRng(),{startContainer:o,startOffset:r}=n;if(!((e,t)=>{if(lg(t)&&!/^(TD|TH)$/.test(t.nodeName)){const n=e.getAttrib(t,"data-mce-selected"),o=parseInt(n,10);return!isNaN(o)&&o>0}return!1})(e,t.getNode())&&es(o)){const s=o.childNodes,a=e.getRoot();let i;if(r{if(e){const o=t?"nextSibling":"previousSibling";for(e=n?e:e[o];e;e=e[o])if(es(e)||!gg(e))return e}},ug=(e,t)=>!!e.getTextBlockElements()[t.nodeName.toLowerCase()]||Zs(e,t),fg=(e,t,n)=>e.schema.isValidChild(t,n),gg=(e,t=!1)=>{if(C(e)&&cs(e)){const n=t?e.data.replace(/ /g,"\xa0"):e.data;return Gr(n)}return!1},pg=(e,t)=>e.select('[contenteditable="true"]',t).length>0,hg=(e,t)=>X(me(t.childNodes),(t,n)=>[...t,...es(n)&&"true"===e.getContentEditable(n)?[n]:hg(e,n)],[]),bg=(e,t)=>{const n=e.dom;return lg(t)&&"false"===n.getContentEditable(t)&&((e,t)=>{const n="[data-mce-cef-wrappable]",o=mm(e),r=rt(o)?n:`${n},${o}`;return bn(un.fromDom(t),r)})(e,t)&&!pg(n,t)},yg=(e,t)=>w(e)?e(t):(C(t)&&(e=e.replace(/%(\w+)/g,(e,n)=>t[n]||e)),e),vg=(e,t)=>(t=t||"",e=""+((e=e||"").nodeName||e),t=""+(t.nodeName||t),e.toLowerCase()===t.toLowerCase()),Cg=(e,t)=>{if(v(e))return null;{let n=String(e);return"color"!==t&&"backgroundColor"!==t||(n=Ya(n)),"fontWeight"===t&&700===e&&(n="bold"),"fontFamily"===t&&(n=n.replace(/[\'\"]/g,"").replace(/,\s+/g,",")),n}},wg=(e,t,n)=>{const o=e.getStyle(t,n);return Cg(o,n)},Sg=(e,t)=>{let n;return e.getParent(t,t=>!!es(t)&&(n=e.getStyle(t,"text-decoration"),!!n&&"none"!==n)),n},Eg=(e,t,n)=>e.getParents(t,n,e.getRoot()),xg=(e,t,n)=>{const o=e.formatter.get(t);return C(o)&&H(o,n)},_g=e=>ke(e,"block"),kg=e=>_g(e)&&!0===e.wrapper,Ng=e=>ke(e,"selector"),Ag=e=>ke(e,"inline"),Rg=e=>Ng(e)&&!1!==e.expand&&!Ag(e),Dg=e=>(e=>{const t=[];let n=e;for(;n;){if(cs(n)&&n.data!==Ki||n.childNodes.length>1)return[];es(n)&&t.push(n),n=n.firstChild}return t})(e).length>0,Tg=e=>Tf(e.dom)&&Dg(e.dom),Og=Vf,Bg=Eg,Pg=gg,Lg=ug,Mg=e=>ps(e)&&e.getAttribute("data-mce-bogus")&&!e.nextSibling,Ig=(e,t)=>{let n=t;for(;n;){if(es(n)&&e.getContentEditable(n))return"false"===e.getContentEditable(n)?n:t;n=n.parentNode}return t},Fg=(e,t,n,o)=>{const r=t.data;if(e){for(let e=n;e>0;e--)if(o(r.charAt(e-1)))return e}else for(let e=n;eFg(e,t,n,e=>qf(e)||Kf(e)),zg=(e,t,n)=>Fg(e,t,n,Yf),jg=(e,t,n,o,r,s)=>{let a;const i=e.getParent(n,t=>Cs(t)||e.isBlock(t)),l=C(i)?i:t,c=(t,n,o)=>{const s=Pi(e),i=r?s.backwards:s.forwards;return I.from(i(t,n,(e,t)=>Og(e.parentNode)?-1:(a=e,o(r,e,t)),l))};return c(n,o,Ug).bind(e=>s?c(e.container,e.offset+(r?-1:0),zg):I.some(e)).orThunk(()=>a?I.some({container:a,offset:r?0:a.length}):I.none())},$g=(e,t,n,o,r)=>{const s=o[r];cs(o)&&rt(o.data)&&s&&(o=s);const a=Bg(e,o);for(let o=0;o{let r=n;const s=e.getRoot(),a=t[0];if(_g(a)&&(r=a.wrapper?null:e.getParent(n,a.block,s)),!r){const t=e.getParent(n,"LI,TD,TH,SUMMARY")??s;r=e.getParent(cs(n)?n.parentNode:n,t=>t!==s&&Lg(e.schema,t),t)}if(r&&_g(a)&&a.wrapper&&(r=Bg(e,r,"ul,ol").reverse()[0]||r),!r)for(r=n;r&&r[o]&&!e.isBlock(r[o])&&(r=r[o],!vg(r,"br")););return r||n},Vg=(e,t,n,o)=>{const r=n.parentNode;return!C(n[o])&&(!(r!==t&&!v(r)&&!e.isBlock(r))||Vg(e,t,r,o))},qg=(e,t,n,o,r,s)=>{let a=n;const i=r?"previousSibling":"nextSibling",l=e.getRoot();if(cs(n)&&!Pg(n)&&(r?o>0:oOg(e.parentNode)||Og(e),Kg=(e,t,n,o={})=>{const{includeTrailingSpace:r=!1,expandToBlock:s=!0}=o,a=e.getParent(t.commonAncestorContainer,e=>Cs(e)),i=C(a)?a:e.getRoot();let{startContainer:l,startOffset:c,endContainer:d,endOffset:m}=t;const u=n[0];return es(l)&&l.hasChildNodes()&&(l=hl(l,c),cs(l)&&(c=0)),es(d)&&d.hasChildNodes()&&(d=hl(d,t.collapsed?m:m-1),cs(d)&&(m=d.data.length)),l=Ig(e,l),d=Ig(e,d),Wg(l)&&(l=Og(l)?l:l.parentNode,l=t.collapsed?l.previousSibling||l:l.nextSibling||l,cs(l)&&(c=t.collapsed?l.length:0)),Wg(d)&&(d=Og(d)?d:d.parentNode,d=t.collapsed?d.nextSibling||d:d.previousSibling||d,cs(d)&&(m=t.collapsed?0:d.length)),t.collapsed&&(jg(e,i,l,c,!0,r).each(({container:e,offset:t})=>{l=e,c=t}),jg(e,i,d,m,!1,r).each(({container:e,offset:t})=>{d=e,m=t})),(Ag(u)||u.block_expand)&&(Ag(u)&&cs(l)&&0!==c||(l=qg(e,n,l,c,!0,s)),Ag(u)&&cs(d)&&m!==d.data.length||(d=qg(e,n,d,m,!1,s))),Rg(u)&&(l=$g(e,n,t,l,"previousSibling"),d=$g(e,n,t,d,"nextSibling")),(_g(u)||Ng(u))&&(l=Hg(e,n,l,"previousSibling"),d=Hg(e,n,d,"nextSibling"),_g(u)&&(e.isBlock(l)||(l=qg(e,n,l,c,!0,s),cs(l)&&(c=0)),e.isBlock(d)||(d=qg(e,n,d,m,!1,s),cs(d)&&(m=d.data.length)))),es(l)&&l.parentNode&&(c=e.nodeIndex(l),l=l.parentNode),es(d)&&d.parentNode&&(m=e.nodeIndex(d)+1,d=d.parentNode),{startContainer:l,startOffset:c,endContainer:d,endOffset:m}},Yg=(e,t,n)=>{const o=t.startOffset,r=hl(t.startContainer,o),s=t.endOffset,a=hl(t.endContainer,s-1),i=e=>{const t=e[0];cs(t)&&t===r&&o>=t.data.length&&e.splice(0,1);const n=e[e.length-1];return 0===s&&e.length>0&&n===a&&cs(n)&&e.splice(e.length-1,1),e},l=(e,t,n)=>{const o=[];for(;e&&e!==n;e=e[t])o.push(e);return o},c=(t,n)=>e.getParent(t,e=>e.parentNode===n,n),d=(e,t,o)=>{const r=o?"nextSibling":"previousSibling";for(let s=e,a=s.parentNode;s&&s!==t;s=a){a=s.parentNode;const t=l(s===e?s:s[r],r);t.length&&(o||t.reverse(),n(i(t)))}};if(r===a)return n(i([r]));const m=e.findCommonAncestor(r,a)??e.getRoot();if(e.isChildOf(r,a))return d(r,m,!0);if(e.isChildOf(a,r))return d(a,m);const u=c(r,m)||r,f=c(a,m)||a;d(r,u,!0);const g=l(u===r?u:u.nextSibling,"nextSibling",f===a?f.nextSibling:f);g.length&&n(i(g)),d(a,f)},Gg=['pre[class*=language-][contenteditable="false"]',"figure.image","div[data-ephox-embed-iri]","div.tiny-pageembed","div.mce-toc","div[data-mce-toc]","div.mce-footnotes"],Xg=(e,t,n,o,r,s)=>{const{uid:a=t,...i}=n;yr(e,Si()),vo(e,`${xi()}`,a),vo(e,`${Ei()}`,o);const{attributes:l={},classes:c=[]}=r(a,i);if(Co(e,l),((e,t)=>{q(t,t=>{yr(e,t)})})(e,c),s){c.length>0&&vo(e,`${ki()}`,c.join(","));const t=ge(l);t.length>0&&vo(e,`${Ni()}`,t.join(","))}},Qg=(e,t,n,o,r)=>{const s=un.fromTag("span",e);return Xg(s,t,n,o,r,!1),s},Zg=(e,t,n,o,r,s)=>{const a=[],i=Qg(e.getDoc(),n,s,o,r),l=Ke(),c=()=>{l.clear()},d=e=>{q(e,m)},m=t=>{switch(((e,t,n,o)=>In(t).fold(()=>"skipping",r=>"br"===o||(e=>Rn(e)&&or(e)===Ki)(t)?"valid":(e=>An(e)&&wr(e,Si()))(t)?"existing":Tf(t.dom)?"caret":H(Gg,e=>bn(t,e))?"valid-block":fg(e,n,o)&&fg(e,En(r),n)?"valid":"invalid-child"))(e,t,"span",En(t))){case"invalid-child":{c();const e=Vn(t);d(e),c();break}case"valid-block":c(),Xg(t,n,s,o,r,!0);break;case"valid":{const e=l.get().getOrThunk(()=>{const e=To(i);return a.push(e),l.set(e),e});po(t,e);break}}};return Yg(e.dom,t,e=>{c(),(e=>{const t=V(e,un.fromDom);d(t)})(e)}),a},Jg=e=>{const t=(()=>{const e={};return{register:(t,n)=>{e[t]={name:t,settings:n}},lookup:t=>xe(e,t).map(e=>e.settings),getNames:()=>ge(e)}})();((e,t)=>{const n=Ei(),o=e=>I.from(e.attr(n)).bind(t.lookup),r=e=>{e.attr(xi(),null),e.attr(Ei(),null),e.attr(_i(),null);const t=I.from(e.attr(Ni())).map(e=>e.split(",")).getOr([]),n=I.from(e.attr(ki())).map(e=>e.split(",")).getOr([]);q(t,t=>e.attr(t,null));const o=e.attr("class")?.split(" ")??[],r=se(o,[Si()].concat(n));e.attr("class",r.length>0?r.join(" "):null),e.attr(ki(),null),e.attr(Ni(),null)};e.serializer.addTempAttr(_i()),e.serializer.addAttributeFilter(n,e=>{for(const t of e)o(t).each(e=>{!1===e.persistent&&("span"===t.name?t.unwrap():r(t))})})})(e,t);const n=((e,t)=>{const n=Ae({}),o=()=>({listeners:[],previous:Ke()}),r=(e,t)=>{s(e,e=>(t(e),e))},s=(e,t)=>{const r=n.get(),s=t(xe(r,e).getOrThunk(o));r[e]=s,n.set(r)},a=(t,n)=>{q(Ti(e,t),e=>{n?vo(e,_i(),"true"):xo(e,_i())})},i=it(()=>{const n=ie(t.getNames());q(n,t=>{s(t,n=>{const o=n.previous.get();return Ri(e,I.some(t)).fold(()=>{o.each(e=>{(e=>{r(e,t=>{q(t.listeners,t=>t(!1,e))})})(t),n.previous.clear(),a(e,!1)})},({uid:e,name:t,elements:s})=>{ze(o,e)||(o.each(e=>a(e,!1)),((e,t,n)=>{r(e,o=>{q(o.listeners,o=>o(!0,e,{uid:t,nodes:V(n,e=>e.dom)}))})})(t,e,s),n.previous.set(e),a(e,!0))}),{previous:n.previous,listeners:n.listeners}})})},30);return e.on("remove",()=>{i.cancel()}),e.on("NodeChange",()=>{i.throttle()}),{addListener:(e,t)=>{s(e,e=>({previous:e.previous,listeners:e.listeners.concat([t])}))}}})(e,t),o=On("span"),r=e=>{q(e,e=>{o(e)?Ro(e):(e=>{Cr(e,Si()),xo(e,`${xi()}`),xo(e,`${Ei()}`),xo(e,`${_i()}`);const t=So(e,`${Ni()}`).map(e=>e.split(",")).getOr([]),n=So(e,`${ki()}`).map(e=>e.split(",")).getOr([]);var o;q(t,t=>xo(e,t)),o=e,q(n,e=>{Cr(o,e)}),xo(e,`${ki()}`),xo(e,`${Ni()}`)})(e)})};return{register:(e,n)=>{t.register(e,n)},annotate:(n,o)=>{t.lookup(n).each(t=>{((e,t,n,o)=>{e.undoManager.transact(()=>{const r=e.selection,s=r.getRng(),a=Qf(e).length>0,i=Le("mce-annotation");if(s.collapsed&&!a&&((e,t)=>{const n=Kg(e.dom,t,[{inline:"span"}]);t.setStart(n.startContainer,n.startOffset),t.setEnd(n.endContainer,n.endOffset),e.selection.setRng(t)})(e,s),r.getRng().collapsed&&!a){const s=Qg(e.getDoc(),i,o,t,n.decorate);Mo(s,dt),r.getRng().insertNode(s.dom),r.select(s.dom)}else sg(r,!1,()=>{rg(e,r=>{Zg(e,r,i,t,n.decorate,o)})})})})(e,n,t,o)})},annotationChanged:(e,t)=>{n.addListener(e,t)},remove:t=>{Ri(e,I.some(t)).each(({elements:t})=>{const n=e.selection.getBookmark();r(t),e.selection.moveToBookmark(n)})},removeAll:t=>{const n=e.selection.getBookmark();he(Oi(e,t),(e,t)=>{r(e)}),e.selection.moveToBookmark(n)},getAll:t=>{const n=Oi(e,t);return be(n,e=>V(e,e=>e.dom))}}},ep=Le("tiny-aria-announcer"),tp="data-mce-announced-at",np={position:"absolute",left:"-9999px",width:"1px",height:"1px",overflow:"hidden"},op=e=>{const t=un.fromTag("div");return Co(t,{"aria-live":e,"aria-atomic":"false","aria-relevant":"additions"}),t},rp=()=>{const e=un.fromTag("div"),t=op("polite"),n=op("assertive");return vo(e,"id",ep),jo(e,np),go(e,t),go(e,n),go((e=>{const t=e.dom.body;if(null==t)throw new Error("Body is not available yet");return un.fromDom(t)})(un.fromDom(document)),e),{container:e,politeRegion:t,assertiveRegion:n}},sp=(()=>{const e=Ke(),t=async()=>{const t=async()=>{const t=new Promise(e=>{const t=rp();setTimeout(()=>e(t),100)});return e.set(t),t};return e.get().fold(t,async n=>{const{container:o}=await n;return o.dom.isConnected?n:e.get().filter(e=>e!==n).getOrThunk(t)})},n=(e,t)=>{const n=Date.now();((e,t)=>{var n;q((n=`div[${tp}]`,kr(e,e=>bn(e,n))),e=>{So(e,tp).bind(e=>st(e)).filter(e=>t-e>6e5).each(()=>Ao(e))})})(e,n);const o=un.fromTag("div");vo(o,tp,String(n)),go(o,un.fromText(t)),go(e,o)};return{polite:async e=>{const{politeRegion:o}=await t();n(o,e)},assertive:async e=>{const{assertiveRegion:o}=await t();n(o,e)}}})(),ap={announce:(e,t)=>{!0===t?.assertive?sp.assertive(e).catch(x):sp.polite(e).catch(x)}},ip=e=>({getBookmark:D($f,e),moveToBookmark:D(Hf,e)});ip.isBookmarkNode=Vf;const lp=(e,t,n)=>!n.collapsed&&H(n.getClientRects(),n=>((e,t,n)=>t>=e.left&&t<=e.right&&n>=e.top&&n<=e.bottom)(n,e,t)),cp=(e,t)=>{const n=Rn(t)?or(t).length:Vn(t).length+1;return e>n?n:e<0?0:e},dp=e=>Ur.range(e.start,cp(e.soffset,e.start),e.finish,cp(e.foffset,e.finish)),mp=(e,t)=>!Jr(t.dom)&&(Cn(e,t)||vn(e,t)),up=e=>t=>mp(e,t.start)&&mp(e,t.finish),fp=e=>Ur.range(un.fromDom(e.startContainer),e.startOffset,un.fromDom(e.endContainer),e.endOffset),gp=e=>{const t=document.createRange();try{return t.setStart(e.start.dom,e.soffset),t.setEnd(e.finish.dom,e.foffset),I.some(t)}catch{return I.none()}},pp=e=>{const t=(e=>e.inline||sn.browser.isFirefox())(e)?(n=un.fromDom(e.getBody()),(e=>{const t=e.getSelection();return(t&&0!==t.rangeCount?I.from(t.getRangeAt(0)):I.none()).map(fp)})(Ln(n).dom).filter(up(n))):I.none();var n;e.bookmark=t.isSome()?t:e.bookmark},hp=e=>(e.bookmark?e.bookmark:I.none()).bind(t=>{return n=un.fromDom(e.getBody()),o=t,I.from(o).filter(up(n)).map(dp);var n,o}).bind(gp),bp={isEditorUIElement:e=>{const t=e.className.toString();return-1!==t.indexOf("tox-")||-1!==t.indexOf("mce-")}},yp={setEditorTimeout:(e,t,n)=>((e,t)=>(S(t)||(t=0),window.setTimeout(e,t)))(()=>{e.removed||t()},n),setEditorInterval:(e,t,n)=>{const o=((e,t)=>(S(t)||(t=0),window.setInterval(e,t)))(()=>{e.removed?window.clearInterval(o):t()},n);return o}};let vp;const Cp=gi.DOM,wp=e=>{const t=e.classList;return void 0!==t&&(t.contains("tox-edit-area")||t.contains("tox-edit-area__iframe")||t.contains("mce-content-body"))},Sp=(e,t)=>{const n=um(e),o=Cp.getParent(t,t=>(e=>es(e)&&bp.isEditorUIElement(e))(t)||!!n&&e.dom.is(t,n));return null!==o},Ep=e=>{try{const t=Qn(un.fromDom(e.getElement()));return co(t).fold(()=>document.body,e=>e.dom)}catch{return document.body}},xp=(e,t)=>{const n=t.editor;(e=>{const t=at(()=>{pp(e)},0);e.on("init",()=>{e.inline&&((e,t)=>{const n=()=>{t.throttle()};gi.DOM.bind(document,"mouseup",n),e.on("remove",()=>{gi.DOM.unbind(document,"mouseup",n)})})(e,t),((e,t)=>{((e,t)=>{e.on("mouseup touchend",e=>{t.throttle()})})(e,t),e.on("keyup NodeChange AfterSetSelectionRange",t=>{(e=>"nodechange"===e.type&&e.selectionChange)(t)||pp(e)})})(e,t)}),e.on("remove",()=>{t.cancel()})})(n);const o=(e,t)=>{tu(e)&&!0!==e.inline&&t(un.fromDom(e.getContainer()),"tox-edit-focus")};n.on("focusin",()=>{const t=e.focusedEditor;wp(Ep(n))&&o(n,yr),t!==n&&(t&&t.dispatch("blur",{focusedEditor:n}),e.setActive(n),e.focusedEditor=n,n.dispatch("focus",{blurredEditor:t}),n.focus(!0))}),n.on("focusout",()=>{yp.setEditorTimeout(n,()=>{const t=e.focusedEditor;wp(Ep(n))&&t===n||o(n,Cr),Sp(n,Ep(n))||t!==n||(n.dispatch("blur",{focusedEditor:null}),e.focusedEditor=null)})}),vp||(vp=t=>{const n=e.activeEditor;n&&eo(t).each(t=>{const o=t;o.ownerDocument===document&&(o===document.body||Sp(n,o)||e.focusedEditor!==n||(n.dispatch("blur",{focusedEditor:null}),e.focusedEditor=null))})},Cp.bind(document,"focusin",vp))},_p=(e,t)=>{e.focusedEditor===t.editor&&(e.focusedEditor=null),!e.activeEditor&&vp&&(Cp.unbind(document,"focusin",vp),vp=null)},kp=(e,t)=>{((e,t)=>(e=>e.collapsed?I.from(hl(e.startContainer,e.startOffset)).map(un.fromDom):I.none())(t).bind(t=>$i(t)?I.some(t):Cn(e,t)?I.none():I.some(e)))(un.fromDom(e.getBody()),t).bind(e=>Af(e.dom)).fold(()=>{e.selection.normalize()},t=>e.selection.setRng(t.toRange()))},Np=e=>{if(e.setActive)try{e.setActive()}catch{e.focus()}else e.focus()},Ap=e=>e.inline?(e=>{const t=e.getBody();return t&&(n=un.fromDom(t),lo(n)||(o=n,co(Qn(o)).filter(e=>o.dom.contains(e.dom))).isSome());var n,o})(e):(e=>C(e.iframeElement)&&lo(un.fromDom(e.iframeElement)))(e),Rp=e=>Ap(e)||(e=>{const t=Qn(un.fromDom(e.getElement()));return co(t).filter(t=>!wp(t.dom)&&Sp(e,t.dom)).isSome()})(e),Dp=e=>e.editorManager.setActive(e),Tp={BACKSPACE:8,DELETE:46,DOWN:40,ENTER:13,ESC:27,LEFT:37,RIGHT:39,SPACEBAR:32,TAB:9,UP:38,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,modifierPressed:e=>e.shiftKey||e.ctrlKey||e.altKey||Tp.metaKeyPressed(e),metaKeyPressed:e=>sn.os.isMacOS()||sn.os.isiOS()?e.metaKey:e.ctrlKey&&!e.altKey},Op="data-mce-selected",Bp=`table,img,figure.image,hr,video,span.mce-preview-object,details,${As}`,Pp=Math.abs,Lp=Math.round,Mp={nw:[0,0,-1,-1],ne:[1,0,1,-1],se:[1,1,1,1],sw:[0,1,-1,1]},Ip=(e,t)=>{const n=t.dom,o=t.getDoc(),r=document,s=t.getBody();let a,i,l,c,d,m,u,f,g,p,h,b,y,v,w;const S=e=>C(e)&&(hs(e)||n.is(e,"figure.image")),E=e=>xs(e)||n.hasClass(e,"mce-preview-object"),x=e=>{const n=e.target;((e,t)=>{if((e=>"longpress"===e.type||0===e.type.indexOf("touch"))(e)){const n=e.touches[0];return S(e.target)&&!lp(n.clientX,n.clientY,t)}return S(e.target)&&!lp(e.clientX,e.clientY,t)})(e,t.selection.getRng())&&!e.isDefaultPrevented()&&t.selection.select(n)},_=e=>n.hasClass(e,"mce-preview-object")&&C(e.firstElementChild)?[e,e.firstElementChild]:n.is(e,"figure.image")?[e.querySelector("img")]:[e],k=e=>{const o=Zd(t);return!(!o||t.mode.isReadOnly())&&"false"!==e.getAttribute("data-mce-resize")&&e!==t.getBody()&&(n.hasClass(e,"mce-preview-object")&&C(e.firstElementChild)?bn(un.fromDom(e.firstElementChild),o):bn(un.fromDom(e),o))},N=(e,o,r)=>{if(C(r)){const s=_(e);q(s,e=>{Rs(e)?((e,t,o)=>{e[t]=o;const r=400;if(e.width>r&&!("width"===t&&o{N(e,"width",t),N(e,"height",n)},R=e=>{let o,r,d,C,x;o=e.screenX-m,r=e.screenY-u,b=o*c[2]+f,y=r*c[3]+g,b=b<5?5:b,y=y<5?5:y,d=(S(a)||E(a)||Rs(a))&&!1!==Jd(t)?!Tp.modifierPressed(e):Tp.modifierPressed(e),d&&(Pp(o)>Pp(r)?(y=Lp(b*p),b=Lp(y/p)):(b=Lp(y/p),y=Lp(b*p))),A(i,b,y),C=c.startPos.x+o,x=c.startPos.y+r,C=C>0?C:0,x=x>0?x:0,n.setStyles(l,{left:C,top:x,display:"block"}),l.innerHTML=b+" × "+y,o=s.scrollWidth-v,r=s.scrollHeight-w,o+r!==0&&n.setStyles(l,{left:C-o,top:x-r}),h||(((e,t,n,o,r)=>{e.dispatch("ObjectResizeStart",{target:t,width:n,height:o,origin:r})})(t,a,f,g,"corner-"+c.name),h=!0)},D=()=>{const e=h;h=!1,e&&(N(a,"width",b),N(a,"height",y)),n.unbind(o,"mousemove",R),n.unbind(o,"mouseup",D),r!==o&&(n.unbind(r,"mousemove",R),n.unbind(r,"mouseup",D)),n.remove(i),n.remove(l),n.remove(d),T(a),e&&(((e,t,n,o,r)=>{e.dispatch("ObjectResized",{target:t,width:n,height:o,origin:r})})(t,a,b,y,"corner-"+c.name),n.setAttrib(a,"style",n.getAttrib(a,"style"))),t.nodeChanged()},T=e=>{M();const h=n.getPos(e,s),C=h.x,S=h.y,x=e.getBoundingClientRect(),N=x.width||x.right-x.left,T=x.height||x.bottom-x.top;a!==e&&(B(),a=e,b=y=0);const O=t.dispatch("ObjectSelected",{target:e});k(e)&&!O.isDefaultPrevented()?he(Mp,(e,t)=>{let h=n.get("mceResizeHandle"+t);h&&n.remove(h),h=n.add(s,"div",{id:"mceResizeHandle"+t,"data-mce-bogus":"all",class:"mce-resizehandle",unselectable:!0,style:"cursor:"+t+"-resize; margin:0; padding:0"}),n.bind(h,"mousedown",h=>{h.stopImmediatePropagation(),h.preventDefault(),(h=>{const b=_(a)[0];m=h.screenX,u=h.screenY,f=b.clientWidth,g=b.clientHeight,p=g/f,c=e,c.name=t,c.startPos={x:N*e[0]+C,y:T*e[1]+S},v=s.scrollWidth,w=s.scrollHeight,d=n.add(s,"div",{class:"mce-resize-backdrop","data-mce-bogus":"all"}),n.setStyles(d,{position:"fixed",left:"0",top:"0",width:"100%",height:"100%"}),i=((e,t)=>{if(E(t))return e.create("img",{src:sn.transparentSrc});if(as(t)){const n=Qe(c.name,"n")?ce:de,o=t.cloneNode(!0);return n(e.select("tr",o)).each(t=>{const n=e.select("td,th",t);e.setStyle(t,"height",null),q(n,t=>e.setStyle(t,"height",null))}),o}return t.cloneNode(!0)})(n,a),n.addClass(i,"mce-clonedresizable"),n.setAttrib(i,"data-mce-bogus","all"),i.contentEditable="false",n.setStyles(i,{left:C,top:S,margin:0}),A(i,N,T),i.removeAttribute(Op),s.appendChild(i),n.bind(o,"mousemove",R),n.bind(o,"mouseup",D),r!==o&&(n.bind(r,"mousemove",R),n.bind(r,"mouseup",D)),l=n.add(s,"div",{class:"mce-resize-helper","data-mce-bogus":"all"},f+" × "+g)})(h)}),e.elm=h,n.setStyles(h,{left:N*e[0]+C-h.offsetWidth/2,top:T*e[1]+S-h.offsetHeight/2})}):B(!1)},O=at(T,0),B=(e=!0)=>{O.cancel(),M(),a&&e&&a.removeAttribute(Op),he(Mp,(e,t)=>{const o=n.get("mceResizeHandle"+t);o&&(n.unbind(o),n.remove(o))})},P=(e,t)=>n.isChildOf(e,t),L=o=>{if(h||t.removed||t.composing)return;const r="mousedown"===o.type?o.target:e.getNode(),a=fr(un.fromDom(r),Bp).map(e=>e.dom).filter(e=>n.isEditable(e.parentElement)||"IMG"===e.nodeName&&n.isEditable(e)).getOrUndefined(),i=C(a)?n.getAttrib(a,Op,"1"):"1";if(q(n.select(`img[${Op}],hr[${Op}]`),e=>{e.removeAttribute(Op)}),C(a)&&P(a,s)&&Rp(t)){I();const t=e.getStart(!0);if(P(t,a)&&P(e.getEnd(!0),a))return n.setAttrib(a,Op,i),void O.throttle(a)}B()},M=()=>{he(Mp,e=>{e.elm&&(n.unbind(e.elm),delete e.elm)})},I=()=>{try{t.getDoc().execCommand("enableObjectResizing",!1,"false")}catch{}};return t.on("init",()=>{I(),t.on("NodeChange ResizeEditor ResizeWindow ResizeContent drop",L),t.on("keyup compositionend",e=>{a&&"TABLE"===a.nodeName&&L(e)}),t.on("hide blur",B),t.on("contextmenu longpress",x,!0)}),t.on("remove",M),{isResizable:k,showResizeRect:T,hideResizeRect:B,updateResizeRect:L,destroy:()=>{O.cancel(),a=i=d=null}}},Fp=(e,t,n)=>{const o=Ln(un.fromDom(n));return Vr(o.dom,e,t).map(e=>{const t=n.createRange();return t.setStart(e.start.dom,e.soffset),t.setEnd(e.finish.dom,e.foffset),t}).getOrUndefined()},Up=(e,t)=>C(e)&&C(t)&&e.startContainer===t.startContainer&&e.startOffset===t.startOffset&&e.endContainer===t.endContainer&&e.endOffset===t.endOffset,zp=(e,t,n)=>null!==((e,t,n)=>{let o=e;for(;o&&o!==t;){if(n(o))return o;o=o.parentNode}return null})(e,t,n),jp=(e,t,n)=>zp(e,t,e=>e.nodeName===n),$p=(e,t)=>el(e)&&!zp(e,t,Tf),Hp=(e,t,n)=>{const o=t.parentNode;if(o){const r=new Kr(t,e.getParent(o,e.isBlock)||e.getRoot());let s;for(;s=r[n?"prev":"next"]();)if(ps(s))return!0}return!1},Vp=(e,t,n,o,r)=>{const s=e.getRoot(),a=e.schema.getNonEmptyElements(),i=r.parentNode;let l,c;if(!i)return I.none();const d=e.getParent(i,e.isBlock)||s;if(o&&ps(r)&&t&&e.isEmpty(d))return I.some(Kl(i,e.nodeIndex(r)));const m=new Kr(r,d);for(;c=m[o?"prev":"next"]();){if("false"===e.getContentEditableParent(c)||$p(c,s))return I.none();if(cs(c)&&c.data.length>0)return jp(c,s,"A")?I.none():I.some(Kl(c,o?c.data.length:0));if(e.isBlock(c)||a[c.nodeName.toLowerCase()])return I.none();l=c}return us(l)?I.none():n&&l?I.some(Kl(l,0)):I.none()},qp=(e,t,n,o)=>{const r=e.getRoot();let s,a=!1,i=n?o.startContainer:o.endContainer,l=n?o.startOffset:o.endOffset;const c=es(i)&&l===i.childNodes.length,d=e.schema.getNonEmptyElements();let m=n;if(el(i))return I.none();if(es(i)&&l>i.childNodes.length-1&&(m=!1),fs(i)&&(i=r,l=0),i===r){if(m&&(s=i.childNodes[l>0?l-1:0],s)){if(el(s))return I.none();if(d[s.nodeName]||as(s))return I.none()}if(i.hasChildNodes()){if(l=Math.min(!m&&l>0?l-1:l,i.childNodes.length-1),i=i.childNodes[l],l=cs(i)&&c?i.data.length:0,!t&&i===r.lastChild&&as(i))return I.none();if(((e,t)=>{let n=t;for(;n&&n!==e;){if(vs(n))return!0;n=n.parentNode}return!1})(r,i)||el(i))return I.none();if(ks(i))return I.none();if(i.hasChildNodes()&&!as(i)){s=i;const t=new Kr(i,r);do{if(vs(s)||el(s)){a=!1;break}if(cs(s)&&s.data.length>0){l=m?0:s.data.length,i=s,a=!0;break}if(d[s.nodeName.toLowerCase()]&&!Ss(s)){l=e.nodeIndex(s),i=s.parentNode,m||l++,a=!0;break}}while(s=m?t.next():t.prev())}}}return t&&(cs(i)&&0===l&&Vp(e,c,t,!0,i).each(e=>{i=e.container(),l=e.offset(),a=!0}),es(i)&&(s=i.childNodes[l],s||(s=i.childNodes[l-1]),!s||!ps(s)||(e=>"A"===e.previousSibling?.nodeName)(s)||Hp(e,s,!1)||Hp(e,s,!0)||Vp(e,c,t,!0,s).each(e=>{i=e.container(),l=e.offset(),a=!0}))),m&&!t&&cs(i)&&l===i.data.length&&Vp(e,c,t,!1,i).each(e=>{i=e.container(),l=e.offset(),a=!0}),a&&i?I.some(Kl(i,l)):I.none()},Wp=(e,t)=>{const n=t.collapsed,o=t.cloneRange(),r=Kl.fromRangeStart(t);return qp(e,n,!0,o).each(e=>{n&&Kl.isAbove(r,e)||o.setStart(e.container(),e.offset())}),n||qp(e,n,!1,o).each(e=>{o.setEnd(e.container(),e.offset())}),n&&o.collapse(!0),Up(t,o)?I.none():I.some(o)},Kp=(e,t)=>e.splitText(t),Yp=e=>{let t=e.startContainer,n=e.startOffset,o=e.endContainer,r=e.endOffset;if(t===o&&cs(t)){if(n>0&&nn){r-=n;const e=Kp(o,r).previousSibling;t=o=e,r=e.data.length,n=0}else r=0}else if(cs(t)&&n>0&&n0&&r({walk:(t,n)=>Yg(e,t,n),split:Yp,expand:(t,n={type:"word"})=>{if("word"===n.type){const n=Kg(e,t,[{inline:"span"}],{includeTrailingSpace:!1,expandToBlock:!1}),o=e.createRng();return o.setStart(n.startContainer,n.startOffset),o.setEnd(n.endContainer,n.endOffset),o}return t},normalize:t=>Wp(e,t).fold(L,e=>(t.setStart(e.startContainer,e.startOffset),t.setEnd(e.endContainer,e.endOffset),!0))});Gp.compareRanges=Up,Gp.getCaretRangeFromPoint=Fp,Gp.getSelectedNode=pl,Gp.getNode=hl;const Xp=(e,t)=>e.view(t).fold(N([]),t=>{const n=e.owner(t),o=Xp(e,n);return[t].concat(o)});var Qp=Object.freeze({__proto__:null,view:e=>(e.dom===document?I.none():I.from(e.dom.defaultView?.frameElement)).map(un.fromDom),owner:e=>Pn(e)});const Zp=e=>"textarea"===En(e),Jp=(e,t)=>{const n=(e=>{const t=e.dom.ownerDocument,n=t.body,o=t.defaultView,r=t.documentElement;if(n===e.dom)return Go(n.offsetLeft,n.offsetTop);const s=Xo(o?.pageYOffset,r.scrollTop),a=Xo(o?.pageXOffset,r.scrollLeft),i=Xo(r.clientTop,n.clientTop),l=Xo(r.clientLeft,n.clientLeft);return Qo(e).translate(a-l,s-i)})(e),o=(e=>Ko.get(e))(e);return{element:e,bottom:n.top+o,height:o,pos:n,cleanup:t}},eh=(e,t,n,o)=>{rh(e,(r,s)=>nh(e,t,n,o),n)},th=(e,t,n,o,r)=>{const s={elm:o.element.dom,alignToTop:r};((e,t)=>e.dispatch("ScrollIntoView",t).isDefaultPrevented())(e,s)||(n(e,t,Zo(t).top,o,r),((e,t)=>{e.dispatch("AfterScrollIntoView",t)})(e,s))},nh=(e,t,n,o)=>{const r=un.fromDom(e.getBody()),s=un.fromDom(e.getDoc());r.dom.offsetWidth;const a=((e,t)=>{const n=((e,t)=>{const n=Vn(e);if(0===n.length||Zp(e))return{element:e,offset:t};if(t\ufeff
    ');return mo(n.element,o),Jp(o,()=>Ao(o))})(un.fromDom(n.startContainer),n.startOffset);th(e,s,t,a,o),a.cleanup()},oh=(e,t,n,o)=>{const r=un.fromDom(e.getDoc());th(e,r,n,(e=>Jp(un.fromDom(e),x))(t),o)},rh=(e,t,n)=>{const o=n.startContainer,r=n.startOffset,s=n.endContainer,a=n.endOffset;t(un.fromDom(o),un.fromDom(s));const i=e.dom.createRng();i.setStart(o,r),i.setEnd(s,a),e.selection.setRng(n)},sh=(e,t,n,o,r)=>{const s=t.pos;if(o)Jo(s.left,Math.max(0,s.top-30),r);else{const o=s.top-n+t.height+30;Jo(-e.getBody().getBoundingClientRect().left,o,r)}},ah=(e,t,n,o,r,s)=>{const a=o+n,i=r.pos.top,l=r.bottom,c=l-i>=o;ia?sh(e,r,o,c?!1!==s:!0===s,t):l>a&&!c&&sh(e,r,o,!0===s,t)},ih=(e,t,n,o,r)=>{const s=Ln(t).dom.innerHeight;ah(e,t,n,s,o,r)},lh=(e,t,n,o,r)=>{const s=Ln(t).dom.innerHeight;ah(e,t,n,s,o,r);const a=(e=>{const t=ao(),n=Zo(t),o=((e,t)=>{const n=t.owner(e);return Xp(t,n)})(e,Qp),r=Qo(e),s=G(o,(e,t)=>{const n=Qo(t);return{left:e.left+n.left,top:e.top+n.top}},{left:0,top:0});return Go(s.left+r.left+n.left,s.top+r.top+n.top)})(o.element),i=Wr(window);a.topi.bottom&&er(o.element,!0===r)},ch=(e,t,n)=>eh(e,ih,t,n),dh=(e,t,n)=>oh(e,t,ih,n),mh=(e,t,n)=>eh(e,lh,t,n),uh=(e,t,n)=>oh(e,t,lh,n),fh=(e,t,n)=>{(e.inline?ch:mh)(e,t,n)},gh=(e,t)=>t.collapsed?e.isEditable(t.startContainer):e.isEditable(t.startContainer)&&e.isEditable(t.endContainer),ph=(e,t,n,o,r)=>{const s=n?t.startContainer:t.endContainer,a=n?t.startOffset:t.endOffset;return I.from(s).map(un.fromDom).map(e=>o&&t.collapsed?e:qn(e,r(e,a)).getOr(e)).bind(e=>An(e)?I.some(e):Mn(e).filter(An)).map(e=>e.dom).getOr(e)},hh=(e,t,n=!1)=>ph(e,t,!0,n,(e,t)=>Math.min(Yn(e),t)),bh=(e,t,n=!1)=>ph(e,t,!1,n,(e,t)=>t>0?t-1:t),yh=(e,t)=>{const n=e;for(;e&&cs(e)&&0===e.length;)e=t?e.nextSibling:e.previousSibling;return e||n},vh=(e,t)=>V(t,t=>{const n=e.dispatch("GetSelectionRange",{range:t});return n.range!==t?n.range:t}),Ch={"#text":3,"#comment":8,"#cdata":4,"#pi":7,"#doctype":10,"#document-fragment":11},wh=(e,t,n)=>{const o=n?"lastChild":"firstChild",r=n?"prev":"next";if(e[o])return e[o];if(e!==t){let n=e[r];if(n)return n;for(let o=e.parent;o&&o!==t;o=o.parent)if(n=o[r],n)return n}},Sh=e=>{const t=e.value??"";if(!Gr(t))return!1;const n=e.parent;return!n||"span"===n.name&&!n.attr("style")||!/^[ ]+$/.test(t)},Eh=e=>{const t="a"===e.name&&!e.attr("href")&&e.attr("id");return e.attr("name")||e.attr("id")&&!e.firstChild||e.attr("data-mce-bookmark")||t};class xh{static create(e,t){const n=new xh(e,Ch[e]||1);return t&&he(t,(e,t)=>{n.attr(t,e)}),n}name;type;attributes;value;parent;firstChild;lastChild;next;prev;raw;constructor(e,t){this.name=e,this.type=t,1===t&&(this.attributes=[],this.attributes.map={})}replace(e){const t=this;return e.parent&&e.remove(),t.insert(e,t),t.remove(),t}attr(e,t){const n=this;if(!u(e))return C(e)&&he(e,(e,t)=>{n.attr(t,e)}),n;const o=n.attributes;if(o){if(void 0!==t){if(null===t){if(e in o.map){delete o.map[e];let t=o.length;for(;t--;)if(o[t].name===e)return o.splice(t,1),n}return n}if(e in o.map){let n=o.length;for(;n--;)if(o[n].name===e){o[n].value=t;break}}else o.push({name:e,value:t});return o.map[e]=t,n}return o.map[e]}}clone(){const e=this,t=new xh(e.name,e.type),n=e.attributes;if(n){const e=[];e.map={};for(let t=0,o=n.length;tu(e.nodeValue)&&e.nodeValue.includes(Ki),Nh=e=>(0===e.length?"":`${V(e,e=>`[${e}]`).join(",")},`)+'[data-mce-bogus="all"]',Ah=e=>document.createTreeWalker(e,NodeFilter.SHOW_COMMENT,e=>kh(e)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP),Rh=e=>document.createTreeWalker(e,NodeFilter.SHOW_TEXT,e=>{if(kh(e)){const t=e.parentNode;return t&&_e(_h,t.nodeName)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}return NodeFilter.FILTER_SKIP}),Dh=e=>null!==Ah(e).nextNode(),Th=e=>null!==Rh(e).nextNode(),Oh=(e,t)=>null!==t.querySelector(Nh(e)),Bh=(e,t)=>{q(((e,t)=>t.querySelectorAll(Nh(e)))(e,t),t=>{const n=un.fromDom(t);"all"===wo(n,"data-mce-bogus")?Ao(n):q(e,e=>{Eo(n,e)&&xo(n,e)})})},Ph=e=>{let t=e.nextNode();for(;null!==t;)t.nodeValue=null,t=e.nextNode()},Lh=_(Ph,Ah),Mh=_(Ph,Rh),Ih=(e,t)=>{const n=[{condition:D(Oh,t),action:D(Bh,t)},{condition:Dh,action:Lh},{condition:Th,action:Mh}];let o=e,r=!1;return q(n,({condition:t,action:n})=>{t(o)&&(r||(o=e.cloneNode(!0),r=!0),n(o))}),o},Fh=e=>{const t=Ar(e,"[data-mce-bogus]");q(t,e=>{"all"===wo(e,"data-mce-bogus")?Ao(e):Mi(e)?(mo(e,un.fromText(ct)),Ao(e)):Ro(e)})},Uh=e=>{const t=Ar(e,"input");q(t,e=>{xo(e,"name")})},zh=(e,t,n)=>{let o;return o="raw"===t.format?dn.trim(Gi(Ih(n,e.serializer.getTempAttrs()).innerHTML)):"text"===t.format?((e,t)=>{const n=e.getDoc(),o=Qn(un.fromDom(e.getBody())),r=un.fromTag("div",n);vo(r,"data-mce-bogus","all"),jo(r,{position:"fixed",left:"-9999999px",top:"0"}),Mo(r,t.innerHTML),Fh(r),Uh(r);const s=(e=>Xn(e)?e:un.fromDom(Pn(e).dom.body))(o);go(s,r);const a=Gi(r.dom.innerText);return Ao(r),a})(e,n):"tree"===t.format?e.serializer.serialize(n,t):((e,t)=>{const n=Ed(e),o=new RegExp(`^(<${n}[^>]*>( | |\\s|\xa0|
    |)<\\/${n}>[\r\n]*|
    [\r\n]*)$`);return t.replace(o,"")})(e,e.serializer.serialize(n,t)),"text"!==t.format&&!Vi(un.fromDom(n))&&u(o)?dn.trim(o):o},jh=dn.makeMap,$h=e=>{const t=[],n=(e=e||{}).indent,o=jh(e.indent_before||""),r=jh(e.indent_after||""),s=Sa.getEncodeFunc(e.entity_encoding||"raw",e.entities),a="xhtml"!==e.element_format;return{start:(e,i,l)=>{if(n&&o[e]&&t.length>0){const e=t[t.length-1];e.length>0&&"\n"!==e&&t.push("\n")}if(t.push("<",e),i)for(let e=0,n=i.length;e":" />",l&&n&&r[e]&&t.length>0){const e=t[t.length-1];e.length>0&&"\n"!==e&&t.push("\n")}},end:e=>{let o;t.push(""),n&&r[e]&&t.length>0&&(o=t[t.length-1],o.length>0&&"\n"!==o&&t.push("\n"))},text:(e,n)=>{e.length>0&&(t[t.length]=n?e:s(e))},cdata:e=>{t.push("")},comment:e=>{t.push("\x3c!--",e,"--\x3e")},pi:(e,o)=>{o?t.push(""):t.push(""),n&&t.push("\n")},doctype:e=>{t.push("",n?"\n":"")},reset:()=>{t.length=0},getContent:()=>t.join("").replace(/\n$/,"")}},Hh=(e={},t=Ua())=>{const n=$h(e);return e.validate=!("validate"in e)||e.validate,{serialize:o=>{const r=e.validate,s={3:e=>{n.text(e.value??"",e.raw)},8:e=>{n.comment(e.value??"")},7:e=>{n.pi(e.name,e.value)},10:e=>{n.doctype(e.value??"")},4:e=>{n.cdata(e.value??"")},11:e=>{let t=e;if(t=t.firstChild)do{a(t)}while(t=t.next)}};n.reset();const a=e=>{const o=s[e.type];if(o)o(e);else{const o=e.name,s=o in t.getVoidElements();let i=e.attributes;if(r&&i&&i.length>1){const n=[];n.map={};const o=t.getElementRule(e.name);if(o){for(let e=0,t=o.attributesOrder.length;e{Vh.add(e)});const qh=new Set;q(["background-color"],e=>{qh.add(e)});const Wh=["font","text-decoration","text-emphasis"],Kh=(e,t)=>ge(((e,t)=>e.parseStyle(e.getAttrib(t,"style")))(e,t)),Yh=(e,t)=>H(Kh(e,t),e=>(e=>Vh.has(e))(e)),Gh=(e,t,n)=>I.from(n.container()).filter(cs).exists(o=>{const r=e?0:-1;return t(o.data.charAt(n.offset()+r))}),Xh=D(Gh,!0,Kf),Qh=D(Gh,!1,Kf),Zh=e=>{const t=e.container();return cs(t)&&(0===t.data.length||Yi(t.data)&&ip.isBookmarkNode(t.parentNode))},Jh=(e,t)=>n=>Gu(e?0:-1,n).filter(t).isSome(),eb=e=>hs(e)&&"block"===$o(un.fromDom(e),"display"),tb=e=>vs(e)&&!(e=>es(e)&&"all"===e.getAttribute("data-mce-bogus"))(e),nb=Jh(!0,eb),ob=Jh(!1,eb),rb=Jh(!0,xs),sb=Jh(!1,xs),ab=Jh(!0,as),ib=Jh(!1,as),lb=Jh(!0,tb),cb=Jh(!1,tb),db=(e,t)=>((e,t,n)=>Cn(t,e)?Fn(e,e=>n(e)||vn(e,t)).slice(0,-1):[])(e,t,L),mb=(e,t)=>[e].concat(db(e,t)),ub=(e,t,n)=>xf(e,t,n,Zh),fb=(e,t,n)=>Z(mb(un.fromDom(t.container()),e),(e=>t=>e.isBlock(En(t)))(n)),gb=(e,t,n,o)=>ub(e,t.dom,n).forall(e=>fb(t,n,o).fold(()=>!Yu(e,n,t.dom),o=>!Yu(e,n,t.dom)&&Cn(o,un.fromDom(e.container())))),pb=(e,t,n,o)=>fb(t,n,o).fold(()=>ub(e,t.dom,n).forall(e=>!Yu(e,n,t.dom)),t=>ub(e,t.dom,n).isNone()),hb=D(pb,!1),bb=D(pb,!0),yb=D(gb,!1),vb=D(gb,!0),Cb=e=>rf(e).exists(Mi),wb=(e,t,n,o)=>{const r=Y(mb(un.fromDom(n.container()),t),e=>o.isBlock(En(e))),s=ce(r).getOr(t);return Sf(e,s.dom,n).filter(Cb)},Sb=(e,t,n)=>rf(t).exists(Mi)||wb(!0,e,t,n).isSome(),Eb=(e,t,n)=>(e=>I.from(e.getNode(!0)).map(un.fromDom))(t).exists(Mi)||wb(!1,e,t,n).isSome(),xb=D(wb,!1),_b=D(wb,!0),kb=e=>Kl.isTextPosition(e)&&!e.isAtStart()&&!e.isAtEnd(),Nb=(e,t,n)=>{const o=Y(mb(un.fromDom(t.container()),e),e=>n.isBlock(En(e)));return ce(o).getOr(e)},Ab=(e,t,n)=>kb(t)?Qh(t):Qh(t)||Nf(Nb(e,t,n).dom,t).exists(Qh),Rb=(e,t,n)=>kb(t)?Xh(t):Xh(t)||kf(Nb(e,t,n).dom,t).exists(Xh),Db=e=>rf(e).bind(e=>lr(e,An)).exists(e=>(e=>$(["pre","pre-wrap"],e))($o(e,"white-space"))),Tb=(e,t)=>n=>{return o=new Kr(n,e)[t](),C(o)&&vs(o)&&Iu(o);var o},Ob=(e,t,n)=>!Db(t)&&(((e,t,n)=>((e,t)=>Nf(e.dom,t).isNone())(e,t)||((e,t)=>kf(e.dom,t).isNone())(e,t)||hb(e,t,n)||bb(e,t,n)||Eb(e,t,n)||Sb(e,t,n))(e,t,n)||Ab(e,t,n)||Rb(e,t,n)),Bb=(e,t,n)=>!Db(t)&&(hb(e,t,n)||yb(e,t,n)||Eb(e,t,n)||Ab(e,t,n)||((e,t)=>{const n=Nf(e.dom,t).getOr(t),o=Tb(e.dom,"prev");return t.isAtStart()&&(o(t.container())||o(n.container()))})(e,t)),Pb=(e,t,n)=>!Db(t)&&(bb(e,t,n)||vb(e,t,n)||Sb(e,t,n)||Rb(e,t,n)||((e,t)=>{const n=kf(e.dom,t).getOr(t),o=Tb(e.dom,"next");return t.isAtEnd()&&(o(t.container())||o(n.container()))})(e,t)),Lb=(e,t,n)=>Bb(e,t,n)||Pb(e,(e=>{const t=e.container(),n=e.offset();return cs(t)&&nqf(e.charAt(t)),Ib=(e,t)=>Kf(e.charAt(t)),Fb=(e,t,n,o)=>{const r=t.data,s=Kl(t,0);return n||!Mb(r,0)||Lb(e,s,o)?!!(n&&Ib(r,0)&&Bb(e,s,o))&&(t.data=dt+r.slice(1),!0):(t.data=" "+r.slice(1),!0)},Ub=(e,t,n,o)=>{const r=t.data,s=Kl(t,r.length-1);return n||!Mb(r,r.length-1)||Lb(e,s,o)?!!(n&&Ib(r,r.length-1)&&Pb(e,s,o))&&(t.data=r.slice(0,-1)+dt,!0):(t.data=r.slice(0,-1)+" ",!0)},zb=(e,t,n)=>{const o=t.container();if(!cs(o))return I.none();if((e=>{const t=e.container();return cs(t)&&Xe(t.data,dt)})(t)){const r=Fb(e,o,!1,n)||(e=>{const t=e.data,n=(e=>{const t=e.split("");return V(t,(e,n)=>qf(e)&&n>0&&n{if(0===n)return;const r=un.fromDom(e),s=ir(r,e=>o.isBlock(En(e))).getOr(r),a=e.data.slice(t,t+n),i=t+n>=e.data.length&&Pb(s,Kl(e,e.data.length),o),l=0===t&&Bb(s,Kl(e,0),o);e.replaceData(t,n,Qr(a,4,l,i))},$b=(e,t,n)=>{const o=e.data.slice(t),r=o.length-tt(o).length;jb(e,t,r,n)},Hb=(e,t,n)=>{const o=e.data.slice(0,t),r=o.length-nt(o).length;jb(e,t-r,r,n)},Vb=(e,t,n,o,r=!0)=>{const s=nt(e.data).length,a=r?e:t,i=r?t:e;return r?a.appendData(i.data):a.insertData(0,i.data),Ao(un.fromDom(i)),o&&$b(a,s,n),a},qb=(e,t)=>((e,t)=>{const n=e.container(),o=e.offset();return!Kl.isTextPosition(e)&&n===t.parentNode&&o>Kl.before(t).offset()})(t,e)?Kl(t.container(),t.offset()-1):t,Wb=e=>{return Nl(e.previousSibling)?I.some((t=e.previousSibling,cs(t)?Kl(t,t.data.length):Kl.after(t))):e.previousSibling?Rf(e.previousSibling):I.none();var t},Kb=e=>{return Nl(e.nextSibling)?I.some((t=e.nextSibling,cs(t)?Kl(t,0):Kl.before(t))):e.nextSibling?Af(e.nextSibling):I.none();var t},Yb=(e,t,n)=>((e,t,n)=>e?((e,t)=>Kb(t).orThunk(()=>Wb(t)).orThunk(()=>((e,t)=>kf(e,Kl.after(t)).orThunk(()=>Nf(e,Kl.before(t))))(e,t)))(t,n):((e,t)=>Wb(t).orThunk(()=>Kb(t)).orThunk(()=>((e,t)=>I.from(t.previousSibling?t.previousSibling:t.parentNode).bind(t=>Nf(e,Kl.before(t))).orThunk(()=>kf(e,Kl.after(t))))(e,t)))(t,n))(e,t,n).map(D(qb,n)),Gb=(e,t,n)=>{n.fold(()=>{e.focus()},n=>{e.selection.setRng(n.toRange(),t)})},Xb=(e,t)=>t&&_e(e.schema.getBlockElements(),En(t)),Qb=(e,t,n,o=!0,r=!1)=>{const s=Yb(t,e.getBody(),n.dom),a=ir(n,D(Xb,e),(i=e.getBody(),e=>e.dom===i));var i;const l=((e,t,n,o)=>{const r=zn(e).filter(Rn),s=jn(e).filter(Rn);return Ao(e),(a=r,i=s,l=t,c=(e,t,r)=>{const s=e.dom,a=t.dom,i=s.data.length;return Vb(s,a,n,o),r.container()===a?Kl(s,i):r},a.isSome()&&i.isSome()&&l.isSome()?I.some(c(a.getOrDie(),i.getOrDie(),l.getOrDie())):I.none()).orThunk(()=>(o&&(r.each(e=>Hb(e.dom,e.dom.length,n)),s.each(e=>$b(e.dom,0,n))),t));var a,i,l,c})(n,s,e.schema,((e,t)=>_e(e.schema.getTextInlineElements(),En(t)))(e,n));e.dom.isEmpty(e.getBody())?(e.setContent(""),e.selection.setCursorLocation()):a.bind(t=>((e,t,n)=>{if(Ls(e,t)){const e=un.fromHtml('
    ');return n?q(Vn(t),e=>{Tg(e)||Ao(e)}):No(t),go(t,e),I.some(Kl.before(e.dom))}return I.none()})(e.schema,t,r)).fold(()=>{o&&Gb(e,t,l)},n=>{o&&Gb(e,t,I.some(n))})},Zb=/[\u0591-\u07FF\uFB1D-\uFDFF\uFE70-\uFEFC]/,Jb=(e,t)=>bn(un.fromDom(t),Qd(e))&&!Zs(e.schema,t)&&e.dom.isEditable(t),ey=e=>"rtl"===gi.DOM.getStyle(e,"direction",!0)||(e=>Zb.test(e))(e.textContent??""),ty=(e,t,n)=>{const o=((e,t,n)=>Y(gi.DOM.getParents(n.container(),"*",t),e))(e,t,n);return I.from(o[o.length-1])},ny=(e,t)=>{const n=t.container(),o=t.offset();return e?Ji(n)?cs(n.nextSibling)?Kl(n.nextSibling,0):Kl.after(n):nl(t)?Kl(n,o+1):t:Ji(n)?cs(n.previousSibling)?Kl(n.previousSibling,n.previousSibling.data.length):Kl.before(n):ol(t)?Kl(n,o-1):t},oy=D(ny,!0),ry=D(ny,!1),sy=(e,t)=>{const n=e=>e.stopImmediatePropagation();e.on("beforeinput input",n,!0),e.getDoc().execCommand(t),e.off("beforeinput input",n)},ay=e=>sy(e,"Delete"),iy=e=>sy(e,"ForwardDelete"),ly=e=>Ui(e)||ji(e),cy=(e,t)=>Cn(e,t)?lr(t,ly,(e=>t=>ze(Mn(t),e,vn))(e)):I.none(),dy=(e,t=!0)=>{e.dom.isEmpty(e.getBody())&&e.setContent("",{no_selection:!t})},my=(e,t,n)=>$e(Af(n),Rf(n),(o,r)=>{const s=ny(!0,o),a=ny(!1,r),i=ny(!1,t);return e?kf(n,i).exists(e=>e.isEqual(a)&&t.isEqual(s)):Nf(n,i).exists(e=>e.isEqual(s)&&t.isEqual(a))}).getOr(!0),uy=e=>(kn(e)?zn(e):Kn(e)).bind(uy).orThunk(()=>I.some(e)),fy=(e,t,n,o=!0)=>{t.deleteContents();const r=uy(n).getOr(n),s=un.fromDom(e.dom.getParent(r.dom,e.dom.isBlock)??n.dom);if(s.dom===e.getBody()?dy(e,o):Ls(e.schema,s,{checkRootAsContent:!1})&&(Wi(s),o&&e.selection.setCursorLocation(s.dom,0)),!vn(n,s)){const t=ze(Mn(s),n)?[]:Un(s);q(t.concat(Vn(n)),t=>{vn(t,s)||Cn(t,s)||!Ls(e.schema,t)||Ao(t)})}},gy=e=>Ar(e,"td,th"),py=(e,t)=>Zf(un.fromDom(e),t),hy=(e,t)=>({start:e,end:t}),by=Ne([{singleCellTable:["rng","cell"]},{fullTable:["table"]},{partialTable:["cells","outsideDetails"]},{multiTable:["startTableCells","endTableCells","betweenRng"]}]),yy=(e,t)=>fr(un.fromDom(e),"td,th",t),vy=e=>!vn(e.start,e.end),Cy=(e,t)=>Zf(e.start,t).bind(n=>Zf(e.end,t).bind(e=>He(vn(n,e),n))),wy=e=>t=>Cy(t,e).map(e=>((e,t,n)=>({rng:e,table:t,cells:n}))(t,e,gy(e))),Sy=(e,t,n,o)=>{if(n.collapsed||!e.forall(vy))return I.none();if(t.isSameTable){const t=e.bind(wy(o));return I.some({start:t,end:t})}{const e=yy(n.startContainer,o),t=yy(n.endContainer,o),r=e.bind((e=>t=>Zf(t,e).bind(e=>de(gy(e)).map(e=>hy(t,e))))(o)).bind(wy(o)),s=t.bind((e=>t=>Zf(t,e).bind(e=>ce(gy(e)).map(e=>hy(e,t))))(o)).bind(wy(o));return I.some({start:r,end:s})}},Ey=(e,t)=>J(e,e=>vn(e,t)),xy=e=>$e(Ey(e.cells,e.rng.start),Ey(e.cells,e.rng.end),(t,n)=>e.cells.slice(t,n+1)),_y=(e,t)=>{const{startTable:n,endTable:o}=t,r=e.cloneRange();return n.each(e=>r.setStartAfter(e.dom)),o.each(e=>r.setEndBefore(e.dom)),r},ky=(e,t)=>{const n=(e=>t=>vn(e,t))(e),o=((e,t)=>{const n=yy(e.startContainer,t),o=yy(e.endContainer,t);return $e(n,o,hy)})(t,n),r=((e,t)=>{const n=py(e.startContainer,t),o=py(e.endContainer,t),r=n.isSome(),s=o.isSome(),a=$e(n,o,vn).getOr(!1);return(e=>$e(e.startTable,e.endTable,(t,n)=>{const o=Dr(t,e=>vn(e,n)),r=Dr(n,e=>vn(e,t));return o||r?{...e,startTable:o?I.none():e.startTable,endTable:r?I.none():e.endTable,isSameTable:!1,isMultiTable:!1}:e}).getOr(e))({startTable:n,endTable:o,isStartInTable:r,isEndInTable:s,isSameTable:a,isMultiTable:!a&&r&&s})})(t,n);return((e,t,n)=>e.exists(e=>((e,t)=>!vy(e)&&Cy(e,t).exists(e=>{const t=e.dom.rows;return 1===t.length&&1===t[0].cells.length}))(e,n)&&tg(e.start,t)))(o,t,n)?o.map(e=>by.singleCellTable(t,e.start)):r.isMultiTable?((e,t,n,o)=>Sy(e,t,n,o).bind(({start:e,end:o})=>{const r=e.bind(xy).getOr([]),s=o.bind(xy).getOr([]);if(r.length>0&&s.length>0){const e=_y(n,t);return I.some(by.multiTable(r,s,e))}return I.none()}))(o,r,t,n):((e,t,n,o)=>Sy(e,t,n,o).bind(({start:e,end:t})=>e.or(t)).bind(e=>{const{isSameTable:o}=t,r=xy(e).getOr([]);if(o&&e.cells.length===r.length)return I.some(by.fullTable(e.table));if(r.length>0){if(o)return I.some(by.partialTable(r,I.none()));{const e=_y(n,t);return I.some(by.partialTable(r,I.some({...t,rng:e})))}}return I.none()}))(o,r,t,n)},Ny=e=>q(e,e=>{xo(e,"contenteditable"),Wi(e)}),Ay=(e,t,n,o)=>{const r=n.cloneRange();o?(r.setStart(n.startContainer,n.startOffset),r.setEndAfter(t.dom.lastChild)):(r.setStartBefore(t.dom.firstChild),r.setEnd(n.endContainer,n.endOffset)),Oy(e,r,t,!1).each(e=>e())},Ry=e=>{const t=Qf(e),n=un.fromDom(e.selection.getNode());ws(n.dom)&&Ls(e.schema,n)?e.selection.setCursorLocation(n.dom,0):e.selection.collapse(!0),t.length>1&&H(t,e=>vn(e,n))&&vo(n,"data-mce-selected","1")},Dy=(e,t,n)=>I.some(()=>{const o=e.selection.getRng(),r=n.bind(({rng:n,isStartInTable:r})=>{const s=((e,t)=>I.from(e.dom.getParent(t,e.dom.isBlock)).map(un.fromDom))(e,r?n.endContainer:n.startContainer);n.deleteContents(),((e,t,n)=>{n.each(n=>{t?Ao(n):(Wi(n),e.selection.setCursorLocation(n.dom,0))})})(e,r,s.filter(D(Ls,e.schema)));const a=r?t[0]:t[t.length-1];return Ay(e,a,o,r),Ls(e.schema,a)?I.none():I.some(r?t.slice(1):t.slice(0,-1))}).getOr(t);Ny(r),Ry(e)}),Ty=(e,t,n,o)=>I.some(()=>{const r=e.selection.getRng(),s=t[0],a=n[n.length-1];Ay(e,s,r,!0),Ay(e,a,r,!1);const i=Ls(e.schema,s)?t:t.slice(1),l=Ls(e.schema,a)?n:n.slice(0,-1);Ny(i.concat(l)),o.deleteContents(),Ry(e)}),Oy=(e,t,n,o=!0)=>I.some(()=>{fy(e,t,n,o)}),By=(e,t)=>I.some(()=>Qb(e,!1,t)),Py=(e,t)=>Z(mb(t,e),Hi),Ly=(e,t)=>Z(mb(t,e),On("caption")),My=(e,t)=>I.some(()=>{Wi(t),e.selection.setCursorLocation(t.dom,0)}),Iy=(e,t)=>e?ab(t):ib(t),Fy=(e,t,n)=>{const o=un.fromDom(e.getBody());return Ly(o,n).fold(()=>((e,t,n,o)=>{const r=Kl.fromRangeStart(e.selection.getRng());return Py(n,o).bind(o=>Ls(e.schema,o,{checkRootAsContent:!1})?My(e,o):((e,t,n,o,r)=>Ef(n,e.getBody(),r).bind(e=>Py(t,un.fromDom(e.getNode())).bind(e=>vn(e,o)?I.none():I.some(x))))(e,n,t,o,r))})(e,t,o,n).orThunk(()=>He(((e,t)=>{const n=Kl.fromRangeStart(e.selection.getRng());return Iy(t,n)||Sf(t,e.getBody(),n).exists(e=>Iy(t,e))})(e,t),x)),n=>((e,t,n,o)=>{const r=Kl.fromRangeStart(e.selection.getRng());return Ls(e.schema,o)?My(e,o):((e,t,n,o,r)=>Ef(n,e.getBody(),r).fold(()=>I.some(x),s=>((e,t,n,o)=>Af(e.dom).bind(r=>Rf(e.dom).map(e=>t?n.isEqual(r)&&o.isEqual(e):n.isEqual(e)&&o.isEqual(r))).getOr(!0))(o,n,r,s)?((e,t)=>My(e,t))(e,o):((e,t,n)=>Ly(e,un.fromDom(n.getNode())).fold(()=>I.some(x),e=>He(!vn(e,t),x)))(t,o,s)))(e,n,t,o,r)})(e,t,o,n))},Uy=(e,t)=>{const n=un.fromDom(e.selection.getStart(!0)),o=Qf(e);return e.selection.isCollapsed()&&0===o.length?Fy(e,t,n):((e,t,n)=>{const o=un.fromDom(e.getBody()),r=e.selection.getRng();return 0!==n.length?Dy(e,n,I.none()):((e,t,n,o)=>Ly(t,o).fold(()=>((e,t,n)=>ky(t,n).bind(t=>t.fold(D(Oy,e),D(By,e),D(Dy,e),D(Ty,e))))(e,t,n),t=>((e,t)=>My(e,t))(e,t)))(e,o,r,t)})(e,n,o)},zy=(e,t)=>{let n=t;for(;n&&n!==e;){if(ys(n)||vs(n))return n;n=n.parentNode}return null},jy=["data-ephox-","data-mce-","data-alloy-","data-snooker-","_"],$y=dn.each,Hy=e=>{const t=e.dom,n=new Set(e.serializer.getTempAttrs()),o=e=>H(jy,t=>Qe(e,t))||n.has(e);return{compare:(e,n)=>{if(e.nodeName!==n.nodeName||e.nodeType!==n.nodeType)return!1;const r=e=>{const n={};return $y(t.getAttribs(e),r=>{const s=r.nodeName.toLowerCase();"style"===s||o(s)||(n[s]=t.getAttrib(e,s))}),n},s=(e,t)=>{for(const n in e)if(_e(e,n)){const o=t[n];if(y(o))return!1;if(e[n]!==o)return!1;delete t[n]}for(const e in t)if(_e(t,e))return!1;return!0};if(es(e)&&es(n)){if(!s(r(e),r(n)))return!1;if(!s(t.parseStyle(t.getAttrib(e,"style")),t.parseStyle(t.getAttrib(n,"style"))))return!1}return!Vf(e)&&!Vf(n)},isAttributeInternal:o}},Vy=(e,t)=>{if(cs(e))return{container:e,offset:t};const n=Gp.getNode(e,t);return cs(n)?{container:n,offset:t>=e.childNodes.length?n.data.length:0}:n.previousSibling&&cs(n.previousSibling)?{container:n.previousSibling,offset:n.previousSibling.data.length}:n.nextSibling&&cs(n.nextSibling)?{container:n.nextSibling,offset:0}:{container:e,offset:t}},qy=gi.DOM,Wy=()=>qy.create("span",{"data-mce-type":"bookmark"}),Ky=(e,t,n)=>{if(es(e)){const o=n();return e.hasChildNodes()?t===e.childNodes.length?e.appendChild(o):e.insertBefore(o,e.childNodes[t]):e.appendChild(o),{container:o,offset:0}}return{container:e,offset:t}},Yy=(e,t)=>{if(es(e)&&C(e.parentNode)){const n=e;t=(e=>{let t=e.parentNode?.firstChild,n=0;for(;t;){if(t===e)return n;es(t)&&"bookmark"===t.getAttribute("data-mce-type")||n++,t=t.nextSibling}return-1})(e),e=e.parentNode,qy.remove(n),!e.hasChildNodes()&&qy.isBlock(e)&&e.appendChild(qy.create("br"))}return{container:e,offset:t}},Gy=(e,t,n,o)=>{const r=qy.createRng();return r.setStart(e,t),r.setEnd(n,o),(e=>{const t=e.cloneRange(),n=Vy(e.startContainer,e.startOffset);t.setStart(n.container,n.offset);const o=Vy(e.endContainer,e.endOffset);return t.setEnd(o.container,o.offset),t})(r)},Xy=(e,t=Wy)=>{const{container:n,offset:o}=Ky(e.startContainer,e.startOffset,t);if(e.collapsed)return{startContainer:n,startOffset:o};{const{container:r,offset:s}=Ky(e.endContainer,e.endOffset,t);return{startContainer:n,startOffset:o,endContainer:r,endOffset:s}}},Qy=e=>{const{container:t,offset:n}=Yy(e.startContainer,e.startOffset);if(y(e.endContainer)||y(e.endOffset))return Gy(t,n,t,n);{const{container:o,offset:r}=Yy(e.endContainer,e.endOffset);return Gy(t,n,o,r)}},Zy=(e,t,n,o)=>{if(dn.each(n.styles,(n,r)=>{e.setStyle(t,r,yg(n,o))}),n.styles){const n=e.getAttrib(t,"style");n&&e.setAttrib(t,"data-mce-style",n)}},Jy=(e,t,n,o,r)=>{const s=e.dom;w(n.onformat)&&n.onformat(t,n,o,r),Zy(s,t,n,o),dn.each(n.attributes,(e,n)=>{s.setAttrib(t,n,yg(e,o))}),dn.each(n.classes,e=>{const n=yg(e,o);s.hasClass(t,n)||s.addClass(t,n)})},ev=vg,tv=(e,t,n)=>{const o=e.formatter.get(n);if(o)for(let n=0;n{const s=e.dom.getRoot();if(t===s)return!1;const a=e.dom.getParent(t,t=>!!tv(e,t,n)||t.parentNode===s||!!sv(e,t,n,o,!0));return!!sv(e,a,n,o,r)},ov=(e,t,n)=>!(!Ag(n)||!ev(t,n.inline))||!(!_g(n)||!ev(t,n.block))||!!Ng(n)&&es(t)&&e.is(t,n.selector),rv=(e,t,n,o,r,s)=>{const a=n[o],i="attributes"===o;if(w(n.onmatch))return n.onmatch(t,n,o);if(a)if(ft(a)){for(let n=0;n{const s=e.formatter.get(n),a=e.dom;if(s&&es(t))for(let n=0;nC(sv(e,t,n,o,r))||H(me(t.childNodes),t=>av(e,t,n,o,r)),iv=(e,t,n,o,r)=>{const s=e.dom;return!(!es(t)||"false"!==s.getContentEditable(t)||bg(e,t))&&H(hg(s,t),t=>av(e,t,n,o,r))},lv=(e,t,n,o,r)=>{if(o)return nv(e,o,t,n,r)||iv(e,o,t,n,r);if(o=e.selection.getNode(),nv(e,o,t,n,r)||iv(e,o,t,n,r))return!0;const s=e.selection.getStart();return!(s===o||!nv(e,s,t,n,r))},cv=Ki,dv=e=>{if(e){const t=new Kr(e,e);for(let e=t.current();e;e=t.next())if(cs(e))return e}return null},mv=e=>{const t=un.fromTag("span");return Co(t,{id:Df,"data-mce-bogus":"1","data-mce-type":"format-caret"}),e&&go(t,un.fromText(cv)),t},uv=(e,t,n)=>{const o=e.dom,r=e.selection;if(Dg(t))Qb(e,!1,un.fromDom(t),n,!0);else{const e=r.getRng(),n=o.getParent(t,o.isBlock),s=e.startContainer,a=e.startOffset,i=e.endContainer,l=e.endOffset,c=(e=>{const t=dv(e);return t&&t.data.charAt(0)===cv&&t.deleteData(0,1),t})(t);o.remove(t,!0),s===c&&a>0&&e.setStart(c,a-1),i===c&&l>0&&e.setEnd(c,l-1),n&&o.isEmpty(n)&&Wi(un.fromDom(n)),r.setRng(e)}},fv=(e,t,n)=>{const o=e.dom,r=e.selection;if(t)uv(e,t,n);else if(!(t=Of(e.getBody(),r.getStart())))for(;t=o.get(Df);)uv(e,t,n)},gv=(e,t)=>(e.appendChild(t),t),pv=(e,t)=>{const n=G(e,(e,t)=>gv(e,t.cloneNode(!1)),t),o=n.ownerDocument??document;return gv(n,o.createTextNode(cv))},hv=e=>rr(e,or(e).replace(new RegExp(`${dt}$`)," ")),bv=(e,t)=>{const n=()=>{null===t||e.dom.isEmpty(t)||zn(un.fromDom(t)).each(e=>{Rn(e)?hv(e):dr(e,e=>Rn(e)).each(e=>{Rn(e)&&hv(e)})})};e.once("input",t=>{t.data&&!Kf(t.data)&&(t.isComposing?e.once("compositionend",()=>{n()}):n())})},yv=(e,t,n,o)=>{const a=e.dom,i=e.selection;let l=!1;const c=e.formatter.get(t);if(!c)return;const d=i.getRng(),m=d.startContainer,u=d.startOffset;let f=m;cs(m)&&(u!==m.data.length&&(l=!0),f=f.parentNode);const g=[];let h;for(;f;){if(sv(e,f,t,n,o)){h=f;break}f.nextSibling&&(l=!0),g.push(f),f=f.parentNode}if(h)if(l){const r=i.getBookmark();d.collapse(!0);let s=Kg(a,d,c,{includeTrailingSpace:!0});s=Yp(s),e.formatter.remove(t,n,s,o),i.moveToBookmark(r)}else{const l=Of(e.getBody(),h),c=C(l)?a.getParents(h.parentNode,M,l):[],d=mv(!1).dom;((e,t,n)=>{const o=e.dom,r=o.getParent(n,D(ug,e.schema));r&&o.isEmpty(r)?n.parentNode?.replaceChild(t,n):((e=>{const t=Ar(e,"br"),n=Y((e=>{const t=[];let n=e.dom;for(;n;)t.push(un.fromDom(n)),n=n.lastChild;return t})(e).slice(-1),Mi);t.length===n.length&&q(n,Ao)})(un.fromDom(n)),o.isEmpty(n)?n.parentNode?.replaceChild(t,n):o.insertAfter(t,n))})(e,d,l??h);const m=((e,t,n,o,a,i)=>{const l=e.formatter,c=e.dom,d=Y(ge(l.get()),e=>e!==o&&!Xe(e,"removeformat")),m=((e,t,n)=>X(n,(n,o)=>{const r=((e,t)=>xg(e,t,e=>{const t=e=>w(e)||e.length>1&&"%"===e.charAt(0);return H(["styles","attributes"],n=>xe(e,n).exists(e=>{const n=p(e)?e:Ee(e);return H(n,t)}))}))(e,o);return e.formatter.matchNode(t,o,{},r)?n.concat([o]):n},[]))(e,n,d);if(Y(m,t=>!((e,t,n)=>{const o=["inline","block","selector","attributes","styles","classes"],a=e=>we(e,(e,t)=>H(o,e=>e===t));return xg(e,t,t=>{const o=a(t);return xg(e,n,e=>{const t=a(e);return((e,t,n=s)=>r(n).eq(e,t))(o,t)})})})(e,t,o)).length>0){const e=n.cloneNode(!1);return c.add(t,e),l.remove(o,a,e,i),c.remove(e),I.some(e)}return I.none()})(e,d,h,t,n,o),u=pv([...g,...m.toArray(),...c],d);l&&uv(e,l,C(l)),i.setCursorLocation(u,1),bv(e,d),a.isEmpty(h)&&a.remove(h)}},vv=e=>{const t=mv(!1),n=pv(e,t.dom);return{caretContainer:t,caretPosition:Kl(n,0)}},Cv=(e,t)=>{const{caretContainer:n,caretPosition:o}=vv(t);return mo(un.fromDom(e),n),Ao(un.fromDom(e)),o},wv=(e,t)=>{if(Tf(t.dom))return!1;const n=e.schema.getTextInlineElements();return _e(n,En(t))&&!Tf(t.dom)&&!ss(t.dom)},Sv=["fontWeight","fontStyle","color","fontSize","fontFamily"],Ev=(e,t)=>{const n=e.get(t);return p(n)?Z(n,e=>Ag(e)&&"span"===e.inline&&(e=>f(e.styles)&&H(ge(e.styles),e=>$(Sv,e)))(e)):I.none()},xv=(e,t)=>Nf(t,Kl.fromRangeStart(e)).isNone(),_v=(e,t)=>!1===kf(t,Kl.fromRangeEnd(e)).exists(e=>!ps(e.getNode())||kf(t,e).isSome()),kv=e=>t=>_s(t)&&e.isEditable(t),Nv=(e,t)=>V(e.getSelectedBlocks(),(n,o)=>0===o&&t(n)?e.dom.getParent(n,_s)??n:n),Av=e=>{const t=Qf(e);if(t.length>0){const e=ne(t,e=>Ar(e,"li"));return I.some(V(e,e=>e.dom))}return I.none()},Rv=e=>{const t=Av(e).getOrThunk(()=>Nv(e.selection,e=>!_s(e)));return Y(t,kv(e.selection.dom))},Dv=dn.each,Tv=e=>es(e)&&!Vf(e)&&!Tf(e)&&!ss(e),Ov=(e,t)=>{for(let n=e;n;n=n[t]){if(cs(n)&&ot(n.data))return e;if(es(n)&&!Vf(n))return n}return e},Bv=(e,t,n)=>{const o=Hy(e),r=ts(t)&&e.dom.isEditable(t),s=ts(n)&&e.dom.isEditable(n);if(r&&s){const r=Ov(t,"previousSibling"),s=Ov(n,"nextSibling");if(o.compare(r,s)){for(let e=r.nextSibling;e&&e!==s;){const t=e;e=e.nextSibling,r.appendChild(t)}return e.dom.remove(s),dn.each(dn.grep(s.childNodes),e=>{r.appendChild(e)}),r}}return n},Pv=(e,t,n,o)=>{if(o&&!1!==t.merge_siblings){const t=Bv(e,mg(o),o)??o;Bv(e,t,mg(t,!0))}},Lv=(e,t,n)=>{Dv(e.childNodes,e=>{Tv(e)&&(t(e)&&n(e),e.hasChildNodes()&&Lv(e,t,n))})},Mv=(e,t)=>n=>!(!n||!wg(e,n,t)),Iv=(e,t,n)=>o=>{e.setStyle(o,t,n),""===o.getAttribute("style")&&o.removeAttribute("style"),((e,t)=>{"SPAN"===t.nodeName&&0===e.getAttribs(t).length&&e.remove(t,!0)})(e,o)},Fv=Ne([{keep:[]},{rename:["name"]},{removed:[]}]),Uv=/^(src|href|style)$/,zv=dn.each,jv=vg,$v=(e,t,n)=>e.isChildOf(t,n)&&t!==n&&!e.isBlock(n),Hv=(e,t,n)=>{let o=t[n?"startContainer":"endContainer"],r=t[n?"startOffset":"endOffset"];if(es(o)){const e=o.childNodes.length-1;!n&&r&&r--,o=o.childNodes[r>e?e:r]}return cs(o)&&n&&r>=o.data.length&&(o=new Kr(o,e.getBody()).next()||o),cs(o)&&!n&&0===r&&(o=new Kr(o,e.getBody()).prev()||o),o},Vv=(e,t)=>{const n=t?"firstChild":"lastChild",o=e[n];return(e=>/^(TR|TH|TD)$/.test(e.nodeName))(e)&&o?"TR"===e.nodeName&&o[n]||o:e},qv=(e,t,n,o)=>{const r=e.create(n,o);return t.parentNode?.insertBefore(r,t),r.appendChild(t),r},Wv=(e,t,n,o,r)=>{const s=un.fromDom(t),a=un.fromDom(e.create(o,r)),i=n?Hn(s):$n(s);return bo(a,i),n?(mo(s,a),fo(a,s)):(uo(s,a),go(a,s)),a.dom},Kv=(e,t,n)=>{const o=t.parentNode;let r;const s=e.dom,a=Ed(e);_g(n)&&o===s.getRoot()&&(n.list_block&&jv(t,n.list_block)||q(me(t.childNodes),t=>{fg(e,a,t.nodeName.toLowerCase())?r?r.appendChild(t):(r=qv(s,t,a),s.setAttribs(r,xd(e))):r=null})),(e=>Ng(e)&&Ag(e)&&ze(xe(e,"mixed"),!0))(n)&&!jv(n.inline,t)||s.remove(t,!0)},Yv=(e,t,n)=>S(e)?{name:t,value:null}:{name:e,value:yg(t,n)},Gv=(e,t)=>{""===e.getAttrib(t,"style")&&(t.removeAttribute("style"),t.removeAttribute("data-mce-style"))},Xv=(e,t,n,o,r)=>{let s=!1;zv(n.styles,(a,i)=>{const{name:l,value:c}=Yv(i,a,o),d=Cg(c,l);(n.remove_similar||h(c)||!es(r)||jv(wg(e,r,l),d))&&e.setStyle(t,l,""),s=!0}),s&&Gv(e,t)},Qv=(e,t,n,o,r)=>{const s=e.dom,a=Hy(e),i=e.schema;if(Ag(t)&&Xs(i,t.inline)&&Zs(i,o)&&o.parentElement===e.getBody())return Kv(e,o,t),Fv.removed();if(!t.ceFalseOverride&&o&&"false"===s.getContentEditableParent(o))return Fv.keep();if(o&&!ov(s,o,t)&&!((e,t)=>t.links&&"A"===e.nodeName)(o,t))return Fv.keep();const l=o,c=t.preserve_attributes;if(Ag(t)&&"all"===t.remove&&p(c)){const e=Y(s.getAttribs(l),e=>$(c,e.name.toLowerCase()));if(s.removeAllAttribs(l),q(e,e=>s.setAttrib(l,e.name,e.value)),e.length>0)return Fv.rename("span")}if("all"!==t.remove){Xv(s,l,t,n,r),zv(t.attributes,(e,o)=>{const{name:a,value:i}=Yv(o,e,n);if(t.remove_similar||h(i)||!es(r)||jv(s.getAttrib(r,a),i)){if("class"===a){const e=s.getAttrib(l,a);if(e){let t="";if(q(e.split(/\s+/),e=>{/mce\-\w+/.test(e)&&(t+=(t?" ":"")+e)}),t)return void s.setAttrib(l,a,t)}}if(Uv.test(a)&&l.removeAttribute("data-mce-"+a),"style"===a&&os(["li"])(l)&&"none"===s.getStyle(l,"list-style-type"))return l.removeAttribute(a),void s.setStyle(l,"list-style-type","none");"class"===a&&l.removeAttribute("className"),l.removeAttribute(a)}}),zv(t.classes,e=>{e=yg(e,n),es(r)&&!s.hasClass(r,e)||s.removeClass(l,e)});const e=s.getAttribs(l);for(let t=0;tQv(e,t,n,o,o).fold(N(o),t=>(e.dom.createFragment().appendChild(o),e.dom.rename(o,t)),N(null)),Jv=(e,t,n,o,r)=>{(o||e.selection.isEditable())&&((e,t,n,o,r)=>{const s=e.formatter.get(t),a=s[0],i=e.dom,l=e.selection,c=o=>{const i=((e,t,n,o,r)=>{let s;return t.parentNode&&q(Eg(e.dom,t.parentNode).reverse(),t=>{if(!s&&es(t)&&"_start"!==t.id&&"_end"!==t.id){const a=sv(e,t,n,o,r);a&&!1!==a.split&&(s=t)}}),s})(e,o,t,n,r);return((e,t,n,o,r,s,a,i)=>{let l,c;const d=e.dom;if(n){const s=n.parentNode;for(let n=o.parentNode;n&&n!==s;n=n.parentNode){let o=d.clone(n,!1);for(let n=0;nH(s,o=>eC(e,o,n,t,t)),m=t=>{const n=me(t.childNodes),o=d(t)||H(s,e=>ov(i,t,e)),r=t.parentNode;if(!o&&C(r)&&Rg(a)&&d(r),a.deep&&n.length)for(let e=0;e{es(t)&&e.dom.getStyle(t,"text-decoration")===n&&t.parentNode&&Sg(i,t.parentNode)===n&&eC(e,{deep:!1,exact:!0,inline:"span",styles:{textDecoration:n}},void 0,t)})},u=e=>{const t=i.get(e?"_start":"_end");if(t){let n=t[e?"firstChild":"lastChild"];return(e=>Vf(e)&&es(e)&&("_start"===e.id||"_end"===e.id))(n)&&(n=n[e?"firstChild":"lastChild"]),cs(n)&&0===n.data.length&&(n=e?t.previousSibling||t.nextSibling:t.nextSibling||t.previousSibling),i.remove(t,!0),n}return null},f=t=>{let n,o,r=Kg(i,t,s,{includeTrailingSpace:t.collapsed});if(a.split){if(r=Yp(r),n=Hv(e,r,!0),o=Hv(e,r),n!==o){if(n=Vv(n,!0),o=Vv(o,!1),$v(i,n,o)){const e=I.from(n.firstChild).getOr(n);return c(Wv(i,e,!0,"span",{id:"_start","data-mce-type":"bookmark"})),void u(!0)}if($v(i,o,n)){const e=I.from(o.lastChild).getOr(o);return c(Wv(i,e,!1,"span",{id:"_end","data-mce-type":"bookmark"})),void u(!1)}n=qv(i,n,"span",{id:"_start","data-mce-type":"bookmark"}),o=qv(i,o,"span",{id:"_end","data-mce-type":"bookmark"});const e=i.createRng();e.setStartAfter(n),e.setEndBefore(o),Yg(i,e,e=>{q(e,e=>{Vf(e)||Vf(e.parentNode)||c(e)})}),c(n),c(o),n=u(!0),o=u()}else n=o=c(n);r.startContainer=n.parentNode?n.parentNode:n,r.startOffset=i.nodeIndex(n),r.endContainer=o.parentNode?o.parentNode:o,r.endOffset=i.nodeIndex(o)+1}Yg(i,r,e=>{q(e,m)})};if(o){if(ig(o)){const e=i.createRng();e.setStartBefore(o),e.setEndAfter(o),f(e)}else f(o);rd(e,t,o,n)}else l.isCollapsed()&&Ag(a)&&!Qf(e).length?yv(e,t,n,r):(cg(e,()=>rg(e,f),o=>Ag(a)&&lv(e,t,n,o)),e.nodeChanged()),((e,t,n)=>{"removeformat"===t?q(Rv(e),t=>{q(Sv,n=>e.dom.setStyle(t,n,"")),Gv(e.dom,t)}):Ev(e.formatter,t).each(t=>{q(Rv(e),o=>Xv(e.dom,o,t,n,null))})})(e,t,n),rd(e,t,o,n)})(e,t,n,o,r)},eC=(e,t,n,o,r)=>Qv(e,t,n,o,r).fold(L,t=>(e.dom.rename(o,t),!0),M),tC=["fontsize","subscript","superscript"],nC=["strikethrough",...tC],oC=(e,t)=>H(tC,n=>((e,t,n)=>C(e.matchNode(t.dom,n,{},"fontsize"===n)))(e,t,n)),rC=(e,t,n,o,r)=>{const s=t=>vn(un.fromDom(e.getRoot()),t)||e.isBlock(t.dom);q(t,t=>{((e,t,n,o,r)=>{const s=Fn(t,e).filter(An);return(a=s,i=n,ee(a,i).map(e=>e.i)).map(e=>{const t=s[e];return{container:t,innerWrapper:o(t),outerWrappers:[...r(To(t)).toArray(),...ne(s.slice(0,e),e=>n(e)?r(e).toArray():[To(e)])]}});var a,i})(s,t,n,o,r).each(({container:o,innerWrapper:s,outerWrappers:a})=>{e.split(o.dom,t.dom),((e,t,n,o)=>{q(Vn(e),e=>{An(e)&&n(e)&&o(e).isNone()&&Ro(e)}),q(Vn(e),e=>go(t,e)),fo(e,t)})(t,s,n,r),((e,t)=>{if(t.length>0){const n=t[t.length-1];mo(e,n);const o=X(t.slice(0,t.length-1),(e,t)=>(go(e,t),t),n);go(o,e)}})(t,a)})})},sC=(e,t,n)=>{const o=Xy(e.selection.getRng());rC(e.dom,n,n=>C(sv(e,n.dom,t)),n=>{const o=un.fromTag(En(n)),r=sv(e,n.dom,t,{});return C(r)&&(e=>!p(e.attributes)&&!p(e.styles))(r)&&Jy(e,o.dom,r),o},n=>{const o=sv(e,n.dom,t,{});return C(o)?((e,t,n,o)=>Qv(e,t,{},o).fold(()=>I.some(o),t=>I.some(e.dom.rename(o,t)),I.none))(e,o,0,n.dom).map(un.fromDom):I.some(n)}),e.selection.setRng(Qy(o))},aC=e=>["h1","h2","h3","h4","h5","h6"].includes(e.name),iC=(e,t,n,o)=>{const r=n.name;for(let t=0,s=e.length;t{const n=(e,n)=>{he(e,e=>{const o=me(e.nodes);q(e.filter.callbacks,r=>{for(let t=o.length-1;t>=0;t--){const r=o[t];(n?void 0!==r.attr(e.filter.name):r.name===e.filter.name)&&!v(r.parent)||o.splice(t,1)}o.length>0&&r(o,e.filter.name,t)})})};n(e.nodes,!1),n(e.attributes,!0)},cC=(e,t,n,o={})=>{const r=((e,t,n)=>{const o={nodes:{},attributes:{}};return n.firstChild&&((e,t)=>{let n=e;for(;n=n.walk();)t(n)})(n,n=>{iC(e,t,n,o)}),o})(e,t,n);lC(r,o)},dC=(e,t,n,o)=>{if((e.pad_empty_with_br||t.insert)&&n(o)){const e=new xh("br",1);t.insert&&e.attr("data-mce-bogus","1"),o.empty().append(e)}else o.empty().append(new xh("#text",3)).value=dt},mC=(e,t)=>{const n=e?.firstChild;return C(n)&&n===e.lastChild&&n.name===t},uC=(e,t,n,o)=>o.isEmpty(t,n,t=>((e,t)=>{const n=e.getElementRule(t.name);return!0===n?.paddEmpty})(e,t)),fC=e=>{let t;for(let n=e;n;n=n.parent){const e=n.attr("contenteditable");if("false"===e)break;"true"===e&&(t=n)}return I.from(t)},gC=(e,t,n=e.parent)=>{if(t.getSpecialElements()[e.name])e.empty().remove();else{const o=e.children();for(const e of o)n&&!t.isValidChild(n.name,e.name)&&gC(e,t,n);e.unwrap()}},pC=(e,t,n,o=x)=>{const r=t.getTextBlockElements(),s=t.getNonEmptyElements(),a=t.getWhitespaceElements(),i=dn.makeMap("tr,td,th,tbody,thead,tfoot,table,summary"),l=new Set,c=e=>e!==n&&!i[e.name];for(let n=0;n1)if(hC(t,i,d))gC(i,t);else{f.reverse(),m=f[0].clone(),o(m);let e=m;for(let n=0;n0?(u=f[n].clone(),o(u),e.append(u)):u=e;for(let e=f[n].firstChild;e&&e!==f[n+1];){const t=e.next;u.append(e),e=t}e=u}uC(t,s,a,m)?d.insert(i,f[0],!0):(d.insert(m,f[0],!0),d.insert(i,m)),d=f[0],(uC(t,s,a,d)||mC(d,"br"))&&d.empty().remove()}else if(i.parent){if("li"===i.name){let e=i.prev;if(e&&("ul"===e.name||"ol"===e.name)){e.append(i);continue}if(e=i.next,e&&("ul"===e.name||"ol"===e.name)&&e.firstChild){e.insert(i,e.firstChild,!0);continue}const t=new xh("ul",1);o(t),i.wrap(t);continue}if(t.isValidChild(i.parent.name,"div")&&t.isValidChild("div",i.name)){const e=new xh("div",1);o(e),i.wrap(e)}else gC(i,t)}}},hC=(e,t,n=t.parent)=>!(!n||(!e.children[t.name]||e.isValidChild(n.name,t.name))&&("a"!==t.name||!(e=>{let t=e;for(;t;){if("a"===t.name)return!0;t=t.parent}return!1})(n))&&(!(e=>"summary"===e.name)(n)||!aC(t)||n?.firstChild===t&&n?.lastChild===t)),bC=e=>e.collapsed?e:(e=>{const t=Kl.fromRangeStart(e),n=Kl.fromRangeEnd(e),o=e.commonAncestorContainer;return Sf(!1,o,n).map(r=>!Yu(t,n,o)&&Yu(t,r,o)?((e,t,n,o)=>{const r=document.createRange();return r.setStart(e,t),r.setEnd(n,o),r})(t.container(),t.offset(),r.container(),r.offset()):e).getOr(e)})(e),yC=dn.explode,vC=()=>{const e={};return{addFilter:(t,n)=>{q(yC(t),t=>{_e(e,t)||(e[t]={name:t,callbacks:[]}),e[t].callbacks.push(n)})},getFilters:()=>Ee(e),removeFilter:(t,n)=>{q(yC(t),t=>{if(_e(e,t))if(C(n)){const o=e[t],r=Y(o.callbacks,e=>e!==n);r.length>0?o.callbacks=r:delete e[t]}else delete e[t]})}}},CC=e=>e.replace(/</g,"<").replace(/>/g,">").replace(/&/g,"&"),wC=(e,t,n)=>{const o=Ga();t.convert_fonts_to_spans&&((e,t,n)=>{e.addNodeFilter("font",e=>{q(e,e=>{const o=t.parse(e.attr("style")),r=e.attr("color"),s=e.attr("face"),a=e.attr("size");r&&(o.color=r),s&&(o["font-family"]=s),a&&st(a).each(e=>{o["font-size"]=n[e-1]}),e.name="span",e.attr("style",t.serialize(o)),(e=>{q(["color","face","size"],t=>{e.attr(t,null)})})(e)})})})(e,o,dn.explode(t.font_size_legacy_values??"")),((e,t,n)=>{e.addNodeFilter("strike",e=>{const o="html4"!==t.type;q(e,e=>{if(o)e.name="s";else{const t=n.parse(e.attr("style"));t["text-decoration"]="line-through",e.name="span",e.attr("style",n.serialize(t))}})})})(e,n,o)},SC=e=>{const[t,...n]=e.split(","),o=n.join(","),r=/data:([^/]+\/[^;]+)(;.+)?/.exec(t);if(r){const e=";base64"===r[2],t=(e=>{try{return decodeURIComponent(e)}catch{return e}})(o),n=e?(e=>{const t=/([a-z0-9+\/=\s]+)/i.exec(e);return t?t[1]:""})(t):t;return I.some({type:r[1],data:n,base64Encoded:e})}return I.none()},EC=(e,t,n=!0)=>{let o=t;if(n)try{o=atob(t)}catch{return I.none()}const r=new Uint8Array(o.length);for(let e=0;enew Promise((t,n)=>{const o=new FileReader;o.onloadend=()=>{t(o.result)},o.onerror=()=>{n(o.error?.message)},o.readAsDataURL(e)});let _C=0;const kC=(e,t,n)=>SC(e).bind(({data:e,type:o,base64Encoded:r})=>{if(t&&!r)return I.none();{const t=r?e:btoa((s=e,X((new window.TextEncoder).encode(s),(e,t)=>e+String.fromCharCode(t),"")));return n(t,o)}var s}),NC=(e,t,n)=>{const o=e.create("blobid"+_C++,t,n);return e.add(o),o},AC=(e,t,n=!1)=>kC(t,n,(t,n)=>I.from(e.getByData(t,n)).orThunk(()=>EC(n,t).map(n=>NC(e,n,t)))),RC=/^(?:(?:(?:[A-Za-z][A-Za-z\d.+-]{0,14}:\/\/(?:[-.~*+=!&;:'%@?^${}(),\w]+@)?|www\.|[-;:&=+$,.\w]+@)([A-Za-z\d-]+(?:\.[A-Za-z\d-]+)*))(?::\d+)?(?:\/(?:[-.~*+=!;:'%@$(),\/\w]*[-~*+=%@$()\/\w])?)?(?:\?(?:[-.~*+=!&;:'%@?^${}(),\/\w]+)?)?(?:#(?:[-.~*+=!&;:'%@?^${}(),\/\w]+)?)?)$/,DC=e=>I.from(e.match(RC)).bind(e=>le(e,1)).map(e=>Qe(e,"www.")?e.substring(4):e),TC=(e,t)=>{I.from(e.attr("src")).bind(DC).forall(e=>!$(t,e))&&e.attr("sandbox","")},OC=(e,t)=>Qe(e,`${t}/`); +/*! @license DOMPurify 3.4.12 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.12/LICENSE */ +function BC(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=Array(t);n2?n-2:0),r=2;r1?t-1:0),o=1;o1?n-1:0),r=1;r2&&void 0!==arguments[2]?arguments[2]:ZC;if(MC&&MC(e,null),!QC(t))return e;let o=t.length;for(;o--;){let r=t[o];if("string"==typeof r){const e=n(r);e!==r&&(IC(t)||(t[o]=e),r=e)}e[r]=!0}return e}function pw(e){for(let t=0;t/g),Tw=jC(/\${[\w\W]*/g),Ow=jC(/^data-[\-\w.\u00B7-\uFFFF]+$/),Bw=jC(/^aria-[\-\w]+$/),Pw=jC(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),Lw=jC(/^(?:\w+script|data):/i),Mw=jC(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),Iw=jC(/^html$/i),Fw=jC(/^[a-z][.\w]*(-[.\w]+)+$/i),Uw=jC(/<[/\w!]/g),zw=jC(/<[/\w]/g),jw=jC(/<\/no(script|embed|frames)/i),$w=jC(/\/>/i),Hw=function(){return"undefined"==typeof window?null:window},Vw=function(e,t,n,o){return lw(e,t)&&QC(e[t])?gw(o.base?hw(o.base):{},e[t],o.transform):n};var qw=function e(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Hw();const n=t=>e(t);if(n.version="3.4.12",n.removed=[],!t||!t.document||9!==t.document.nodeType||!t.Element)return n.isSupported=!1,n;let o=t.document;const r=o,s=r.currentScript;t.DocumentFragment;const a=t.HTMLTemplateElement,i=t.Node,l=t.Element,c=t.NodeFilter;void 0===t.NamedNodeMap&&(t.NamedNodeMap||t.MozNamedAttrMap),t.HTMLFormElement;const d=t.DOMParser,m=t.trustedTypes,u=l.prototype,f=bw(u,"cloneNode"),g=bw(u,"remove"),p=bw(u,"nextSibling"),h=bw(u,"childNodes"),b=bw(u,"parentNode"),y=bw(u,"shadowRoot"),v=bw(u,"attributes"),C=i&&i.prototype?bw(i.prototype,"nodeType"):null,w=i&&i.prototype?bw(i.prototype,"nodeName"):null;if("function"==typeof a){const e=o.createElement("template");e.content&&e.content.ownerDocument&&(o=e.content.ownerDocument)}let S,E,x="",_=!1,k=0;const N=function(){if(k>0)throw mw('A configured TRUSTED_TYPES_POLICY callback (createHTML or createScriptURL) must not call DOMPurify.sanitize, as that causes infinite recursion. Do not pass a policy whose callbacks wrap DOMPurify as TRUSTED_TYPES_POLICY; see the "DOMPurify and Trusted Types" section of the README.')},A=function(e){N(),k++;try{return S.createHTML(e)}finally{k--}},R=o,D=R.implementation,T=R.createNodeIterator,O=R.createDocumentFragment,B=R.getElementsByTagName,P=r.importNode;let L={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]};n.isSupported="function"==typeof LC&&"function"==typeof b&&D&&void 0!==D.createHTMLDocument;const M=Rw,I=Dw,F=Tw,U=Ow,z=Bw,j=Lw,$=Mw,H=Fw;let V=Pw,q=null;const W=gw({},[...yw,...vw,...Cw,...Sw,...xw]);let K=null;const Y=gw({},[..._w,...kw,...Nw,...Aw]);let G=Object.seal($C(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),X=null,Q=null;const Z=Object.seal($C(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}}));let J=!0,ee=!0,te=!1,ne=!0,oe=!1,re=!0,se=!1,ae=!1,ie=null,le=null,ce=!1,de=!1,me=!1,ue=!1,fe=!0,ge=!1;const pe="user-content-";let he=!0,be=!1,ye={},ve=null;const Ce=gw({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","selectedcontent","style","svg","template","thead","title","video","xmp"]);let we=null;const Se=gw({},["audio","video","img","source","image","track"]);let Ee=null;const xe=gw({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),_e="http://www.w3.org/1998/Math/MathML",ke="http://www.w3.org/2000/svg",Ne="http://www.w3.org/1999/xhtml";let Ae=Ne,Re=!1,De=null;const Te=gw({},[_e,ke,Ne],JC),Oe=zC(["mi","mo","mn","ms","mtext"]);let Be=gw({},Oe);const Pe=zC(["annotation-xml"]);let Le=gw({},Pe);const Me=gw({},["title","style","font","a","script"]);let Ie=null;const Fe=["application/xhtml+xml","text/html"];let Ue=null,ze=null;const je=o.createElement("form"),$e=function(e){return e instanceof RegExp||e instanceof Function},He=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(ze&&ze===e)return;e&&"object"==typeof e||(e={}),e=hw(e),Ie=-1===Fe.indexOf(e.PARSER_MEDIA_TYPE)?"text/html":e.PARSER_MEDIA_TYPE,Ue="application/xhtml+xml"===Ie?JC:ZC,q=Vw(e,"ALLOWED_TAGS",W,{transform:Ue}),K=Vw(e,"ALLOWED_ATTR",Y,{transform:Ue}),De=Vw(e,"ALLOWED_NAMESPACES",Te,{transform:JC}),Ee=Vw(e,"ADD_URI_SAFE_ATTR",xe,{transform:Ue,base:xe}),we=Vw(e,"ADD_DATA_URI_TAGS",Se,{transform:Ue,base:Se}),ve=Vw(e,"FORBID_CONTENTS",Ce,{transform:Ue}),X=Vw(e,"FORBID_TAGS",hw({}),{transform:Ue}),Q=Vw(e,"FORBID_ATTR",hw({}),{transform:Ue}),ye=!!lw(e,"USE_PROFILES")&&(e.USE_PROFILES&&"object"==typeof e.USE_PROFILES?hw(e.USE_PROFILES):e.USE_PROFILES),J=!1!==e.ALLOW_ARIA_ATTR,ee=!1!==e.ALLOW_DATA_ATTR,te=e.ALLOW_UNKNOWN_PROTOCOLS||!1,ne=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,oe=e.SAFE_FOR_TEMPLATES||!1,re=!1!==e.SAFE_FOR_XML,se=e.WHOLE_DOCUMENT||!1,de=e.RETURN_DOM||!1,me=e.RETURN_DOM_FRAGMENT||!1,ue=e.RETURN_TRUSTED_TYPE||!1,ce=e.FORCE_BODY||!1,fe=!1!==e.SANITIZE_DOM,ge=e.SANITIZE_NAMED_PROPS||!1,he=!1!==e.KEEP_CONTENT,be=e.IN_PLACE||!1,V=function(e){try{return dw(e,""),!0}catch(e){return!1}}(e.ALLOWED_URI_REGEXP)?e.ALLOWED_URI_REGEXP:Pw,Ae="string"==typeof e.NAMESPACE?e.NAMESPACE:Ne,Be=lw(e,"MATHML_TEXT_INTEGRATION_POINTS")&&e.MATHML_TEXT_INTEGRATION_POINTS&&"object"==typeof e.MATHML_TEXT_INTEGRATION_POINTS?hw(e.MATHML_TEXT_INTEGRATION_POINTS):gw({},Oe),Le=lw(e,"HTML_INTEGRATION_POINTS")&&e.HTML_INTEGRATION_POINTS&&"object"==typeof e.HTML_INTEGRATION_POINTS?hw(e.HTML_INTEGRATION_POINTS):gw({},Pe);const t=lw(e,"CUSTOM_ELEMENT_HANDLING")&&e.CUSTOM_ELEMENT_HANDLING&&"object"==typeof e.CUSTOM_ELEMENT_HANDLING?hw(e.CUSTOM_ELEMENT_HANDLING):$C(null);if(G=$C(null),lw(t,"tagNameCheck")&&$e(t.tagNameCheck)&&(G.tagNameCheck=t.tagNameCheck),lw(t,"attributeNameCheck")&&$e(t.attributeNameCheck)&&(G.attributeNameCheck=t.attributeNameCheck),lw(t,"allowCustomizedBuiltInElements")&&"boolean"==typeof t.allowCustomizedBuiltInElements&&(G.allowCustomizedBuiltInElements=t.allowCustomizedBuiltInElements),jC(G),oe&&(ee=!1),me&&(de=!0),ye&&(q=gw({},xw),K=$C(null),!0===ye.html&&(gw(q,yw),gw(K,_w)),!0===ye.svg&&(gw(q,vw),gw(K,kw),gw(K,Aw)),!0===ye.svgFilters&&(gw(q,Cw),gw(K,kw),gw(K,Aw)),!0===ye.mathMl&&(gw(q,Sw),gw(K,Nw),gw(K,Aw))),Z.tagCheck=null,Z.attributeCheck=null,lw(e,"ADD_TAGS")&&("function"==typeof e.ADD_TAGS?Z.tagCheck=e.ADD_TAGS:QC(e.ADD_TAGS)&&(q===W&&(q=hw(q)),gw(q,e.ADD_TAGS,Ue))),lw(e,"ADD_ATTR")&&("function"==typeof e.ADD_ATTR?Z.attributeCheck=e.ADD_ATTR:QC(e.ADD_ATTR)&&(K===Y&&(K=hw(K)),gw(K,e.ADD_ATTR,Ue))),lw(e,"ADD_URI_SAFE_ATTR")&&QC(e.ADD_URI_SAFE_ATTR)&&gw(Ee,e.ADD_URI_SAFE_ATTR,Ue),lw(e,"FORBID_CONTENTS")&&QC(e.FORBID_CONTENTS)&&(ve===Ce&&(ve=hw(ve)),gw(ve,e.FORBID_CONTENTS,Ue)),lw(e,"ADD_FORBID_CONTENTS")&&QC(e.ADD_FORBID_CONTENTS)&&(ve===Ce&&(ve=hw(ve)),gw(ve,e.ADD_FORBID_CONTENTS,Ue)),he&&(q["#text"]=!0),se&&gw(q,["html","head","body"]),q.table&&(gw(q,["tbody"]),delete X.tbody),e.TRUSTED_TYPES_POLICY){if("function"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw mw('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw mw('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');const t=S;S=e.TRUSTED_TYPES_POLICY;try{x=A("")}catch(e){throw S=t,e}}else null===e.TRUSTED_TYPES_POLICY?(S=void 0,x=""):(void 0===S&&(_||(E=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let n=null;const o="data-tt-policy-suffix";t&&t.hasAttribute(o)&&(n=t.getAttribute(o));const r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+r+" could not be created."),null}}(m,s),_=!0),S=E),S&&"string"==typeof x&&(x=A("")));zC&&zC(e),ze=e},Ve=gw({},[...vw,...Cw,...ww]),qe=gw({},[...Sw,...Ew]),We=function(e){GC(n.removed,{element:e});try{b(e).removeChild(e)}catch(t){if(g(e),!b(e))throw mw("a node selected for removal could not be detached from its tree and cannot be safely returned; refusing to sanitize in place")}},Ke=function(e){Xe(e);const t=h(e);if(t){const e=[];WC(t,t=>{GC(e,t)}),WC(e,e=>{try{g(e)}catch(e){}})}const n=v(e);if(n)for(let t=n.length-1;t>=0;--t){const o=n[t],r=o&&o.name;if("string"==typeof r)try{e.removeAttribute(r)}catch(e){}}},Ye=function(e,t){try{GC(n.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){GC(n.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e)if(de||me)try{We(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},Ge=function(e){const t=v(e);if(t)for(let n=t.length-1;n>=0;--n){const o=t[n],r=o&&o.name;if("string"==typeof r&&!K[Ue(r)])try{e.removeAttribute(r)}catch(e){}}},Xe=function(e){const t=[e];for(;t.length>0;){const e=t.pop();1===(C?C(e):e.nodeType)&&Ge(e);const n=h(e);if(n)for(let e=n.length-1;e>=0;--e)t.push(n[e])}},Qe=function(e){let t=null,n=null;if(ce)e=""+e;else{const t=ew(e,/^[\r\n\t ]+/);n=t&&t[0]}"application/xhtml+xml"===Ie&&Ae===Ne&&(e=''+e+"");const r=S?A(e):e;if(Ae===Ne)try{t=(new d).parseFromString(r,Ie)}catch(e){}if(!t||!t.documentElement){t=D.createDocument(Ae,"template",null);try{t.documentElement.innerHTML=Re?x:r}catch(e){}}const s=t.body||t.documentElement;return e&&n&&s.insertBefore(o.createTextNode(n),s.childNodes[0]||null),Ae===Ne?B.call(t,se?"html":"body")[0]:se?t.documentElement:s},Ze=function(e){return T.call(e.ownerDocument||e,e,c.SHOW_ELEMENT|c.SHOW_COMMENT|c.SHOW_TEXT|c.SHOW_PROCESSING_INSTRUCTION|c.SHOW_CDATA_SECTION,null)},Je=function(e){return e=tw(e,M," "),e=tw(e,I," "),tw(e,F," ")},et=function(e){var t;e.normalize();const n=T.call(e.ownerDocument||e,e,c.SHOW_TEXT|c.SHOW_COMMENT|c.SHOW_CDATA_SECTION|c.SHOW_PROCESSING_INSTRUCTION,null);let o=n.nextNode();for(;o;)o.data=Je(o.data),o=n.nextNode();const r=null===(t=e.querySelectorAll)||void 0===t?void 0:t.call(e,"template");r&&WC(r,e=>{nt(e.content)&&et(e.content)})},tt=function(e){const t=w?w(e):null;return"string"==typeof t&&"form"===Ue(t)&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||e.attributes!==v(e)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes||e.nodeType!==C(e)||e.childNodes!==h(e))},nt=function(e){if(!C||"object"!=typeof e||null===e)return!1;try{return 11===C(e)}catch(e){return!1}},ot=function(e){if(!C||"object"!=typeof e||null===e)return!1;try{return"number"==typeof C(e)}catch(e){return!1}};function rt(e,t,o){0!==e.length&&WC(e,e=>{e.call(n,t,o,ze)})}const st=function(e,t){if(rt(L.beforeSanitizeElements,e,null),e!==t&&null===b(e))return!0;if(tt(e))return We(e),!0;const o=Ue(w?w(e):e.nodeName);if(rt(L.uponSanitizeElement,e,{tagName:o,allowedTags:q}),e!==t&&null===b(e))return!0;if(function(e,t){return!!(re&&e.hasChildNodes()&&!ot(e.firstElementChild)&&dw(Uw,e.textContent)&&dw(Uw,e.innerHTML))||!(!re||e.namespaceURI!==Ne||"style"!==t||!ot(e.firstElementChild))||7===e.nodeType||!(!re||8!==e.nodeType||!dw(zw,e.data))}(e,o))return We(e),!0;if(X[o]||!(Z.tagCheck instanceof Function&&Z.tagCheck(o))&&!q[o]){const t=function(e,t){if(!X[t]&<(t)){if(G.tagNameCheck instanceof RegExp&&dw(G.tagNameCheck,t))return!1;if(G.tagNameCheck instanceof Function&&G.tagNameCheck(t))return!1}if(he&&!ve[t]){const t=b(e),n=h(e);if(n&&t)for(let o=n.length-1;o>=0;--o){const r=be?n[o]:f(n[o],!0);t.insertBefore(r,p(e))}}return We(e),!0}(e,o);return!1===t&&rt(L.afterSanitizeElements,e,null),t}if(1===(C?C(e):e.nodeType)&&!function(e){let t=b(e);t&&t.tagName||(t={namespaceURI:Ae,tagName:"template"});const n=ZC(e.tagName),o=ZC(t.tagName);return!!De[e.namespaceURI]&&(e.namespaceURI===ke?function(e,t,n){return t.namespaceURI===Ne?"svg"===e:t.namespaceURI===_e?"svg"===e&&("annotation-xml"===n||Be[n]):Boolean(Ve[e])}(n,t,o):e.namespaceURI===_e?function(e,t,n){return t.namespaceURI===Ne?"math"===e:t.namespaceURI===ke?"math"===e&&Le[n]:Boolean(qe[e])}(n,t,o):e.namespaceURI===Ne?function(e,t,n){return!(t.namespaceURI===ke&&!Le[n])&&!(t.namespaceURI===_e&&!Be[n])&&!qe[e]&&(Me[e]||!Ve[e])}(n,t,o):!("application/xhtml+xml"!==Ie||!De[e.namespaceURI]))}(e))return We(e),!0;if(("noscript"===o||"noembed"===o||"noframes"===o)&&dw(jw,e.innerHTML))return We(e),!0;if(oe&&3===e.nodeType){const t=Je(e.textContent);e.textContent!==t&&(GC(n.removed,{element:e.cloneNode()}),e.textContent=t)}return rt(L.afterSanitizeElements,e,null),!1},at=function(e,t,n){if(Q[t])return!1;if(re&&"patchsrc"===t)return!1;if(re&&"for"===t&&"label"!==e&&"output"!==e)return!1;if(fe&&("id"===t||"name"===t)&&(n in o||n in je))return!1;const r=K[t]||Z.attributeCheck instanceof Function&&Z.attributeCheck(t,e);if(ee&&dw(U,t));else if(J&&dw(z,t));else if(r){if(Ee[t]);else if(dw(V,tw(n,$,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==nw(n,"data:")||!we[e])if(te&&!dw(j,tw(n,$,"")));else if(n)return!1}else if(!(lt(e)&&(G.tagNameCheck instanceof RegExp&&dw(G.tagNameCheck,e)||G.tagNameCheck instanceof Function&&G.tagNameCheck(e))&&(G.attributeNameCheck instanceof RegExp&&dw(G.attributeNameCheck,t)||G.attributeNameCheck instanceof Function&&G.attributeNameCheck(t,e))||"is"===t&&G.allowCustomizedBuiltInElements&&(G.tagNameCheck instanceof RegExp&&dw(G.tagNameCheck,n)||G.tagNameCheck instanceof Function&&G.tagNameCheck(n))))return!1;return!0},it=gw({},["annotation-xml","color-profile","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","missing-glyph"]),lt=function(e){return!it[ZC(e)]&&dw(H,e)},ct=function(e,t,n,o){if(S&&"object"==typeof m&&"function"==typeof m.getAttributeType&&!n)switch(m.getAttributeType(e,t)){case"TrustedHTML":return A(o);case"TrustedScriptURL":return function(e){N(),k++;try{return S.createScriptURL(e)}finally{k--}}(o)}return o},dt=function(e,t,o,r){try{o?e.setAttributeNS(o,t,r):e.setAttribute(t,r),tt(e)?We(e):YC(n.removed)}catch(n){Ye(t,e)}},mt=function(e){rt(L.beforeSanitizeAttributes,e,null);const t=e.attributes;if(!t||tt(e))return;const n={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:K,forceKeepAttr:void 0};let o=t.length;const r=Ue(e.nodeName);for(;o--;){const s=t[o],a=s.name,i=s.namespaceURI,l=s.value,c=Ue(a),d=l;let m="value"===a?d:ow(d);n.attrName=c,n.attrValue=m,n.keepAttr=!0,n.forceKeepAttr=void 0,rt(L.uponSanitizeAttribute,e,n),m=n.attrValue,!ge||"id"!==c&&"name"!==c||0===nw(m,pe)||(Ye(a,e),m=pe+m),re&&dw(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,m)||"attributename"===c&&ew(m,"href")?Ye(a,e):n.forceKeepAttr||(!n.keepAttr||!ne&&dw($w,m)?Ye(a,e):(oe&&(m=Je(m)),at(r,c,m)?(m=ct(r,c,i,m),m!==d&&dt(e,a,i,m)):Ye(a,e)))}rt(L.afterSanitizeAttributes,e,null)},ut=function(e){let t=null;const n=Ze(e);for(rt(L.beforeSanitizeShadowDOM,e,null);t=n.nextNode();)if(rt(L.uponSanitizeShadowNode,t,null),st(t,e),mt(t),nt(t.content)&&ut(t.content),1===(C?C(t):t.nodeType)){const e=y(t);nt(e)&&(ft(e),ut(e))}rt(L.afterSanitizeShadowDOM,e,null)},ft=function(e){const t=[{node:e,shadow:null}];for(;t.length>0;){const e=t.pop();if(e.shadow){ut(e.shadow);continue}const n=e.node,o=1===(C?C(n):n.nodeType),r=h(n);if(r)for(let e=r.length-1;e>=0;--e)t.push({node:r[e],shadow:null});if(o){const e=w?w(n):null;if("string"==typeof e&&"template"===Ue(e)){const e=n.content;nt(e)&&t.push({node:e,shadow:null})}}if(o){const e=y(n);nt(e)&&t.push({node:null,shadow:e},{node:e,shadow:null})}}};return n.sanitize=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=null,s=null,a=null,i=null;if(Re=!e,Re&&(e="\x3c!--\x3e"),"string"!=typeof e&&!ot(e)&&(e=function(e){switch(typeof e){case"string":return e;case"number":return rw(e);case"boolean":return sw(e);case"bigint":return aw?aw(e):"0";case"symbol":return iw?iw(e):"Symbol()";case"undefined":default:return cw(e);case"function":case"object":{if(null===e)return cw(e);const t=e,n=bw(t,"toString");if("function"==typeof n){const e=n(t);return"string"==typeof e?e:cw(e)}return cw(e)}}}(e),"string"!=typeof e))throw mw("dirty is not a string, aborting");if(!n.isSupported)return e;ae?(q=ie,K=le):He(t),(L.uponSanitizeElement.length>0||L.uponSanitizeAttribute.length>0)&&(q=hw(q)),L.uponSanitizeAttribute.length>0&&(K=hw(K)),n.removed=[];const l=be&&"string"!=typeof e&&ot(e);if(l){!function(e){if(!re)return;const t=[e];for(;t.length>0;){const e=t.pop(),n=C?C(e):e.nodeType;if(7===n||8===n&&dw(zw,e.data)){try{g(e)}catch(e){}continue}if(1===n){const t=e,n=Ue(w?w(e):e.nodeName);try{t.hasAttribute&&t.hasAttribute("patchsrc")&&t.removeAttribute("patchsrc"),t.hasAttribute&&t.hasAttribute("for")&&"label"!==n&&"output"!==n&&t.removeAttribute("for")}catch(e){}}const o=h(e);if(o)for(let e=o.length-1;e>=0;--e)t.push(o[e])}}(e);const t=w?w(e):e.nodeName;if("string"==typeof t){const n=Ue(t);if(!q[n]||X[n])throw Ke(e),mw("root node is forbidden and cannot be sanitized in-place")}if(tt(e))throw Ke(e),mw("root node is clobbered and cannot be sanitized in-place");try{ft(e)}catch(t){throw Ke(e),t}}else if(ot(e))o=Qe("\x3c!----\x3e"),s=o.ownerDocument.importNode(e,!0),1===s.nodeType&&"BODY"===s.nodeName||"HTML"===s.nodeName?o=s:o.appendChild(s),ft(s);else{if(!de&&!oe&&!se&&-1===e.indexOf("<"))return S&&ue?A(e):e;if(o=Qe(e),!o)return de?null:ue?x:""}o&&ce&&We(o.firstChild);const c=l?e:o,d=Ze(c);try{for(;a=d.nextNode();)st(a,c),mt(a),nt(a.content)&&ut(a.content)}catch(t){throw l&&(Ke(e),WC(n.removed,e=>{e.element&&Xe(e.element)})),t}if(l)return WC(n.removed,e=>{e.element&&Xe(e.element)}),oe&&et(e),e;if(de){if(oe&&et(o),me)for(i=O.call(o.ownerDocument);o.firstChild;)i.appendChild(o.firstChild);else i=o;return(K.shadowroot||K.shadowrootmode)&&(i=P.call(r,i,!0)),i}let m=se?o.outerHTML:o.innerHTML;return se&&q["!doctype"]&&o.ownerDocument&&o.ownerDocument.doctype&&o.ownerDocument.doctype.name&&dw(Iw,o.ownerDocument.doctype.name)&&(m="\n"+m),oe&&(m=Je(m)),S&&ue?A(m):m},n.setConfig=function(){He(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),ae=!0,ie=q,le=K},n.clearConfig=function(){ze=null,ae=!1,ie=null,le=null,S=E,x=""},n.isValidAttribute=function(e,t,n){ze||He({});const o=Ue(e),r=Ue(t);return at(o,r,n)},n.addHook=function(e,t){"function"==typeof t&&lw(L,e)&&GC(L[e],t)},n.removeHook=function(e,t){if(lw(L,e)){if(void 0!==t){const n=KC(L[e],t);return-1===n?void 0:XC(L[e],n,1)[0]}return YC(L[e])}},n.removeHooks=function(e){lw(L,e)&&(L[e]=[])},n.removeAllHooks=function(){L={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},n}();const Ww=dn.each,Kw=dn.trim,Yw=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],Gw={ftp:21,http:80,https:443,mailto:25},Xw=["img","video"],Qw=(e,t,n)=>{const o=(e=>{try{return decodeURIComponent(e)}catch{return unescape(e)}})(t).replace(/\s/g,"");return!e.allow_script_urls&&(!!/((java|vb)script|mhtml):/i.test(o)||!e.allow_html_data_urls&&(/^data:image\//i.test(o)?((e,t)=>C(e)?!e:!C(t)||!$(Xw,t))(e.allow_svg_data_urls,n)&&/^data:image\/svg\+xml/i.test(o):/^data:/i.test(o)))};class Zw{static parseDataUri(e){let t;const n=decodeURIComponent(e).split(","),o=/data:([^;]+)/.exec(n[0]);return o&&(t=o[1]),{type:t,data:n[1]}}static isDomSafe(e,t,n={}){if(n.allow_script_urls)return!0;{const o=Sa.decode(e).replace(/[\s\u0000-\u001F]+/g,"");return!Qw(n,o,t)}}static getDocumentBaseUrl(e){let t;return t=0!==e.protocol.indexOf("http")&&"file:"!==e.protocol?e.href??"":e.protocol+"//"+e.host+e.pathname,/^[^:]+:\/\/\/?[^\/]+\//.test(t)&&(t=t.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,""),/[\/\\]$/.test(t)||(t+="/")),t}source;protocol;authority;userInfo;user;password;host;port;relative;path="";directory="";file;query;anchor;settings;constructor(e,t={}){e=Kw(e),this.settings=t;const n=t.base_uri,o=this;if(/^([\w\-]+):([^\/]{2})/i.test(e)||/^\s*#/.test(e))return void(o.source=e);const r=0===e.indexOf("//");if(0!==e.indexOf("/")||r||(e=(n&&n.protocol||"http")+"://mce_host"+e),!/^[\w\-]*:?\/\//.test(e)){const t=n?n.path:new Zw(document.location.href).directory;if(""===n?.protocol)e="//mce_host"+o.toAbsPath(t,e);else{const r=/([^#?]*)([#?]?.*)/.exec(e);r&&(e=(n&&n.protocol||"http")+"://mce_host"+o.toAbsPath(t,r[1])+r[2])}}e=e.replace(/@@/g,"(mce_at)");const s=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@\/]*):?([^:@\/]*))?@)?(\[[a-zA-Z0-9:.%]+\]|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(e);s&&Ww(Yw,(e,t)=>{let n=s[t];n&&(n=n.replace(/\(mce_at\)/g,"@@")),o[e]=n}),n&&(o.protocol||(o.protocol=n.protocol),o.userInfo||(o.userInfo=n.userInfo),o.port||"mce_host"!==o.host||(o.port=n.port),o.host&&"mce_host"!==o.host||(o.host=n.host),o.source=""),r&&(o.protocol="")}setPath(e){const t=/^(.*?)\/?(\w+)?$/.exec(e);t&&(this.path=t[0],this.directory=t[1],this.file=t[2]),this.source="",this.getURI()}toRelative(e){if("./"===e)return e;const t=new Zw(e,{base_uri:this});if("mce_host"!==t.host&&this.host!==t.host&&t.host||this.port!==t.port||this.protocol!==t.protocol&&""!==t.protocol)return t.getURI();const n=this.getURI(),o=t.getURI();if(n===o||"/"===n.charAt(n.length-1)&&n.substr(0,n.length-1)===o)return n;let r=this.toRelPath(this.path,t.path);return t.query&&(r+="?"+t.query),t.anchor&&(r+="#"+t.anchor),r}toAbsolute(e,t){const n=new Zw(e,{base_uri:this});return n.getURI(t&&this.isSameOrigin(n))}isSameOrigin(e){if(this.host==e.host&&this.protocol==e.protocol){if(this.port==e.port)return!0;const t=this.protocol?Gw[this.protocol]:null;if(t&&(this.port||t)==(e.port||t))return!0}return!1}toRelPath(e,t){let n,o,r=0,s="";const a=e.substring(0,e.lastIndexOf("/")).split("/"),i=t.split("/");if(a.length>=i.length)for(n=0,o=a.length;n=i.length||a[n]!==i[n]){r=n+1;break}if(a.length=a.length||a[n]!==i[n]){r=n+1;break}if(1===r)return t;for(n=0,o=a.length-(r-1);n{e&&a.push(e)});const i=[];for(let e=s.length-1;e>=0;e--)0!==s[e].length&&"."!==s[e]&&(".."!==s[e]?n>0?n--:i.push(s[e]):n++);const l=a.length-n;let c;return c=l<=0?re(i).join("/"):a.slice(0,l).join("/")+"/"+re(i).join("/"),0!==c.indexOf("/")&&(c="/"+c),o&&c.lastIndexOf("/")!==c.length-1&&(c+=o),c}getURI(e=!1){let t;return this.source&&!e||(t="",e||(this.protocol?t+=this.protocol+"://":t+="//",this.userInfo&&(t+=this.userInfo+"@"),this.host&&(t+=this.host),this.port&&(t+=":"+this.port)),this.path&&(t+=this.path),this.query&&(t+="?"+this.query),this.anchor&&(t+="#"+this.anchor),this.source=t),this.source}}const Jw=dn.makeMap("src,href,data,background,action,formaction,poster,xlink:href"),eS="data-mce-type";let tS=0;const nS=(e,t,n,o,r)=>{const s=t.validate,a=n.getSpecialElements();8===e.nodeType&&(!t.allow_conditional_comments&&/^\[if/i.test(e.nodeValue??"")&&(e.nodeValue=" "+e.nodeValue),t.sanitize&&t.allow_html_in_comments&&u(e.nodeValue)&&(e.nodeValue=(e=>e.replace(/&/g,"&").replace(//g,">"))(e.nodeValue)));const i=r?.tagName??e.nodeName.toLowerCase();if("html"!==o&&n.isValid(o))return void(C(r)&&(r.allowedTags[i]=!0));if(1!==e.nodeType||"body"===i)return;const l=un.fromDom(e);if(t.sanitize){const e=Ii(l)&&n.isValid("script")||Fi(l)&&n.isValid("style");e&&I.from((e=>e.dom.textContent)(l)).each(e=>vo(l,"data-mce-tmp",e));const t=(e=>An(e)&&"iframe"===En(e))(l)&&n.isValid("iframe");(e||t)&&No(l)}const c=Eo(l,eS),d=wo(l,"data-mce-bogus");if(!c&&u(d))return void("all"===d?Ao(l):Ro(l));const m=n.getElementRule(i);if(!s||m){if(C(r)&&(r.allowedTags[i]=!0),s&&m&&!c){if(q(m.attributesForced??[],e=>{vo(l,e.name,"{$uid}"===e.value?"mce_"+tS++:e.value)}),q(m.attributesDefault??[],e=>{Eo(l,e.name)||vo(l,e.name,"{$uid}"===e.value?"mce_"+tS++:e.value)}),m.attributesRequired&&!H(m.attributesRequired,e=>Eo(l,e)))return void Ro(l);if(m.removeEmptyAttrs&&_o(l))return void Ro(l);m.outputName&&m.outputName!==i&&Bo(l,m.outputName)}}else _e(a,i)?Ao(l):Ro(l)},oS=(e,t,n,o,r,s)=>"html"!==n&&!Fs(o)||!(r in Jw&&Qw(e,s,o))&&(!e.validate||t.isValid(o,r)||Qe(r,"data-")||Qe(r,"aria-")),rS=(e,t)=>e.hasAttribute(eS)&&("id"===t||"class"===t||"style"===t),sS=(e,t,n)=>e in t.getBoolAttrs()&&!_e(t.getCustomElements(),n.toLowerCase()),aS=(e,t,n,o)=>{const{attributes:r}=e;for(let s=r.length-1;s>=0;s--){const a=r[s],i=a.name,l=a.value;oS(t,n,o,e.tagName.toLowerCase(),i,l)||rS(e,i)?sS(i,n,e.nodeName)&&e.setAttribute(i,i):e.removeAttribute(i)}},iS=(e,t,n)=>{const o=qw();return o.addHook("uponSanitizeElement",(o,r)=>{nS(o,e,t,n.track(o),r)}),o.addHook("afterSanitizeElements",e=>{(e=>{const t=un.fromDom(e);(Ii(t)||Fi(t))&&So(t,"data-mce-tmp").each(e=>{((e,t)=>{e.dom.textContent=t})(t,e),xo(t,"data-mce-tmp")})})(e)}),o.addHook("uponSanitizeAttribute",(o,r)=>{((e,t,n,o,r)=>{const s=e.tagName.toLowerCase(),{attrName:a,attrValue:i}=r;r.keepAttr=oS(t,n,o,s,a,i),r.keepAttr?(r.allowedAttributes[a]=!0,sS(a,n,e.nodeName)&&(r.attrValue=a),t.allow_svg_data_urls&&Qe(i,"data:image/svg+xml")&&(r.forceKeepAttr=!0)):rS(e,a)&&(r.forceKeepAttr=!0)})(o,e,t,n.current(),r)}),o},lS=(e,t)=>{const n=qw(),o=t.allow_mathml_annotation_encodings,r=p(o)&&o.length>0;n.addHook("uponSanitizeElement",(e,n)=>{const s=n.tagName??e.nodeName.toLowerCase();((e,n)=>r&&"semantics"===n?I.some(!0):"annotation"===n?I.some(es(e)&&(e=>{const t=e.getAttribute("encoding");return r&&u(t)&&$(o,t)})(e)):p(t.extended_mathml_elements)&&t.extended_mathml_elements.includes(n)?I.from(!0):I.none())(e,s).each(o=>{n.allowedTags[s]=o,!o&&t.sanitize&&es(e)&&e.remove()})}),n.addHook("uponSanitizeAttribute",(e,n)=>{p(t.extended_mathml_attributes)&&t.extended_mathml_attributes.includes(n.attrName)&&(n.forceKeepAttr=!0)}),n.sanitize(e,{IN_PLACE:!0,USE_PROFILES:{mathMl:!0}})},cS=e=>t=>{const n=zs(t);if("svg"===n)(e=>{const t=["type","href","role","arcrole","title","show","actuate","label","from","to"].map(e=>`xlink:${e}`),n={IN_PLACE:!0,USE_PROFILES:{html:!0,svg:!0,svgFilters:!0},ALLOWED_ATTR:t};qw().sanitize(e,n)})(t);else{if("math"!==n)throw new Error("Not a namespace element");lS(t,e)}},dS=["script","style","template","param","meta","title","link"],mS=dn.makeMap,uS=dn.extend,fS=(e,t,n,o,r)=>{const s=e.name,a=s in n&&"title"!==s&&"textarea"!==s&&"noscript"!==s,i=t.childNodes;for(let t=0,s=i.length;t{const n=vC(),o=vC(),r={validate:!0,root_name:"body",sanitize:!0,allow_html_in_comments:!1,...e},s=new DOMParser,a=((e,t)=>{const n=(()=>{const e=Ke(),t=()=>e.get().map(zs).getOr("html");return{track:n=>(Us(n)?e.set(n):e.get().exists(e=>!e.contains(n))&&e.clear(),t()),current:t,reset:()=>{e.clear()}}})();if(e.sanitize){const o=iS(e,t,n),r=(t,r)=>{o.sanitize(t,((e,t)=>{const n={IN_PLACE:!0,ALLOW_UNKNOWN_PROTOCOLS:!0,ALLOWED_TAGS:["#comment","#cdata-section","body","html"],ALLOWED_ATTR:[]};return n.PARSER_MEDIA_TYPE=t,e.allow_script_urls?n.ALLOWED_URI_REGEXP=/.*/:e.allow_html_data_urls&&(n.ALLOWED_URI_REGEXP=/^(?!(\w+script|mhtml):)/i),n})(e,r)),o.removed=[],n.reset()};return{sanitizeHtmlElement:r,sanitizeNamespaceElement:cS(e)}}return{sanitizeHtmlElement:(o,r)=>{const s=document.createNodeIterator(o,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_COMMENT|NodeFilter.SHOW_TEXT);let a;for(;a=s.nextNode();){const o=n.track(a);nS(a,e,t,o),es(a)&&aS(a,e,t,o)}n.reset()},sanitizeNamespaceElement:x}})(r,t),i=n.addFilter,l=n.getFilters,c=n.removeFilter,d=o.addFilter,m=o.getFilters,f=o.removeFilter,g=(e,n)=>{const o=u(n.attr(eS)),r=1===n.type&&!_e(e,n.name)&&!ea(t,n)&&!Fs(n.name);return 3===n.type||r&&!o},p={schema:t,addAttributeFilter:d,getAttributeFilters:m,removeAttributeFilter:f,addNodeFilter:i,getNodeFilters:l,removeNodeFilter:c,parse:(e,n={})=>{const o=r.validate,i="#document"===(n.context??r.root_name),c=n.context??(i?"html":r.root_name),d=((e,n,o="html",r=!1)=>{const i="xhtml"===o,l=i?"application/xhtml+xml":"text/html",c=_e(t.getSpecialElements(),n.toLowerCase()),d=c?`<${n}>${e}`:e,m=s.parseFromString(/^[\s]*${d}`:i?`${d}`:`${d}`,l),u=r?m.documentElement:m.body;return a.sanitizeHtmlElement(u,l),c?u.firstChild:u})(e,c,n.format,i);Ks(t,d);const u=new xh(c,11);fS(u,d,t.getSpecialElements(),a.sanitizeNamespaceElement,r.sanitize&&r.allow_html_in_comments),d.innerHTML="";const[f,p]=((e,t,n,o)=>{const r=n.validate,s=t.getNonEmptyElements(),a=t.getWhitespaceElements(),i=uS(mS(dS),t.getBlockElements()),l=Ia(t),c=/[ \t\r\n]+/g,d=/^[ \t\r\n]+/,m=/[ \t\r\n]+$/,u=e=>{let t=e.parent;for(;C(t);){if(t.name in a)return!0;t=t.parent}return!1},f=n=>n.name in i||ea(t,n)||Fs(n.name)&&n.parent===e,g=(t,n)=>{const r=n?t.prev:t.next;return!C(r)&&!v(t.parent)&&f(t.parent)&&(t.parent!==e||!0===o.isRootContent)};return[e=>{if(3===e.type&&!u(e)){let t=e.value??"";t=t.replace(c," "),(((e,t)=>C(e)&&(t(e)||"br"===e.name))(e.prev,f)||g(e,!0))&&(t=t.replace(d,"")),0===t.length||" "===t&&e.prev&&8===e.prev.type&&e.next&&8===e.next.type?e.remove():e.value=t}},e=>{if(1===e.type){const i=t.getElementRule(e.name);if(r&&i){const r=uC(t,s,a,e);i.paddInEmptyBlock&&r&&(e=>{let n=e;for(;C(n);){if(n.name in l)return uC(t,s,a,n);n=n.parent}return!1})(e)?dC(n,o,f,e):i.removeEmpty&&r?f(e)?e.remove():e.unwrap():i.paddEmpty&&(r||(e=>mC(e,"#text")&&e?.firstChild?.value===dt)(e))&&dC(n,o,f,e)}}else if(3===e.type&&!u(e)){let t=e.value??"";(e.next&&f(e.next)||g(e,!1))&&(t=t.replace(m,"")),0===t.length?e.remove():e.value=t}}]})(u,t,r,n),h=[],b=o?e=>((e,n)=>{hC(t,e)&&n.push(e)})(e,h):x,y={nodes:{},attributes:{}},w=e=>iC(l(),m(),e,y);((e,t,n)=>{const o=[];for(let n=e,r=n;n;r=n,n=n.walk()){const s=n;q(t,e=>e(s)),v(s.parent)&&s!==e?n=r:o.push(s)}for(let e=o.length-1;e>=0;e--){const t=o[e];q(n,e=>e(t))}})(u,[f,w],[p,b]),h.reverse(),o&&h.length>0&&(n.context?n.invalid=!0:pC(h,t,u,w));const S=((e,t)=>{const n=t.forced_root_block??e.forced_root_block;return!1===n?"":!0===n?"p":n})(r,n);return S&&("body"===u.name||n.isRootContent)&&((e,n)=>{const o=uS(mS(dS),t.getBlockElements()),s=/^[ \t\r\n]+/,a=/[ \t\r\n]+$/;let i=e.firstChild,l=null;const c=e=>{e&&(i=e.firstChild,i&&3===i.type&&(i.value=i.value?.replace(s,"")),i=e.lastChild,i&&3===i.type&&(i.value=i.value?.replace(a,"")))};if(t.isValidChild(e.name,n.toLowerCase())){for(;i;){const t=i.next;g(o,i)?(l||(l=new xh(n,1),l.attr(r.forced_root_block_attrs),e.insert(l,i)),l.append(i)):(c(l),l=null),i=t}c(l)}})(u,S),n.invalid||lC(y,n),u}};return((e,t)=>{const n=e.schema;e.addAttributeFilter("href",e=>{let n=e.length;const o=e=>{const t=e?dn.trim(e):"";return/\b(noopener)\b/g.test(t)?t:(e=>e.split(" ").filter(e=>e.length>0).concat(["noopener"]).sort().join(" "))(t)};if(!t.allow_unsafe_link_target)for(;n--;){const t=e[n];"a"===t.name&&"_blank"===t.attr("target")&&t.attr("rel",o(t.attr("rel")))}}),t.allow_html_in_named_anchor||e.addAttributeFilter("id,name",e=>{let t,n,o,r,s=e.length;for(;s--;)if(r=e[s],"a"===r.name&&r.firstChild&&!r.attr("href"))for(o=r.parent,t=r.lastChild;t&&o;)n=t.prev,o.insert(t,r),t=n}),t.fix_list_elements&&e.addNodeFilter("ul,ol",e=>{let t,n,o=e.length;for(;o--;)if(t=e[o],n=t.parent,n&&("ul"===n.name||"ol"===n.name))if(t.prev&&"li"===t.prev.name)t.prev.append(t);else{const e=new xh("li",1);e.attr("style","list-style-type: none"),t.wrap(e)}});const o=n.getValidClasses();t.validate&&o&&e.addAttributeFilter("class",e=>{let t=e.length;for(;t--;){const n=e[t],r=n.attr("class")??"",s=dn.explode(r," ");let a="";for(let e=0;e{const{blob_cache:n}=t;if(n){const t=e=>{const t=e.attr("src");(e=>e.attr("src")===sn.transparentSrc||C(e.attr("data-mce-placeholder")))(e)||(e=>C(e.attr("data-mce-bogus")))(e)||v(t)||AC(n,t,!0).each(t=>{e.attr("src",t.blobUri())})};e.addAttributeFilter("src",e=>q(e,t))}})(e,t);const r=t.sandbox_iframes??!1,s=fe(t.sandbox_iframes_exclusions??[]);t.convert_unsafe_embeds&&e.addNodeFilter("object,embed",e=>q(e,e=>{e.replace((({type:e,src:t,width:n,height:o}={},r,s)=>{const a=(e=>y(e)?"iframe":OC(e,"image")?"img":OC(e,"video")?"video":OC(e,"audio")?"audio":"iframe")(e),i=new xh(a,1);return i.attr("audio"===a?{src:t}:{src:t,width:n,height:o}),"audio"!==a&&"video"!==a||i.attr("controls",""),"iframe"===a&&r&&TC(i,s),i})({type:e.attr("type"),src:"object"===e.name?e.attr("data"):e.attr("src"),width:e.attr("width"),height:e.attr("height")},r,s))})),r&&e.addNodeFilter("iframe",e=>q(e,e=>TC(e,s)))})(p,r),((e,t,n)=>{t.inline_styles&&wC(e,t,n)})(p,r,t),p},hS=e=>e instanceof xh,bS=(e,t,n)=>{const o=(e=>hS(e)?Hh({validate:!1}).serialize(e):e)(e),r=t(o);if(r.isDefaultPrevented())return r;if(hS(e)){if(r.content!==o){const t=pS({validate:!1,forced_root_block:!1,...n}).parse(r.content,{context:e.name});return{...r,content:t}}return{...r,content:e}}return r},yS=e=>({sanitize:nu(e),sandbox_iframes:lu(e),sandbox_iframes_exclusions:cu(e)}),vS=(e,t)=>{if(t.no_events)return Te.value(t);{const n=((e,t)=>e.dispatch("BeforeGetContent",t))(e,t);return n.isDefaultPrevented()?Te.error(ad(e,{content:"",...n}).content):Te.value(n)}},CS=(e,t,n)=>{if(n.no_events)return t;{const o=bS(t,t=>ad(e,{...n,content:t}),yS(e));return o.content}},wS=(e,t)=>{if(t.no_events)return Te.value(t);{const n=bS(t.content,n=>((e,t)=>e.dispatch("BeforeSetContent",t))(e,{...t,content:n}),yS(e));return n.isDefaultPrevented()?(sd(e,n),Te.error(void 0)):Te.value(n)}},SS=(e,t,n)=>{n.no_events||sd(e,{...n,content:t})},ES="autoresize_on_init,content_editable_state,padd_empty_with_br,block_elements,boolean_attributes,editor_deselector,editor_selector,elements,file_browser_callback_types,filepicker_validator_handler,force_hex_style_colors,force_p_newlines,gecko_spellcheck,images_dataimg_filter,media_scripts,mode,move_caret_before_on_enter_elements,non_empty_elements,self_closing_elements,short_ended_elements,special,spellchecker_select_languages,spellchecker_whitelist,tab_focus,tabfocus_elements,table_responsive_width,text_block_elements,text_inline_elements,toolbar_drawer,types,validate,whitespace_elements,paste_enable_default_filters,paste_filter_drop,paste_word_valid_elements,paste_retain_style_properties,paste_convert_word_fake_lists,template_cdate_classes,template_mdate_classes,template_selected_content_classes,template_preview_replace_values,template_replace_values,templates,template_cdate_format,template_mdate_format".split(","),xS=["content_css_cors"],_S="bbcode,colorpicker,contextmenu,fullpage,legacyoutput,spellchecker,template,textcolor,rtc".split(","),kS=[{name:"export",replacedWith:"Export to PDF"}],NS=(e,t)=>{const n=Y(t,t=>_e(e,t));return ie(n)},AS=e=>{const t=NS(e,ES),n=e.forced_root_block;return!1!==n&&""!==n||t.push("forced_root_block (false only)"),ie(t)},RS=e=>NS(e,xS),DS=(e,t)=>{const n=dn.makeMap(e.plugins," "),o=Y(t,e=>_e(n,e));return ie(o)},TS=e=>DS(e,_S),OS=e=>DS(e,kS.map(e=>e.name)),BS=e=>Z(kS,t=>t.name===e).fold(()=>e,t=>t.replacedWith?`${e}, replaced by ${t.replacedWith}`:e),PS={fire:'The "fire" event api has been deprecated and will be removed in TinyMCE 9. Use "dispatch" instead.',selectionSetContent:'The "editor.selection.setContent" method has been deprecated and will be removed in TinyMCE 9. Use "editor.insertContent" instead.'},LS=e=>{console.warn(PS[e],(new Error).stack)},MS=e=>0===e.dom.length?(Ao(e),I.none()):I.some(e),IS=(e,t,n,o,r)=>{e.bind(e=>((o?Hb:$b)(e.dom,o?e.dom.length:0,r),t.filter(Rn).map(t=>((e,t,n,o,r)=>{const s=e.dom,a=t.dom,i=o?s.length:a.length;o?(Vb(s,a,r,!1,!o),n.setStart(a,i)):(Vb(a,s,r,!1,!o),n.setEnd(a,i))})(e,t,n,o,r)))).orThunk(()=>{const e=((e,t)=>e.filter(e=>ip.isBookmarkNode(e.dom)).bind(t?jn:zn))(t,o).or(t).filter(Rn);return e.map(e=>((e,t,n)=>{Mn(e).each(o=>{const r=e.dom;t&&Bb(o,Kl(r,0),n)?$b(r,0,n):!t&&Pb(o,Kl(r,r.length),n)&&Hb(r,r.length,n)})})(e,o,r))})},FS=(e,t,n={})=>{const o=((e,t)=>({format:"html",...e,set:!0,selection:!0,content:t}))(n,t);wS(e,o).each(t=>{const n=((e,t)=>{if("raw"!==t.format){const n=e.selection.getRng(),o=e.dom.getParent(n.commonAncestorContainer,e.dom.isBlock),r=o?{context:o.nodeName.toLowerCase()}:{},s=e.parser.parse(t.content,{forced_root_block:!1,...r,...t});return Hh({validate:!1},e.schema).serialize(s)}return t.content})(e,t),o=e.selection.getRng();((e,t,n)=>{const o=I.from(t.firstChild).map(un.fromDom),r=I.from(t.lastChild).map(un.fromDom);e.deleteContents(),e.insertNode(t);const s=o.bind(zn).filter(Rn).bind(MS),a=r.bind(jn).filter(Rn).bind(MS);IS(s,o,e,!0,n),IS(a,r,e,!1,n),e.collapse(!1)})(o,o.createContextualFragment(n),e.schema),e.selection.setRng(o),fh(e,o),SS(e,n,t)})},US=(e,t)=>{let n=t.firstChild,o=t.lastChild;return n&&"meta"===n.name&&(n=n.next),o&&"mce_marker"===o.attr("id")&&(o=o.prev),((e,t)=>{const n=e.getNonEmptyElements();return C(t)&&(t.isEmpty(n)||((e,t)=>e.getBlockElements()[t.name]&&(e=>C(e.firstChild)&&e.firstChild===e.lastChild)(t)&&(e=>"br"===e.name||e.value===dt)(t.firstChild))(e,t))})(e,o)&&(o=o?.prev),!(!n||n!==o||"ul"!==n.name&&"ol"!==n.name)},zS=e=>{return e.length>0&&(!(n=e[e.length-1]).firstChild||(t=n,C(t?.firstChild)&&t.firstChild===t.lastChild&&(e=>e.data===dt||ps(e))(t.firstChild)))?e.slice(0,-1):e;var t,n},jS=(e,t)=>{const n=e.getParent(t,e.isBlock);return n&&"LI"===n.nodeName?n:null},$S=(e,t)=>{const n=Kl.after(e),o=yf(t).prev(n);return o?o.toRange():null},HS=(e,t,n,o)=>{const r=((e,t,n)=>{const o=t.serialize(n);return(e=>{const t=e.firstChild,n=e.lastChild;return t&&"META"===t.nodeName&&t.parentNode?.removeChild(t),n&&"mce_marker"===n.id&&n.parentNode?.removeChild(n),e})(e.createFragment(o))})(t,e,o),s=jS(t,n.startContainer),a=zS((i=r.firstChild,Y(i?.childNodes??[],e=>"LI"===e.nodeName)));var i;const l=t.getRoot(),c=e=>{const o=Kl.fromRangeStart(n),r=yf(t.getRoot()),a=1===e?r.prev(o):r.next(o),i=a?.getNode();return!i||jS(t,i)!==s};return s?c(1)?((e,t,n)=>{const o=e.parentNode;return o&&dn.each(t,t=>{o.insertBefore(t,e)}),((e,t)=>{const n=Kl.before(e),o=yf(t).next(n);return o?o.toRange():null})(e,n)})(s,a,l):c(2)?((e,t,n,o)=>(o.insertAfter(t.reverse(),e),$S(t[0],n)))(s,a,l,t):((e,t,n,o)=>{const r=((e,t)=>{const n=t.cloneRange(),o=t.cloneRange();return n.setStartBefore(e),o.setEndAfter(e),[n.cloneContents(),o.cloneContents()]})(e,o),s=e.parentNode;return s&&(s.insertBefore(r[0],e),dn.each(t,t=>{s.insertBefore(t,e)}),s.insertBefore(r[1],e),s.removeChild(e)),$S(t[t.length-1],n)})(s,a,l,n):null},VS=["pre"],qS=ws,WS=(e,t)=>{const n=e.schema.getTextInlineElements(),o=e.dom;if(t){const t=e.getBody(),r=Hy(e),s="*[data-mce-fragment]",a=o.select(s);dn.each(a,e=>{const a=e=>C(n[e.nodeName.toLowerCase()]),i=e=>1===e.childNodes.length;if(!Yh(o,l=e)&&!((e,t)=>Yh(e,t)&&H(Kh(e,t),e=>(e=>qh.has(e))(e)))(o,l)&&a(e)&&i(e)){const n=Kh(o,e),l=(e,t)=>oe(e,e=>$(t,e)),c=t=>i(e)&&o.is(t,s)&&a(t)&&(t.nodeName===e.nodeName&&l(n,Kh(o,t))||c(t.children[0])),d=n=>C(n)&&n!==t&&(r.compare(e,n)||d(n.parentElement)),m=n=>C(n)&&n!==t&&o.is(n,s)&&(((e,t,n)=>{const o=Kh(e,t),r=Kh(e,n),s=o=>{const r=e.getStyle(t,o)??"",s=e.getStyle(n,o)??"";return ot(r)&&ot(s)&&r!==s};return H(o,e=>{const t=t=>H(t,t=>t===e);if(!t(r)&&t(Wh)){const e=Y(r,e=>H(Wh,t=>Qe(e,t)));return H(e,s)}return s(e)})})(o,e,n)||m(n.parentElement));(c(e.children[0])||d(e.parentElement)&&!m(e.parentElement))&&o.remove(e,!0)}var l}),((e,t)=>{const n=Y(t,t=>oC(e.formatter,t));sC(e,"strikethrough",n)})(e,Po(a))}},KS=(e,t,n)=>{const o=e.selection,r=e.dom,s=e.parser,a=n.merge,i=Hh({validate:!0},e.schema),l='';n.preserve_zwsp||(t=Gi(t)),-1===t.indexOf("{$caret}")&&(t+="{$caret}"),t=t.replace(/\{\$caret\}/,l);let c=o.getRng();const d=c.startContainer,m=e.getBody();d===m&&o.isCollapsed()&&r.isBlock(m.firstChild)&&((e,t)=>C(t)&&!e.schema.getVoidElements()[t.nodeName])(e,m.firstChild)&&r.isEmpty(m.firstChild)&&(c=r.createRng(),c.setStart(m.firstChild,0),c.setEnd(m.firstChild,0),o.setRng(c)),o.isCollapsed()||(e=>{const t=e.dom,n=bC(e.selection.getRng());e.selection.setRng(n);const o=t.getParent(n.startContainer,qS);((e,t,n)=>!!C(n)&&n===e.getParent(t.endContainer,qS)&&tg(un.fromDom(n),t))(t,n,o)?Oy(e,n,un.fromDom(o)):ag(n,bs)||(r=n,ag(r,cs))?n.deleteContents():e.getDoc().execCommand("Delete",!1);var r})(e);const u=o.getNode(),f={context:u.nodeName.toLowerCase(),data:n.data,insert:!0},g=s.parse(t,f);if(!0===n.paste&&US(e.schema,g)&&((e,t)=>!!jS(e,t))(r,u))return c=HS(i,r,o.getRng(),g),c&&o.setRng(c),t;!0===n.paste&&((e,t,n,o)=>{const r=t.firstChild,s=t.lastChild,a=r===("bookmark"===s.attr("data-mce-type")?s.prev:s),i=$(VS,r.name);if(a&&i){const t="false"!==r.attr("contenteditable"),s=e.getParent(n,e.isBlock)?.nodeName.toLowerCase()===r.name,a=I.from(zy(o,n)).forall(ys);return t&&s&&a}return!1})(r,g,u,e.getBody())&&g.firstChild?.unwrap(),(e=>{let t=e;for(;t=t.walk();)1===t.type&&t.attr("data-mce-fragment","1")})(g);let p=g.lastChild;if(p&&"mce_marker"===p.attr("id")){const t=p;for(p=p.prev;p&&"table"!==p.name;p=p.walk(!0))if(3===p.type||!r.isBlock(p.name)){p.parent&&e.schema.isValidChild(p.parent.name,"span")&&p.parent.insert(t,p,"br"===p.name);break}}if(e._selectionOverrides.showBlockCaretContainer(u),f.invalid||((e,t,n)=>H(n.children(),aC)&&"SUMMARY"===e.getParent(t,e.isBlock)?.nodeName)(r,u,g)){FS(e,l);let n,a=o.getNode();const c=e.getBody();for(fs(a)?a=n=c:n=a;n&&n!==c;)a=n,n=n.parentNode;t=a===c?c.innerHTML:r.getOuterHTML(a);const d=s.parse(t),m=(e=>{for(let t=e;t;t=t.walk())if("mce_marker"===t.attr("id"))return I.some(t);return I.none()})(d),u=m.bind(fC).getOr(d);m.each(e=>e.replace(g));const f=(e=>{const t=[];for(let n=e.firstChild;C(n);n=n.walk())t.push(n);return t})(g);g.unwrap();const p=Y(f,t=>hC(e.schema,t));pC(p,e.schema,u),cC(s.getNodeFilters(),s.getAttributeFilters(),d),t=i.serialize(d),a===c?r.setHTML(c,t):r.setOuterHTML(a,t)}else t=i.serialize(g),((e,t,n)=>{"all"===n.getAttribute("data-mce-bogus")?n.parentNode?.insertBefore(e.dom.createFragment(t),n):((e,t)=>{if(e.isBlock(t)&&e.isEditable(t)){const e=t.childNodes;return 1===e.length&&ps(e[0])||0===e.length}return!1})(e.dom,n)?e.dom.setHTML(n,t):FS(e,t,{no_events:!0})})(e,t,u);var h;return WS(e,a),((e,t)=>{let n;const o=e.dom,r=e.selection;if(!t)return;r.scrollIntoView(t);const s=zy(e.getBody(),t);if(s&&"false"===o.getContentEditable(s))return o.remove(t),void r.select(s);let a=o.createRng();const i=t.previousSibling;if(cs(i)){a.setStart(i,i.nodeValue?.length??0);const e=t.nextSibling;cs(e)&&(i.appendData(e.data),e.parentNode?.removeChild(e))}else a.setStartBefore(t),a.setEndBefore(t);const l=o.getParent(t,o.isBlock);if(o.remove(t),l&&o.isEmpty(l)){const t=qS(l);No(un.fromDom(l)),a.setStart(l,0),a.setEnd(l,0),t||(e=>!!e.getAttribute("data-mce-fragment"))(l)||!(n=(t=>{let n=Kl.fromRangeStart(t);return n=yf(e.getBody()).next(n),n?.toRange()})(a))?o.add(l,o.create("br",t?{}:{"data-mce-bogus":"1"})):(a=n,o.remove(l))}r.setRng(a)})(e,r.get("mce_marker")),h=e.getBody(),dn.each(h.getElementsByTagName("*"),e=>{e.removeAttribute("data-mce-fragment")}),((e,t,n)=>{I.from(e.getParent(t,"td,th")).map(un.fromDom).each(e=>((e,t)=>{Kn(e).each(n=>{zn(n).each(o=>{t.isBlock(En(e))&&Mi(n)&&t.isBlock(En(o))&&Ao(n)})})})(e,n))})(r,o.getStart(),e.schema),((e,t,n)=>{const o=Fn(un.fromDom(n),e=>vn(e,un.fromDom(t)));le(o,o.length-2).filter(An).fold(()=>Ks(e,t),t=>Ks(e,t.dom))})(e.schema,e.getBody(),o.getStart()),t},YS=(e,t,n)=>{e.dom.setHTML(e.getBody(),t),!0!==n&&(e=>{Ap(e)&&Af(e.getBody()).each(t=>{const n=t.getNode(),o=as(n)?Af(n).getOr(t):t;e.selection.setRng(o.toRange())})})(e)},GS={},XS=os(["pre"]);(e=>{GS[e]||(GS[e]=[]),GS[e].push(e=>{if(!e.selection.getRng().collapsed){const t=e.selection.getSelectedBlocks(),n=Y(Y(t,XS),(e=>t=>{const n=t.previousSibling;return XS(n)&&$(e,n)})(t));q(n,e=>{((e,t)=>{const n=un.fromDom(t),o=Pn(n).dom;Ao(n),bo(un.fromDom(e),[un.fromTag("br",o),un.fromTag("br",o),...Vn(n)])})(e.previousSibling,e)})}})})("pre");const QS=dn.each,ZS=dn.each,JS=(e,t,n,o)=>{const r=e.formatter.get(t),s=r[0],a=!o&&e.selection.isCollapsed(),i=e.dom,l=e.selection,c=(t,o)=>{let r=!1;return ZS(t,t=>!(!Ng(t)||("false"!==i.getContentEditable(o)||t.ceFalseOverride)&&(!C(t.collapsed)||t.collapsed===a)&&i.is(o,t.selector)&&!Tf(o)&&(Jy(e,o,t,n,o),r=!0,1))),r},d=t=>{if(u(t)){const r=i.create(t);return Jy(e,r,s,n,o),r}return null},m=(a,i,l)=>{const m=[];let u=!0;const f=s.inline||s.block,g=d(f);Yg(a,i,o=>{let i;const d=o=>{let p=!1,h=u,b=!1;const y=o.parentNode,v=y.nodeName.toLowerCase(),w=a.getContentEditable(o);C(w)&&(h=u,u="true"===w,p=!0,b=bg(e,o));const S=u&&!p;if(ps(o)&&!((e,t,n,o)=>{if(dm(e)&&Ag(t)&&n.parentNode){const t=Ia(e.schema),a=(r=un.fromDom(n),s=e=>Tf(e.dom),((e,t)=>{const n=e.dom;return n.parentNode?cr(un.fromDom(n.parentNode),n=>!vn(e,n)&&t(n)):I.none()})(r,s).isSome());return ke(t,o)&&Ps(e.schema,n.parentNode,{skipBogus:!1,includeZwsp:!0})&&!a}var r,s;return!1})(e,s,o,v))return i=null,void(_g(s)&&a.remove(o));if((o=>kg(s)&&sv(e,o,t,n))(o))i=null;else{if(((t,n,o)=>{const r=(e=>_g(e)&&!0!==e.wrapper)(s)&&ug(e.schema,t)&&fg(e,n,f)&&(t=>oe(t.childNodes,t=>!ug(e.schema,t)||fg(e,f,t.nodeName.toLowerCase())))(t);return o&&r})(o,v,S)){const t=a.rename(o,f);return Jy(e,t,s,n,o),m.push(t),void(i=null)}if(Ng(s)){let e=c(r,o);if(!e&&C(y)&&Rg(s)&&(e=c(r,y)),!Ag(s)||e)return void(i=null)}C(g)&&((t,n,o,r)=>{const i=t.nodeName.toLowerCase(),c=fg(e,f,i)&&fg(e,n,f),d=!l&&cs(t)&&Yi(t.data),m=Tf(t),u=!Ag(s)||!a.isBlock(t);return(o||r)&&c&&!d&&!m&&u})(o,v,S,b)?(i||(i=a.clone(g,!1),y.insertBefore(i,o),m.push(i)),b&&p&&(u=h),i.appendChild(o)):(i=null,q(me(o.childNodes),d),p&&(u=h),i=null)}};q(o,d)}),!0===s.links&&q(m,t=>{const r=t=>{"A"===t.nodeName&&Jy(e,t,s,n,o),q(me(t.childNodes),r)};r(t)}),((e,t,n)=>{if($(nC,t)){const t=((e,t)=>ne(t,t=>{const n=Nr(t,t=>oC(e,t));return oC(e,t)?[t,...n]:n}))(e.formatter,n);sC(e,"strikethrough",t)}})(e,t,Po(m)),q(m,o=>{const i=(e=>{let t=0;return q(e.childNodes,e=>{(e=>C(e)&&cs(e)&&0===e.length)(e)||Vf(e)||t++}),t})(o);!(m.length>1)&&a.isBlock(o)||0!==i?(Ag(s)||_g(s)&&s.wrapper)&&(s.exact||1!==i||(o=(t=>{const o=Z(t.childNodes,lg).filter(e=>"false"!==a.getContentEditable(e)&&ov(a,e,s));return o.map(o=>{const r=a.clone(o,!1);return Jy(e,r,s,n,t),a.replace(r,t,!0),a.remove(o,!0),r}).getOr(t)})(o)),((e,t,n,o)=>{QS(t,t=>{Ag(t)&&QS(e.dom.select(t.inline,o),o=>{Tv(o)&&eC(e,t,n,o,t.exact?o:null)}),((e,t,n)=>{if(t.clear_child_styles){const o=t.links?"*:not(a)":"*";Dv(e.select(o,n),n=>{Tv(n)&&e.isEditable(n)&&Dv(t.styles,(t,o)=>{e.setStyle(n,o,"")})})}})(e.dom,t,o)})})(e,r,n,o),((e,t,n,o,r)=>{const s=r.parentNode;sv(e,s,n,o)&&eC(e,t,o,r)||t.merge_with_parents&&s&&e.dom.getParent(s,s=>!!sv(e,s,n,o)&&(eC(e,t,o,r),!0))})(e,s,t,n,o),((e,t,n,o)=>{if(t.styles&&t.styles.backgroundColor){const r=Mv(e,"fontSize");Lv(o,t=>r(t)&&e.isEditable(t),Iv(e,"backgroundColor",yg(t.styles.backgroundColor,n)))}})(a,s,n,o),((e,t,n,o)=>{const r=t=>{if(ts(t)&&es(t.parentNode)&&e.isEditable(t)){const n=Sg(e,t.parentNode);e.getStyle(t,"color")&&n?e.setStyle(t,"text-decoration",n):e.getStyle(t,"text-decoration")===n&&e.setStyle(t,"text-decoration",null)}};t.styles&&(t.styles.color||t.styles.textDecoration)&&(dn.walk(o,r,"childNodes"),r(o))})(a,s,0,o),((e,t,n,o)=>{if(Ag(t)&&("sub"===t.inline||"sup"===t.inline)){const n=Mv(e,"fontSize");Lv(o,t=>n(t)&&e.isEditable(t),Iv(e,"fontSize",""));const r=Y(e.select("sup"===t.inline?"sub":"sup",o),e.isEditable);e.remove(r,!0)}})(a,s,0,o),Pv(e,s,0,o)):a.remove(o,!0)})},f=ig(o)?o:l.getNode();if("false"!==i.getContentEditable(f)||bg(e,f)){if(s){if(o)if(ig(o)){if(!c(r,o)){const e=i.createRng();e.setStartBefore(o),e.setEndAfter(o),m(i,Kg(i,e,r),!0)}}else m(i,o,!0);else a&&Ag(s)&&!Qf(e).length?((e,t,n)=>{let o;const r=e.selection,s=e.formatter.get(t);if(!s)return;const a=r.getRng();let i=a.startOffset;const l=a.startContainer.nodeValue;o=Of(e.getBody(),r.getStart());const c=/[^\s\u00a0\u00ad\u200b\ufeff]/;if(l&&i>0&&i{rg(e,(e,t)=>{const n=t?e:Kg(i,e,r);m(i,n,!1)})},M),e.nodeChanged()),Ev(e.formatter,t).each(t=>{const o=(e=>{const t=Av(e).getOrThunk(()=>(e=>{if(e.isCollapsed())return[];const t=e.getRng(),n=Nv(e,e=>xv(t,e)&&!_s(e));if(1===n.length)return xv(t,n[0])&&_v(t,n[0])?n:[];{const e=ce(n).filter(e=>xv(t,e)).toArray(),o=de(n).filter(e=>_v(t,e)).toArray(),r=n.slice(1,-1);return e.concat(r).concat(o)}})(e.selection));return Y(t,kv(e.selection.dom))})(e);q(o,e=>Zy(i,e,t,n))});((e,t)=>{_e(GS,e)&&q(GS[e],e=>{e(t)})})(t,e)}od(e,t,o,n)}else{if(c(r,o=f),pg(i,o))return void q(hg(i,o),e=>{const t=i.createRng();t.selectNodeContents(e),m(i,t,!0)});if(_g(s)&&!i.isBlock(o)){const t=i.getParent(o,i.isBlock);if(i.isEditable(t)){const r=s.block;if(t.nodeName.toLowerCase()===r.toLowerCase())Jy(e,t,s,n,o);else if(!kg(s)){const a=i.rename(t,r);Jy(e,a,s,n,o)}}}else{const e=Y(r,Ng);I.from(i.getParent(o,t=>H(e,e=>i.is(t,e.selector)))).filter(i.isEditable).each(e=>c(r,e))}od(e,t,o,n)}},eE=(e,t,n,o)=>{(o||e.selection.isEditable())&&JS(e,t,n,o)},tE=e=>_e(e,"vars"),nE=e=>e.selection.getStart(),oE=(e,t,n,o,r)=>Q(t,t=>{const s=e.formatter.matchNode(t,n,r??{},o);return!y(s)},t=>!!tv(e,t,n)||!o&&C(e.formatter.matchNode(t,n,r,!0))),rE=(e,t)=>{const n=t??nE(e);return Y(Eg(e.dom,n),e=>es(e)&&!ss(e))},sE=(e,t,n)=>{const o=rE(e,t);he(n,(n,r)=>{const s=n=>{const s=oE(e,o,r,n.similar,tE(n)?n.vars:void 0),a=s.isSome();if(n.state.get()!==a){n.state.set(a);const e=s.getOr(t);tE(n)?n.callback(a,{node:e,format:r,parents:o}):q(n.callbacks,t=>t(a,{node:e,format:r,parents:o}))}};q([n.withSimilar,n.withoutSimilar],s),q(n.withVars,s)})},aE=(e,t,n)=>({element:e,width:t,rows:n}),iE=(e,t)=>({element:e,cells:t}),lE=(e,t)=>({x:e,y:t}),cE=(e,t)=>So(e,t).bind(st).getOr(1),dE=(e,t,n)=>{const o=e.rows;return!!(o[n]?o[n].cells:[])[t]},mE=e=>X(e,(e,t)=>t.cells.length>e?t.cells.length:e,0),uE=(e,t)=>{const n=e.rows;for(let e=0;e{const s=[],a=e.rows;for(let e=n;e<=r;e++){const n=a[e].cells,r=t((e,t)=>{const n=To(e.element),o=un.fromTag("tbody");return bo(o,t),go(n,o),n})(e,(e=>V(e.rows,e=>{const t=V(e.cells,e=>{const t=Oo(e);return xo(t,"colspan"),xo(t,"rowspan"),t}),n=To(e.element);return bo(n,t),n}))(e)),pE=(e,t,n)=>{const o=un.fromDom(t.commonAncestorContainer),r=mb(o,e),s=Y(r,e=>n.isWrapper(En(e))),a=((e,t)=>Z(e,e=>"li"===En(e)&&tg(e,t)).fold(N([]),t=>(e=>Z(e,e=>"ul"===En(e)||"ol"===En(e)))(e).map(e=>{const t=un.fromTag(En(e)),n=we(qo(e),(e,t)=>Qe(t,"list-style"));return jo(t,n),[un.fromTag("li"),t]}).getOr([])))(r,t),i=s.concat(a.length?a:(e=>ji(e)?Mn(e).filter(zi).fold(N([]),t=>[e,t]):zi(e)?[e]:[])(o));return V(i,To)},hE=()=>tr([]),bE=(e,t)=>((e,t)=>mr(t,"table",D(vn,e)))(e,t[0]).bind(e=>{const n=t[0],o=t[t.length-1],r=(e=>{const t=aE(To(e),0,[]);return q(Ar(e,"tr"),(e,n)=>{q(Ar(e,"td,th"),(o,r)=>{((e,t,n,o,r)=>{const s=cE(r,"rowspan"),a=cE(r,"colspan"),i=e.rows;for(let e=n;e{for(;dE(e,t,n);)t++;return t})(t,r,n),n,e,o)})}),aE(t.element,mE(t.rows),t.rows)})(e);return((e,t,n)=>uE(e,t).bind(t=>uE(e,n).map(n=>((e,t,n)=>{const o=t.x,r=t.y,s=n.x,a=n.y,i=rtr([gE(e)]))}).getOrThunk(hE),yE=(e,t,n)=>{const o=Xf(t,e);return o.length>0?bE(e,o):((e,t,n)=>t.length>0&&t[0].collapsed?hE():((e,t,n)=>((e,t)=>{const n=X(t,(e,t)=>(go(t,e),t),e);return t.length>0?tr([n]):n})(un.fromDom(t.cloneContents()),pE(e,t,n)))(e,t[0],n))(e,t,n)},vE=(e,t)=>t>=0&&tGi(e.innerText),wE=e=>es(e)?e.outerHTML:cs(e)?Sa.encodeRaw(e.data,!1):us(e)?"\x3c!--"+e.data+"--\x3e":"",SE=(e,t)=>(((e,t)=>{let n=0;q(e,e=>{0===e[0]?n++:1===e[0]?(((e,t,n)=>{const o=(e=>{let t;const n=document.createElement("div"),o=document.createDocumentFragment();for(e&&(n.innerHTML=e);t=n.firstChild;)o.appendChild(t);return o})(t);if(e.hasChildNodes()&&n{if(e.hasChildNodes()&&t{const n=e.length+t.length+2,o=new Array(n),r=new Array(n),s=(n,o,r,a,l)=>{const c=i(n,o,r,a);if(null===c||c.start===o&&c.diag===o-a||c.end===n&&c.diag===n-r){let s=n,i=r;for(;sa-r?(l.push([2,e[s]]),++s):(l.push([1,t[i]]),++i)}else{s(n,c.start,r,c.start-c.diag,l);for(let t=c.start;t{let a=n;for(;a-o({start:e,end:t,diag:n}))(n,a,o)},i=(n,s,i,l)=>{const c=s-n,d=l-i;if(0===c||0===d)return null;const m=c-d,u=d+c,f=(u%2==0?u:u+1)/2;let g,p,h,b,y;for(o[1+f]=n,r[1+f]=s+1,g=0;g<=f;++g){for(p=-g;p<=g;p+=2){for(h=p+f,p===-g||p!==g&&o[h-1]=n&&y>=i&&e[b]===t[y];)r[h]=b--,y--;if(m%2==0&&-g<=p&&p<=g&&r[h]<=o[h+m])return a(r[h],p+n-i,s,l)}}return null},l=[];return s(0,e.length,0,t.length,l),l})(V(me(t.childNodes),wE),e),t),t),EE=lt(()=>document.implementation.createHTMLDocument("undo")),xE=e=>{const t=e.serializer.getTempAttrs(),n=Ih(e.getBody(),t);return(e=>null!==e.querySelector(`iframe, ${As}`))(n)?{type:"fragmented",fragments:Y(V(me(n.childNodes),_(Gi,wE)),e=>e.length>0),content:"",bookmark:null,beforeBookmark:null}:{type:"complete",fragments:null,content:Gi(n.innerHTML),bookmark:null,beforeBookmark:null}},_E=(e,t,n)=>{const o=n?t.beforeBookmark:t.bookmark;"fragmented"===t.type?SE(t.fragments,e.getBody()):e.setContent(t.content,{format:"raw",no_selection:!C(o)||!Pf(o)||!o.isFakeCaret}),o&&(e.selection.moveToBookmark(o),e.selection.scrollIntoView())},kE=e=>"fragmented"===e.type?e.fragments.join(""):e.content,NE=(e,t)=>{const n=un.fromTag("body",EE());return Mo(n,kE(t)),q(Ar(n,"*[data-mce-bogus]"),Ro),e&&q(Ar(n,"details[open]"),e=>xo(e,"open")),Lo(n)},AE=(e,t,n)=>!(!t||!n)&&(!!((e,t)=>kE(e)===kE(t))(t,n)||((e,t,n)=>NE(e,t)===NE(e,n))(e,t,n)),RE=e=>0===e.get(),DE=(e,t,n)=>{RE(n)&&(e.typing=t)},TE=(e,t)=>{e.typing&&(DE(e,!1,t),e.add())},OE=e=>({init:{bindEvents:x},undoManager:{beforeChange:(t,n)=>((e,t,n)=>{RE(t)&&n.set(gc(e.selection))})(e,t,n),add:(t,n,o,r,s,a)=>((e,t,n,o,r,s,a)=>{const i=xE(e),l=dn.extend(s||{},i);if(!RE(o)||e.removed)return null;const c=t.data[n.get()];if(e.dispatch("BeforeAddUndo",{level:l,lastLevel:c,originalEvent:a}).isDefaultPrevented())return null;if(c&&AE(e.readonly,c,l))return null;t.data[n.get()]&&r.get().each(e=>{t.data[n.get()].beforeBookmark=e});const d=ym(e);if(d&&t.data.length>d){for(let e=0;e0?(e.setDirty(!0),e.dispatch("AddUndo",m),e.dispatch("change",m)):e.dispatch("AddUndo",m),l})(e,t,n,o,r,s,a),undo:(t,n,o)=>((e,t,n,o)=>{let r;return t.typing&&(t.add(),t.typing=!1,DE(t,!1,n)),o.get()>0&&(o.set(o.get()-1),r=t.data[o.get()],_E(e,r,!0),e.setDirty(!0),e.dispatch("Undo",{level:r})),r})(e,t,n,o),redo:(t,n)=>((e,t,n)=>{let o;return t.get()((e,t,n)=>{t.data=[],n.set(0),t.typing=!1,e.dispatch("ClearUndos")})(e,t,n),reset:e=>(e=>{e.clear(),e.add()})(e),hasUndo:(t,n)=>((e,t,n)=>n.get()>0||t.typing&&t.data[0]&&!AE(e.readonly,xE(e),t.data[0]))(e,t,n),hasRedo:(e,t)=>((e,t)=>t.get()((e,t,n)=>(TE(e,t),e.beforeChange(),e.ignore(n),e.add()))(e,t,n),ignore:(e,t)=>((e,t)=>{try{e.set(e.get()+1),t()}finally{e.set(e.get()-1)}})(e,t),extra:(t,n,o,r)=>((e,t,n,o,r)=>{if(t.transact(o)){const o=t.data[n.get()].bookmark,s=t.data[n.get()-1];_E(e,s,!0),t.transact(r)&&(t.data[n.get()-1].beforeBookmark=o)}})(e,t,n,o,r)},formatter:{match:(t,n,o,r)=>lv(e,t,n,o,r),matchAll:(t,n)=>((e,t,n)=>{const o=[],r={},s=e.selection.getStart();return e.dom.getParent(s,s=>{for(let a=0;asv(e,t,n,o,r),canApply:t=>((e,t)=>{const n=e.formatter.get(t),o=e.dom;if(n&&e.selection.isEditable()){const t=e.selection.getStart(),r=Eg(o,t);for(let e=n.length-1;e>=0;e--){const t=n[e];if(!Ng(t))return!0;for(let e=r.length-1;e>=0;e--)if(o.is(r[e],t.selector))return!0}}return!1})(e,t),closest:t=>((e,t)=>{const n=t=>vn(t,un.fromDom(e.getBody()));return I.from(e.selection.getStart(!0)).bind(o=>Or(un.fromDom(o),n=>ue(t,t=>((t,n)=>sv(e,t.dom,n)?I.some(n):I.none())(n,t)),n)).getOrNull()})(e,t),apply:(t,n,o)=>eE(e,t,n,o),remove:(t,n,o,r)=>Jv(e,t,n,o,r),toggle:(t,n,o)=>((e,t,n,o)=>{const r=e.formatter.get(t);r&&(!lv(e,t,n,o)||"toggle"in r[0]&&!r[0].toggle?eE(e,t,n,o):Jv(e,t,n,o))})(e,t,n,o),formatChanged:(t,n,o,r,s)=>((e,t,n,o,r,s)=>(((e,t,n,o,r,s)=>{const a=t.get();q(n.split(","),t=>{const n=xe(a,t).getOrThunk(()=>{const e={withSimilar:{state:Ae(!1),similar:!0,callbacks:[]},withoutSimilar:{state:Ae(!1),similar:!1,callbacks:[]},withVars:[]};return a[t]=e,e}),i=()=>{const n=rE(e);return oE(e,n,t,r,s).isSome()};if(y(s)){const e=r?n.withSimilar:n.withoutSimilar;e.callbacks.push(o),1===e.callbacks.length&&e.state.set(i())}else n.withVars.push({state:Ae(i()),similar:r,vars:s,callback:o})}),t.set(a)})(e,t,n,o,r,s),{unbind:()=>((e,t,n)=>{const o=e.get();q(t.split(","),e=>xe(o,e).each(t=>{o[e]={withSimilar:{...t.withSimilar,callbacks:Y(t.withSimilar.callbacks,e=>e!==n)},withoutSimilar:{...t.withoutSimilar,callbacks:Y(t.withoutSimilar.callbacks,e=>e!==n)},withVars:Y(t.withVars,e=>e.callback!==n)}})),e.set(o)})(t,n,o)}))(e,t,n,o,r,s)},editor:{getContent:t=>((e,t)=>I.from(e.getBody()).fold(N("tree"===t.format?new xh("body",11):""),n=>zh(e,t,n)))(e,t),setContent:(t,n)=>((e,t,n)=>I.from(e.getBody()).map(o=>hS(t)?((e,t,n,o)=>{cC(e.parser.getNodeFilters(),e.parser.getAttributeFilters(),n);const r=Hh({validate:!1},e.schema).serialize(n),s=Gi(Vi(un.fromDom(t))?r:dn.trim(r));return YS(e,s,o.no_selection),{content:n,html:s}})(e,o,t,n):((e,t,n,o)=>{if(0===(n=Gi(n)).length||/^\s+$/.test(n)){const r='
    ';"TABLE"===t.nodeName?n=""+r+"":/^(UL|OL)$/.test(t.nodeName)&&(n="
  • "+r+"
  • ");const s=Ed(e);return e.schema.isValidChild(t.nodeName.toLowerCase(),s.toLowerCase())?(n=r,n=e.dom.createHTML(s,xd(e),n)):n||(n=r),YS(e,n,o.no_selection),{content:n,html:n}}{"raw"!==o.format&&(n=Hh({validate:!1},e.schema).serialize(e.parser.parse(n,{isRootContent:!0,insert:!0})));const r=Vi(un.fromDom(t))?n:dn.trim(n);return YS(e,r,o.no_selection),{content:r,html:r}}})(e,o,t,n)).getOr({content:t,html:hS(n.content)?"":n.content}))(e,t,n),insertContent:(t,n)=>KS(e,t,n),addVisual:t=>((e,t)=>{const n=e.dom,o=C(t)?t:e.getBody();q(n.select("table,a",o),t=>{switch(t.nodeName){case"TABLE":const o=Nm(e),r=n.getAttrib(t,"border");r&&"0"!==r||!e.hasVisual?n.removeClass(t,o):n.addClass(t,o);break;case"A":if(!n.getAttrib(t,"href")){const o=n.getAttrib(t,"name")||t.id,r=Am(e);o&&e.hasVisual?n.addClass(t,r):n.removeClass(t,r)}}}),e.dispatch("VisualAid",{element:t,hasVisual:e.hasVisual})})(e,t)},selection:{getContent:(t,n)=>((e,t,n={})=>{const o=((e,t)=>({...e,format:t,get:!0,selection:!0,getInner:!0}))(n,t);return vS(e,o).fold(A,t=>{const n=((e,t)=>{if("text"===t.format)return(e=>I.from(e.selection.getRng()).map(t=>{const n=I.from(e.dom.getParent(t.commonAncestorContainer,e.dom.isBlock)),o=e.getBody(),r=(e=>e.map(e=>e.nodeName).getOr("div").toLowerCase())(n),s=un.fromDom(t.cloneContents());Fh(s),Uh(s);const a=e.dom.add(o,r,{"data-mce-bogus":"all",style:"overflow: hidden; opacity: 0;"},s.dom),i=CE(a),l=Gi(a.textContent??"");if(e.dom.remove(a),vE(l,0)||vE(l,l.length-1)){const e=n.getOr(o),t=CE(e),r=t.indexOf(i);return-1===r?i:(vE(t,r-1)?" ":"")+i+(vE(t,r+i.length)?" ":"")}return i}).getOr(""))(e);{const n=((e,t)=>{const n=e.selection.getRng(),o=e.dom.create("body"),r=e.selection.getSel(),s=vh(e,Gf(r)),a=t.contextual?yE(un.fromDom(e.getBody()),s,e.schema).dom:n.cloneContents();return a&&o.appendChild(a),e.selection.serializer.serialize(o,t)})(e,t);return"tree"===t.format?n:e.selection.isCollapsed()?"":n}})(e,t);return CS(e,n,t)})})(e,t,n)},autocompleter:{addDecoration:x,removeDecoration:x},raw:{getModel:()=>I.none()}}),BE=e=>_e(e.plugins,"rtc"),PE=e=>e.rtcInstance?e.rtcInstance:OE(e),LE=e=>{const t=e.rtcInstance;if(t)return t;throw new Error("Failed to get RTC instance not yet initialized.")},ME=e=>LE(e).init.bindEvents(),IE=(e,t,n)=>{if(_e(e,t)){const o=Y(e[t],e=>e!==n);0===o.length?delete e[t]:e[t]=o}};const FE=e=>!(!e||!e.ownerDocument)&&Cn(un.fromDom(e.ownerDocument),un.fromDom(e)),UE=(e,t,n,o)=>{let r,s;const{selectorChangedWithUnbind:a}=((e,t)=>{let n,o;const r=(t,n)=>Z(n,n=>e.is(n,t)),s=t=>e.getParents(t,void 0,e.getRoot());return{selectorChangedWithUnbind:(e,a)=>(n||(n={},o={},t.on("NodeChange",e=>{const t=e.element,a=s(t),i={};he(n,(e,t)=>{r(t,a).each(n=>{o[t]||(q(e,e=>{e(!0,{node:n,selector:t,parents:a})}),o[t]=e),i[t]=e})}),he(o,(e,n)=>{i[n]||(delete o[n],q(e,e=>{e(!1,{node:t,selector:n,parents:a})}))})})),n[e]||(n[e]=[]),n[e].push(a),r(e,s(t.selection.getStart())).each(()=>{o[e]=n[e]}),{unbind:()=>{IE(n,e,a),IE(o,e,a)}})}})(e,o),i=e=>{const t=c();t.collapse(!!e),d(t)},l=()=>t.getSelection?t.getSelection():t.document.selection,c=()=>{let n;const a=(e,t,n)=>{try{return t.compareBoundaryPoints(e,n)}catch{return-1}},i=t.document;if(C(o.bookmark)&&!Ap(o)){const e=hp(o);if(e.isSome())return e.map(e=>vh(o,[e])[0]).getOr(i.createRange())}try{const e=l();e&&!Jr(e.anchorNode)&&(n=e.rangeCount>0?e.getRangeAt(0):i.createRange(),n=vh(o,[n])[0])}catch{}if(n||(n=i.createRange()),fs(n.startContainer)&&n.collapsed){const t=e.getRoot();n.setStart(t,0),n.setEnd(t,0)}return r&&s&&(0===a(n.START_TO_START,n,r)&&0===a(n.END_TO_END,n,r)?n=s:(r=null,s=null)),n},d=(e,t)=>{if(!(e=>!!e&&FE(e.startContainer)&&FE(e.endContainer))(e))return;const n=l();if(e=o.dispatch("SetSelectionRange",{range:e,forward:t}).range,n){s=e;try{n.removeAllRanges(),n.addRange(e)}catch{}!1===t&&n.extend&&(n.collapse(e.endContainer,e.endOffset),n.extend(e.startContainer,e.startOffset)),r=n.rangeCount>0?n.getRangeAt(0):null}if(!e.collapsed&&e.startContainer===e.endContainer&&n?.setBaseAndExtent&&e.endOffset-e.startOffset<2&&e.startContainer.hasChildNodes()){const t=e.startContainer.childNodes[e.startOffset];t&&"IMG"===t.nodeName&&(n.setBaseAndExtent(e.startContainer,e.startOffset,e.endContainer,e.endOffset),n.anchorNode===e.startContainer&&n.focusNode===e.endContainer||n.setBaseAndExtent(t,0,t,1))}o.dispatch("AfterSetSelectionRange",{range:e,forward:t})},m=()=>{const t=l(),n=t?.anchorNode,o=t?.focusNode;if(!t||!n||!o||Jr(n)||Jr(o))return!0;const r=e.createRng(),s=e.createRng();try{r.setStart(n,t.anchorOffset),r.collapse(!0),s.setStart(o,t.focusOffset),s.collapse(!0)}catch{return!0}return r.compareBoundaryPoints(r.START_TO_START,s)<=0},u={dom:e,win:t,serializer:n,editor:o,expand:(t={type:"word"})=>d(Gp(e).expand(c(),t)),collapse:i,setCursorLocation:(t,n)=>{const r=e.createRng();C(t)&&C(n)?(r.setStart(t,n),r.setEnd(t,n),d(r),i(!1)):(ng(e,r,o.getBody(),!0),d(r))},getContent:e=>((e,t={})=>((e,t,n)=>LE(e).selection.getContent(t,n))(e,t.format?t.format:"html",t))(o,e),setContent:(e,t)=>((e,t,n={})=>{LS("selectionSetContent"),FS(e,t,n)})(o,e,t),getBookmark:(e,t)=>f.getBookmark(e,t),moveToBookmark:e=>f.moveToBookmark(e),select:(t,n)=>(((e,t,n)=>I.from(t).bind(t=>I.from(t.parentNode).map(o=>{const r=e.nodeIndex(t),s=e.createRng();return s.setStart(o,r),s.setEnd(o,r+1),n&&(ng(e,s,t,!0),ng(e,s,t,!1)),s})))(e,t,n).each(d),t),isCollapsed:()=>{const e=c(),t=l();return!(!e||e.item)&&(e.compareEndPoints?0===e.compareEndPoints("StartToEnd",e):!t||e.collapsed)},isEditable:()=>{if(o.mode.isReadOnly())return!1;const t=c(),n=o.getBody().querySelectorAll('[data-mce-selected="1"]');return n.length>0?oe(n,t=>e.isEditable(t.parentElement)):gh(e,t)},isForward:m,setNode:t=>(FS(o,e.getOuterHTML(t)),t),getNode:()=>((e,t)=>{if(!t)return e;let n=t.startContainer,o=t.endContainer;const r=t.startOffset,s=t.endOffset;let a=t.commonAncestorContainer;t.collapsed||(n===o&&s-r<2&&n.hasChildNodes()&&(a=n.childNodes[r]),cs(n)&&cs(o)&&(n=n.length===r?yh(n.nextSibling,!0):n.parentNode,o=0===s?yh(o.previousSibling,!1):o.parentNode,n&&n===o&&(a=n)));const i=cs(a)?a.parentNode:a;return ts(i)?i:e})(o.getBody(),c()),getSel:l,setRng:d,getRng:c,getStart:e=>hh(o.getBody(),c(),e),getEnd:e=>bh(o.getBody(),c(),e),getSelectedBlocks:(t,n)=>((e,t,n,o)=>{const r=[],s=e.getRoot(),a=e.getParent(n||hh(s,t,t.collapsed),e.isBlock),i=e.getParent(o||bh(s,t,t.collapsed),e.isBlock);if(a&&a!==s&&r.push(a),a&&i&&a!==i){let t;const n=new Kr(a,s);for(;(t=n.next())&&t!==i;)e.isBlock(t)&&r.push(t)}return i&&a!==i&&i!==s&&r.push(i),r})(e,c(),t,n),normalize:()=>{const t=c(),n=l();if(!(Gf(n).length>1)&&og(o)){const n=Wp(e,t);return n.each(e=>{d(e,m())}),n.getOr(t)}return t},selectorChanged:(e,t)=>(a(e,t),u),selectorChangedWithUnbind:a,getScrollContainer:()=>{let t,n=e.getRoot();for(;n&&"BODY"!==n.nodeName;){if(n.scrollHeight>n.clientHeight){t=n;break}n=n.parentNode}return t},scrollIntoView:(e,t)=>{C(e)?((e,t,n)=>{(e.inline?dh:uh)(e,t,n)})(o,e,t):fh(o,c(),t)},placeCaretAt:(e,t)=>d(Fp(e,t,o.getDoc())),getBoundingClientRect:()=>{const e=c();return e.collapsed?Kl.fromRangeStart(e).getClientRects()[0]:e.getBoundingClientRect()},destroy:()=>{t=r=s=null,g.destroy()}},f=ip(u),g=Ip(u,o);return u.bookmarkManager=f,u.controlSelection=g,u},zE=(e,t,n)=>{-1===dn.inArray(t,n)&&(e.addAttributeFilter(n,(e,t)=>{let n=e.length;for(;n--;)e[n].attr(t,null)}),t.push(n))},jE=(e,t)=>{const n=["data-mce-selected"],o={entity_encoding:"named",remove_trailing_brs:!0,pad_empty_with_br:!1,...e},r=t&&t.dom?t.dom:gi.DOM,s=t&&t.schema?t.schema:Ua(o),a=pS(o,s);return((e,t,n)=>{e.addAttributeFilter("data-mce-tabindex",(e,t)=>{let n=e.length;for(;n--;){const o=e[n];o.attr("tabindex",o.attr("data-mce-tabindex")),o.attr(t,null)}}),e.addAttributeFilter("src,href,style",(e,o)=>{const r="data-mce-"+o,s=t.url_converter,a=t.url_converter_scope;let i=e.length;for(;i--;){const t=e[i];let l=t.attr(r);void 0!==l?(t.attr(o,l.length>0?l:null),t.attr(r,null)):(l=t.attr(o),"style"===o?l=n.serializeStyle(n.parseStyle(l),t.name):s&&(l=s.call(a,l,o,t.name)),t.attr(o,l.length>0?l:null))}}),e.addAttributeFilter("class",e=>{let t=e.length;for(;t--;){const n=e[t];let o=n.attr("class");o&&(o=o.replace(/(?:^|\s)mce-item-\w+(?!\S)/g,""),n.attr("class",o.length>0?o:null))}}),e.addAttributeFilter("data-mce-type",(e,t,n)=>{let o=e.length;for(;o--;){const t=e[o];if("bookmark"===t.attr("data-mce-type")&&!n.cleanup){const e=I.from(t.firstChild).exists(e=>!Yi(e.value??""));e?t.unwrap():t.remove()}}}),e.addNodeFilter("script,style",(e,n)=>{const o=e=>e.replace(/()/g,"\n").replace(/^[\r\n]*|[\r\n]*$/g,"").replace(/^\s*(()?|\s*\/\/\s*\]\]>(-->)?|\/\/\s*(-->)?|\]\]>|\/\*\s*-->\s*\*\/|\s*-->\s*)\s*$/g,"");let r=e.length;for(;r--;){const s=e[r],a=s.firstChild,i=a?.value??"";if("script"===n){const e=s.attr("type");e&&s.attr("type","mce-no/type"===e?null:e.replace(/^mce\-/,"")),"xhtml"===t.element_format&&a&&i.length>0&&(a.value="// ")}else"xhtml"===t.element_format&&a&&i.length>0&&(a.value="\x3c!--\n"+o(i)+"\n--\x3e")}}),e.addNodeFilter("#comment",e=>{let o=e.length;for(;o--;){const r=e[o],s=r.value;t.preserve_cdata&&0===s?.indexOf("[CDATA[")&&(r.name="#cdata",r.type=4,r.value=n.decode(s.replace(/^\[CDATA\[|\]\]$/g,"")))}}),e.addNodeFilter("xml:namespace,input",(e,t)=>{let n=e.length;for(;n--;){const o=e[n];7===o.type?o.remove():1===o.type&&("input"!==t||o.attr("type")||o.attr("type","text"))}}),e.addAttributeFilter("data-mce-type",t=>{q(t,t=>{"format-caret"===t.attr("data-mce-type")&&(t.isEmpty(e.schema.getNonEmptyElements())?t.remove():t.unwrap())})}),e.addAttributeFilter("data-mce-src,data-mce-href,data-mce-style,data-mce-selected,data-mce-expando,data-mce-block,data-mce-type,data-mce-resize,data-mce-placeholder",(e,t)=>{let n=e.length;for(;n--;)e[n].attr(t,null)}),t.remove_trailing_brs&&((e,t,n)=>{t.addNodeFilter("br",(t,o,r)=>{const s=dn.extend({},n.getBlockElements()),a=n.getNonEmptyElements(),i=n.getWhitespaceElements();s.body=1;const l=e=>e.name in s||ea(n,e);for(let o=0,c=t.length;o{const{indent:i,entity_encoding:l,...c}=n,d={format:"html",...c},m=((e,t,n)=>((e,t)=>C(e)&&e.hasEventListeners("PreProcess")&&!t.no_events)(e,n)?((e,t,n)=>{let o;const r=e.dom;let s=t.cloneNode(!0);const a=document.implementation;if(a.createHTMLDocument){const e=a.createHTMLDocument("");dn.each("BODY"===s.nodeName?s.childNodes:[s],t=>{e.body.appendChild(e.importNode(t,!0))}),s="BODY"!==s.nodeName?e.body.firstChild:e.body,o=r.doc,r.doc=e}return((e,t)=>{e.dispatch("PreProcess",t)})(e,{...n,node:s}),o&&(r.doc=o),s})(e,t,n):t)(t,e,d),u=((e,t,n)=>{const o=Gi(n.getInner?t.innerHTML:e.getOuterHTML(t));return n.selection||Vi(un.fromDom(t))?o:dn.trim(o)})(r,m,d),f=((e,t,n)=>{const o=n.selection?{forced_root_block:!1,...n}:n,r=e.parse(t,o);return(e=>{const t=e=>"br"===e?.name,n=e.lastChild;if(t(n)){const e=n.prev;t(e)&&(n.remove(),e.remove())}})(r),r})(a,u,d);if("tree"===d.format)return f;const g={...o,...C(i)?{indent:i}:{},...C(l)?{entity_encoding:l}:{}};return((e,t,n,o,r)=>{const s=((e,t,n)=>Hh(e,t).serialize(n))(t,n,o);return((e,t,n)=>{if(!t.no_events&&e){const o=((e,t)=>e.dispatch("PostProcess",t))(e,{...t,content:n});return o.content}return n})(e,r,s)})(t,g,s,f,d)},addRules:s.addValidElements,setRules:s.setValidElements,addTempAttr:D(zE,a,n),getTempAttrs:N(n),getNodeFilters:a.getNodeFilters,getAttributeFilters:a.getAttributeFilters,removeNodeFilter:a.removeNodeFilter,removeAttributeFilter:a.removeAttributeFilter}},$E=(e,t)=>{const n=jE(e,t);return{schema:n.schema,addNodeFilter:n.addNodeFilter,addAttributeFilter:n.addAttributeFilter,serialize:n.serialize,addRules:n.addRules,setRules:n.setRules,addTempAttr:n.addTempAttr,getTempAttrs:n.getTempAttrs,getNodeFilters:n.getNodeFilters,getAttributeFilters:n.getAttributeFilters,removeNodeFilter:n.removeNodeFilter,removeAttributeFilter:n.removeAttributeFilter}},HE=(e,t,n={})=>{const o=((e,t)=>({format:"html",...e,set:!0,content:t}))(n,t);wS(e,o).each(t=>{const n=((e,t,n)=>PE(e).editor.setContent(t,n))(e,t.content,t);SS(e,n.html,t)})},VE=gi.DOM,qE=e=>I.from(e).each(e=>e.destroy()),WE=(()=>{const e={};return{add:(t,n)=>{e[t]=n},get:t=>e[t]?e[t]:{icons:{}},has:t=>_e(e,t)}})(),KE=wi.ModelManager,YE=(e,t)=>t.dom[e],GE=(e,t)=>parseInt($o(t,e),10),XE=D(YE,"clientWidth"),QE=D(YE,"clientHeight"),ZE=D(GE,"margin-top"),JE=D(GE,"margin-left"),ex=e=>{const t=[],n=()=>{const t=e.theme;return t&&t.getNotificationManagerImpl?t.getNotificationManagerImpl():(()=>{const e=()=>{throw new Error("Theme did not provide a NotificationManager implementation.")};return{open:e,close:e,getArgs:e}})()},o=()=>I.from(t[0]),r=()=>{o().each(e=>{e.reposition()})},s=e=>{J(t,t=>t===e).each(e=>{t.splice(e,1)})},a=(o,a=!0)=>e.removed||!(e=>{return(t=e.inline?e.getBody():e.getContentAreaContainer(),I.from(t).map(un.fromDom)).map(Fo).getOr(!1);var t})(e)?{}:(a&&e.dispatch("BeforeOpenNotification",{notification:o}),Z(t,e=>{return t=n().getArgs(e),r=o,!(t.type!==r.type||t.text!==r.text||t.progressBar||t.timeout||r.progressBar||r.timeout);var t,r}).getOrThunk(()=>{e.editorManager.setActive(e);const a=n().open(o,()=>{s(a)},()=>Rp(e));return(e=>{t.push(e)})(a),r(),e.dispatch("OpenNotification",{notification:{...a}}),a})),i=N(t);return(e=>{e.on("SkinLoaded",()=>{const t=nm(e);t&&a({text:t,type:"warning",timeout:0},!1),r()}),e.on("show ResizeEditor ResizeWindow NodeChange ToggleView FullscreenStateChanged",()=>{requestAnimationFrame(r)}),e.on("remove",()=>{q(t.slice(),e=>{n().close(e)})}),e.on("keydown",e=>{const t="f12"===e.key?.toLowerCase()||123===e.keyCode;e.altKey&&t&&(e.preventDefault(),o().map(e=>un.fromDom(e.getEl())).each(e=>io(e)))})})(e),{open:a,close:()=>{o().each(e=>{n().close(e),s(e),r()})},getNotifications:i}},tx=wi.PluginManager,nx=wi.ThemeManager,ox=e=>{let t=[];const n=()=>{const t=e.theme;return t&&t.getWindowManagerImpl?t.getWindowManagerImpl():(()=>{const e=()=>{throw new Error("Theme did not provide a WindowManager implementation.")};return{open:e,openUrl:e,alert:e,confirm:e,close:e}})()},o=(e,t)=>(...n)=>t?t.apply(e,n):void 0,r=n=>{(t=>{e.dispatch("CloseWindow",{dialog:t})})(n);const o=ue(t,({instanceApi:e,triggerElement:t})=>e===n?t:I.none());t=Y(t,({instanceApi:e})=>e!==n),0===t.length?e.focus():o.filter(Fo).each(io)},s=n=>{e.editorManager.setActive(e),pp(e);const o=co();e.ui.show();const r=n();return((n,o)=>{t.push({instanceApi:n,triggerElement:o}),(t=>{e.dispatch("OpenWindow",{dialog:t})})(n)})(r,o),r},a=e=>{0!==t.length&&e.each(e=>io(e))};return e.on("remove",()=>{q(t,({instanceApi:e})=>{n().close(e)})}),{open:(e,t)=>s(()=>n().open(e,t,r)),openUrl:e=>s(()=>n().openUrl(e,r)),alert:(e,t,r)=>{const s=co(),i=n();i.alert(e,o(r||i,()=>{a(s),t?.()}))},confirm:(e,t,r)=>{const s=co(),i=n();i.confirm(e,o(r||i,e=>{a(s),t?.(e)}))},close:()=>{I.from(t[t.length-1]).each(({instanceApi:e})=>{n().close(e),r(e)})}}},rx=(e,t)=>{e.notificationManager.open({type:"error",text:t})},sx=(e,t)=>{e._skinLoaded?rx(e,t):e.on("SkinLoaded",()=>{rx(e,t)})},ax=(e,t,n)=>{nd(e,t,{message:n}),console.error(n)},ix=(e,t,n)=>n?`Failed to load ${e}: ${n} from url ${t}`:`Failed to load ${e} url: ${t}`,lx=(e,...t)=>{const n=window.console;n&&(n.error?n.error(e,...t):n.log(e,...t))},cx=new WeakMap,dx=(e,t)=>{const{type:n,message:o}=t;e.notificationManager.open({type:n,text:o})},mx=e=>{const t=(e=>{switch(e){case"error":return console.error;case"info":return console.info;case"warn":return console.warn;default:return console.log}})(e.type);t(e.message)},ux=(e,t)=>{const{console:n,editor:o}=t;C(o)&&(e._skinLoaded?dx(e,o):e.on("SkinLoaded",()=>{dx(e,o)})),C(n)&&mx(n)},fx="Read more: https://www.tiny.cloud/docs/tinymce/latest/license-key/",gx="Make sure to provide a valid license key or add license_key: 'gpl' to the init config to agree to the open source license terms.",px="licensekeymanager",hx=e=>{const t=(e=>u(uu(e))?"online":"offline")(e),n=(e=>{const t=mu(e)?.toLowerCase();return"gpl"===t?"gpl":v(t)?"no_key":"non_gpl"})(e),o=new Set([...Em(e),...ge(xm(e))]).has(px);return"gpl"!==n||"online"===t||o?{type:"use_plugin",onlineStatus:t,licenseKeyType:n,forcePlugin:o}:{type:"use_gpl",onlineStatus:t,licenseKeyType:n,forcePlugin:o}},bx=e=>t=>{let n=!1;return{validate:o=>{const{plugin:r}=o,s=u(r);return s&&(((e,t,n)=>{ux(e,{console:{type:"error",message:[`The "${t}" plugin requires a valid TinyMCE license key.`,fx].join(" ")},...n?{}:{editor:{type:"warning",message:"One or more premium plugins are disabled due to license key restrictions."}}})})(t,r,n),n=!0),Promise.resolve(e&&!s)}}},yx=bx(!1),vx=bx(!0),Cx="manager",wx=px,Sx=(()=>{const e=wi();return{load:(t,n)=>{if("use_plugin"===hx(t).type){const o=xe(xm(t),wx).map(et).filter(ot).getOr(`plugins/${wx}/plugin${n}.js`);e.load(Cx,o).catch(()=>{((e,t)=>{ax(e,"LicenseKeyManagerLoadError",ix("license key manager",t))})(t,o)})}},add:t=>{e.add(Cx,t)},init:t=>{const n=e=>{Object.defineProperty(t,"licenseKeyManager",{value:e,writable:!1,configurable:!1,enumerable:!0})},o=hx(t),r=e.get(Cx);if(C(r))n(r(t,e.urls[Cx]));else switch(o.type){case"use_gpl":n(vx(t));break;case"use_plugin":(e=>{cx.has(e)||(cx.set(e,!0),e.initialized?(e.removed||e.mode.set("readonly"),e.options.set("disabled",!0)):e.on("init",()=>{e.removed||e.mode.set("readonly"),e.options.set("disabled",!0)}),e.on("DisabledStateChange",e=>{const{state:t}=e;t||e.preventDefault()},!0),e.on("SwitchMode",t=>{const{mode:n}=t;"readonly"!==n&&e.mode.set("readonly")}))})(t),n(yx(t)),"offline"===o.onlineStatus&&"no_key"===o.licenseKeyType?(e=>{const t="The editor is disabled because a TinyMCE license key has not been provided.";ux(e,{console:{type:"error",message:[`${t}`,gx,fx].join(" ")},editor:{type:"warning",message:`${t}`}})})(t):((e,t)=>{const n=("online"===t?"API":"license")+" key",o=`The editor is disabled because the TinyMCE ${n} could not be validated.`;ux(e,{console:{type:"error",message:[`${o}`,`The TinyMCE Commercial License Key Manager plugin is required for the provided ${n} to be validated but could not be loaded.`,fx].join(" ")},editor:{type:"warning",message:`${o}`}})})(t,o.onlineStatus)}t.licenseKeyManager.validate({})}}})(),Ex=(e,t,n)=>{try{e.getDoc().execCommand(t,!1,String(n))}catch{}},xx=(e,t,n)=>{wr(e,t)&&!n?Cr(e,t):n&&yr(e,t)},_x=e=>{const t=un.fromDom(e.getBody());xx(t,"mce-content-readonly",!0),e.selection.controlSelection.hideResizeRect(),e._selectionOverrides.hideFakeCaret(),(e=>{I.from(e.selection.getNode()).each(e=>{e.removeAttribute("data-mce-selected")})})(e)},kx=e=>{const t=un.fromDom(e.getBody());xx(t,"mce-content-readonly",!1),e.hasEditableRoot()&&xr(t,!0),((e,t)=>{Ex(e,"StyleWithCSS",t),Ex(e,"enableInlineTableEditing",t),Ex(e,"enableObjectResizing",t)})(e,!1),Rp(e)&&e.focus(),(e=>{e.selection.setRng(e.selection.getRng())})(e),e.nodeChanged()},Nx=e=>fu(e),Ax="data-mce-contenteditable",Rx=(e,t)=>{const n=un.fromDom(e.getBody());t?(_x(e),xr(n,!1),q(Ar(n,'*[contenteditable="true"]'),e=>{vo(e,Ax,"true"),xr(e,!1)})):(q(Ar(n,`*[${Ax}="true"]`),e=>{xo(e,Ax),xr(e,!0)}),kx(e))},Dx=e=>{e.parser.addAttributeFilter("contenteditable",t=>{Nx(e)&&q(t,e=>{e.attr(Ax,e.attr("contenteditable")),e.attr("contenteditable","false")})}),e.serializer.addAttributeFilter(Ax,t=>{Nx(e)&&q(t,e=>{e.attr("contenteditable",e.attr(Ax))})}),e.serializer.addTempAttr(Ax)},Tx=["copy"],Ox=(e,t)=>fr(t,"details",t=>vn(t,un.fromDom(e.getBody()))).isSome(),Bx=e=>"content/"+e+"/content.css",Px=(e,t)=>{const n=e.editorManager.baseURL+"/skins/content",o=`content${e.editorManager.suffix}.css`;return V(t,t=>(e=>tinymce.Resource.has(Bx(e)))(t)?Bx(t):(e=>/^[a-z0-9\-]+$/i.test(e))(t)&&!e.inline?`${n}/${t}/${o}`:e.documentBaseURI.toAbsolute(t))},Lx=(e,t)=>{const n={};return{findAll:(o,r=M)=>{const s=Y((e=>e?me(e.getElementsByTagName("img")):[])(o),t=>{const n=t.src;return!t.hasAttribute("data-mce-bogus")&&!t.hasAttribute("data-mce-placeholder")&&!(!n||n===sn.transparentSrc)&&(Qe(n,"blob:")?!e.isUploaded(n)&&r(t):!!Qe(n,"data:")&&r(t))}),a=V(s,e=>{const o=e.src;if(_e(n,o))return n[o].then(t=>u(t)?t:{image:e,blobInfo:t.blobInfo});{const r=((e,t)=>{const n=()=>Promise.reject("Invalid data URI");if(Qe(t,"blob:")){const s=e.getByUri(t);return C(s)?Promise.resolve(s):(o=t,Qe(o,"blob:")?(e=>fetch(e).then(e=>e.ok?e.blob():Promise.reject()).catch(()=>Promise.reject({message:`Cannot convert ${e} to Blob. Resource might not exist or is inaccessible.`,uriType:"blob"})))(o):Qe(o,"data:")?(r=o,new Promise((e,t)=>{SC(r).bind(({type:e,data:t,base64Encoded:n})=>EC(e,t,n)).fold(()=>t("Invalid data URI"),e)})):Promise.reject("Unknown URI format")).then(t=>xC(t).then(o=>kC(o,!1,n=>I.some(NC(e,t,n))).getOrThunk(n)))}var o,r;return Qe(t,"data:")?AC(e,t).fold(n,e=>Promise.resolve(e)):Promise.reject("Unknown image data format")})(t,o).then(t=>(delete n[o],{image:e,blobInfo:t})).catch(e=>(delete n[o],e));return n[o]=r,r}});return Promise.all(a)}}},Mx=()=>{let e={};const t=(e,t)=>({status:e,resultUri:t}),n=t=>t in e;return{hasBlobUri:n,getResultUri:t=>{const n=e[t];return n?n.resultUri:null},isPending:t=>!!n(t)&&1===e[t].status,isUploaded:t=>!!n(t)&&2===e[t].status,markPending:n=>{e[n]=t(1,null)},markUploaded:(n,o)=>{e[n]=t(2,o)},removeFailed:t=>{delete e[t]},destroy:()=>{e={}}}};let Ix=0;const Fx=(e,t)=>{const n={},o=(e,n)=>new Promise((o,r)=>{const s=new XMLHttpRequest;s.open("POST",t.url),s.withCredentials=t.credentials,s.upload.onprogress=e=>{n(e.loaded/e.total*100)},s.onerror=()=>{r("Image upload failed due to a XHR Transport error. Code: "+s.status)},s.onload=()=>{if(s.status<200||s.status>=300)return void r("HTTP Error: "+s.status);const e=JSON.parse(s.responseText);var n,a;e&&u(e.location)?o((n=t.basePath,a=e.location,n?n.replace(/\/$/,"")+"/"+a.replace(/^\//,""):a)):r("Invalid JSON: "+s.responseText)};const a=new FormData;a.append("file",e.blob(),e.filename()),s.send(a)}),r=w(t.handler)?t.handler:o,s=(e,t)=>({url:t,blobInfo:e,status:!0}),a=(e,t)=>({url:"",blobInfo:e,status:!1,error:t}),i=(e,t)=>{dn.each(n[e],e=>{e(t)}),delete n[e]};return{upload:(l,c)=>t.url||r!==o?((t,o)=>(t=dn.grep(t,t=>!e.isUploaded(t.blobUri())),Promise.all(dn.map(t,t=>e.isPending(t.blobUri())?(e=>{const t=e.blobUri();return new Promise(e=>{n[t]=n[t]||[],n[t].push(e)})})(t):((t,n,o)=>(e.markPending(t.blobUri()),new Promise(r=>{let l,c;try{const d=()=>{l&&(l.close(),c=x)},m=n=>{d();const o=u(n)?n:n.url;e.markUploaded(t.blobUri(),o),i(t.blobUri(),s(t,o)),r(s(t,o))},f=n=>{d(),e.removeFailed(t.blobUri()),i(t.blobUri(),a(t,n)),r(a(t,n))};c=e=>{e<0||e>100||I.from(l).orThunk(()=>I.from(o).map(B)).each(t=>{l=t,t.progressBar.value(e)})},n(t,c).then(m,e=>{f(u(e)?{message:e}:e)})}catch(e){r(a(t,e))}})))(t,r,o)))))(l,c):new Promise(e=>{e([])})}},Ux=e=>()=>e.notificationManager.open({text:e.translate("Image uploading..."),type:"info",timeout:-1,progressBar:!0}),zx=(e,t)=>Fx(t,{url:Ld(e),basePath:Md(e),credentials:Id(e),handler:Fd(e)}),jx=e=>{const t=(()=>{let e=[];const t=e=>{if(v(e.blob)||v(e.base64)||""===e.base64&&!e.allowEmptyFile)throw new Error("blob and base64 representations of the image are required for BlobInfo to be created");const t=e.id||"blobid"+Ix+++(()=>{const e=()=>Math.round(4294967295*Be()).toString(36);return"s"+(new Date).getTime().toString(36)+e()+e()+e()})(),n=e.name||t,o=e.blob;var r;return{id:N(t),name:N(n),filename:N(e.filename||n+"."+(r=o.type,{"image/jpeg":"jpg","image/jpg":"jpg","image/gif":"gif","image/png":"png","image/apng":"apng","image/avif":"avif","image/svg+xml":"svg","image/webp":"webp","image/bmp":"bmp","image/tiff":"tiff"}[r.toLowerCase()]||"dat")),blob:N(o),base64:N(e.base64),blobUri:N(e.blobUri||URL.createObjectURL(o)),uri:N(e.uri)}},n=t=>Z(e,t).getOrUndefined(),o=e=>n(t=>t.id()===e);return{create:(e,n,o,r,s)=>{if(u(e))return t({id:e,name:r,filename:s,blob:n,base64:o});if(f(e))return t(e);throw new Error("Unknown input type")},add:t=>{o(t.id())||e.push(t)},get:o,getByUri:e=>n(t=>t.blobUri()===e),getByData:(e,t)=>n(n=>n.base64()===e&&n.blob().type===t),findFirst:n,removeByUri:t=>{e=Y(e,e=>e.blobUri()!==t||(URL.revokeObjectURL(e.blobUri()),!1))},destroy:()=>{q(e,e=>{URL.revokeObjectURL(e.blobUri())}),e=[]}}})();let n,o;const r=Mx(),s=[],a=t=>n=>e.selection?t(n):[],i=(e,t,n)=>{let o=0;do{o=e.indexOf(t,o),-1!==o&&(e=e.substring(0,o)+n+e.substr(o+t.length),o+=n.length-t.length+1)}while(-1!==o);return e},l=(e,t,n)=>{const o=`src="${n}"${n===sn.transparentSrc?' data-mce-placeholder="1"':""}`;return e=i(e,`src="${t}"`,o),i(e,'data-mce-src="'+t+'"','data-mce-src="'+n+'"')},c=(t,n)=>{q(e.undoManager.data,e=>{"fragmented"===e.type?e.fragments=V(e.fragments,e=>l(e,t,n)):e.content=l(e.content,t,n)})},d=()=>(n||(n=zx(e,r)),p().then(a(o=>{const r=V(o,e=>e.blobInfo);return n.upload(r,Ux(e)).then(a(n=>{const r=[];let s=!1;const a=V(n,(n,a)=>{const{blobInfo:i,image:l}=o[a];let d=!1;return n.status&&Od(e)?(n.url&&!Xe(l.src,n.url)&&(s=!0),t.removeByUri(l.src),BE(e)||((t,n)=>{const o=e.convertURL(n,"src");var r;c(t.src,n),Co(un.fromDom(t),{src:Td(e)?(r=n,r+(-1===r.indexOf("?")?"?":"&")+(new Date).getTime()):n,"data-mce-src":o})})(l,n.url)):n.error&&(n.error.remove&&(c(l.src,sn.transparentSrc),r.push(l),d=!0),((e,t)=>{sx(e,Ci.translate(["Failed to upload image: {0}",t]))})(e,n.error.message)),{element:l,status:n.status,uploadUri:n.url,blobInfo:i,removed:d}});return r.length>0&&!BE(e)?e.undoManager.transact(()=>{q(Po(r),n=>{const o=Mn(n);Ao(n),o.each((e=>t=>{((e,t)=>e.dom.isEmpty(t.dom)&&C(e.schema.getTextBlockElements()[En(t)]))(e,t)&&go(t,un.fromHtml('
    '))})(e)),t.removeByUri(n.dom.src)})}):s&&e.undoManager.dispatchChange(),a}))}))),m=()=>Dd(e)?d():Promise.resolve([]),g=e=>oe(s,t=>t(e)),p=()=>(o||(o=Lx(r,t)),o.findAll(e.getBody(),g).then(a(t=>{const n=Y(t,t=>u(t)?(sx(e,t),!1):"blob"!==t.uriType);return BE(e)||q(n,e=>{c(e.image.src,e.blobInfo.blobUri()),e.image.src=e.blobInfo.blobUri(),e.image.removeAttribute("data-mce-src")}),n}))),h=n=>n.replace(/src="(blob:[^"]+)"/g,(n,o)=>{const s=r.getResultUri(o);if(s)return'src="'+s+'"';let a=t.getByUri(o);return a||(a=X(e.editorManager.get(),(e,t)=>e||t.editorUpload&&t.editorUpload.blobCache.getByUri(o),void 0)),a?'src="data:'+a.blob().type+";base64,"+a.base64()+'"':n});return e.on("SetContent",()=>{Dd(e)?m():p()}),e.on("RawSaveContent",e=>{e.content=h(e.content)}),e.on("GetContent",e=>{e.source_view||"raw"===e.format||"tree"===e.format||(e.content=h(e.content))}),e.on("PostRender",()=>{e.parser.addNodeFilter("img",e=>{q(e,e=>{const n=e.attr("src");if(!n||t.getByUri(n))return;const o=r.getResultUri(n);o&&e.attr("src",o)})})}),{blobCache:t,addFilter:e=>{s.push(e)},uploadImages:d,uploadImagesAuto:m,scanForImages:p,destroy:()=>{t.destroy(),r.destroy(),o=n=null}}},$x={remove_similar:!0,inherit:!1},Hx={selector:"td,th",...$x},Vx={tablecellbackgroundcolor:{styles:{backgroundColor:"%value"},...Hx},tablecellverticalalign:{styles:{"vertical-align":"%value"},...Hx},tablecellbordercolor:{styles:{borderColor:"%value"},...Hx},tablecellclass:{classes:["%value"],...Hx},tableclass:{selector:"table",classes:["%value"],...$x},tablecellborderstyle:{styles:{borderStyle:"%value"},...Hx},tablecellborderwidth:{styles:{borderWidth:"%value"},...Hx}},qx=N(Vx),Wx=dn.each,Kx=gi.DOM,Yx=e=>C(e)&&f(e),Gx=(e,t)=>{const n=t&&t.schema||Ua({}),o=e=>{const t=u(e)?{name:e,classes:[],attrs:{}}:e,n=Kx.create(t.name);return((e,t)=>{t.classes.length>0&&Kx.addClass(e,t.classes.join(" ")),Kx.setAttribs(e,t.attrs)})(n,t),n},r=(e,t,s)=>{let a;const i=t[0],l=Yx(i)?i.name:void 0,c=((e,t)=>{const o=n.getElementRule(e.nodeName.toLowerCase()),r=o?.parentsRequired;return!(!r||!r.length)&&(t&&$(r,t)?t:r[0])})(e,l);if(c)l===c?(a=i,t=t.slice(1)):a=c;else if(i)a=i,t=t.slice(1);else if(!s)return e;const d=a?o(a):Kx.create("div");d.appendChild(e),s&&dn.each(s,t=>{const n=o(t);d.insertBefore(n,e)});const m=Yx(a)?a.siblings:void 0;return r(d,t,m)},s=Kx.create("div");if(e.length>0){const t=e[0],n=o(t),a=Yx(t)?t.siblings:void 0;s.appendChild(r(n,e.slice(1),a))}return s},Xx=e=>{let t="div";const n={name:t,classes:[],attrs:{},selector:e=dn.trim(e)};return"*"!==e&&(t=e.replace(/(?:([#\.]|::?)([\w\-]+)|(\[)([^\]]+)\]?)/g,(e,t,o,r,s)=>{switch(t){case"#":n.attrs.id=o;break;case".":n.classes.push(o);break;case":":-1!==dn.inArray("checked disabled enabled read-only required".split(" "),o)&&(n.attrs[o]=o)}if("["===r){const e=s.match(/([\w\-]+)(?:\=\"([^\"]+))?/);e&&(n.attrs[e[1]]=e[2])}return""})),n.name=t||"div",n},Qx=(e,t)=>{let n="",o=cm(e);if(""===o)return"";const r=e=>u(e)?e.replace(/%(\w+)/g,""):"",s=(t,n)=>Kx.getStyle(n??e.getBody(),t,!0);if(u(t)){const n=e.formatter.get(t);if(!n)return"";t=n[0]}if("preview"in t){const e=t.preview;if(!1===e)return"";o=e||o}let a,i=t.block||t.inline||"span";const l=(c=t.selector,u(c)?(c=(c=c.split(/\s*,\s*/)[0]).replace(/\s*(~\+|~|\+|>)\s*/g,"$1"),dn.map(c.split(/(?:>|\s+(?![^\[\]]+\]))/),e=>{const t=dn.map(e.split(/(?:~\+|~|\+)/),Xx),n=t.pop();return t.length&&(n.siblings=t),n}).reverse()):[]);var c;l.length>0?(l[0].name||(l[0].name=i),i=t.selector,a=Gx(l,e)):a=Gx([i],e);const d=Kx.select(i,a)[0]||a.firstChild;Wx(t.styles,(e,t)=>{const n=r(e);n&&Kx.setStyle(d,t,n)}),Wx(t.attributes,(e,t)=>{const n=r(e);n&&Kx.setAttrib(d,t,n)}),Wx(t.classes,e=>{const t=r(e);Kx.hasClass(d,t)||Kx.addClass(d,t)}),e.dispatch("PreviewFormats"),Kx.setStyles(a,{position:"absolute",left:-65535}),e.getBody().appendChild(a);const m=s("fontSize"),f=/px$/.test(m)?parseInt(m,10):0;return Wx(o.split(" "),e=>{let t=s(e,d);if(!("background-color"===e&&/transparent|rgba\s*\([^)]+,\s*0\)/.test(t)&&(t=s(e),"#ffffff"===Ya(t).toLowerCase())||"color"===e&&"#000000"===Ya(t).toLowerCase())){if("font-size"===e&&/em|%$/.test(t)){if(0===f)return;t=parseFloat(t)/(/%$/.test(t)?100:1)*f+"px"}"border"===e&&t&&(n+="padding:0 2px;"),n+=e+":"+t+";"}}),e.dispatch("AfterPreviewFormats"),Kx.remove(a),n},Zx=e=>{const t=(e=>{const t={},n=(e,o)=>{e&&(u(e)?(p(o)||(o=[o]),q(o,e=>{y(e.deep)&&(e.deep=!Ng(e)),y(e.split)&&(e.split=!Ng(e)||Ag(e)),y(e.remove)&&Ng(e)&&!Ag(e)&&(e.remove="none"),Ng(e)&&Ag(e)&&(e.mixed=!0,e.block_expand=!0),u(e.classes)&&(e.classes=e.classes.split(/\s+/))}),t[e]=o):he(e,(e,t)=>{n(t,e)}))};return n((e=>{const t=e.dom,n=e.schema.type,o={valigntop:[{selector:"td,th",styles:{verticalAlign:"top"}}],valignmiddle:[{selector:"td,th",styles:{verticalAlign:"middle"}}],valignbottom:[{selector:"td,th",styles:{verticalAlign:"bottom"}}],alignleft:[{selector:"figure.image",collapsed:!1,classes:"align-left",ceFalseOverride:!0,preview:"font-family font-size"},{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li,pre",styles:{textAlign:"left"},inherit:!1,preview:!1},{selector:"img,audio,video",collapsed:!1,styles:{float:"left"},preview:"font-family font-size"},{selector:".mce-placeholder",styles:{float:"left"},ceFalseOverride:!0},{selector:"table",collapsed:!1,styles:{marginLeft:"0px",marginRight:"auto"},onformat:e=>{t.setStyle(e,"float",null)},preview:"font-family font-size"},{selector:".mce-preview-object,[data-ephox-embed-iri],.tiny-pageembed",ceFalseOverride:!0,styles:{float:"left"}}],aligncenter:[{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li,pre",styles:{textAlign:"center"},inherit:!1,preview:"font-family font-size"},{selector:"figure.image",collapsed:!1,classes:"align-center",ceFalseOverride:!0,preview:"font-family font-size"},{selector:"img,audio,video",collapsed:!1,styles:{display:"block",marginLeft:"auto",marginRight:"auto"},preview:!1},{selector:".mce-placeholder",styles:{display:"block",marginLeft:"auto",marginRight:"auto"},ceFalseOverride:!0},{selector:"table",collapsed:!1,styles:{marginLeft:"auto",marginRight:"auto"},preview:"font-family font-size"},{selector:".mce-preview-object,.tiny-pageembed",ceFalseOverride:!0,styles:{display:"table",marginLeft:"auto",marginRight:"auto"},preview:!1},{selector:"[data-ephox-embed-iri]",ceFalseOverride:!0,styles:{marginLeft:"auto",marginRight:"auto"},preview:!1}],alignright:[{selector:"figure.image",collapsed:!1,classes:"align-right",ceFalseOverride:!0,preview:"font-family font-size"},{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li,pre",styles:{textAlign:"right"},inherit:!1,preview:"font-family font-size"},{selector:"img,audio,video",collapsed:!1,styles:{float:"right"},preview:"font-family font-size"},{selector:".mce-placeholder",styles:{float:"right"},ceFalseOverride:!0},{selector:"table",collapsed:!1,styles:{marginRight:"0px",marginLeft:"auto"},onformat:e=>{t.setStyle(e,"float",null)},preview:"font-family font-size"},{selector:".mce-preview-object,[data-ephox-embed-iri],.tiny-pageembed",ceFalseOverride:!0,styles:{float:"right"},preview:!1}],alignjustify:[{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li,pre",styles:{textAlign:"justify"},inherit:!1,preview:"font-family font-size"}],bold:[{inline:"strong",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{fontWeight:"bold"}},{inline:"b",remove:"all",preserve_attributes:["class","style"]}],italic:[{inline:"em",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{fontStyle:"italic"}},{inline:"i",remove:"all",preserve_attributes:["class","style"]}],underline:[{inline:"span",styles:{textDecoration:"underline"},exact:!0},{inline:"u",remove:"all",preserve_attributes:["class","style"]}],strikethrough:(()=>{const e={inline:"span",styles:{textDecoration:"line-through"},exact:!0},t={inline:"strike",remove:"all",preserve_attributes:["class","style"]},o={inline:"s",remove:"all",preserve_attributes:["class","style"]};return"html4"!==n?[o,e,t]:[e,o,t]})(),forecolor:{inline:"span",styles:{color:"%value"},links:!0,remove_similar:!0,clear_child_styles:!0},hilitecolor:{inline:"span",styles:{backgroundColor:"%value"},links:!0,remove_similar:!0,clear_child_styles:!0},fontname:{inline:"span",toggle:!1,styles:{fontFamily:"%value"},clear_child_styles:!0},fontsize:{inline:"span",toggle:!1,styles:{fontSize:"%value"},clear_child_styles:!0},lineheight:{selector:"h1,h2,h3,h4,h5,h6,p,li,td,th,div",styles:{lineHeight:"%value"},remove_similar:!0},fontsize_class:{inline:"span",attributes:{class:"%value"}},blockquote:{block:"blockquote",wrapper:!0,remove:"all"},subscript:{inline:"sub"},superscript:{inline:"sup"},code:{inline:"code"},samp:{inline:"samp"},link:{inline:"a",selector:"a",remove:"all",split:!0,deep:!0,onmatch:(e,t,n)=>es(e)&&e.hasAttribute("href"),onformat:(e,n,o)=>{dn.each(o,(n,o)=>{t.setAttrib(e,o,n)})}},lang:{inline:"span",clear_child_styles:!0,remove_similar:!0,attributes:{lang:"%value","data-mce-lang":e=>e?.customValue??null}},removeformat:[{selector:"b,strong,em,i,font,u,strike,s,sub,sup,dfn,code,samp,kbd,var,cite,mark,q,del,ins,small",remove:"all",split:!0,expand:!1,block_expand:!0,deep:!0},{selector:"span",attributes:["style","class"],remove:"empty",split:!0,expand:!1,deep:!0},{selector:"*",attributes:["style","class"],split:!1,expand:!1,deep:!0}]};return dn.each("p h1 h2 h3 h4 h5 h6 div address pre dt dd".split(/\s/),e=>{o[e]={block:e,remove:"all"}}),o})(e)),n(qx()),n(lm(e)),{get:e=>C(e)?t[e]:t,has:e=>_e(t,e),register:n,unregister:e=>(e&&t[e]&&delete t[e],t)}})(e),n=Ae({});return(e=>{e.addShortcut("meta+b","","Bold"),e.addShortcut("meta+i","","Italic"),e.addShortcut("meta+u","","Underline");for(let t=1;t<=6;t++)e.addShortcut("access+"+t,"",["FormatBlock",!1,"h"+t]);e.addShortcut("access+7","",["FormatBlock",!1,"p"]),e.addShortcut("access+8","",["FormatBlock",!1,"div"]),e.addShortcut("access+9","",["FormatBlock",!1,"address"])})(e),(e=>{e.on("mouseup keydown",t=>{var n;((e,t,n)=>{const o=e.selection,r=e.getBody();fv(e,null,n),8!==t&&46!==t||!o.isCollapsed()||o.getStart().innerHTML!==cv||fv(e,Of(r,o.getStart()),!0),37!==t&&39!==t||fv(e,Of(r,o.getStart()),!0)})(e,t.keyCode,(n=e.selection.getRng().endContainer,cs(n)&&Ze(n.data,dt)))})})(e),BE(e)||((e,t)=>{e.set({}),t.on("NodeChange",n=>{sE(t,n.element,e.get())}),t.on("FormatApply FormatRemove",n=>{const o=I.from(n.node).map(e=>ig(e)?e:e.startContainer).bind(e=>es(e)?I.some(e):I.from(e.parentElement)).getOrThunk(()=>nE(t));sE(t,o,e.get())})})(n,e),{get:t.get,has:t.has,register:t.register,unregister:t.unregister,apply:(t,n,o)=>{((e,t,n,o)=>{LE(e).formatter.apply(t,n,o)})(e,t,n,o)},remove:(t,n,o,r)=>{((e,t,n,o,r)=>{LE(e).formatter.remove(t,n,o,r)})(e,t,n,o,r)},toggle:(t,n,o)=>{((e,t,n,o)=>{LE(e).formatter.toggle(t,n,o)})(e,t,n,o)},match:(t,n,o,r)=>((e,t,n,o,r)=>LE(e).formatter.match(t,n,o,r))(e,t,n,o,r),closest:t=>((e,t)=>LE(e).formatter.closest(t))(e,t),matchAll:(t,n)=>((e,t,n)=>LE(e).formatter.matchAll(t,n))(e,t,n),matchNode:(t,n,o,r)=>((e,t,n,o,r)=>LE(e).formatter.matchNode(t,n,o,r))(e,t,n,o,r),canApply:t=>((e,t)=>LE(e).formatter.canApply(t))(e,t),formatChanged:(t,o,r,s)=>((e,t,n,o,r,s)=>LE(e).formatter.formatChanged(t,n,o,r,s))(e,n,t,o,r,s),getCssText:D(Qx,e)}},Jx=e=>{switch(e.toLowerCase()){case"undo":case"redo":case"mcefocus":return!0;default:return!1}},e_=e=>{const t=Ke(),n=Ae(0),o=Ae(0),r={data:[],typing:!1,beforeChange:()=>{((e,t,n)=>{LE(e).undoManager.beforeChange(t,n)})(e,n,t)},add:(s,a)=>((e,t,n,o,r,s,a)=>LE(e).undoManager.add(t,n,o,r,s,a))(e,r,o,n,t,s,a),dispatchChange:()=>{e.setDirty(!0);const t=xE(e);t.bookmark=gc(e.selection),e.dispatch("change",{level:t,lastLevel:le(r.data,o.get()).getOrUndefined()})},undo:()=>((e,t,n,o)=>LE(e).undoManager.undo(t,n,o))(e,r,n,o),redo:()=>((e,t,n)=>LE(e).undoManager.redo(t,n))(e,o,r.data),clear:()=>{((e,t,n)=>{LE(e).undoManager.clear(t,n)})(e,r,o)},reset:()=>{((e,t)=>{LE(e).undoManager.reset(t)})(e,r)},hasUndo:()=>((e,t,n)=>LE(e).undoManager.hasUndo(t,n))(e,r,o),hasRedo:()=>((e,t,n)=>LE(e).undoManager.hasRedo(t,n))(e,r,o),transact:t=>((e,t,n,o)=>LE(e).undoManager.transact(t,n,o))(e,r,n,t),ignore:t=>{((e,t,n)=>{LE(e).undoManager.ignore(t,n)})(e,n,t)},extra:(t,n)=>{((e,t,n,o,r)=>{LE(e).undoManager.extra(t,n,o,r)})(e,r,o,t,n)}};return BE(e)||((e,t,n)=>{const o=Ae(!1),r=e=>{DE(t,!1,n),t.add({},e)};e.on("init",()=>{t.add()}),e.on("BeforeExecCommand",e=>{const o=e.command;Jx(o)||(TE(t,n),t.beforeChange())}),e.on("ExecCommand",e=>{const t=e.command;Jx(t)||r(e)}),e.on("ObjectResizeStart cut",()=>{t.beforeChange()}),e.on("SaveContent ObjectResized blur",r),e.on("dragend",r),e.on("keyup",n=>{const s=n.keyCode;if(n.isDefaultPrevented())return;const a=sn.os.isMacOS()&&"Meta"===n.key;(s>=33&&s<=36||s>=37&&s<=40||45===s||n.ctrlKey||a)&&(r(),e.nodeChanged()),46!==s&&8!==s||e.nodeChanged(),o.get()&&t.typing&&!AE(e.readonly,xE(e),t.data[0])&&(e.isDirty()||e.setDirty(!0),e.dispatch("TypingUndo"),o.set(!1),e.nodeChanged())}),e.on("keydown",e=>{const s=e.keyCode;if(e.isDefaultPrevented())return;if(s>=33&&s<=36||s>=37&&s<=40||45===s)return void(t.typing&&r(e));const a=e.ctrlKey&&!e.altKey||e.metaKey;if((s<16||s>20)&&224!==s&&91!==s&&!t.typing&&!a)return t.beforeChange(),DE(t,!0,n),t.add({},e),void o.set(!0);!(sn.os.isMacOS()?e.metaKey:e.ctrlKey&&!e.altKey)||"Backspace"!==e.key&&"Delete"!==e.key||t.beforeChange()}),e.on("mousedown",e=>{t.typing&&r(e)}),e.on("input",e=>{var t;e.inputType&&("insertReplacementText"===e.inputType||"insertText"===(t=e).inputType&&null===t.data||(e=>"insertFromPaste"===e.inputType||"insertFromDrop"===e.inputType)(e))&&r(e)}),e.on("AddUndo Undo Redo ClearUndos",t=>{t.isDefaultPrevented()||e.nodeChanged()})})(e,r,n),(e=>{e.addShortcut("meta+z","","Undo"),e.addShortcut("meta+y,meta+shift+z","","Redo")})(e),r},t_=[9,27,Tp.HOME,Tp.END,19,20,44,144,145,33,34,45,16,17,18,91,92,93,Tp.DOWN,Tp.UP,Tp.LEFT,Tp.RIGHT].concat(sn.browser.isFirefox()?[224]:[]),n_="data-mce-placeholder",o_=e=>"keydown"===e.type||"keyup"===e.type,r_=e=>{const t=e.keyCode;return t===Tp.BACKSPACE||t===Tp.DELETE},s_=e=>(t,n,o={})=>{const r=t.getBody(),s={bubbles:!0,composed:!0,data:null,isComposing:!1,detail:0,view:null,target:r,currentTarget:r,eventPhase:Event.AT_TARGET,originalTarget:r,explicitOriginalTarget:r,isTrusted:!1,srcElement:r,cancelable:!1,preventDefault:x,inputType:n},a=Qa(new InputEvent(e));return t.dispatch(e,{...a,...s,...o})},a_=s_("input"),i_=s_("beforeinput"),l_=(e,t,n)=>{let o=!0;const r=()=>o=!1;if(i_(e,t?"deleteContentForward":"deleteContentBackward").isDefaultPrevented())return!1;e.on("input",r);try{n()}finally{e.off("input",r)}return o&&e.dispatch("input"),!0},c_=e=>t=>C(t)&&e.test(t.nodeName),d_=e=>C(e)&&3===e.nodeType,m_=e=>C(e)&&1===e.nodeType,u_=c_(/^(OL|UL|DL)$/),f_=c_(/^(OL|UL)$/),g_=c_(/^(LI|DT|DD)$/),p_=c_(/^(DT|DD)$/),h_=c_(/^(TH|TD)$/),b_=e=>C(e)&&"br"===e.nodeName.toLowerCase(),y_=(e,t)=>C(t)&&t.nodeName in e.schema.getTextBlockElements(),v_=(e,t)=>C(e)&&e.nodeName in t,C_=(e,t)=>C(t)&&t.nodeName in e.schema.getVoidElements(),w_=(e,t,n)=>{const o=e.isEmpty(t);return!(n&&e.select("span[data-mce-type=bookmark]",t).length>0)&&o},S_=(e,t)=>e.isChildOf(t,e.getRoot()),E_=gi.DOM,x_=(e,t)=>{const n=dn.grep(e.select("ol,ul",t));dn.each(n,t=>{((e,t)=>{const n=t.parentElement;if(n&&"LI"===n.nodeName&&n.firstChild===t){const o=n.previousSibling;o&&"LI"===o.nodeName?(o.appendChild(t),w_(e,n)&&E_.remove(n)):E_.setStyle(n,"listStyleType","none")}if(u_(n)){const e=n.previousSibling;e&&"LI"===e.nodeName&&e.appendChild(t)}})(e,t)})},__=(e,t)=>{if(d_(e))return{container:e,offset:t};const n=Gp.getNode(e,t);return d_(n)?{container:n,offset:t>=e.childNodes.length?n.data.length:0}:n.previousSibling&&d_(n.previousSibling)?{container:n.previousSibling,offset:n.previousSibling.data.length}:n.nextSibling&&d_(n.nextSibling)?{container:n.nextSibling,offset:0}:{container:e,offset:t}},k_=e=>{const t=e.cloneRange(),n=__(e.startContainer,e.startOffset);t.setStart(n.container,n.offset);const o=__(e.endContainer,e.endOffset);return t.setEnd(o.container,o.offset),t},N_=e=>wn(e,"OL,UL"),A_=e=>wn(e,"LI"),R_=e=>Wn(e).exists(N_),D_=["OL","UL","DL"],T_=D_.join(","),O_=(e,t)=>{const n=t||e.selection.getStart(!0);return e.dom.getParent(n,T_,L_(e,n,e.selection.isCollapsed()))},B_=e=>{const t=e.selection.getSelectedBlocks();return Y(((e,t,n)=>{const o=dn.map(t,t=>e.dom.getParent(t,"li,dd,dt",L_(e,t,n))||t);return fe(o)})(e,t,e.selection.isCollapsed()),g_)},P_=(e,t)=>{const n=e.dom.getParents(t,"TD,TH");return n.length>0?n[0]:e.getBody()},L_=(e,t,n)=>{const o=e.dom.getParents(t,e.dom.isBlock);let r=!(e=>ue(e,e=>A_(un.fromDom(e))?I.some(!0):h_(e)?I.some(!1):I.none()).getOr(!1))(o);const s=Z(o,t=>{return(A_(un.fromDom(a=t))||N_(un.fromDom(a)))&&(r=!0),r&&(!n||(t=>t.nodeName.toLowerCase()!==Ed(e))(t))&&(o=e.schema,!u_(s=t)&&!g_(s)&&H(D_,e=>o.isValidChild(s.nodeName,e)));var o,s,a});return s.getOr(e.getBody())},M_=(e,t)=>{const n=e.dom.getParents(t,"ol,ul",L_(e,t,!0));return de(n)},I_=(e,t)=>{const n=V(t,t=>M_(e,t).getOr(t));return fe(n)},F_=e=>/\btox\-/.test(e.className),U_=(e,t)=>null!==t&&!e.dom.isEditable(t),z_=(e,t)=>{const n=e.dom.getParent(t,"ol,ul,dl");return U_(e,n)||!e.selection.isEditable()},j_=(e,t,n)=>e.dispatch("ListMutation",{action:t,element:n}),$_=(e,t,n={})=>{const o=e.dom,r=e.schema.getBlockElements(),s=o.createFragment(),a=Ed(e),i=xd(e);let l,c,d=!1;for(c=o.create(a,{...i,...n.style?{style:n.style}:{}}),v_(t.firstChild,r)||s.appendChild(c);l=t.firstChild;){const e=l.nodeName;d||"SPAN"===e&&"bookmark"===l.getAttribute("data-mce-type")||(d=!0),v_(l,r)?(s.appendChild(l),c=null):(c||(c=o.create(a,i),s.appendChild(c)),c.appendChild(l))}return!d&&c&&c.appendChild(o.create("br",{"data-mce-bogus":"1"})),s},H_=e=>"listAttributes"in e,V_=e=>"isComment"in e,q_=e=>e.depth>0,W_=e=>e.isSelected,K_=e=>{const t=Vn(e),n=Kn(e).exists(N_)?t.slice(0,-1):t;return V(n,Oo)},Y_=(e,t)=>{go(e.item,t.list)},G_=(e,t)=>{const n={list:un.fromTag(t,e),item:un.fromTag("li",e)};return go(n.list,n.item),n},X_=(e,t,n)=>{const o=t.slice(0,n.depth);return de(o).each(t=>{if(H_(n)){const o=((e,t,n)=>{const o=un.fromTag("li",e);return Co(o,t),bo(o,n),o})(e,n.itemAttributes,n.content);((e,t)=>{go(e.list,t),e.item=t})(t,o),((e,t)=>{En(e.list)!==t.listType&&(e.list=Bo(e.list,t.listType)),Co(e.list,t.listAttributes)})(t,n)}else if((e=>"isFragment"in e)(n))bo(t.item,n.content);else{const e=un.fromHtml(`\x3c!--${n.content}--\x3e`);go(t.list,e)}}),o},Q_=e=>(q(e,(t,n)=>{((e,t)=>{const n=e[t].depth,o=e=>e.depth===n&&!e.dirty,r=e=>e.depthQ(e.slice(t+1),o,r))})(e,n).fold(()=>{t.dirty&&H_(t)&&(e=>{e.listAttributes=we(e.listAttributes,(e,t)=>"start"!==t)})(t)},e=>{return o=e,void(H_(n=t)&&H_(o)&&(n.listType=o.listType,n.listAttributes={...o.listAttributes}));var n,o})}),e),Z_=(e,t,n,o)=>{if(kn(o))return[{depth:e+1,content:o.dom.nodeValue??"",dirty:!1,isSelected:!1,isComment:!0}];t.each(e=>{vn(e.start,o)&&n.set(!0)});const r=((e,t,n)=>Mn(e).filter(An).map(o=>({depth:t,dirty:!1,isSelected:n,content:K_(e),itemAttributes:ko(e),listAttributes:ko(o),listType:En(o),isInPreviousLi:!1})))(o,e,n.get());t.each(e=>{vn(e.end,o)&&n.set(!1)});const s=Kn(o).filter(N_).map(o=>ek(e,t,n,o)).getOr([]);return r.toArray().concat(s)},J_=(e,t,n,o)=>Wn(o).filter(N_).fold(()=>Z_(e,t,n,o),r=>{const s=X(Vn(o),(o,s,a)=>{if(0===a)return o;if(A_(s))return o.concat(Z_(e,t,n,s));{const t={isFragment:!0,depth:e,content:[s],isSelected:!1,dirty:!1,parentListType:En(r)};return o.concat(t)}},[]);return ek(e,t,n,r).concat(s)}),ek=(e,t,n,o)=>ne(Vn(o),o=>(N_(o)?ek:J_)(e+1,t,n,o)),tk=(e,t)=>{const n=Q_(t);return((e,t)=>{let n=I.none();const o=X(t,(t,o,r)=>V_(o)?0===r?(n=I.some(o),t):X_(e,t,o):o.depth>t.length?((e,t,n)=>{const o=((e,t,n)=>{const o=[];for(let r=0;r{for(let t=1;t{for(let t=0;t{H_(t)&&(Co(e.list,t.listAttributes),Co(e.item,t.itemAttributes)),bo(e.item,t.content)})})(o,n),r=o,$e(de(t),ce(r),Y_),t.concat(o)})(e,t,o):X_(e,t,o),[]);return n.each(e=>{const t=un.fromHtml(`\x3c!--${e.content}--\x3e`);ce(o).each(e=>{fo(e.list,t)})}),ce(o).map(e=>e.list)})(e.contentDocument,n).toArray()},nk=(e,t,n)=>{const o=((e,t)=>{const n=Ae(!1);return V(e,e=>({sourceList:e,entries:ek(0,t,n,e)}))})(t,(e=>{const t=V(B_(e),un.fromDom);return $e(Z(t,T(R_)),Z(re(t),T(R_)),(e,t)=>({start:e,end:t}))})(e));q(o,t=>{((e,t,n)=>{q(Y(t,W_),t=>((e,t,n)=>{switch(t){case"Indent":if(!((e,t)=>bu(e).map(e=>e>=t).getOr(!0))(e,n.depth))return;n.depth++;break;case"Outdent":n.depth--;break;case"Flatten":n.depth=0}n.dirty=!0})(e,n,t))})(e,t.entries,n);const o=((e,t)=>ne(((e,t)=>{if(0===e.length)return[];{let n=t(e[0]);const o=[];let r=[];for(let s=0,a=e.length;sce(t).exists(q_)?tk(e,t):((e,t)=>{const n=Q_(t);return V(n,t=>{const n=V_(t)?tr([un.fromHtml(`\x3c!--${t.content}--\x3e`)]):tr(t.content),o=H_(t)?t.itemAttributes:{};return un.fromDom($_(e,n.dom,o))})})(e,t)))(e,t.entries);var r;q(o,t=>{j_(e,"Indent"===n?"IndentList":"OutdentList",t.dom)}),r=t.sourceList,q(o,e=>{mo(r,e)}),Ao(t.sourceList)})},ok=gi.DOM,rk=On("dd"),sk=On("dt"),ak=e=>{sk(e)&&Bo(e,"dd")},ik=(e,t,n)=>{q(n,"Indent"===t?ak:t=>((e,t)=>{rk(t)?Bo(t,"dt"):sk(t)&&In(t).each(n=>((e,t,n)=>{const o=ok.select('span[data-mce-type="bookmark"]',t),r=$_(e,n),s=ok.createRng();s.setStartAfter(n),s.setEndAfter(t);const a=s.extractContents();for(let t=a.firstChild;t;t=t.firstChild)if("LI"===t.nodeName&&e.dom.isEmpty(t)){ok.remove(t);break}e.dom.isEmpty(a)||ok.insertAfter(a,t),ok.insertAfter(r,t);const i=n.parentElement;i&&w_(e.dom,i)&&(e=>{const t=e.parentNode;t&&dn.each(o,e=>{t.insertBefore(e,n.parentNode)}),ok.remove(e)})(i),ok.remove(n),w_(e.dom,t)&&ok.remove(t)})(e,n.dom,t.dom))})(e,t))},lk=(e,t)=>{const n=Po((e=>{const t=(e=>{const t=M_(e,e.selection.getStart()),n=Y(e.selection.getSelectedBlocks(),f_);return t.toArray().concat(n)})(e),n=(e=>{const t=e.selection.getStart();return e.dom.getParents(t,"ol,ul",L_(e,t,e.selection.isCollapsed()))})(e);return Z(n,e=>{return t=un.fromDom(e),Mn(t).exists(e=>g_(e.dom)&&Wn(e).exists(e=>!u_(e.dom))&&Kn(e).exists(e=>!u_(e.dom)));var t}).fold(()=>I_(e,t),e=>[e])})(e)),o=Po((e=>Y(B_(e),p_))(e));let r=!1;if(n.length||o.length){const s=e.selection.getBookmark();nk(e,n,t),ik(e,t,o),e.selection.moveToBookmark(s),e.selection.setRng(k_(e.selection.getRng())),e.nodeChanged(),r=!0}return r},ck=(e,t)=>!(e=>{const t=O_(e);return U_(e,t)||!e.selection.isEditable()})(e)&&lk(e,t),dk=e=>ck(e,"Indent"),mk=e=>ck(e,"Outdent"),uk=e=>ck(e,"Flatten"),fk=e=>{switch(e){case"UL":return"ToggleUlList";case"OL":return"ToggleOlList";case"DL":return"ToggleDLList"}},gk=(e,t)=>{dn.each(t,(t,n)=>{e.setAttribute(n,t)})},pk=(e,t,n)=>{((e,t,n)=>{const o=n["list-style-type"]?n["list-style-type"]:null;e.setStyle(t,"list-style-type",o)})(e,t,n),((e,t,n)=>{gk(t,n["list-attributes"]),dn.each(e.select("li",t),e=>{gk(e,n["list-item-attributes"])})})(e,t,n)},hk=(e,t)=>C(t)&&!v_(t,e.schema.getBlockElements()),bk=(e,t,n,o)=>{let r=t[n?"startContainer":"endContainer"];const s=t[n?"startOffset":"endOffset"];m_(r)&&(r=r.childNodes[Math.min(s,r.childNodes.length-1)]||r),!n&&b_(r.nextSibling)&&(r=r.nextSibling);const a=(t,n)=>{const r=new Kr(t,(t=>{for(;!e.dom.isBlock(t)&&t.parentNode&&o!==t;)t=t.parentNode;return t})(t)),s=n?"next":"prev";let a;for(;a=r[s]();)if(!C_(e,a)&&!mt(a.textContent)&&0!==a.textContent?.length)return I.some(a);return I.none()};if(n&&d_(r))if(mt(r.textContent))r=a(r,!1).getOr(r);else for(null!==r.parentNode&&hk(e,r.parentNode)&&(r=r.parentNode);null!==r.previousSibling&&(hk(e,r.previousSibling)||d_(r.previousSibling));)r=r.previousSibling;if(!n&&d_(r))if(mt(r.textContent))r=a(r,!0).getOr(r);else for(null!==r.parentNode&&hk(e,r.parentNode)&&(r=r.parentNode);null!==r.nextSibling&&(hk(e,r.nextSibling)||d_(r.nextSibling));)r=r.nextSibling;for(;r.parentNode!==o;){const t=r.parentNode;if(y_(e,r))return r;if(/^(TD|TH)$/.test(t.nodeName))return r;r=t}return r},yk=(e,t,n)=>{const o=e.selection.getRng();let r="LI";const s=L_(e,((e,t)=>{const n=e.selection.getStart(!0),o=bk(e,t,!0,e.getBody());return r=un.fromDom(o),s=un.fromDom(t.commonAncestorContainer),Rr(r,D(vn,s))?t.commonAncestorContainer:n;var r,s})(e,o),o.collapsed),a=e.dom;if("false"===a.getContentEditable(e.selection.getNode()))return;"DL"===(t=t.toUpperCase())&&(r="DT");const i=Xy(o),l=Y(((e,t,n)=>{const o=[],r=e.dom,s=bk(e,t,!0,n),a=bk(e,t,!1,n);let i;const l=[];for(let e=s;e&&(l.push(e),e!==a);e=e.nextSibling);return dn.each(l,t=>{if(y_(e,t))return o.push(t),void(i=null);if(r.isBlock(t)||b_(t))return b_(t)&&r.remove(t),void(i=null);const s=t.nextSibling;ip.isBookmarkNode(t)&&(u_(s)||y_(e,s)||!s&&t.parentNode===n)?i=null:(i||(i=r.create("p"),t.parentNode?.insertBefore(i,t),o.push(i)),i.appendChild(t))}),o})(e,o,s),e.dom.isEditable);dn.each(l,o=>{let s;const i=o.previousSibling,l=o.parentNode;g_(l)||(i&&u_(i)&&i.nodeName===t&&((e,t,n)=>{const o=e.getStyle(t,"list-style-type");let r=n?n["list-style-type"]:"";return r=null===r?"":r,o===r})(a,i,n)?(s=i,o=a.rename(o,r),i.appendChild(o)):(s=a.create(t),l.insertBefore(s,o),s.appendChild(o),o=a.rename(o,r)),((e,t)=>{dn.each(["margin","margin-right","margin-bottom","margin-left","margin-top","padding","padding-right","padding-bottom","padding-left","padding-top"],n=>e.setStyle(t,n,""))})(a,o),pk(a,s,n),Ck(e.dom,s))}),e.selection.setRng(Qy(i))},vk=(e,t,n)=>{return((e,t)=>u_(e)&&e.nodeName===t?.nodeName)(t,n)&&((e,t,n)=>e.getStyle(t,"list-style-type",!0)===e.getStyle(n,"list-style-type",!0))(e,t,n)&&(o=n,t.className===o.className);var o},Ck=(e,t)=>{let n,o=t.nextSibling;if(vk(e,t,o)){const r=o;for(;n=r.firstChild;)t.appendChild(n);e.remove(r)}if(o=t.previousSibling,vk(e,t,o)){const r=o;for(;n=r.lastChild;)t.insertBefore(n,t.firstChild);e.remove(r)}},wk=(e,t,n,o)=>{if(t.nodeName!==n){const r=e.dom.rename(t,n);pk(e.dom,r,o),j_(e,fk(n),r)}else pk(e.dom,t,o),j_(e,fk(n),t)},Sk=(e,t,n,o)=>{if(t.classList.forEach((e,n,o)=>{e.startsWith("tox-")&&(o.remove(e),0===o.length&&t.removeAttribute("class"))}),t.nodeName!==n){const r=e.dom.rename(t,n);pk(e.dom,r,o),j_(e,fk(n),r)}else pk(e.dom,t,o),j_(e,fk(n),t)},Ek=e=>"list-style-type"in e,xk=(e,t,n)=>{const o=O_(e);if(z_(e,o))return;const r=(e=>{const t=O_(e),n=e.selection.getSelectedBlocks();return((e,t)=>C(e)&&1===t.length&&t[0]===e)(t,n)?(e=>Y(e.querySelectorAll(T_),u_))(t):Y(n,e=>u_(e)&&t!==e)})(e),s=f(n)?n:{};r.length>0?((e,t,n,o,r)=>{const s=u_(t);if(!s||t.nodeName!==o||Ek(r)||F_(t)){yk(e,o,r);const a=Xy(e.selection.getRng()),i=s?[t,...n]:n,l=s&&F_(t)?Sk:wk;dn.each(i,t=>{l(e,t,o,r)}),e.selection.setRng(Qy(a))}else uk(e)})(e,o,r,t,s):((e,t,n,o)=>{if(t!==e.getBody())if(t)if(t.nodeName!==n||Ek(o)||F_(t)){const r=Xy(e.selection.getRng());F_(t)&&t.classList.forEach((e,n,o)=>{e.startsWith("tox-")&&(o.remove(e),0===o.length&&t.removeAttribute("class"))}),pk(e.dom,t,o);const s=e.dom.rename(t,n);Ck(e.dom,s),e.selection.setRng(Qy(r)),yk(e,n,o),j_(e,fk(n),s)}else uk(e);else yk(e,n,o),j_(e,fk(n),t)})(e,o,t,s)},_k=(e,t,n,o)=>{let r=t.startContainer;const s=t.startOffset;if(d_(r)&&(n?s0))return r;const a=e.schema.getNonEmptyElements();m_(r)&&(r=Gp.getNode(r,s));const i=new Kr(r,o);n&&((e,t)=>!!b_(t)&&e.isBlock(t.nextSibling)&&!b_(t.previousSibling))(e.dom,r)&&i.next();const l=n?i.next.bind(i):i.prev2.bind(i);for(;r=l();){if("LI"===r.nodeName&&!r.hasChildNodes())return r;if(a[r.nodeName])return r;if(d_(r)&&r.data.length>0)return r}return null},kk=(e,t)=>{const n=t.childNodes;return 1===n.length&&!u_(n[0])&&e.isBlock(n[0])},Nk=(e,t,n)=>{let o;const r=kk(e,n)?n.firstChild:n;if(((e,t)=>{var n;kk(e,t)&&(n=t.firstChild,I.from(n).map(un.fromDom).filter(Nn).exists(e=>Sr(e)&&!$(["details"],En(e))))&&e.remove(t.firstChild,!0)})(e,t),!w_(e,t,!0))for(;o=t.firstChild;)r.appendChild(o)},Ak=(e,t,n)=>{let o;const r=t.parentNode;if(!S_(e,t)||!S_(e,n))return;u_(n.lastChild)&&(o=n.lastChild),r===n.lastChild&&b_(r.previousSibling)&&e.remove(r.previousSibling);const s=n.lastChild;s&&b_(s)&&t.hasChildNodes()&&e.remove(s),w_(e,n,!0)&&No(un.fromDom(n)),Nk(e,t,n),o&&n.appendChild(o);const a=Cn(un.fromDom(n),un.fromDom(t))?e.getParents(t,u_,n):[];e.remove(t),q(a,t=>{w_(e,t)&&t!==e.getRoot()&&e.remove(t)})},Rk=(e,t)=>{const n=e.dom,o=e.selection,r=o.getStart(),s=P_(e,r),a=n.getParent(o.getStart(),"LI",s);if(a){const r=a.parentElement;if(r===e.getBody()&&w_(n,r))return!0;const i=k_(o.getRng()),l=n.getParent(_k(e,i,t,s),"LI",s),c=l&&(t?n.isChildOf(a,l):n.isChildOf(l,a));if(l&&l!==a&&!c)return e.undoManager.transact(()=>{var n;t?((e,t,n,o)=>{const r=e.dom;if(r.isEmpty(o))((e,t,n)=>{No(un.fromDom(n)),Ak(e.dom,t,n),e.selection.setCursorLocation(n,0)})(e,n,o);else{const s=Xy(t);Ak(r,n,o),e.selection.setRng(Qy(s))}})(e,i,l,a):(n=a,n.parentNode?.firstChild===n?mk(e):((e,t,n,o)=>{const r=Xy(t);Ak(e.dom,n,o);const s=Qy(r);e.selection.setRng(s)})(e,i,a,l))}),!0;if(c&&!t&&l!==a){const t=i.commonAncestorContainer.parentElement;return!(!t||n.isChildOf(l,t)||(e.undoManager.transact(()=>{const o=Xy(i);Nk(n,t,l),t.remove();const r=Qy(o);e.selection.setRng(r)}),0))}if(!l&&!t&&0===i.startOffset&&0===i.endOffset)return e.undoManager.transact(()=>{uk(e)}),!0}return!1},Dk=e=>{const t=e.selection.getStart(),n=P_(e,t),o=e.dom.getParent(t,"LI,DT,DD",n);return C(o)||B_(e).length>0},Tk=(e,t)=>{const n=e.selection;return!z_(e,n.getNode())&&(n.isCollapsed()?((e,t)=>Rk(e,t)||((e,t)=>{const n=e.dom,o=e.selection.getStart(),r=P_(e,o),s=n.getParent(o,n.isBlock,r);if(s&&n.isEmpty(s,void 0,{checkRootAsContent:!0})){const o=k_(e.selection.getRng()),a=_k(e,o,t,r),i=n.getParent(a,"LI",r);if(a&&i&&(t||!n.isChildOf(a,s))){const l=e=>$(["td","th","caption"],En(e)),c=e=>e.dom===r,d=lr(un.fromDom(i),l,c),m=lr(un.fromDom(o.startContainer),l,c);return!!je(d,m,vn)&&(e.undoManager.transact(()=>{const o=i.parentNode;((e,t,n)=>{const o=e.getParent(t.parentNode,e.isBlock,n);e.remove(t),o&&e.isEmpty(o)&&e.remove(o)})(n,s,r),Ck(n,o),e.selection.select(a,!0),e.selection.collapse(t)}),!0)}}return!1})(e,t))(e,t):((e,t)=>!!Dk(e)&&(e.undoManager.transact(()=>{l_(e,t,()=>e.execCommand("Delete"))&&x_(e.dom,e.getBody())}),!0))(e,t))},Ok=(e,t)=>({from:e,to:t}),Bk=(e,t)=>{const n=un.fromDom(e),o=un.fromDom(t.container());return cy(n,o).map(e=>((e,t)=>({block:e,position:t}))(e,t))},Pk=(e,t)=>lr(t,e=>Hi(e)||ys(e.dom),t=>vn(t,e)).filter(An).getOr(e),Lk=(e,t)=>{const n=((e,t)=>{const n=Vn(e);return J(n,e=>t.isBlock(En(e))).fold(N(n),e=>n.slice(0,e))})(e,t);return q(n,Ao),n},Mk=(e,t,n)=>{const o=mb(n,t);return Z(o.reverse(),t=>Ls(e,t)).each(Ao)},Ik=(e,t,n,o,r)=>{if(Ls(o,n))return Wi(n),Af(n.dom);((e,t)=>0===Y($n(t),t=>!Ls(e,t)).length)(o,r)&&Ls(o,t)&&mo(r,un.fromTag("br"));const s=Nf(n.dom,Kl.before(r.dom));return q(Lk(t,o),e=>{mo(r,e)}),Mk(o,e,t),s},Fk=(e,t,n,o)=>{if(Ls(o,n)){if(Ls(o,t)){const e=e=>{const t=(e,n)=>Wn(e).fold(()=>n,e=>((e,t)=>e.isInline(En(t)))(o,e)?t(e,n.concat(To(e))):n);return t(e,[])},r=G(e(n),(e,t)=>(po(e,t),t),qi());No(t),go(t,r)}return Ao(n),Af(t.dom)}const r=Rf(n.dom);return q(Lk(t,o),e=>{go(n,e)}),Mk(o,e,t),r},Uk=(e,t)=>{_f(e,t.dom).bind(e=>I.from(e.getNode())).map(un.fromDom).filter(Mi).each(Ao)},zk=(e,t,n,o)=>(Uk(!0,t),Uk(!1,n),((e,t)=>Cn(t,e)?((e,t)=>{const n=mb(t,e);return I.from(n[n.length-1])})(t,e):I.none())(t,n).fold(D(Fk,e,t,n,o),D(Ik,e,t,n,o))),jk=(e,t,n,o,r)=>t?zk(e,o,n,r):zk(e,n,o,r),$k=(e,t)=>{const n=un.fromDom(e.getBody()),o=((e,t,n,o)=>o.collapsed?((e,t,n,o)=>{const r=Bk(t,Kl.fromRangeStart(o)),s=r.bind(o=>Sf(n,t,o.position).bind(o=>Bk(t,o).map(o=>((e,t,n,o)=>ps(o.position.getNode())&&!Ls(e,o.block)?_f(!1,o.block.dom).bind(e=>e.isEqual(o.position)?Sf(n,t,e).bind(e=>Bk(t,e)):I.some(o)).getOr(o):o)(e,t,n,o))));return $e(r,s,Ok).filter(e=>(e=>!vn(e.from.block,e.to.block))(e)&&((e,t)=>{const n=un.fromDom(e);return vn(Pk(n,t.from.block),Pk(n,t.to.block))})(t,e)&&(e=>!1===vs(e.from.block.dom)&&!1===vs(e.to.block.dom))(e)&&(e=>{const t=e=>Ui(e)||Gs(e.dom)||ji(e);return t(e.from.block)&&t(e.to.block)})(e)&&(e=>!(Cn(e.to.block,e.from.block)||Cn(e.from.block,e.to.block)))(e))})(e,t,n,o):I.none())(e.schema,n.dom,t,e.selection.getRng()).map(o=>()=>{jk(n,t,o.from.block,o.to.block,e.schema).each(t=>{e.selection.setRng(t.toRange())})});return o},Hk=(e,t)=>{const n=un.fromDom(t),o=D(vn,e);return ir(n,Hi,o).isSome()},Vk=e=>{const t=un.fromDom(e.getBody());return((e,t)=>{const n=Nf(e.dom,Kl.fromRangeStart(t)).isNone(),o=kf(e.dom,Kl.fromRangeEnd(t)).isNone();return!((e,t)=>Hk(e,t.startContainer)||Hk(e,t.endContainer))(e,t)&&n&&o})(t,e.selection.getRng())?(e=>I.some(()=>{e.setContent(""),e.selection.setCursorLocation()}))(e):((e,t,n)=>{const o=t.getRng();return $e(cy(e,un.fromDom(o.startContainer)),cy(e,un.fromDom(o.endContainer)),(r,s)=>vn(r,s)?I.none():I.some(()=>{o.deleteContents(),jk(e,!0,r,s,n).each(e=>{t.setRng(e.toRange())})})).getOr(I.none())})(t,e.selection,e.schema)},qk=(e,t)=>e.selection.isCollapsed()?I.none():Vk(e),Wk=(e,t,n,o,r)=>I.from(t._selectionOverrides.showCaret(e,n,o,r)),Kk=(e,t)=>e.dispatch("BeforeObjectSelected",{target:t}).isDefaultPrevented()?I.none():I.some((e=>{const t=e.ownerDocument.createRange();return t.selectNode(e),t})(t)),Yk=(e,t,n)=>t.collapsed?((e,t,n)=>{const o=tf(1,e.getBody(),t),r=Kl.fromRangeStart(o),s=r.getNode();if(Ou(s))return Wk(1,e,s,!r.isAtEnd(),!1);const a=r.getNode(!0);if(Ou(a))return Wk(1,e,a,!1,!1);const i=zy(e.dom.getRoot(),r.getNode());return Ou(i)?Wk(1,e,i,!1,n):I.none()})(e,t,n).getOr(t):t,Gk=e=>lb(e)||rb(e),Xk=e=>cb(e)||sb(e),Qk=(e,t,n,o,r,s)=>{Wk(o,e,s.getNode(!r),r,!0).each(n=>{if(t.collapsed){const e=t.cloneRange();r?e.setEnd(n.startContainer,n.startOffset):e.setStart(n.endContainer,n.endOffset),e.deleteContents()}else t.deleteContents();e.selection.setRng(n)}),((e,t)=>{cs(t)&&0===t.data.length&&e.remove(t)})(e.dom,n)},Zk=(e,t)=>((e,t)=>{const n=e.selection.getRng();if(!cs(n.commonAncestorContainer))return I.none();const o=t?1:-1,r=yf(e.getBody()),s=D(sf,t?r.next:r.prev),a=t?Gk:Xk,i=of(o,e.getBody(),n),l=s(i),c=l?ny(t,l):l;if(!c||!af(i,c))return I.none();if(a(c))return I.some(()=>Qk(e,n,i.getNode(),o,t,c));const d=s(c);return d&&a(d)&&af(c,d)?I.some(()=>Qk(e,n,i.getNode(),o,t,d)):I.none()})(e,t),Jk=(e,t)=>{const n=e.getBody();return t?Af(n).filter(lb):Rf(n).filter(cb)},eN=e=>{const t=e.selection.getRng();return!t.collapsed&&(Jk(e,!0).exists(e=>e.isEqual(Kl.fromRangeStart(t)))||Jk(e,!1).exists(e=>e.isEqual(Kl.fromRangeEnd(t))))},tN=Ne([{remove:["element"]},{moveToElement:["element"]},{moveToPosition:["position"]}]),nN=(e,t,n,o)=>Sf(t,e,n).bind(r=>{return s=r.getNode(),C(s)&&(Hi(un.fromDom(s))||ji(un.fromDom(s)))||((e,t,n,o,r)=>{const s=t=>r.isInline(t.nodeName.toLowerCase())&&!Yu(n,o,e);return nf(!t,n).fold(()=>nf(t,o).fold(L,s),s)})(e,t,n,r,o)?I.none():t&&vs(r.getNode())||!t&&vs(r.getNode(!0))?((e,t,n,o,r)=>{const s=r.getNode(!n);return cy(un.fromDom(t),un.fromDom(o.getNode())).map(t=>Ls(e,t)?tN.remove(t.dom):tN.moveToElement(s)).orThunk(()=>I.some(tN.moveToElement(s)))})(o,e,t,n,r):t&&cb(n)||!t&&lb(n)?I.some(tN.moveToPosition(r)):I.none();var s}),oN=(e,t)=>I.from(zy(e.getBody(),t)),rN=(e,t)=>{const n=e.selection.getNode();return oN(e,n).filter(vs).fold(()=>((e,t,n,o)=>{const r=tf(t?1:-1,e,n),s=Kl.fromRangeStart(r),a=un.fromDom(e);return!t&&cb(s)?I.some(tN.remove(s.getNode(!0))):t&&lb(s)?I.some(tN.remove(s.getNode())):!t&&lb(s)&&Eb(a,s,o)?xb(a,s,o).map(e=>tN.remove(e.getNode())):t&&cb(s)&&Sb(a,s,o)?_b(a,s,o).map(e=>tN.remove(e.getNode())):((e,t,n,o)=>((e,t)=>{const n=t.getNode(!e),o=e?"after":"before";return es(n)&&n.getAttribute("data-mce-caret")===o})(t,n)?((e,t)=>v(t)?I.none():e&&vs(t.nextSibling)?I.some(tN.moveToElement(t.nextSibling)):!e&&vs(t.previousSibling)?I.some(tN.moveToElement(t.previousSibling)):I.none())(t,n.getNode(!t)).orThunk(()=>nN(e,t,n,o)):nN(e,t,n,o).bind(t=>((e,t,n)=>n.fold(e=>I.some(tN.remove(e)),e=>I.some(tN.moveToElement(e)),n=>Yu(t,n,e)?I.none():I.some(tN.moveToPosition(n))))(e,n,t)))(e,t,s,o)})(e.getBody(),t,e.selection.getRng(),e.schema).map(n=>()=>n.fold(((e,t)=>n=>(e._selectionOverrides.hideFakeCaret(),Qb(e,t,un.fromDom(n)),!0))(e,t),((e,t)=>n=>{const o=t?Kl.before(n):Kl.after(n);return e.selection.setRng(o.toRange()),!0})(e,t),(e=>t=>(e.selection.setRng(t.toRange()),!0))(e))),()=>I.some(x))},sN=e=>{const t=e.dom,n=e.selection,o=zy(e.getBody(),n.getNode());if(ys(o)&&t.isBlock(o)&&t.isEmpty(o)){const e=t.create("br",{"data-mce-bogus":"1"});t.setHTML(o,""),o.appendChild(e),n.setRng(Kl.before(e).toRange())}return!0},aN=(e,t)=>e.selection.isCollapsed()?rN(e,t):((e,t)=>{const n=e.selection.getNode();return vs(n)&&!ws(n)?oN(e,n.parentNode).filter(vs).fold(()=>I.some(()=>{var n;n=un.fromDom(e.getBody()),q(Ar(n,".mce-offscreen-selection"),Ao),Qb(e,t,un.fromDom(e.selection.getNode())),dy(e)}),()=>I.some(x)):eN(e)?I.some(()=>{fy(e,e.selection.getRng(),un.fromDom(e.getBody()))}):I.none()})(e,t),iN=(e,t)=>{const n=e.dom,o=n.getParent(e.selection.getStart(),n.isBlock),r=n.getParent(e.selection.getEnd(),n.isBlock),s=e.getBody(),a=o?.nodeName?.toLowerCase();if("div"===a&&o&&r&&o===s.firstChild&&r===s.lastChild&&!n.isEmpty(s)){const n=o.cloneNode(!1),r=()=>{if(t?iy(e):ay(e),s.firstChild!==o){const t=Xy(e.selection.getRng(),()=>document.createElement("span"));Array.from(s.childNodes).forEach(e=>n.appendChild(e)),s.appendChild(n),e.selection.setRng(Qy(t))}};return I.some(r)}return I.none()},lN=(e,t)=>e.selection.isCollapsed()?((e,t)=>{const n=Kl.fromRangeStart(e.selection.getRng());return Sf(t,e.getBody(),n).filter(e=>t?nb(e):ob(e)).bind(e=>Gu(t?0:-1,e)).map(t=>()=>e.selection.select(t))})(e,t):I.none(),cN=cs,dN=e=>cN(e)&&e.data[0]===Ki,mN=e=>cN(e)&&e.data[e.data.length-1]===Ki,uN=e=>(e.ownerDocument??document).createTextNode(Ki),fN=(e,t)=>e?(e=>{if(cN(e.previousSibling))return mN(e.previousSibling)||e.previousSibling.appendData(Ki),e.previousSibling;if(cN(e))return dN(e)||e.insertData(0,Ki),e;{const t=uN(e);return e.parentNode?.insertBefore(t,e),t}})(t):(e=>{if(cN(e.nextSibling))return dN(e.nextSibling)||e.nextSibling.insertData(0,Ki),e.nextSibling;if(cN(e))return mN(e)||e.appendData(Ki),e;{const t=uN(e);return e.nextSibling?e.parentNode?.insertBefore(t,e.nextSibling):e.parentNode?.appendChild(t),t}})(t),gN=D(fN,!0),pN=D(fN,!1),hN=(e,t)=>cs(e.container())?fN(t,e.container()):fN(t,e.getNode()),bN=(e,t)=>{const n=t.get();return n&&e.container()===n&&Ji(n)},yN=(e,t)=>t.fold(t=>{_u(e.get());const n=gN(t);return e.set(n),I.some(Kl(n,n.length-1))},t=>Af(t).map(t=>{if(bN(t,e)){const t=e.get();return Kl(t,1)}{_u(e.get());const n=hN(t,!0);return e.set(n),Kl(n,1)}}),t=>Rf(t).map(t=>{if(bN(t,e)){const t=e.get();return Kl(t,t.length-1)}{_u(e.get());const n=hN(t,!1);return e.set(n),Kl(n,n.length-1)}}),t=>{_u(e.get());const n=pN(t);return e.set(n),I.some(Kl(n,1))}),vN=(e,t)=>{for(let n=0;nKu(t,e)||e,SN=(e,t,n)=>{const o=oy(n),r=wN(t,o.container());return ty(e,r,o).fold(()=>kf(r,o).bind(D(ty,e,r)).map(e=>CN.before(e)),I.none)},EN=(e,t)=>null===Of(e,t),xN=(e,t,n)=>ty(e,t,n).filter(D(EN,t)),_N=(e,t,n)=>{const o=ry(n);return xN(e,t,o).bind(e=>Nf(e,o).isNone()?I.some(CN.start(e)):I.none())},kN=(e,t,n)=>{const o=oy(n);return xN(e,t,o).bind(e=>kf(e,o).isNone()?I.some(CN.end(e)):I.none())},NN=(e,t,n)=>{const o=ry(n),r=wN(t,o.container());return ty(e,r,o).fold(()=>Nf(r,o).bind(D(ty,e,r)).map(e=>CN.after(e)),I.none)},AN=e=>!ey(DN(e)),RN=(e,t,n)=>vN([SN,_N,kN,NN],[e,t,n]).filter(AN),DN=e=>e.fold(A,A,A,A),TN=e=>e.fold(N("before"),N("start"),N("end"),N("after")),ON=e=>e.fold(CN.before,CN.before,CN.after,CN.after),BN=e=>e.fold(CN.start,CN.start,CN.end,CN.end),PN=(e,t,n,o,r,s)=>$e(ty(t,n,o),ty(t,n,r),(t,o)=>t!==o&&((e,t,n)=>{const o=Ku(t,e),r=Ku(n,e);return C(o)&&o===r})(n,t,o)?CN.after(e?t:o):s).getOr(s),LN=(e,t)=>e.fold(M,e=>{return o=t,!(TN(n=e)===TN(o)&&DN(n)===DN(o));var n,o}),MN=(e,t)=>e?t.fold(_(I.some,CN.start),I.none,_(I.some,CN.after),I.none):t.fold(I.none,_(I.some,CN.before),I.none,_(I.some,CN.end)),IN=(e,t,n)=>{const o=e?1:-1;return t.setRng(Kl(n.container(),n.offset()+o).toRange()),t.getSel().modify("move",e?"forward":"backward","word"),!0};var FN;!function(e){e[e.Br=0]="Br",e[e.Block=1]="Block",e[e.Wrap=2]="Wrap",e[e.Eol=3]="Eol"}(FN||(FN={}));const UN=(e,t)=>-1===e?re(t):t,zN=(e,t,n)=>1===e?t.next(n):t.prev(n),jN=(e,t,n,o)=>ps(o.getNode(1===t))?FN.Br:!1===Yu(n,o)?FN.Block:FN.Wrap,$N=(e,t,n,o)=>{const r=yf(n);let s=o;const a=[];for(;s;){const n=zN(t,r,s);if(!n)break;if(ps(n.getNode(!1)))return 1===t?{positions:UN(t,a).concat([n]),breakType:FN.Br,breakAt:I.some(n)}:{positions:UN(t,a),breakType:FN.Br,breakAt:I.some(n)};if(n.isVisible()){if(e(s,n)){const e=jN(0,t,s,n);return{positions:UN(t,a),breakType:e,breakAt:I.some(n)}}a.push(n),s=n}else s=n}return{positions:UN(t,a),breakType:FN.Eol,breakAt:I.none()}},HN=(e,t,n,o)=>t(n,o).breakAt.map(o=>{const r=t(n,o).positions;return-1===e?r.concat(o):[o].concat(r)}).getOr([]),VN=(e,t)=>X(e,(e,n)=>e.fold(()=>I.some(n),o=>$e(ce(o.getClientRects()),ce(n.getClientRects()),(e,r)=>{const s=Math.abs(t-e.left);return Math.abs(t-r.left)<=s?n:o}).or(e)),I.none()),qN=(e,t)=>ce(t.getClientRects()).bind(t=>VN(e,t.left)),WN=D($N,Kl.isAbove,-1),KN=D($N,Kl.isBelow,1),YN=D(HN,-1,WN),GN=D(HN,1,KN),XN=(e,t)=>WN(e,t).breakAt.isNone(),QN=(e,t)=>KN(e,t).breakAt.isNone(),ZN=(e,t)=>qN(YN(e,t),t),JN=(e,t)=>qN(GN(e,t),t),eA=vs,tA=(e,t)=>Math.abs(e.left-t),nA=(e,t)=>Math.abs(e.right-t),oA=(e,t)=>yt(e,(e,n)=>{const o=Math.min(tA(e,t),nA(e,t)),r=Math.min(tA(n,t),nA(n,t));return r===o&&ke(n,"node")&&eA(n.node)||r{const t=t=>V(t,t=>{const n=cl(t);return n.node=e,n});if(es(e))return t(e.getClientRects());if(cs(e)){const n=e.ownerDocument.createRange();return n.setStart(e,0),n.setEnd(e,e.data.length),t(n.getClientRects())}return[]},sA=e=>ne(e,rA);var aA;!function(e){e[e.Up=-1]="Up",e[e.Down=1]="Down"}(aA||(aA={}));const iA=(e,t,n,o,r,s)=>{let a=0;const i=[],l=o=>{let s=sA([o]);e===aA.Up&&(s=s.reverse());for(let e=0;e0&&t(o,Ct(i))&&a++,o.line=a,r(o))return!0;i.push(o)}}return!1},c=Ct(s.getClientRects());if(!c)return i;const d=s.getNode();return d&&(l(d),((e,t,n,o)=>{let r=o;for(;r=Vu(r,e,Rl,t);)if(n(r))return})(e,o,l,d)),i},lA=D(iA,aA.Up,ul,fl),cA=D(iA,aA.Down,fl,ul),dA=e=>Ct(e.getClientRects()),mA=e=>t=>((e,t)=>t.line>e)(e,t),uA=e=>t=>((e,t)=>t.line===e)(e,t),fA=(e,t)=>{e.selection.setRng(t),fh(e,e.selection.getRng())},gA=(e,t,n)=>I.some(Yk(e,t,n)),pA=(e,t)=>{const n=e.getNode(-1===t);return C(n)&&qu(n)?I.some(n):I.none()},hA=(e,t)=>{const n=e.dom.createRng();return n.selectNode(t),n},bA=(e,t,n,o,r,s)=>{const a=1===t,i=yf(e.getBody()),l=D(sf,a?i.next:i.prev),c=a?o:r;if(!n.collapsed){const o=pl(n);if(s(o)){if(qu(o)){const o=of(t,e.getBody(),n);return I.from(l(o)).map(e=>e.toRange())}return Wk(t,e,o,-1===t,!1)}if(eN(e)){const e=n.cloneRange();return e.collapse(-1===t),I.from(e)}}const d=of(t,e.getBody(),n);if(c(d))return Kk(e,d.getNode(!a));let m=l(d);const u=il(n);if(!m)return u?I.some(n):I.none();if(m=ny(a,m),c(m))return pA(m,t).fold(()=>Wk(t,e,m?.getNode(!a),a,!1),t=>I.some(hA(e,t)));const f=l(m);return f&&c(f)&&af(m,f)?pA(m,t).fold(()=>Wk(t,e,f.getNode(!a),a,!1),t=>I.some(hA(e,t))):u?gA(e,m.toRange(),!1):I.none()},yA=(e,t,n,o,r,s)=>{const a=of(t,e.getBody(),n),i=Ct(a.getClientRects()),l=t===aA.Down,c=e.getBody();if(!i)return I.none();if(eN(e)){const e=l?Kl.fromRangeEnd(n):Kl.fromRangeStart(n);return(l?JN:ZN)(c,e).orThunk(()=>I.from(e)).map(e=>e.toRange())}const d=(l?cA:lA)(c,mA(1),a),m=Y(d,uA(1)),u=i.left,f=oA(m,u);if(f&&s(f.node)){const n=Math.abs(u-f.left),o=Math.abs(u-f.right);return Wk(t,e,f.node,n{const r=yf(t);let s,a,i,l;const c=[];let d=0;e===aA.Down?(s=r.next,a=fl,i=ul,l=Kl.after(o)):(s=r.prev,a=ul,i=fl,l=Kl.before(o));const m=dA(l);do{if(!l.isVisible())continue;const e=dA(l);if(i(e,m))continue;c.length>0&&a(e,Ct(c))&&d++;const t=cl(e);if(t.position=l,t.line=d,n(t))return c;c.push(t)}while(l=s(l));return c})(t,c,mA(1),g);let o=oA(Y(n,uA(1)),u);if(o)return gA(e,o.position.toRange(),!1);if(o=Ct(Y(n,uA(0))),o)return gA(e,o.position.toRange(),!1)}return 0===m.length?vA(e,l).filter(l?r:o).map(t=>Yk(e,t.toRange(),!1)):I.none()},vA=(e,t)=>{const n=e.selection.getRng(),o=t?Kl.fromRangeEnd(n):Kl.fromRangeStart(n),r=(s=o.container(),a=e.getBody(),ir(un.fromDom(s),e=>Pu(e.dom),e=>e.dom===a).map(e=>e.dom).getOr(a));var s,a;if(t){const e=KN(r,o);return de(e.positions)}{const e=WN(r,o);return ce(e.positions)}},CA=(e,t,n)=>vA(e,t).filter(n).exists(t=>(e.selection.setRng(t.toRange()),!0)),wA=(e,t)=>{const n=e.dom.createRng();n.setStart(t.container(),t.offset()),n.setEnd(t.container(),t.offset()),e.selection.setRng(n)},SA=(e,t)=>{e?t.setAttribute("data-mce-selected","inline-boundary"):t.removeAttribute("data-mce-selected")},EA=(e,t,n)=>yN(t,n).map(t=>(wA(e,t),n)),xA=(e,t,n)=>{const o=e.getBody(),r=((e,t,n)=>{const o=Kl.fromRangeStart(e);if(e.collapsed)return o;{const r=Kl.fromRangeEnd(e);return n?Nf(t,r).getOr(r):kf(t,o).getOr(o)}})(e.selection.getRng(),o,n);return((e,t,n,o)=>{const r=ny(e,o),s=RN(t,n,r);return RN(t,n,r).bind(D(MN,e)).orThunk(()=>((e,t,n,o,r)=>{const s=ny(e,r);return Sf(e,n,s).map(D(ny,e)).fold(()=>o.map(ON),r=>RN(t,n,r).map(D(PN,e,t,n,s,r)).filter(D(LN,o))).filter(AN)})(e,t,n,s,o))})(n,D(Jb,e),o,r).bind(n=>EA(e,t,n))},_A=(e,t,n)=>!!im(e)&&xA(e,t,n).isSome(),kA=(e,t,n)=>!!im(t)&&((e,t)=>{const n=t.selection.getRng(),o=e?Kl.fromRangeEnd(n):Kl.fromRangeStart(n);return!!(e=>w(e.selection.getSel().modify))(t)&&(e&&nl(o)?IN(!0,t.selection,o):!(e||!ol(o))&&IN(!1,t.selection,o))})(e,t),NA=e=>{const t=Ae(null),n=D(Jb,e);return e.on("NodeChange",o=>{im(e)&&(((e,t,n)=>{const o=V(Ar(un.fromDom(t.getRoot()),'*[data-mce-selected="inline-boundary"]'),e=>e.dom),r=Y(o,e),s=Y(n,e);q(se(r,s),D(SA,!1)),q(se(s,r),D(SA,!0))})(n,e.dom,o.parents),((e,t)=>{const n=t.get();if(e.selection.isCollapsed()&&!e.composing&&n){const o=Kl.fromRangeStart(e.selection.getRng());Kl.isTextPosition(o)&&!(e=>nl(e)||ol(e))(o)&&(wA(e,xu(n,o)),t.set(null))}})(e,t),((e,t,n,o)=>{if(t.selection.isCollapsed()){const r=Y(o,e);q(r,o=>{const r=Kl.fromRangeStart(t.selection.getRng());RN(e,t.getBody(),r).bind(e=>EA(t,n,e))})}})(n,e,t,o.parents))}),t},AA=D(kA,!0),RA=D(kA,!1),DA=(e,t,n)=>{if(im(e)){const o=vA(e,t).getOrThunk(()=>{const n=e.selection.getRng();return t?Kl.fromRangeEnd(n):Kl.fromRangeStart(n)});return RN(D(Jb,e),e.getBody(),o).exists(t=>{const o=ON(t);return yN(n,o).exists(t=>(wA(e,t),!0))})}return!1},TA=(e,t)=>n=>yN(t,n).map(t=>()=>wA(e,t)),OA=(e,t,n,o)=>{const r=e.getBody(),s=D(Jb,e);e.undoManager.ignore(()=>{e.selection.setRng(((e,t)=>{const n=document.createRange();return n.setStart(e.container(),e.offset()),n.setEnd(t.container(),t.offset()),n})(n,o)),ay(e),RN(s,r,Kl.fromRangeStart(e.selection.getRng())).map(BN).bind(TA(e,t)).each(P)}),e.nodeChanged()},BA=(e,t,n)=>{if(e.selection.isCollapsed()&&im(e)){const o=Kl.fromRangeStart(e.selection.getRng());return((e,t,n,o)=>{const r=((e,t)=>Ku(t,e)||e)(e.getBody(),o.container()),s=D(Jb,e),a=RN(s,r,o);return a.bind(e=>n?e.fold(N(I.some(BN(e))),I.none,N(I.some(ON(e))),I.none):e.fold(I.none,N(I.some(ON(e))),I.none,N(I.some(BN(e))))).map(TA(e,t)).getOrThunk(()=>{const i=Ef(n,r,o),l=i.bind(e=>RN(s,r,e));return $e(a,l,()=>ty(s,r,o).bind(t=>(e=>$e(Af(e),Rf(e),(t,n)=>{const o=ny(!0,t),r=ny(!1,n);return kf(e,o).forall(e=>e.isEqual(r))}).getOr(!0))(t)?I.some(()=>{Qb(e,n,un.fromDom(t))}):I.none())).getOrThunk(()=>l.bind(()=>i.map(r=>()=>{n?OA(e,t,o,r):OA(e,t,r,o)})))})})(e,t,n,o)}return I.none()},PA=(e,t)=>{const n=un.fromDom(e.getBody()),o=un.fromDom(e.selection.getStart()),r=mb(o,n);return J(r,t).fold(N(r),e=>r.slice(0,e))},LA=e=>1===Yn(e),MA=(e,t)=>{const n=D(wv,e);return ne(t,e=>n(e)?[e.dom]:[])},IA=e=>{const t=(e=>PA(e,t=>e.schema.isBlock(En(t))))(e);return MA(e,t)},FA=(e,t)=>{const n=Y((e=>PA(e,t=>e.schema.isBlock(En(t))||(e=>Yn(e)>1)(t)))(e),LA);return de(n).bind(o=>{const r=Kl.fromRangeStart(e.selection.getRng());return my(t,r,o.dom)&&!Tg(o)?I.some(()=>((e,t,n,o)=>{const r=MA(t,o);if(0===r.length)Qb(t,e,n);else{const e=Cv(n.dom,r);t.selection.setRng(e.toRange())}})(t,e,o,n)):I.none()})},UA=(e,t)=>{const n=e.selection.getStart(),o=((e,t)=>{const n=t.parentElement;return ps(t)&&!h(n)&&e.dom.isEmpty(n)})(e,n)||Tg(un.fromDom(n))?Cv(n,t):((e,t)=>{const{caretContainer:n,caretPosition:o}=vv(t);return e.insertNode(n.dom),o})(e.selection.getRng(),t);e.selection.setRng(o.toRange())},zA=(e,t)=>{const n=se(t,IA(e));n.length>0&&UA(e,n)},jA=e=>cs(e.startContainer),$A=e=>{const t=e.selection.getRng();return(e=>0===e.startOffset&&jA(e))(t)&&((e,t)=>{const n=t.startContainer.parentElement;return!h(n)&&wv(e,un.fromDom(n))})(e,t)&&(e=>(e=>(e=>{const t=e.startContainer.parentNode,n=e.endContainer.parentNode;return!h(t)&&!h(n)&&t.isEqualNode(n)})(e)&&(e=>{const t=e.endContainer;return e.endOffset===(cs(t)?t.length:t.childNodes.length)})(e))(e)||(e=>!e.endContainer.isEqualNode(e.commonAncestorContainer))(e))(t)},HA=(e,t)=>e.selection.isCollapsed()?FA(e,t):(e=>{if($A(e)){const t=IA(e);return I.some(()=>{ay(e),zA(e,t)})}return I.none()})(e),VA=e=>((e=>{const t=e.selection.getRng();return t.collapsed&&(jA(t)||e.dom.isEmpty(t.startContainer))&&!(e=>{return t=un.fromDom(e.selection.getStart()),n=e.schema,Rr(t,e=>Tf(e.dom),e=>n.isBlock(En(e)));var t,n})(e)})(e)&&UA(e,[]),!0),qA=(e,t,n)=>C(n)?I.some(()=>{e._selectionOverrides.hideFakeCaret(),Qb(e,t,un.fromDom(n))}):I.none(),WA=(e,t)=>e.selection.isCollapsed()?((e,t)=>{const n=t?rb:sb,o=of(t?1:-1,e.getBody(),e.selection.getRng());return n(o)?qA(e,t,o.getNode(!t)):I.from(ny(t,o)).filter(e=>n(e)&&af(o,e)).bind(n=>qA(e,t,n.getNode(!t)))})(e,t):((e,t)=>{const n=e.selection.getNode();return xs(n)?qA(e,t,n):I.none()})(e,t),KA=e=>st(e??"").getOr(0),YA=(e,t)=>(e||"table"===En(t)?"margin":"padding")+("rtl"===$o(t,"direction")?"-right":"-left"),GA=e=>{const t=QA(e);return!e.mode.isReadOnly()&&(t.length>1||((e,t)=>oe(t,t=>{const n=YA(Vd(e),t),o=Vo(t,n).map(KA).getOr(0);return"false"!==e.dom.getContentEditable(t.dom)&&o>0}))(e,t))},XA=e=>zi(e)||ji(e),QA=e=>{const t=Qf(e);return 0===t.length?Y(Po(e.selection.getSelectedBlocks()),e=>!XA(e)&&!(e=>Mn(e).exists(XA))(e)&&lr(e,e=>ys(e.dom)||vs(e.dom)).exists(e=>ys(e.dom))):t},ZA=(e,t)=>{if(e.mode.isReadOnly())return;const{dom:n}=e,o=qd(e),r=/[a-z%]+$/i.exec(o)?.[0]??"px",s=KA(o),a=Vd(e);q(QA(e),e=>{((e,t,n,o,r,s)=>{const a=YA(n,un.fromDom(s)),i=KA(e.getStyle(s,a));if("outdent"===t){const t=Math.max(0,i-o);e.setStyle(s,a,t?t+r:"")}else{const t=i+o+r;e.setStyle(s,a,t)}})(n,t,a,s,r,e.dom)}),"indent"===t?dk(e):mk(e)},JA=e=>ZA(e,"outdent"),eR=e=>{if(e.selection.isCollapsed()&&GA(e)){const t=e.dom,n=e.selection.getRng(),o=Kl.fromRangeStart(n),r=t.getParent(n.startContainer,t.isBlock);if(null!==r&&hb(un.fromDom(r),o,e.schema))return I.some(()=>JA(e))}return I.none()},tR=(e,t)=>e.selection.isCollapsed()?I.none():((e,t)=>{const n=e.selection.getRng();return(e=>ag(e,ts))(bC(n))?I.some(()=>Qb(e,t,un.fromDom(n.startContainer.childNodes[n.startOffset]))):I.none()})(e,t),nR=(e,t,n)=>ue([eR,aN,Zk,(e,n)=>BA(e,t,n),$k,Uy,lN,WA,qk,HA,iN,tR],t=>t(e,n)).filter(t=>e.selection.isEditable()),oR=(e,t)=>{nR(e,t,!1).fold(()=>{e.selection.isEditable()&&(ay(e),dy(e))},P),Dk(e)&&x_(e.dom,e.getBody())},rR=e=>void 0===e.touches||1!==e.touches.length?I.none():I.some(e.touches[0]),sR=(e,t)=>_e(e,t.nodeName),aR=(e,t)=>!!cs(t)||!!es(t)&&!(sR(e.getBlockElements(),t)||Vf(t)||Zs(e,t)||Us(t)||Es(t)),iR=(e,t)=>{if(cs(t)){if(0===t.data.length)return!0;if(/^\s+$/.test(t.data))return!t.nextSibling||sR(e,t.nextSibling)||Us(t.nextSibling)}return!1},lR=e=>e.dom.create(Ed(e),xd(e)),cR=(e,t,n)=>{const o=un.fromDom(lR(e)),r=qi();go(o,r),n(t,o);const s=document.createRange();return s.setStartBefore(r.dom),s.setEndBefore(r.dom),s},dR=e=>t=>-1!==(" "+t.attr("class")+" ").indexOf(e),mR=(e,t,n)=>function(o){const r=arguments,s=r[r.length-2],a=s>0?t.charAt(s-1):"";if('"'===a)return o;if(">"===a){const e=t.lastIndexOf("<",s);if(-1!==e&&-1!==t.substring(e,s).indexOf('contenteditable="false"'))return o}return''+e.dom.encode("string"==typeof r[1]?r[1]:r[0])+""},uR=(e,t)=>oe(e,e=>{const n=t.match(e);return null!==n&&n[0].length===t.length}),fR=(e,t)=>{t.hasAttribute("data-mce-caret")&&(al(t),e.selection.setRng(e.selection.getRng()),e.selection.scrollIntoView(t))},gR=(e,t)=>{const n=(e=>ur(un.fromDom(e.getBody()),"*[data-mce-caret]").map(e=>e.dom).getOrNull())(e);if(n)return"compositionstart"===t.type?(t.preventDefault(),t.stopPropagation(),void fR(e,n)):void(tl(n)&&(fR(e,n),e.undoManager.add()))},pR=vs,hR=(e,t,n)=>{const o=yf(e.getBody()),r=D(sf,1===t?o.next:o.prev);if(n.collapsed){const o=e.dom.getParent(n.startContainer,"PRE");if(!o)return;if(!r(Kl.fromRangeStart(n))){const n=un.fromDom((e=>{const t=e.dom.create(Ed(e));return t.innerHTML='
    ',t})(e));1===t?uo(un.fromDom(o),n):mo(un.fromDom(o),n),e.selection.select(n.dom,!0),e.selection.collapse()}}},bR=(e,t)=>((e,t)=>{const n=t?1:-1,o=e.selection.getRng();return((e,t,n)=>bA(t,e,n,lb,cb,pR))(n,e,o).orThunk(()=>(hR(e,n,o),I.none()))})(e,((e,t)=>{const n=t?e.getEnd(!0):e.getStart(!0);return ey(n)?!t:t})(e.selection,t)).exists(t=>(fA(e,t),!0)),yR=(e,t)=>((e,t)=>{const n=t?1:-1,o=e.selection.getRng();return((e,t,n)=>yA(t,e,n,e=>lb(e)||ab(e),e=>cb(e)||ib(e),pR))(n,e,o).orThunk(()=>(hR(e,n,o),I.none()))})(e,t).exists(t=>(fA(e,t),!0)),vR=(e,t)=>CA(e,t,t?cb:lb),CR=(e,t)=>Jk(e,!t).map(n=>{const o=n.toRange(),r=e.selection.getRng();return t?o.setStart(r.startContainer,r.startOffset):o.setEnd(r.endContainer,r.endOffset),o}).exists(t=>(fA(e,t),!0)),wR=(e,t)=>{const n=e=>vn(e,t),o=un.fromDom(e.container());return lr(o,e=>ys(e.dom),n).filter(e=>!n(e))},SR=(e,t)=>((e,t)=>{const n=Kl.fromRangeStart(e.selection.getRng()),o=Kl.fromRangeEnd(e.selection.getRng()),r=un.fromDom(e.getBody());return $e(wR(n,r),wR(o,r),(e,t)=>vn(e,t)?I.some(e):I.none()).bind(A).fold(L,r=>!!(t&&QN(r.dom,o)||!t&&XN(r.dom,n))&&((e,t,n)=>(n?JN:ZN)(e.getBody(),t).map(e=>e.toRange()))(e,t?o:n,t).exists(t=>(fA(e,t),!0)))})(e,t),ER=e=>$(["figcaption"],En(e)),xR=(e,t)=>!!e.selection.isCollapsed()&&((e,t)=>{const n=un.fromDom(e.getBody()),o=Kl.fromRangeStart(e.selection.getRng());return((e,t,n)=>{const o=D(vn,t);return lr(un.fromDom(e.container()),e=>n.isBlock(En(e)),o).filter(ER)})(o,n,e.schema).exists(()=>{if(((e,t,n)=>t?QN(e.dom,n):XN(e.dom,n))(n,t,o)){const o=cR(e,n,t?go:fo);return e.selection.setRng(o),!0}return!1})})(e,t),_R=(e,t)=>((e,t)=>t?I.from(e.dom.getParent(e.selection.getNode(),"details")).map(t=>((e,t)=>{const n=e.selection.getRng(),o=Kl.fromRangeStart(n);return!(e.getBody().lastChild!==t||!QN(t,o)||(e.execCommand("InsertNewBlockAfter"),0))})(e,t)).getOr(!1):I.from(e.dom.getParent(e.selection.getNode(),"summary")).bind(t=>I.from(e.dom.getParent(t,"details")).map(n=>((e,t,n)=>{const o=e.selection.getRng(),r=Kl.fromRangeStart(o);return!(e.getBody().firstChild!==t||!XN(n,r)||(e.execCommand("InsertNewBlockBefore"),0))})(e,n,t))).getOr(!1))(e,t),kR={shiftKey:!1,altKey:!1,ctrlKey:!1,metaKey:!1,keyCode:0},NR=(e,t)=>t.keyCode===e.keyCode&&t.shiftKey===e.shiftKey&&t.altKey===e.altKey&&t.ctrlKey===e.ctrlKey&&t.metaKey===e.metaKey,AR=(e,...t)=>()=>e.apply(null,t),RR=(e,t)=>Z(((e,t)=>ne((e=>V(e,e=>({...kR,...e})))(e),e=>NR(e,t)?[e]:[]))(e,t),e=>e.action()),DR=(e,t)=>ue(((e,t)=>ne((e=>V(e,e=>({...kR,...e})))(e),e=>NR(e,t)?[e]:[]))(e,t),e=>e.action()),TR=(e,t)=>{const n=t?1:-1,o=e.selection.getRng();return bA(e,n,o,rb,sb,xs).exists(t=>(fA(e,t),!0))},OR=(e,t)=>{const n=t?1:-1,o=e.selection.getRng();return yA(e,n,o,rb,sb,xs).exists(t=>(fA(e,t),!0))},BR=(e,t)=>CA(e,t,t?sb:rb),PR=(e,t,n)=>ne(Vn(e),e=>bn(e,t)?n(e)?[e]:[]:PR(e,t,n)),LR=(e,t)=>fr(e,"table",t),MR=Ne([{none:["current"]},{first:["current"]},{middle:["current","target"]},{last:["current"]}]),IR={...MR,none:e=>MR.none(e)},FR=(e,t,n,o,r=M)=>{const s=1===o;if(!s&&n<=0)return IR.first(e[0]);if(s&&n>=e.length-1)return IR.last(e[e.length-1]);{const s=n+o,a=e[s];return r(a)?IR.middle(t,a):FR(e,t,s,o,r)}},UR=(e,t)=>LR(e,t).bind(t=>{const n=PR(t,"th,td",M);return J(n,t=>vn(e,t)).map(e=>({index:e,all:n}))});var zR=["body","p","div","article","aside","figcaption","figure","footer","header","nav","section","ol","ul","li","table","thead","tbody","tfoot","caption","tr","td","th","h1","h2","h3","h4","h5","h6","blockquote","pre","address"];const jR=(e,t)=>({element:e,offset:t}),$R=(e,t)=>{if(e.property().isText(t))return jR(t,e.property().getText(t).length);{const n=e.property().children(t);return n.length>0?$R(e,n[n.length-1]):jR(t,n.length)}},HR=(e,t,n)=>{const o=e.property().children(t);return o.length>0&&n0&&e.property().isElement(t)&&o.length===n?$R(e,o[o.length-1]):jR(t,n)},VR=HR,qR={up:N({selector:mr,closest:fr,predicate:ir,all:Fn}),down:N({selector:Ar,predicate:Nr}),styles:N({get:$o,getRaw:Vo,set:zo,remove:Wo}),attrs:N({get:wo,set:vo,remove:xo,copyTo:(e,t)=>{const n=ko(e);Co(t,n)}}),insert:N({before:mo,after:uo,afterAll:ho,append:go,appendAll:bo,prepend:fo,wrap:po}),remove:N({unwrap:Ro,remove:Ao}),create:N({nu:un.fromTag,clone:e=>un.fromDom(e.dom.cloneNode(!1)),text:un.fromText}),query:N({comparePosition:(e,t)=>e.dom.compareDocumentPosition(t.dom),prevSibling:zn,nextSibling:jn}),property:N({children:Vn,name:En,parent:Mn,document:e=>Pn(e).dom,isText:Rn,isComment:kn,isElement:An,isSpecial:e=>{const t=En(e);return $(["script","noscript","iframe","noframes","noembed","title","style","textarea","xmp"],t)},getLanguage:e=>An(e)?So(e,"lang"):I.none(),getText:or,setText:rr,isBoundary:e=>!!An(e)&&("body"===En(e)||$(zR,En(e))),isEmptyTag:e=>!!An(e)&&$(["br","img","hr","input"],En(e)),isNonEditable:e=>An(e)&&"false"===wo(e,"contenteditable")}),eq:vn,is:wn},WR=(e,t)=>VR(qR,e,t),KR=Le("image"),YR=Le("event"),GR=e=>t=>{t[YR]=e},XR=GR(0),QR=GR(2),ZR=GR(1),JR=e=>{const t=e;return I.from(t[YR]).exists(e=>0===e)};const eD=Le("mode"),tD=e=>t=>{t[eD]=e},nD=(e,t)=>tD(t)(e),oD=tD(0),rD=tD(2),sD=tD(1),aD=e=>t=>{const n=t;return I.from(n[eD]).exists(t=>t===e)},iD=aD(0),lD=aD(1),cD=["none","copy","link","move"],dD=["none","copy","copyLink","copyMove","link","linkMove","move","all","uninitialized"],mD=()=>{const e=new window.DataTransfer;let t="move",n="all";const o={get dropEffect(){return t},set dropEffect(e){$(cD,e)&&(t=e)},get effectAllowed(){return n},set effectAllowed(e){JR(o)&&$(dD,e)&&(n=e)},get items(){return((e,t)=>({...t,get length(){return t.length},add:(n,o)=>{if(iD(e)){if(!u(n))return t.add(n);if(!y(o))return t.add(n,o)}return null},remove:n=>{iD(e)&&t.remove(n)},clear:()=>{iD(e)&&t.clear()}}))(o,e.items)},get files(){return lD(o)?(()=>{const e=[];return Object.freeze({length:0,item:e=>null,[Symbol.iterator]:()=>e[Symbol.iterator]()})})():e.files},get types(){return e.types},setDragImage:(t,n,r)=>{var s;iD(o)&&(s={image:t,x:n,y:r},o[KR]=s,e.setDragImage(t,n,r))},getData:t=>lD(o)?"":e.getData(t),setData:(t,n)=>{iD(o)&&e.setData(t,n)},clearData:t=>{iD(o)&&e.clearData(t)}};return oD(o),o},uD=(e,t)=>e.setData("text/html",t),fD=(e,t,n,o,r)=>{const s=Ar(un.fromDom(n),"td,th,caption").map(e=>e.dom),a=Y(((e,t)=>ne(t,t=>{const n=((e,t)=>({left:e.left-t,top:e.top-t,right:e.right+-2,bottom:e.bottom+-2,width:e.width+t,height:e.height+t}))(cl(t.getBoundingClientRect()),-1);return[{x:n.left,y:e(n),cell:t},{x:n.right,y:e(n),cell:t}]}))(e,s),e=>t(e,r));return((e,t,n)=>X(e,(e,o)=>e.fold(()=>I.some(o),e=>{const r=Math.sqrt(Math.abs(e.x-t)+Math.abs(e.y-n)),s=Math.sqrt(Math.abs(o.x-t)+Math.abs(o.y-n));return I.some(se.cell)},gD=D(fD,e=>e.bottom,(e,t)=>e.ye.top,(e,t)=>e.y>t),hD=(e,t,n)=>{const o=e(t,n);return(e=>e.breakType===FN.Wrap&&0===e.positions.length)(o)||!ps(n.getNode())&&(e=>e.breakType===FN.Br&&1===e.positions.length)(o)?!((e,t,n)=>n.breakAt.exists(n=>e(t,n).breakAt.isSome()))(e,t,o):o.breakAt.isNone()},bD=D(hD,WN),yD=D(hD,KN),vD=(e,t,n,o)=>{const r=e.selection.getRng(),s=t?1:-1;return!(!Tu()||!((e,t,n)=>{const o=Kl.fromRangeStart(t);return _f(!e,n).exists(e=>e.isEqual(o))})(t,r,n)||(Wk(s,e,n,!t,!1).each(t=>{fA(e,t)}),0))},CD=(e,t,n)=>{const o=((e,t)=>{const n=t.getNode(e);return as(n)?I.some(n):I.none()})(!!t,n),r=!1===t;o.fold(()=>fA(e,n.toRange()),o=>_f(r,e.getBody()).filter(e=>e.isEqual(n)).fold(()=>fA(e,n.toRange()),n=>((e,t,n)=>{t.undoManager.transact(()=>{const o=e?uo:mo,r=cR(t,un.fromDom(n),o);fA(t,r)})})(t,e,o)))},wD=(e,t,n,o)=>{const r=e.selection.getRng(),s=Kl.fromRangeStart(r),a=e.getBody();if(!t&&bD(o,s)){const o=((e,t,n)=>((e,t)=>ce(t.getClientRects()).bind(t=>gD(e,t.left,t.top)).bind(e=>{return qN(Rf(n=e).map(e=>WN(n,e).positions.concat(e)).getOr([]),t);var n}))(t,n).orThunk(()=>ce(n.getClientRects()).bind(n=>VN(YN(e,Kl.before(t)),n.left))).getOr(Kl.before(t)))(a,n,s);return CD(e,t,o),!0}if(t&&yD(o,s)){const o=((e,t,n)=>((e,t)=>de(t.getClientRects()).bind(t=>pD(e,t.left,t.top)).bind(e=>{return qN(Af(n=e).map(e=>[e].concat(KN(n,e).positions)).getOr([]),t);var n}))(t,n).orThunk(()=>ce(n.getClientRects()).bind(n=>VN(GN(e,Kl.after(t)),n.left))).getOr(Kl.after(t)))(a,n,s);return CD(e,t,o),!0}return!1},SD=(e,t,n)=>I.from(e.dom.getParent(e.selection.getNode(),"td,th")).bind(o=>I.from(e.dom.getParent(o,"table")).map(r=>n(e,t,r,o))).getOr(!1),ED=(e,t)=>SD(e,t,vD),xD=(e,t)=>SD(e,t,wD),_D=(e,t,n)=>n.fold(I.none,I.none,(e,t)=>{return(n=t,dr(n,Pr)).map(e=>(e=>{const t=Ur.exact(e,0,e,0);return Hr(t)})(e));var n},n=>!e.mode.isReadOnly()&&kD(n)&&(e=>RD(e)||Un(e).some(e=>Nn(e)&&RD(e)))(n)?(e.execCommand("mceTableInsertRowAfter"),ND(e,t,n)):I.none()),kD=e=>lr(e,On("table")).exists(Sr),ND=(e,t,n)=>{return _D(e,t,(r=RD,UR(o=n,void 0).fold(()=>IR.none(o),e=>FR(e.all,o,e.index,1,r))));var o,r},AD=(e,t,n)=>{return _D(e,t,(r=RD,UR(o=n,void 0).fold(()=>IR.none(),e=>FR(e.all,o,e.index,-1,r))));var o,r},RD=e=>Sr(e)||Dr(e,DD),DD=e=>Nn(e)&&Sr(e),TD=(e,t)=>{const n=["table","li","dl"],o=un.fromDom(e.getBody()),r=e=>{const t=En(e);return vn(e,o)||$(n,t)},s=e.selection.getRng();return((e,t)=>((e,t,n=L)=>n(t)?I.none():$(e,En(t))?I.some(t):mr(t,e.join(","),e=>bn(e,"table")||n(e)))(["td","th"],e,t))(un.fromDom(t?s.endContainer:s.startContainer),r).map(n=>(LR(n,r).each(t=>{e.model.table.clearSelectedCells(t.dom)}),e.selection.collapse(!t),(t?ND:AD)(e,r,n).each(t=>{e.selection.setRng(t)}),!0)).getOr(!1)},OD=(e,t)=>({container:e,offset:t}),BD=gi.DOM,PD=e=>t=>e===t?-1:0,LD=(e,t,n)=>{if(cs(e)&&t>=0)return I.some(OD(e,t));{const o=Pi(BD);return I.from(o.backwards(e,t,PD(e),n)).map(e=>OD(e.container,e.container.data.length))}},MD=(e,t,n)=>{if(!cs(e))return I.none();const o=e.data;if(t>=0&&t<=o.length)return I.some(OD(e,t));{const o=Pi(BD);return I.from(o.backwards(e,t,PD(e),n)).bind(e=>{const o=e.container.data;return MD(e.container,t+o.length,n)})}},ID=(e,t,n)=>{if(!cs(e))return I.none();const o=e.data;if(t<=o.length)return I.some(OD(e,t));{const r=Pi(BD);return I.from(r.forwards(e,t,PD(e),n)).bind(e=>ID(e.container,t-o.length,n))}},FD=(e,t,n,o,r)=>{const s=Pi(e,(e=>t=>e.isBlock(t)||$(["BR","IMG","HR","INPUT"],t.nodeName)||"false"===e.getContentEditable(t))(e));return I.from(s.backwards(t,n,o,r))},UD=e=>""!==e&&-1!==" \xa0\ufeff\f\n\r\t\v".indexOf(e),zD=(e,t)=>e.substring(t.length),jD=(e,t,n,o=!1)=>{if(!(r=t).collapsed||!cs(r.startContainer))return I.none();var r;const s={text:"",offset:0},a=e.getParent(t.startContainer,e.isBlock)||e.getRoot();return FD(e,t.startContainer,t.startOffset,(e,t,r)=>(s.text=r+s.text,s.offset+=t,((e,t,n,o=!1)=>{let r;const s=n.charAt(0);for(r=t-1;r>=0;r--){const a=e.charAt(r);if(!o&&UD(a))return I.none();if(s===a&&Xe(e,n,r,t))break}return I.some(r)})(s.text,s.offset,n,o).getOr(t)),a).bind(e=>{const o=t.cloneRange();if(o.setStart(e.container,e.offset),o.setEnd(t.endContainer,t.endOffset),o.collapsed)return I.none();const r=(e=>Gi(e.toString().replace(/\u00A0/g," ")))(o);return 0!==r.lastIndexOf(n)?I.none():I.some({text:zD(r,n),range:o,trigger:n})})},$D=e=>{if((e=>3===e.nodeType)(e))return OD(e,e.data.length);{const t=e.childNodes;return t.length>0?$D(t[t.length-1]):OD(e,t.length)}},HD=(e,t)=>{const n=e.childNodes;return n.length>0&&t0&&(e=>1===e.nodeType)(e)&&n.length===t?$D(n[n.length-1]):OD(e,t)},VD=(e,t,n,o={})=>{const r=t(),s=e.selection.getRng().startContainer.nodeValue??"",a=Y(r.lookupByTrigger(n.trigger),t=>n.text.length>=t.minChars&&t.matches.getOrThunk(()=>(e=>t=>{const n=HD(t.startContainer,t.startOffset);return!((e,t)=>{const n=e.getParent(t.container,e.isBlock)??e.getRoot();return FD(e,t.container,t.offset,(e,t)=>0===t?-1:t,n).filter(e=>{const t=e.container.data.charAt(e.offset-1);return!UD(t)}).isSome()})(e,n)})(e.dom))(n.range,s,n.text));if(0===a.length)return I.none();const i=Promise.all(V(a,e=>e.fetch(n.text,e.maxResults,o).then(t=>({matchText:n.text,items:t,columns:e.columns,onAction:e.onAction,highlightOn:e.highlightOn}))));return I.some({lookupData:i,context:n})},qD=Hc("type"),WD=Vc("fetch"),KD=Vc("onAction");Wc("name"),Wc("text"),Wc("role"),Wc("icon"),Wc("url"),Wc("tooltip"),Wc("chevronTooltip"),Wc("label"),Wc("shortcut");const YD=Mc([qD,Hc("trigger"),Yc("minChars",1),(e=>jc(e,e,Tc(1),kc()))("columns"),Yc("maxResults",10),qc("matches",Dc),WD,KD,(GD=Rc,Kc("highlightOn",[],Ic(GD)))]);var GD;const XD=e=>{const t=Ke(),n=Ae(!1),o=t.isSet,r=()=>{o()&&((e=>{e.dispatch("AutocompleterEnd")})(e),n.set(!1),t.clear())},s=lt(()=>(e=>{const t=e.ui.registry.getAll().popups,n=be(t,e=>{return(t=e,Uc("Autocompleter",YD,t)).fold(e=>{throw new Error(zc(e))},A);var t}),o=ut(Se(n,e=>e.trigger)),r=Ee(n);return{dataset:n,triggers:o,lookupByTrigger:e=>Y(r,t=>t.trigger===e)}})(e)),a=a=>{(n=>t.get().map(t=>jD(e.dom,e.selection.getRng(),t.trigger,!0).bind(t=>VD(e,s,t,n))).getOrThunk(()=>((e,t)=>{const n=t(),o=e.selection.getRng();return((e,t,n)=>ue(n.triggers,n=>jD(e,t,n)))(e.dom,o,n).bind(n=>VD(e,t,n))})(e,s)))(a).fold(r,r=>{(e=>{o()||t.set({trigger:e.trigger,matchLength:e.text.length})})(r.context),r.lookupData.then(o=>{t.get().map(s=>{const a=r.context;s.trigger===a.trigger&&(t.set({...s,matchLength:a.text.length}),n.get()?(id(e,{range:a.range}),((e,t)=>{e.dispatch("AutocompleterUpdate",t)})(e,{lookupData:o})):(n.set(!0),id(e,{range:a.range}),((e,t)=>{e.dispatch("AutocompleterStart",t)})(e,{lookupData:o})))})})})},i=()=>t.get().bind(({trigger:t})=>{const o=e.selection.getRng();return jD(e.dom,o,t,n.get()).filter(({range:e})=>((e,t)=>{const n=e.compareBoundaryPoints(window.Range.START_TO_START,t),o=e.compareBoundaryPoints(window.Range.END_TO_END,t);return n>=0&&o<=0})(o,e)).map(({range:e})=>e)});e.addCommand("mceAutocompleterReload",(e,t)=>{const n=f(t)?t.fetchOptions:{};a(n)}),e.addCommand("mceAutocompleterClose",r),e.addCommand("mceAutocompleterRefreshActiveRange",()=>{i().each(t=>{id(e,{range:t})})}),e.editorCommands.addQueryStateHandler("mceAutoCompleterInRange",()=>i().isSome()),((e,t)=>{const n=it(t.load,50);e.on("input",t=>{("insertCompositionText"!==t.inputType||e.composing)&&n.throttle()}),e.on("keydown",e=>{const o=e.which;8===o?n.throttle():27===o?(n.cancel(),t.cancelIfNecessary()):38!==o&&40!==o||n.cancel()},!0),e.on("remove",n.cancel)})(e,{cancelIfNecessary:r,load:a})},QD=Xt().browser.isSafari(),ZD=e=>Wi(un.fromDom(e)),JD=(e,t)=>0===e.startOffset&&e.endOffset===t.textContent?.length,eT=(e,t)=>I.from(e.getParent(t.container(),"details")),tT=(e,t)=>eT(e,t).isSome(),nT=(e,t)=>{const n=t.getNode();y(n)||e.selection.setCursorLocation(n,t.offset())},oT=(e,t,n)=>{const o=e.dom.getParent(t.container(),"details");if(o&&!o.open){const t=e.dom.select("summary",o)[0];t&&(n?Af(t):Rf(t)).each(t=>nT(e,t))}else nT(e,t)},rT=(e,t,n)=>{const{dom:o,selection:r}=e,s=e.getBody();if("character"===n){const n=Kl.fromRangeStart(r.getRng()),a=o.getParent(n.container(),o.isBlock),i=eT(o,n),l=a&&o.isEmpty(a),c=h(a?.previousSibling),d=h(a?.nextSibling);return!!(l&&(t?d:c)&&Ef(!t,s,n).exists(e=>tT(o,e)&&!je(i,eT(o,e))))||Ef(t,s,n).fold(L,n=>{const r=eT(o,n);if(tT(o,n)&&!je(i,r)){if(t||oT(e,n,!1),a&&l){if(t&&c)return!0;if(!t&&d)return!0;oT(e,n,t),e.dom.remove(a)}return!0}return!1})}return!1},sT=(e,t,n,o)=>{const r=e.selection.getRng(),s=Kl.fromRangeStart(r),a=e.getBody();return"selection"===o?((e,t)=>{const n=t.startSummary.exists(t=>t.contains(e.startContainer)),o=t.startSummary.exists(t=>t.contains(e.endContainer)),r=t.startDetails.forall(e=>t.endDetails.forall(t=>e!==t));return(n||o)&&!(n&&o)||r})(r,t):n?((e,t)=>t.startSummary.exists(t=>((e,t)=>Rf(t).exists(n=>ps(n.getNode())&&Nf(t,n).exists(t=>t.isEqual(e))||n.isEqual(e)))(e,t)))(s,t)||((e,t,n)=>n.startDetails.exists(n=>kf(e,t).forall(e=>!n.contains(e.container()))))(a,s,t):((e,t)=>t.startSummary.exists(t=>((e,t)=>Af(t).exists(t=>t.isEqual(e)))(e,t)))(s,t)||((e,t)=>t.startDetails.exists(n=>Nf(n,e).forall(n=>t.startSummary.exists(t=>!t.contains(e.container())&&t.contains(n.container())))))(s,t)},aT=(e,t,n)=>((e,t,n)=>((e,t)=>{const n=I.from(e.getParent(t.startContainer,"details")),o=I.from(e.getParent(t.endContainer,"details"));if(n.isSome()||o.isSome()){const t=n.bind(t=>I.from(e.select("summary",t)[0]));return I.some({startSummary:t,startDetails:n,endDetails:o})}return I.none()})(e.dom,e.selection.getRng()).fold(()=>rT(e,t,n),o=>sT(e,o,t,n)||rT(e,t,n)))(e,t,n)||QD&&((e,t,n)=>{const o=e.selection,r=o.getNode(),s=o.getRng(),a=Kl.fromRangeStart(s);return!!Ns(r)&&("selection"===n&&JD(s,r)||my(t,a,r)?ZD(r):e.undoManager.transact(()=>{const s=o.getSel();let{anchorNode:a,anchorOffset:i,focusNode:l,focusOffset:c}=s??{};const d=()=>{C(a)&&C(i)&&C(l)&&C(c)&&s?.setBaseAndExtent(a,i,l,c)},m=(e,t)=>{q(e.childNodes,e=>{ig(e)&&t.appendChild(e)})},u=e.dom.create("span",{"data-mce-bogus":"1"});m(r,u),r.appendChild(u),d(),"word"!==n&&"line"!==n||s?.modify("extend",t?"right":"left",n),!o.isCollapsed()&&JD(o.getRng(),u)?ZD(r):(e.execCommand(t?"ForwardDelete":"Delete"),a=s?.anchorNode,i=s?.anchorOffset,l=s?.focusNode,c=s?.focusOffset,m(u,r),d()),e.dom.remove(u)}),!0)})(e,t,n)?I.some(x):I.none(),iT=Xt(),lT=iT.os,cT=lT.isMacOS()||lT.isiOS(),dT=iT.browser.isFirefox(),mT=(e,t)=>{const n=e.dom,o=e.schema.getMoveCaretBeforeOnEnterElements();if(!t)return;if(ji(un.fromDom(t))){const e=e=>zi(e)?I.from(e):dr(e,zi),o=e=>n.isEmpty(e.dom);(e=>{for(;e;){if(es(e)||cs(e)&&e.data&&/[\r\n\s]/.test(e.data))return I.from(un.fromDom(e));e=e.nextSibling}return I.none()})(t.firstChild).each(t=>{e(t).fold(()=>{if(o(t)){const e=WR(t,0).element;An(e)&&!Mi(e)&&go(e,un.fromHtml('
    '))}},e=>{mo(e,un.fromText(dt))})})}const r=n.createRng();if(t.normalize(),t.hasChildNodes()){const e=new Kr(t,t);let n,s=t;for(;n=e.current();){if(cs(n)){r.setStart(n,0),r.setEnd(n,0);break}if(o[n.nodeName.toLowerCase()]){r.setStartBefore(n),r.setEndBefore(n);break}s=n,n=e.next()}n||(r.setStart(s,0),r.setEnd(s,0))}else ps(t)?t.nextSibling&&n.isBlock(t.nextSibling)?(r.setStartBefore(t),r.setEndBefore(t)):(r.setStartAfter(t),r.setEndAfter(t)):(r.setStart(t,0),r.setEnd(t,0));e.selection.setRng(r),fh(e,r)},uT=(e,t)=>{const n=e.getRoot();let o,r=t;for(;r!==n&&r&&"false"!==e.getContentEditable(r);){if("true"===e.getContentEditable(r)){o=r;break}r=r.parentNode}return r!==n?o:n},fT=e=>I.from(e.dom.getParent(e.selection.getStart(!0),e.dom.isBlock)),gT=e=>{e.innerHTML='
    '},pT=(e,t)=>{Ed(e).toLowerCase()===t.tagName.toLowerCase()&&((e,t,n)=>{const o=e.dom;I.from(n.style).map(o.parseStyle).each(e=>{const n={...qo(un.fromDom(t)),...e};o.setStyles(t,n)});const r=I.from(n.class).map(e=>e.split(/\s+/)),s=I.from(t.className).map(e=>Y(e.split(/\s+/),e=>""!==e));$e(r,s,(e,n)=>{const r=Y(n,t=>!$(e,t)),s=[...e,...r];o.setAttrib(t,"class",s.join(" "))});const a=["style","class"],i=we(n,(e,t)=>!$(a,t));o.setAttribs(t,i)})(e,t,xd(e))},hT=(e,t,n,o,r=!0,s,a)=>{const i=e.dom,l=e.schema,c=Ed(e),d=n?n.nodeName.toUpperCase():"";let m=t;const u=l.getTextInlineElements();let f;f=s||"TABLE"===d||"HR"===d?i.create(s||c,a||{}):n.cloneNode(!1);let g=f;if(r){do{if(u[m.nodeName]){if(Tf(m)||Vf(m))continue;const e=m.cloneNode(!1);i.setAttrib(e,"id",""),f.hasChildNodes()?(e.appendChild(f.firstChild),f.appendChild(e)):(g=e,f.appendChild(e))}}while((m=m.parentNode)&&m!==o);"LI"!==f.nodeName&&((e,t)=>{const n=un.fromDom(e),o=un.fromDom(t),r=On("span"),s=D(vn,n),a=e=>An(e)&&Vo(e,"font-size").isSome(),i=[...a(o)?[o]:[],..._r(o,a,s)];q(i.slice(1),e=>{Wo(e,"font-size"),xo(e,"data-mce-style"),r(e)&&_o(e)&&Ro(e)})})(f,g)}else i.setAttrib(f,"style",null),i.setAttrib(f,"class",null);return pT(e,f),gT(g),f},bT=(e,t)=>{const n=e?.parentNode;return C(n)&&n.nodeName===t},yT=e=>C(e)&&/^(OL|UL|LI)$/.test(e.nodeName),vT=e=>C(e)&&/^(LI|DT|DD)$/.test(e.nodeName),CT=e=>{const t=e.parentNode;return vT(t)?t:e},wT=(e,t,n)=>{let o=e[n?"firstChild":"lastChild"];for(;o&&!es(o);)o=o[n?"nextSibling":"previousSibling"];return o===t},ST=e=>X(Se(qo(un.fromDom(e)),(e,t)=>`${t}: ${e};`),(e,t)=>e+t,""),ET=(e,t)=>t&&"A"===t.nodeName&&e.isEmpty(t),xT=(e,t)=>e.nodeName===t||e.previousSibling&&e.previousSibling.nodeName===t,_T=(e,t)=>C(t)&&e.isBlock(t)&&!/^(TD|TH|CAPTION|FORM)$/.test(t.nodeName)&&!/^(fixed|absolute)/i.test(t.style.position)&&e.isEditable(t.parentNode)&&"false"!==e.getContentEditable(t),kT=(e,t,n)=>cs(t)?e?1===n&&t.data.charAt(n-1)===Ki?0:n:n===t.data.length-1&&t.data.charAt(n)===Ki?t.data.length:n:n,NT={insert:(e,t)=>{let n,o,r,s,a=!1;const i=e.dom,l=e.schema.getNonEmptyElements(),c=e.selection.getRng(),d=Ed(e),m=un.fromDom(c.startContainer),f=qn(m,c.startOffset),g=f.exists(e=>Nn(e)&&!Sr(e)),p=c.collapsed&&g,b=(t,o)=>hT(e,n,_,x,Ad(e),t,o),y=e=>{const t=kT(e,n,o);if(cs(n)&&(e?t>0:t"BR"===e.nodeName||e.nextSibling&&"BR"===e.nextSibling.nodeName)(n)?!e:a&&!e||!a&&e;const r=new Kr(n,_);let s;for(cs(n)&&(e&&0===t?r.prev():e||t!==n.data.length||r.next());s=r.current();){if(es(s)){if(!s.getAttribute("data-mce-bogus")){const e=s.nodeName.toLowerCase();if(l[e]&&"br"!==e)return!1}}else if(cs(s)&&!Gr(s.data))return!1;e?r.prev():r.next()}return!0},w=()=>{let t;return t=/^(H[1-6]|PRE|FIGURE)$/.test(r)&&"HGROUP"!==k?b(d):b(),((e,t)=>{const n=Rd(e);return!v(t)&&(u(n)?$(dn.explode(n),t.nodeName.toLowerCase()):n)})(e,s)&&_T(i,s)&&i.isEmpty(_,void 0,{includeZwsp:!0})?t=i.split(s,_):i.insertAfter(t,_),mT(e,t),t};Wp(i,c).each(e=>{c.setStart(e.startContainer,e.startOffset),c.setEnd(e.endContainer,e.endOffset)}),n=c.startContainer,o=c.startOffset;const S=!(!t||!t.shiftKey),E=!(!t||!t.ctrlKey);es(n)&&n.hasChildNodes()&&!p&&(a=o>n.childNodes.length-1,n=n.childNodes[Math.min(o,n.childNodes.length-1)]||n,o=a&&cs(n)?n.data.length:0);const x=uT(i,n);if(!x||((e,t)=>{const n=e.dom.getParent(t,"ol,ul,dl");return null!==n&&"false"===e.dom.getContentEditableParent(n)})(e,n))return;S||(n=((e,t,n,o,r)=>{const s=e.dom,a=uT(s,o)??s.getRoot();let i=s.getParent(o,s.isBlock);if(!i||!_T(s,i)){if(i=i||a,!i.hasChildNodes()){const o=s.create(t);return pT(e,o),i.appendChild(o),n.setStart(o,0),n.setEnd(o,0),o}let l,c=o;for(;c&&c.parentNode!==i;)c=c.parentNode;for(;c&&!s.isBlock(c);)l=c,c=c.previousSibling;const d=l?.parentElement?.nodeName;if(l&&d&&e.schema.isValidChild(d,t.toLowerCase())){const a=l.parentNode,i=s.create(t);for(pT(e,i),a.insertBefore(i,l),c=l;c&&!s.isBlock(c);){const e=c.nextSibling;i.appendChild(c),c=e}n.setStart(o,r),n.setEnd(o,r)}}return o})(e,d,c,n,o));let _=i.getParent(n,i.isBlock)||i.getRoot();s=C(_?.parentNode)?i.getParent(_.parentNode,i.isBlock):null,r=_?_.nodeName.toUpperCase():"";const k=s?s.nodeName.toUpperCase():"";if("LI"!==k||E||(_=s,s=s.parentNode,r=k),es(s)&&((e,t,n)=>!t&&n.nodeName.toLowerCase()===Ed(e)&&e.dom.isEmpty(n)&&((e,t,n)=>{let o=t;for(;o&&o!==e&&h(o.nextSibling);){const e=o.parentElement;if(!e||!n(e))return ks(e);o=e}return!1})(e.getBody(),n,t=>_e(e.schema.getTextBlockElements(),t.nodeName.toLowerCase())))(e,S,_))return((e,t,n)=>{const o=t(Ed(e)),r=((e,t)=>e.dom.getParent(t,ks))(e,n);r&&(e.dom.insertAfter(o,r),mT(e,o),(n.parentElement?.childNodes?.length??0)>1&&e.dom.remove(n))})(e,b,_);if(/^(LI|DT|DD)$/.test(r)&&es(s)&&i.isEmpty(_))return void((e,t,n,o,r)=>{const s=e.dom,a=e.selection.getRng(),i=n.parentNode;if(n===e.getBody()||!i)return;var l;yT(l=n)&&yT(l.parentNode)&&(r="LI");const c=vT(o)?ST(o):void 0;let d=vT(o)&&c?t(r,{style:ST(o)}):t(r);if(wT(n,o,!0)&&wT(n,o,!1))if(bT(n,"LI")){const e=CT(n);s.insertAfter(d,e),(e=>e.parentNode?.firstChild===e)(n)?s.remove(e):s.remove(n)}else s.replace(d,n);else if(wT(n,o,!0))bT(n,"LI")?(s.insertAfter(d,CT(n)),d.appendChild(s.doc.createTextNode(" ")),d.appendChild(n)):i.insertBefore(d,n),s.remove(o);else if(wT(n,o,!1))s.insertAfter(d,CT(n)),s.remove(o);else{n=CT(n);const e=a.cloneRange();e.setStartAfter(o),e.setEndAfter(n);const t=e.extractContents();if("LI"===r&&(e=>e.firstChild&&"LI"===e.firstChild.nodeName)(t)){const e=Y(V(d.children,un.fromDom),T(On("br")));d=t.firstChild,s.insertAfter(t,n),q(e,e=>fo(un.fromDom(d),e)),c&&d.setAttribute("style",c)}else s.insertAfter(t,n),s.insertAfter(d,n);s.remove(o)}mT(e,d)})(e,b,s,_,d);if(!(p||_!==e.getBody()&&_T(i,_)))return;const N=_.parentNode;let A;if(p)A=b(d),f.fold(()=>{go(m,un.fromDom(A))},e=>{mo(e,un.fromDom(A))}),e.selection.setCursorLocation(A,0);else if(Zi(_))A=al(_),i.isEmpty(_)&&gT(_),pT(e,A),mT(e,A);else if(y(!1))A=w();else if(y(!0)&&N){const t=Kl.fromRangeStart(c),n=ib(t),o=un.fromDom(_),r=Eb(o,t,e.schema)?xb(o,t,e.schema).bind(e=>I.from(e.getNode())):I.none();A=N.insertBefore(b(),_);const s=xT(_,"HR")||n?A:r.getOr(_);mT(e,s)}else{const t=(e=>{const t=e.cloneRange();return t.setStart(e.startContainer,kT(!0,e.startContainer,e.startOffset)),t.setEnd(e.endContainer,kT(!1,e.endContainer,e.endOffset)),t})(c).cloneRange();t.setEndAfter(_);const n=t.extractContents();(e=>{q(Nr(un.fromDom(e),Rn),e=>{const t=e.dom;t.nodeValue=Gi(t.data)})})(n),(e=>{let t=e;do{cs(t)&&(t.data=t.data.replace(/^[\r\n]+/,"")),t=t.firstChild}while(t)})(n),A=n.firstChild,_===A?C(N)&&i.insertAfter(n,N):i.insertAfter(n,_),(e=>{const t=Wn(e).bind(jn);return ji(e)&&t.exists(zi)})(un.fromDom(A))?(e=>{const t=WR(un.fromDom(e),0).element;Rn(t)&&i.isEmpty(t.dom)&&t.dom.remove()})(A):(((e,t,n)=>{const o=[];if(!n)return;let r=n;for(;r=r.firstChild;){if(e.isBlock(r))return;es(r)&&!t[r.nodeName.toLowerCase()]&&o.push(r)}let s=o.length;for(;s--;)r=o[s],(!r.hasChildNodes()||r.firstChild===r.lastChild&&""===r.firstChild?.nodeValue||ET(e,r))&&e.remove(r)})(i,l,A),((e,t)=>{t.normalize();const n=t.lastChild;(!n||es(n)&&/^(left|right)$/gi.test(e.getStyle(n,"float",!0)))&&e.add(t,"br")})(i,_)),i.isEmpty(_)&&gT(_),A.normalize(),i.isEmpty(A)?(i.remove(A),w()):(pT(e,A),mT(e,A))}i.setAttrib(A,"id",""),e.dispatch("NewBlock",{newBlock:A})},fakeEventName:"insertParagraph"},AT=(e,t,n)=>{const o=e.dom.createRng();n?(o.setStartBefore(t),o.setEndBefore(t)):(o.setStartAfter(t),o.setEndAfter(t)),e.selection.setRng(o),fh(e,o)},RT=(e,t)=>{const n=un.fromTag("br");mo(un.fromDom(t),n),e.undoManager.add()},DT=(e,t)=>{TT(e.getBody(),t)||uo(un.fromDom(t),un.fromTag("br"));const n=un.fromTag("br");uo(un.fromDom(t),n),AT(e,n.dom,!1),e.undoManager.add()},TT=(e,t)=>{return n=Kl.after(t),!!ps(n.getNode())||kf(e,Kl.after(t)).map(e=>ps(e.getNode())).getOr(!1);var n},OT=e=>e&&"A"===e.nodeName&&"href"in e,BT=e=>e.fold(L,OT,OT,L),PT=(e,t)=>{t.fold(x,D(RT,e),D(DT,e),x)},LT={insert:(e,t)=>{const n=(e=>{const t=D(Jb,e),n=Kl.fromRangeStart(e.selection.getRng());return RN(t,e.getBody(),n).filter(BT)})(e);n.isSome()?n.each(D(PT,e)):((e,t)=>{const n=e.selection,o=e.dom,r=n.getRng();let s,a=!1;Wp(o,r).each(e=>{r.setStart(e.startContainer,e.startOffset),r.setEnd(e.endContainer,e.endOffset)});let i=r.startOffset,l=r.startContainer;if(es(l)&&l.hasChildNodes()){const e=i>l.childNodes.length-1;l=l.childNodes[Math.min(i,l.childNodes.length-1)]||l,i=e&&cs(l)?l.data.length:0}let c=o.getParent(l,o.isBlock);const d=c&&c.parentNode?o.getParent(c.parentNode,o.isBlock):null,m=d?d.nodeName.toUpperCase():"",u=!(!t||!t.ctrlKey);"LI"!==m||u||(c=d),cs(l)&&i>=l.data.length&&(((e,t,n)=>{const o=new Kr(t,n);let r;const s=e.getNonEmptyElements();for(;r=o.next();)if(s[r.nodeName.toLowerCase()]||cs(r)&&r.length>0)return!0;return!1})(e.schema,l,c||o.getRoot())||(s=o.create("br"),r.insertNode(s),r.setStartAfter(s),r.setEndAfter(s),a=!0)),s=o.create("br"),Gl(o,r,s),AT(e,s,a),e.undoManager.add()})(e,t)},fakeEventName:"insertLineBreak"},MT=(e,t)=>fT(e).filter(e=>t.length>0&&bn(un.fromDom(e),t)).isSome(),IT=Ne([{br:[]},{block:[]},{none:[]}]),FT=(e,t)=>(e=>MT(e,Nd(e)))(e),UT=e=>(t,n)=>(e=>fT(e).filter(e=>ji(un.fromDom(e))).isSome())(t)===e,zT=(e,t)=>(n,o)=>{const r=(e=>fT(e).fold(N(""),e=>e.nodeName.toUpperCase()))(n)===e.toUpperCase();return r===t},jT=e=>{const t=uT(e.dom,e.selection.getStart());return v(t)},$T=e=>zT("pre",e),HT=e=>(t,n)=>Sd(t)===e,VT=(e,t)=>(e=>MT(e,kd(e)))(e),qT=(e,t)=>t,WT=e=>{const t=Ed(e),n=uT(e.dom,e.selection.getStart());return C(n)&&e.schema.isValidChild(n.nodeName,t)},KT=e=>{const t=e.selection.getRng(),n=un.fromDom(t.startContainer),o=qn(n,t.startOffset).map(e=>Nn(e)&&!Sr(e));return t.collapsed&&o.getOr(!0)},YT=(e,t)=>(n,o)=>X(e,(e,t)=>e&&t(n,o),!0)?I.some(t):I.none(),GT=(e,t,n)=>{if(!t.mode.isReadOnly()){if(t.selection.isCollapsed()||(e=>{e.execCommand("delete")})(t),C(n)&&i_(t,e.fakeEventName).isDefaultPrevented())return;e.insert(t,n),C(n)&&a_(t,e.fakeEventName)}},XT=(e,t)=>{if(e.mode.isReadOnly())return;const n=()=>GT(LT,e,t),o=()=>GT(NT,e,t),r=((e,t)=>vN([YT([FT],IT.none()),YT([$T(!0),jT],IT.none()),YT([zT("summary",!0)],IT.br()),YT([$T(!0),HT(!1),qT],IT.br()),YT([$T(!0),HT(!1)],IT.block()),YT([$T(!0),HT(!0),qT],IT.block()),YT([$T(!0),HT(!0)],IT.br()),YT([UT(!0),qT],IT.br()),YT([UT(!0)],IT.block()),YT([VT],IT.br()),YT([qT],IT.br()),YT([WT],IT.block()),YT([KT],IT.block())],[e,!(!t||!t.shiftKey)]).getOr(IT.none()))(e,t);switch(_d(e)){case"linebreak":r.fold(n,n,x);break;case"block":r.fold(o,o,x);break;case"invert":r.fold(o,n,x);break;default:r.fold(n,o,x)}},QT=Xt(),ZT=QT.os.isiOS()&&QT.browser.isSafari(),JT=(e,t)=>{var n;t.isDefaultPrevented()||(t.preventDefault(),(n=e.undoManager).typing&&(n.typing=!1,n.add()),e.undoManager.transact(()=>{XT(e,t)}))},eO=Xt(),tO=e=>e.stopImmediatePropagation(),nO=e=>e.keyCode===Tp.PAGE_UP||e.keyCode===Tp.PAGE_DOWN,oO=(e,t,n)=>{n&&!e.get()?t.on("NodeChange",tO,!0):!n&&e.get()&&t.off("NodeChange",tO),e.set(n)},rO=(e,t)=>e===t||e.contains(t),sO=(e,t)=>{const n=t.container(),o=t.offset();return cs(n)?(n.insertData(o,e),I.some(Kl(n,o+e.length))):rf(t).map(n=>{const o=un.fromText(e);return t.isAtEnd()?uo(n,o):mo(n,o),Kl(o.dom,e.length)})},aO=D(sO,dt),iO=D(sO," "),lO=e=>t=>{e.selection.setRng(t.toRange()),e.nodeChanged()},cO=e=>{const t=Kl.fromRangeStart(e.selection.getRng()),n=un.fromDom(e.getBody());if(e.selection.isCollapsed()){const o=D(Jb,e),r=Kl.fromRangeStart(e.selection.getRng());return RN(o,e.getBody(),r).bind((e=>t=>t.fold(t=>Nf(e.dom,Kl.before(t)),e=>Af(e),e=>Rf(e),t=>kf(e.dom,Kl.after(t))))(n)).map(o=>()=>((e,t,n)=>o=>Ob(e,o,n)?aO(t):iO(t))(n,t,e.schema)(o).each(lO(e)))}return I.none()},dO=e=>{return He(sn.browser.isFirefox()&&e.selection.isEditable()&&(t=e.dom,n=e.selection.getRng().startContainer,t.isEditable(t.getParent(n,"summary"))),()=>{const t=un.fromDom(e.getBody());e.selection.isCollapsed()||e.getDoc().execCommand("Delete"),((e,t,n)=>Ob(e,t,n)?aO(t):iO(t))(t,Kl.fromRangeStart(e.selection.getRng()),e.schema).each(lO(e))});var t,n},mO=e=>su(e)?[{keyCode:Tp.TAB,action:AR(TD,e,!0)},{keyCode:Tp.TAB,shiftKey:!0,action:AR(TD,e,!1)}]:[],uO=e=>{if(e.addShortcut("Meta+P","","mcePrint"),XD(e),BE(e))return Ae(null);{const t=NA(e);return(e=>{e.on("beforeinput",t=>{e.selection.isEditable()&&!H(t.getTargetRanges(),t=>!((e,t)=>!rO(e.getBody(),t.startContainer)||!rO(e.getBody(),t.endContainer)||gh(e.dom,t))(e,t))||t.preventDefault()})})(e),(e=>{e.on("keyup compositionstart",D(gR,e))})(e),((e,t)=>{e.on("keydown",n=>{n.isDefaultPrevented()||((e,t,n)=>{const o=sn.os.isMacOS()||sn.os.isiOS(),r=sn.browser.isFirefox();RR([{keyCode:Tp.RIGHT,action:AR(bR,e,!0)},{keyCode:Tp.LEFT,action:AR(bR,e,!1)},{keyCode:Tp.UP,action:AR(yR,e,!1)},{keyCode:Tp.DOWN,action:AR(yR,e,!0)},...o?[{keyCode:Tp.UP,action:AR(CR,e,!1),metaKey:!0,shiftKey:!0},{keyCode:Tp.DOWN,action:AR(CR,e,!0),metaKey:!0,shiftKey:!0}]:[],{keyCode:Tp.RIGHT,action:AR(ED,e,!0)},{keyCode:Tp.LEFT,action:AR(ED,e,!1)},{keyCode:Tp.UP,action:AR(xD,e,!1)},{keyCode:Tp.DOWN,action:AR(xD,e,!0)},{keyCode:Tp.UP,action:AR(xD,e,!1)},{keyCode:Tp.UP,action:AR(_R,e,!1)},{keyCode:Tp.DOWN,action:AR(_R,e,!0)},{keyCode:Tp.RIGHT,action:AR(TR,e,!0)},{keyCode:Tp.LEFT,action:AR(TR,e,!1)},{keyCode:Tp.UP,action:AR(OR,e,!1)},{keyCode:Tp.DOWN,action:AR(OR,e,!0)},{keyCode:Tp.RIGHT,action:AR(_A,e,t,!0)},{keyCode:Tp.LEFT,action:AR(_A,e,t,!1)},{keyCode:Tp.RIGHT,ctrlKey:!o,altKey:o,action:AR(AA,e,t)},{keyCode:Tp.LEFT,ctrlKey:!o,altKey:o,action:AR(RA,e,t)},{keyCode:Tp.UP,action:AR(xR,e,!1)},{keyCode:Tp.DOWN,action:AR(xR,e,!0)},...r?[{keyCode:Tp.UP,action:AR(SR,e,!1)},{keyCode:Tp.DOWN,action:AR(SR,e,!0)}]:[]],n).each(e=>{n.preventDefault()})})(e,t,n)})})(e,t),((e,t)=>{let n=!1,o=[];e.on("init",()=>{e.on("keydown",r=>{n=r.keyCode===Tp.BACKSPACE,o=IA(e),r.isDefaultPrevented()||((e,t,n)=>{const o=n.keyCode===Tp.BACKSPACE?"deleteContentBackward":"deleteContentForward",r=e.selection.isCollapsed(),s=r?"character":"selection",a=e=>r?e?"word":"line":"selection";DR([{keyCode:Tp.BACKSPACE,action:AR(eR,e)},{keyCode:Tp.BACKSPACE,action:AR(aN,e,!1)},{keyCode:Tp.DELETE,action:AR(aN,e,!0)},{keyCode:Tp.BACKSPACE,action:AR(Zk,e,!1)},{keyCode:Tp.DELETE,action:AR(Zk,e,!0)},{keyCode:Tp.BACKSPACE,action:AR(BA,e,t,!1)},{keyCode:Tp.DELETE,action:AR(BA,e,t,!0)},{keyCode:Tp.BACKSPACE,action:AR(Uy,e,!1)},{keyCode:Tp.DELETE,action:AR(Uy,e,!0)},{keyCode:Tp.BACKSPACE,action:AR(aT,e,!1,s)},{keyCode:Tp.DELETE,action:AR(aT,e,!0,s)},...cT?[{keyCode:Tp.BACKSPACE,altKey:!0,action:AR(aT,e,!1,a(!0))},{keyCode:Tp.DELETE,altKey:!0,action:AR(aT,e,!0,a(!0))},{keyCode:Tp.BACKSPACE,metaKey:!0,action:AR(aT,e,!1,a(!1))}]:[{keyCode:Tp.BACKSPACE,ctrlKey:!0,action:AR(aT,e,!1,a(!0))},{keyCode:Tp.DELETE,ctrlKey:!0,action:AR(aT,e,!0,a(!0))}],{keyCode:Tp.BACKSPACE,action:AR(lN,e,!1)},{keyCode:Tp.DELETE,action:AR(lN,e,!0)},{keyCode:Tp.BACKSPACE,action:AR(WA,e,!1)},{keyCode:Tp.DELETE,action:AR(WA,e,!0)},{keyCode:Tp.BACKSPACE,action:AR(qk,e,!1)},{keyCode:Tp.DELETE,action:AR(qk,e,!0)},{keyCode:Tp.BACKSPACE,action:AR($k,e,!1)},{keyCode:Tp.DELETE,action:AR($k,e,!0)},{keyCode:Tp.BACKSPACE,action:AR(HA,e,!1)},{keyCode:Tp.DELETE,action:AR(HA,e,!0)},{keyCode:Tp.BACKSPACE,action:AR(iN,e,!1)},{keyCode:Tp.DELETE,action:AR(iN,e,!0)},{keyCode:Tp.BACKSPACE,action:AR(tR,e,!1)},{keyCode:Tp.DELETE,action:AR(tR,e,!0)}],n).filter(t=>e.selection.isEditable()).each(t=>{n.preventDefault(),i_(e,o).isDefaultPrevented()||(t(),a_(e,o))})})(e,t,r)}),e.on("keyup",t=>{t.isDefaultPrevented()||(((e,t,n,o)=>{RR([{keyCode:Tp.BACKSPACE,action:AR(sN,e)},{keyCode:Tp.DELETE,action:AR(sN,e)},...cT?[{keyCode:Tp.BACKSPACE,altKey:!0,action:AR(VA,e)},{keyCode:Tp.DELETE,altKey:!0,action:AR(VA,e)},...n?[{keyCode:dT?224:91,action:AR(()=>(zA(e,o),VA(e)))}]:[]]:[{keyCode:Tp.BACKSPACE,ctrlKey:!0,action:AR(VA,e)},{keyCode:Tp.DELETE,ctrlKey:!0,action:AR(VA,e)}]],t)})(e,t,n,o),o.length=0),n=!1})})})(e,t),(e=>{let t=I.none();e.on("keydown",n=>{n.keyCode===Tp.ENTER&&(ZT&&(e=>{if(!e.collapsed)return!1;const t=e.startContainer;if(cs(t)){const n=/^[\uAC00-\uD7AF\u1100-\u11FF\u3130-\u318F\uA960-\uA97F\uD7B0-\uD7FF]$/,o=t.data.charAt(e.startOffset-1);return n.test(o)}return!1})(e.selection.getRng())?(e=>{t=I.some(e.selection.getBookmark()),e.undoManager.add()})(e):JT(e,n))}),e.on("keyup",n=>{n.keyCode===Tp.ENTER&&t.each(()=>((e,n)=>{e.undoManager.undo(),t.fold(x,t=>e.selection.moveToBookmark(t)),JT(e,n),t=I.none()})(e,n))})})(e),(e=>{e.on("keydown",t=>{t.isDefaultPrevented()||((e,t)=>{DR([{keyCode:Tp.SPACEBAR,action:AR(cO,e)},{keyCode:Tp.SPACEBAR,action:AR(dO,e)}],t).each(n=>{t.preventDefault(),i_(e,"insertText",{data:" "}).isDefaultPrevented()||(n(),a_(e,"insertText",{data:" "}))})})(e,t)})})(e),(e=>{e.on("input",t=>{t.isComposing||(e=>{const t=un.fromDom(e.getBody());e.selection.isCollapsed()&&zb(t,Kl.fromRangeStart(e.selection.getRng()),e.schema).each(t=>{e.selection.setRng(t.toRange())})})(e)})})(e),(e=>{e.on("keydown",t=>{t.isDefaultPrevented()||((e,t)=>{RR([...mO(e)],t).each(e=>{t.preventDefault()})})(e,t)})})(e),((e,t)=>{e.on("keydown",n=>{n.isDefaultPrevented()||((e,t,n)=>{const o=sn.os.isMacOS()||sn.os.isiOS();RR([{keyCode:Tp.END,action:AR(vR,e,!0)},{keyCode:Tp.HOME,action:AR(vR,e,!1)},...o?[]:[{keyCode:Tp.HOME,action:AR(CR,e,!1),ctrlKey:!0,shiftKey:!0},{keyCode:Tp.END,action:AR(CR,e,!0),ctrlKey:!0,shiftKey:!0}],{keyCode:Tp.END,action:AR(BR,e,!0)},{keyCode:Tp.HOME,action:AR(BR,e,!1)},{keyCode:Tp.END,action:AR(DA,e,!0,t)},{keyCode:Tp.HOME,action:AR(DA,e,!1,t)}],n).each(e=>{n.preventDefault()})})(e,t,n)})})(e,t),((e,t)=>{if(eO.os.isMacOS())return;const n=Ae(!1);e.on("keydown",t=>{nO(t)&&oO(n,e,!0)}),e.on("keyup",o=>{o.isDefaultPrevented()||((e,t,n)=>{RR([{keyCode:Tp.PAGE_UP,action:AR(DA,e,!1,t)},{keyCode:Tp.PAGE_DOWN,action:AR(DA,e,!0,t)}],n)})(e,t,o),nO(o)&&n.get()&&(oO(n,e,!1),e.nodeChanged())})})(e,t),t}},fO=(e,t)=>()=>{const n=O_(e);return C(n)&&n.nodeName===t},gO=e=>3===e.type,pO=e=>0===e.length,hO=e=>{const t=(t,n)=>{const o=xh.create("li");q(t,e=>o.append(e)),n?e.insert(o,n,!0):e.append(o)},n=X(e.children(),(e,n)=>gO(n)?[...e,n]:pO(e)||gO(n)?e:(t(e,n),[]),[]);pO(n)||t(n)},bO=e=>{(e=>{e.on("init",()=>{e.on("keydown",t=>{t.defaultPrevented||(t.keyCode===Tp.BACKSPACE?Tk(e,!1)&&t.preventDefault():t.keyCode===Tp.DELETE&&Tk(e,!0)&&t.preventDefault())})})})(e),(e=>{e.addCommand("InsertUnorderedList",(t,n)=>{xk(e,"UL",n)}),e.addCommand("InsertOrderedList",(t,n)=>{xk(e,"OL",n)}),e.addCommand("InsertDefinitionList",(t,n)=>{xk(e,"DL",n)}),e.addCommand("RemoveList",()=>{uk(e)}),e.addCommand("mceListUpdate",(t,n)=>{f(n)&&((e,t)=>{const n=O_(e);null===n||z_(e,n)||e.undoManager.transact(()=>{f(t.styles)&&e.dom.setStyles(n,t.styles),f(t.attrs)&&he(t.attrs,(t,o)=>e.dom.setAttrib(n,o,t))})})(e,n)}),e.addCommand("mceListBackspaceDelete",(t,n)=>{Tk(e,n)}),e.addQueryStateHandler("InsertUnorderedList",fO(e,"UL")),e.addQueryStateHandler("InsertOrderedList",fO(e,"OL")),e.addQueryStateHandler("InsertDefinitionList",fO(e,"DL"))})(e),(e=>{e.on("PreInit",()=>{const{parser:t}=e;t.addNodeFilter("ul,ol",e=>q(e,hO))})})(e),(e=>{hu(e)&&(e=>{e.on("keydown",t=>{t.keyCode!==Tp.TAB||Tp.metaKeyPressed(t)||e.undoManager.transact(()=>{(t.shiftKey?mk(e):dk(e))&&t.preventDefault()})})})(e)})(e)};class yO{editor;lastPath=[];constructor(e){let t;this.editor=e;const n=this;"onselectionchange"in e.getDoc()||e.on("NodeChange click mouseup keyup focus",n=>{const o=e.selection.getRng(),r={startContainer:o.startContainer,startOffset:o.startOffset,endContainer:o.endContainer,endOffset:o.endOffset};"nodechange"!==n.type&&Up(r,t)||e.dispatch("SelectionChange"),t=r}),e.on("contextmenu",()=>{pp(e),e.dispatch("SelectionChange")}),e.on("SelectionChange",()=>{const t=e.selection.getStart(!0);t&&og(e)&&!n.isSameElementPath(t)&&e.dom.isChildOf(t,e.getBody())&&e.nodeChanged({selectionChange:!0})}),e.on("mouseup",t=>{!t.isDefaultPrevented()&&og(e)&&("IMG"===e.selection.getNode().nodeName?yp.setEditorTimeout(e,()=>{e.nodeChanged()}):e.nodeChanged())})}nodeChanged(e={}){const t=this.editor,n=t.selection;let o;if(t.initialized&&n&&!vm(t)&&!fu(t)){const r=t.getBody();o=n.getStart(!0)||r,o.ownerDocument===t.getDoc()&&t.dom.isChildOf(o,r)||(o=r);const s=[];t.dom.getParent(o,e=>e===r||(s.push(e),!1)),t.dispatch("NodeChange",{...e,element:o,parents:s})}}isSameElementPath(e){let t;const n=this.editor,o=re(n.dom.getParents(e,M,n.getBody()));if(o.length===this.lastPath.length){for(t=o.length;t>=0&&o[t]===this.lastPath[t];t--);if(-1===t)return this.lastPath=o,!0}return this.lastPath=o,!1}}const vO="x-tinymce/html",CO=N(vO),wO="\x3c!-- "+vO+" --\x3e",SO=e=>wO+e,EO=e=>-1!==e.indexOf(wO),xO="%MCEPASTEBIN%",_O=e=>e.dom.get("mcepastebin"),kO=e=>C(e)&&"mcepastebin"===e.id,NO=e=>e===xO,AO=(e,t)=>(dn.each(t,t=>{e=m(t,RegExp)?e.replace(t,""):e.replace(t[0],t[1])}),e),RO=e=>AO(e,[/^[\s\S]*]*>\s*|\s*<\/body[^>]*>[\s\S]*$/gi,/|/g,[/( ?)\u00a0<\/span>( ?)/g,(e,t,n)=>t||n?dt:" "],/
    /g,/
    $/i]),DO=(e,t)=>({content:e,cancelled:t}),TO=(e,t)=>(e.insertContent(t,{merge:Hm(e),paste:!0}),!0),OO=e=>/^https?:\/\/[\w\-\/+=.,!;:&%@^~(){}?#]+$/i.test(e),BO=(e,t,n)=>!(e.selection.isCollapsed()||!OO(t))&&((e,t,n)=>(e.undoManager.extra(()=>{n(e,t)},()=>{e.execCommand("mceInsertLink",!1,t)}),!0))(e,t,n),PO=(e,t,n)=>!!((e,t)=>OO(t)&&H(ru(e),e=>Ze(t.toLowerCase(),`.${e.toLowerCase()}`)))(e,t)&&((e,t,n)=>(e.undoManager.extra(()=>{n(e,t)},()=>{e.insertContent('')}),!0))(e,t,n),LO=(()=>{let e=0;return()=>"mceclip"+e++})(),MO=e=>{const t=mD();return uD(t,e),rD(t),t},IO=(e,t,n,o,r)=>{const s=((e,t,n)=>((e,t,n)=>{const o=((e,t,n)=>e.dispatch("PastePreProcess",{content:t,internal:n}))(e,t,n),r=((e,t)=>{const n=pS({sanitize:nu(e),sandbox_iframes:lu(e),sandbox_iframes_exclusions:cu(e),convert_unsafe_embeds:du(e)},e.schema);n.addNodeFilter("meta",e=>{dn.each(e,e=>{e.remove()})});const o=n.parse(t,{forced_root_block:!1,isRootContent:!0});return Hh({validate:!0},e.schema).serialize(o)})(e,o.content);return e.hasEventListeners("PastePostProcess")&&!o.isDefaultPrevented()?((e,t,n)=>{const o=e.dom.create("div",{style:"display:none"},t),r=((e,t,n)=>e.dispatch("PastePostProcess",{node:t,internal:n}))(e,o,n);return DO(r.node.innerHTML,r.isDefaultPrevented())})(e,r,n):DO(r,o.isDefaultPrevented())})(e,t,n))(e,t,n);if(!s.cancelled){const t=s.content,n=()=>((e,t,n)=>{n||!Vm(e)?TO(e,t):((e,t)=>{dn.each([BO,PO,TO],n=>!n(e,t,TO))})(e,t)})(e,t,o);r?i_(e,"insertFromPaste",{dataTransfer:MO(t)}).isDefaultPrevented()||(n(),a_(e,"insertFromPaste")):n()}},FO=(e,t,n,o)=>{const r=n||EO(t);IO(e,(e=>e.replace(wO,""))(t),r,!1,o)},UO=(e,t,n)=>{const o=e.dom.encode(t).replace(/\r\n/g,"\n"),r=((e,t,n)=>{const o=e.split(/\n\n/),r=((e,t)=>{let n="<"+e;const o=Se(t,(e,t)=>t+'="'+Sa.encodeAllRaw(e)+'"');return o.length&&(n+=" "+o.join(" ")),n+">"})(t,n),s="",a=V(o,e=>e.split(/\n/).join("
    "));return 1===a.length?a[0]:V(a,e=>r+e+s).join("")})(Qr(o,Wm(e)),Ed(e),xd(e));IO(e,r,!1,!0,n)},zO=e=>{const t={};if(e&&e.types)for(let n=0;nt in e&&e[t].length>0,$O=e=>jO(e,"text/html")||jO(e,"text/plain"),HO=async(e,t)=>SC(t.uri).fold(()=>Promise.resolve(),({data:n,type:o,base64Encoded:r})=>{const s=r?n:btoa(n),a=t.file,i=e.editorUpload.blobCache,l=(i.getByData(s,o)??((e,t,n,o)=>{const r=LO(),s=Td(e)&&C(n.name),a=s?((e,t)=>{const n=t.match(/([\s\S]+?)(?:\.[a-z0-9.]+)$/i);return C(n)?e.dom.encode(n[1]):void 0})(e,n.name):r,i=s?n.name:void 0,l=t.create(r,n,o,a,i);return t.add(l),l})(e,i,a,s)).blobUri();return(c=l,new Promise((e,t)=>{const n=document.createElement("img");n.addEventListener("load",()=>{e({width:n.naturalWidth,height:n.naturalHeight})}),n.addEventListener("error",()=>{t(`Failed to get image dimensions for: ${c}`)}),n.src=c})).then(({width:t,height:n})=>{FO(e,``,!1,!0)}).catch(()=>{FO(e,``,!1,!0)});var c}),VO=(e,t,n)=>{const o="paste"===t.type?t.clipboardData:t.dataTransfer;var r;if(Im(e)&&o){const s=((e,t)=>{const n=t.items?ne(me(t.items),e=>"file"===e.kind?[e.getAsFile()]:[]):[],o=t.files?me(t.files):[];return Y(n.length>0?n:o,(e=>{const t=ru(e);return e=>Qe(e.type,"image/")&&H(t,t=>(e=>{const t=e.toLowerCase(),n={jpg:"jpeg",jpe:"jpeg",jfi:"jpeg",jif:"jpeg",jfif:"jpeg",pjpeg:"jpeg",pjp:"jpeg",svg:"svg+xml"};return dn.hasOwn(n,t)?"image/"+n[t]:"image/"+t})(t)===e.type)})(e))})(e,o);if(s.length>0)return t.preventDefault(),(r=s,Promise.all(V(r,e=>xC(e).then(t=>({file:e,uri:t}))))).then(async t=>{n&&e.selection.setRng(n);for(const n of t)await HO(e,n)}),!0}return!1},qO=(e,t,n,o,r)=>{let s=RO(n);const a=jO(t,CO())||EO(n),i=!a&&(e=>!/<(?:\/?(?!(?:div|p|br|span)>)\w+|(?:(?!(?:span style="white-space:\s?pre;?">)|br\s?\/>))\w+\s[^>]+)>/i.test(e))(s),l=OO(s);(NO(s)||!s.length||i&&!l)&&(o=!0),(o||l)&&(s=jO(t,"text/plain")&&i?t["text/plain"]:(e=>{const t=Ua(),n=pS({},t);let o="";const r=t.getVoidElements(),s=dn.makeMap("script noscript style textarea video audio iframe object"," "),a=t.getBlockElements(),i=e=>{const n=e.name,l=e;if("br"!==n){if("wbr"!==n)if(r[n]&&(o+=" "),s[n])o+=" ";else{if(3===e.type&&(o+=e.value),!(e.name in t.getVoidElements())){let t=e.firstChild;if(t)do{i(t)}while(t=t.next)}a[n]&&l.next&&(o+="\n","p"===n&&(o+="\n"))}}else o+="\n"};return e=AO(e,[//g]),i(n.parse(e)),o})(s)),NO(s)||(o?UO(e,s,r):FO(e,s,a,r))},WO=(e,t,n)=>{((e,t,n)=>{let o;e.on("keydown",e=>{(e=>Tp.metaKeyPressed(e)&&86===e.keyCode||e.shiftKey&&45===e.keyCode)(e)&&!e.isDefaultPrevented()&&(o=e.shiftKey&&86===e.keyCode)}),e.on("paste",r=>{if(r.isDefaultPrevented()||(e=>sn.os.isAndroid()&&0===e.clipboardData?.items?.length)(r))return;const s="text"===n.get()||o;o=!1;const a=zO(r.clipboardData);!$O(a)&&VO(e,r,t.getLastRng()||e.selection.getRng())||(jO(a,"text/html")?(r.preventDefault(),qO(e,a,a["text/html"],s,!0)):jO(a,"text/plain")&&jO(a,"text/uri-list")?(r.preventDefault(),qO(e,a,a["text/plain"],s,!0)):(t.create(),yp.setEditorTimeout(e,()=>{const n=t.getHtml();t.remove(),qO(e,a,n,s,!1)},0)))})})(e,t,n),(e=>{const t=e=>Qe(e,"webkit-fake-url"),n=e=>Qe(e,"data:");e.parser.addNodeFilter("img",(o,r,s)=>{if(!Im(e)&&(e=>!0===e.data?.paste)(s))for(const r of o){const o=r.attr("src");u(o)&&!r.attr("data-mce-object")&&o!==sn.transparentSrc&&(t(o)||!Km(e)&&n(o))&&r.remove()}})})(e)},KO=(e,t,n,o)=>{((e,t,n)=>{if(!e)return!1;try{return e.clearData(),e.setData("text/html",t),e.setData("text/plain",n),e.setData(CO(),t),!0}catch{return!1}})(e.clipboardData,t.html,t.text)?(e.preventDefault(),o()):n(t.html,o)},YO=e=>(t,n)=>{const{dom:o,selection:r}=e,s=o.create("div",{contenteditable:"false","data-mce-bogus":"all"}),a=o.create("div",{contenteditable:"true"},t);o.setStyles(s,{position:"fixed",top:"0",left:"-3000px",width:"1000px",overflow:"hidden"}),s.appendChild(a),o.add(e.getBody(),s);const i=r.getRng();a.focus();const l=o.createRng();l.selectNodeContents(a),r.setRng(l),yp.setEditorTimeout(e,()=>{r.setRng(i),o.remove(s),n()},0)},GO=e=>({html:SO(e.selection.getContent({contextual:!0})),text:e.selection.getContent({format:"text"})}),XO=e=>!e.selection.isCollapsed()||(e=>!!e.dom.getParent(e.selection.getStart(),"td[data-mce-selected],th[data-mce-selected]",e.getBody()))(e),QO=(e,t)=>Gp.getCaretRangeFromPoint(t.clientX??0,t.clientY??0,e.getDoc()),ZO=(e,t)=>{t&&e.selection.setRng(t),e.focus()},JO=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi,eB=e=>dn.trim(e).replace(JO,Ya).toLowerCase(),tB=(e,t,n)=>{const o=jm(e);if(n||"all"===o||!$m(e))return t;const r=o?o.split(/[, ]/):[];if(r&&"none"!==o){const n=e.dom,o=e.selection.getNode();t=t.replace(/(<[^>]+) style="([^"]*)"([^>]*>)/gi,(e,t,s,a)=>{const i=n.parseStyle(n.decode(s)),l={};for(let e=0;e]+) style="([^"]*)"([^>]*>)/gi,"$1$3");return t=t.replace(/(<[^>]+) data-mce-style="([^"]+)"([^>]*>)/gi,(e,t,n,o)=>t+' style="'+n+'"'+o),t},nB=(e,t)=>{const n=Ae(!1),o=Ae(qm(e)?"text":"html"),r=(e=>{const t=Ae(null);return{create:()=>((e,t)=>{const{dom:n,selection:o}=e,r=e.getBody();t.set(o.getRng());const s=n.add(e.getBody(),"div",{id:"mcepastebin",class:"mce-pastebin",contentEditable:!0,"data-mce-bogus":"all",style:"position: fixed; top: 50%; width: 10px; height: 10px; overflow: hidden; opacity: 0"},xO);sn.browser.isFirefox()&&n.setStyle(s,"left","rtl"===n.getStyle(r,"direction",!0)?65535:-65535),n.bind(s,"beforedeactivate focusin focusout",e=>{e.stopPropagation()}),s.focus(),o.select(s,!0)})(e,t),remove:()=>((e,t)=>{const n=e.dom;if(_O(e)){let o;const r=t.get();for(;o=_O(e);)n.remove(o),n.unbind(o);r&&e.selection.setRng(r)}t.set(null)})(e,t),getEl:()=>_O(e),getHtml:()=>(e=>{const t=e.dom,n=(e,n)=>{e.appendChild(n),t.remove(n,!0)},[o,...r]=Y(e.getBody().childNodes,kO);q(r,e=>{n(o,e)});const s=t.select("div[id=mcepastebin]",o);for(let e=s.length-1;e>=0;e--){const r=t.create("div");o.insertBefore(r,s[e]),n(r,s[e])}return o?o.innerHTML:""})(e),getLastRng:t.get}})(e);(e=>{(sn.browser.isChromium()||sn.browser.isSafari())&&((e,t)=>{e.on("PastePreProcess",n=>{n.content=t(e,n.content,n.internal)})})(e,tB)})(e),((e,t)=>{e.addCommand("mceTogglePlainTextPaste",()=>{((e,t)=>{"text"===t.get()?(t.set("html"),ld(e,!1)):(t.set("text"),ld(e,!0)),e.focus()})(e,t)}),e.addCommand("mceInsertClipboardContent",(t,n)=>{n.html&&FO(e,n.html,n.internal,!1),n.text&&UO(e,n.text,!1)})})(e,o),(e=>{const t=t=>n=>{t(e,n)},n=Fm(e);w(n)&&e.on("PastePreProcess",t(n));const o=Um(e);w(o)&&e.on("PastePostProcess",t(o))})(e),e.addQueryStateHandler("mceTogglePlainTextPaste",()=>"text"===o.get()),e.on("PreInit",()=>{((e,t)=>{e.on("cut",((e,t)=>n=>{!n.isDefaultPrevented()&&XO(e)&&e.selection.isEditable()&&KO(n,GO(e),YO(e),()=>{if(sn.browser.isChromium()||sn.browser.isFirefox()){const n=e.selection.getRng();yp.setEditorTimeout(e,()=>{e.selection.setRng(n),oR(e,t)},0)}else oR(e,t)})})(e,t)),e.on("copy",(e=>t=>{!t.isDefaultPrevented()&&XO(e)&&KO(t,GO(e),YO(e),x)})(e))})(e,t),((e,t)=>{Mm(e)&&e.on("dragend dragover draggesture dragdrop drop drag",e=>{e.preventDefault(),e.stopPropagation()}),Im(e)||e.on("drop",e=>{const t=e.dataTransfer;t&&(e=>H(e.files,e=>/^image\//.test(e.type)))(t)&&e.preventDefault()}),e.on("drop",n=>{if(n.isDefaultPrevented())return;const o=QO(e,n);if(v(o))return;const r=zO(n.dataTransfer),s=jO(r,CO());if((!$O(r)||(e=>{const t=e["text/plain"];return!!t&&0===t.indexOf("file://")})(r))&&VO(e,n,o))return;const a=r[CO()],i=a||r["text/html"]||r["text/plain"],l=((e,t,n,o)=>{const r=e.getParent(n,e=>Zs(t,e));if(!h(e.getParent(n,"summary")))return!0;if(r&&_e(o,"text/html")){const e=(new DOMParser).parseFromString(o["text/html"],"text/html").body;return!h(e.querySelector(r.nodeName.toLowerCase()))}return!1})(e.dom,e.schema,o.startContainer,r),c=t.get();c&&!l||i&&(n.preventDefault(),yp.setEditorTimeout(e,()=>{e.undoManager.transact(()=>{(a||c&&l)&&e.execCommand("Delete"),ZO(e,o);const t=RO(i);r["text/html"]?FO(e,t,s,!0):UO(e,t,!0)})}))}),e.on("dragstart",e=>{t.set(!0)}),e.on("dragover dragend",n=>{Im(e)&&!t.get()&&(n.preventDefault(),ZO(e,QO(e,n))),"dragend"===n.type&&t.set(!1)}),(e=>{e.on("input",t=>{const n=e=>h(e.querySelector("summary"));if("deleteByDrag"===t.inputType){const t=Y(e.dom.select("details"),n);q(t,t=>{ps(t.firstChild)&&t.firstChild.remove();const n=e.dom.create("summary");n.appendChild(qi().dom),t.prepend(n)})}})})(e)})(e,n),WO(e,r,o)})},oB=ps,rB=cs,sB=e=>vs(e.dom),aB=e=>t=>vn(un.fromDom(e),t),iB=(e,t)=>lr(un.fromDom(e),sB,aB(t)),lB=(e,t,n)=>{const o=new Kr(e,t),r=n?o.next.bind(o):o.prev.bind(o);let s=e;for(let t=n?e:r();t&&!oB(t);t=r())Nl(t)&&(s=t);return s},cB=e=>{const t=((e,t,n)=>{const o=Kl.fromRangeStart(e).getNode(),r=((e,t,n)=>lr(un.fromDom(e),e=>(e=>ys(e.dom))(e)||n.isBlock(En(e)),aB(t)).getOr(un.fromDom(t)).dom)(o,t,n),s=lB(o,r,!1),a=lB(o,r,!0),i=document.createRange();return iB(s,r).fold(()=>{rB(s)?i.setStart(s,0):i.setStartBefore(s)},e=>i.setStartBefore(e.dom)),iB(a,r).fold(()=>{rB(a)?i.setEnd(a,a.data.length):i.setEndAfter(a)},e=>i.setEndAfter(e.dom)),i})(e.selection.getRng(),e.getBody(),e.schema);e.selection.setRng(bC(t))};var dB;!function(e){e.Before="before",e.After="after"}(dB||(dB={}));const mB=(e,t)=>Math.abs(e.left-t),uB=(e,t)=>Math.abs(e.right-t),fB=(e,t)=>(e=>X(e,(e,t)=>e.fold(()=>I.some(t),e=>{const n=Math.min(t.left,e.left),o=Math.min(t.top,e.top),r=Math.max(t.right,e.right),s=Math.max(t.bottom,e.bottom);return I.some({top:o,right:r,bottom:s,left:n,width:r-n,height:s-o})}),I.none()))(Y(e,e=>{return(n=t)>=(o=e).top&&n<=o.bottom;var n,o})).fold(()=>[[],e],t=>{const{pass:n,fail:o}=K(e,e=>((e,t)=>{const n=((e,t)=>Math.max(0,Math.min(e.bottom,t.bottom)-Math.max(e.top,t.top)))(e,t)/Math.min(e.height,t.height);return((e,t)=>e.topt.top)(e,t)&&n>.5})(e,t));return[n,o]}),gB=(e,t,n)=>t>e.left&&t{const r=e=>Nl(e.node)?I.some(e):es(e.node)?pB(me(e.node.childNodes),t,n,!1):I.none(),s=(e,s)=>{const a=ie(e,(e,o)=>s(e,t,n)-s(o,t,n));return ue(a,r).map(e=>o&&!cs(e.node)&&a.length>1?((e,o,s)=>r(o).filter(o=>Math.abs(s(e,t,n)-s(o,t,n))<2&&cs(o.node)))(e,a[1],s).getOr(e):e)},[a,i]=fB(sA(e),n),{pass:l,fail:c}=K(i,e=>e.tops(c,gl)).orThunk(()=>s(l,gl))},hB=(e,t,n)=>((e,t,n)=>{const o=un.fromDom(e),r=Pn(o),s=un.fromPoint(r,t,n).filter(e=>Cn(o,e)).getOr(o);return((e,t,n,o)=>{const r=(t,s)=>{const a=Y(t.dom.childNodes,T(e=>es(e)&&e.classList.contains("mce-drag-container")));return s.fold(()=>pB(a,n,o,!0),e=>{const t=Y(a,t=>t!==e.dom);return pB(t,n,o,!0)}).orThunk(()=>(vn(t,e)?I.none():In(t)).bind(e=>r(e,I.some(t))))};return r(t,I.none())})(o,s,t,n)})(e,t,n).filter(e=>Bu(e.node)).map(e=>((e,t)=>({node:e.node,position:mB(e,t){const t=e.getBoundingClientRect(),n=e.ownerDocument,o=n.documentElement,r=n.defaultView;return{top:t.top+(r?.scrollY??0)-o.clientTop,left:t.left+(r?.scrollX??0)-o.clientLeft}},yB=e=>({target:e,srcElement:e}),vB=(e,t,n,o)=>{const r=((e,t)=>{const n=(e=>{const t=mD(),n=(e=>{const t=e;return I.from(t[eD])})(e);return rD(e),XR(t),t.dropEffect=e.dropEffect,t.effectAllowed=e.effectAllowed,(e=>{const t=e;return I.from(t[KR])})(e).each(e=>t.setDragImage(e.image,e.x,e.y)),q(e.types,n=>{"Files"!==n&&t.setData(n,e.getData(n))}),q(e.files,e=>t.items.add(e)),(e=>{const t=e;return I.from(t[YR])})(e).each(e=>{((e,t)=>{GR(t)(e)})(t,e)}),n.each(n=>{nD(e,n),nD(t,n)}),t})(e);return"dragstart"===t?(XR(n),oD(n)):"drop"===t?(QR(n),rD(n)):(ZR(n),sD(n)),n})(n,e);return y(o)?((e,t,n)=>{const o=O("Function not supported on simulated event.");return{bubbles:!0,cancelBubble:!1,cancelable:!0,composed:!1,currentTarget:null,defaultPrevented:!1,eventPhase:0,isTrusted:!0,returnValue:!1,timeStamp:0,type:e,composedPath:o,initEvent:o,preventDefault:x,stopImmediatePropagation:x,stopPropagation:x,AT_TARGET:window.Event.AT_TARGET,BUBBLING_PHASE:window.Event.BUBBLING_PHASE,CAPTURING_PHASE:window.Event.CAPTURING_PHASE,NONE:window.Event.NONE,altKey:!1,button:0,buttons:0,clientX:0,clientY:0,ctrlKey:!1,layerX:0,layerY:0,metaKey:!1,movementX:0,movementY:0,offsetX:0,offsetY:0,pageX:0,pageY:0,relatedTarget:null,screenX:0,screenY:0,shiftKey:!1,x:0,y:0,detail:0,view:null,which:0,initUIEvent:o,initMouseEvent:o,getModifierState:o,dataTransfer:n,...yB(t)}})(e,t,r):((e,t,n,o)=>({...t,dataTransfer:o,type:e,...yB(n)}))(e,o,t,r)},CB=vs,wB=((...e)=>t=>{for(let n=0;n{const r=e.dom,s=t.cloneNode(!0);r.setStyles(s,{width:n,height:o}),r.setAttrib(s,"data-mce-selected",null);const a=r.create("div",{class:"mce-drag-container","data-mce-bogus":"all",unselectable:"on",contenteditable:"false"});return r.setStyles(a,{position:"absolute",opacity:.5,overflow:"hidden",border:0,padding:0,margin:0,width:n,height:o}),r.setStyles(s,{margin:0,boxSizing:"border-box"}),a.appendChild(s),a},EB=(e,t)=>n=>()=>{const o="left"===e?n.scrollX:n.scrollY;n.scroll({[e]:o+t,behavior:"smooth"})},xB=EB("left",-32),_B=EB("left",32),kB=EB("top",-32),NB=EB("top",32),AB=e=>{e&&e.parentNode&&e.parentNode.removeChild(e)},RB=(e,t,n,o,r)=>{"dragstart"===t&&uD(o,e.dom.getOuterHTML(n));const s=vB(t,n,o,r);return e.dispatch(t,s)},DB=(e,t)=>{const n=at((e,n)=>((e,t,n)=>{e._selectionOverrides.hideFakeCaret(),hB(e.getBody(),t,n).fold(()=>e.selection.placeCaretAt(t,n),o=>{const r=e._selectionOverrides.showCaret(1,o.node,o.position===dB.Before,!1);r?e.selection.setRng(r):e.selection.placeCaretAt(t,n)})})(t,e,n),0);t.on("remove",n.cancel);const o=e;return r=>e.on(e=>{const s=Math.max(Math.abs(r.screenX-e.screenX),Math.abs(r.screenY-e.screenY));if(!e.dragging&&s>10){const n=RB(t,"dragstart",e.element,e.dataTransfer,r);if(C(n.dataTransfer)&&(e.dataTransfer=n.dataTransfer),n.isDefaultPrevented())return;e.dragging=!0,t.focus()}if(e.dragging){const s=r.currentTarget===t.getDoc().documentElement,l=((e,t)=>({pageX:t.pageX-e.relX,pageY:t.pageY+5}))(e,((e,t)=>{return n=(e=>e.inline?bB(e.getBody()):{left:0,top:0})(e),o=(e=>{const t=e.getBody();return e.inline?{left:t.scrollLeft,top:t.scrollTop}:{left:0,top:0}})(e),r=((e,t)=>{if(t.target.ownerDocument!==e.getDoc()){const n=bB(e.getContentAreaContainer()),o=(e=>{const t=e.getBody(),n=e.getDoc().documentElement,o={left:t.scrollLeft,top:t.scrollTop},r={left:t.scrollLeft||n.scrollLeft,top:t.scrollTop||n.scrollTop};return e.inline?o:r})(e);return{left:t.pageX-n.left+o.left,top:t.pageY-n.top+o.top}}return{left:t.pageX,top:t.pageY}})(e,t),{pageX:r.left-n.left+o.left,pageY:r.top-n.top+o.top};var n,o,r})(t,r));a=e.ghost,i=t.getBody(),a.parentNode!==i&&i.appendChild(a),((e,t,n,o,r,s,a,i,l,c,d,m)=>{let u=0,f=0;e.style.left=t.pageX+"px",e.style.top=t.pageY+"px",t.pageX+n>r&&(u=t.pageX+n-r),t.pageY+o>s&&(f=t.pageY+o-s),e.style.width=n-u+"px",e.style.height=o-f+"px";const g=l.clientHeight,p=l.clientWidth,h=a+l.getBoundingClientRect().top,b=i+l.getBoundingClientRect().left;d.on(e=>{e.intervalId.clear(),e.dragging&&m&&(a+8>=g?e.intervalId.set(NB(c)):a-8<=0?e.intervalId.set(kB(c)):i+8>=p?e.intervalId.set(_B(c)):i-8<=0?e.intervalId.set(xB(c)):h+16>=window.innerHeight?e.intervalId.set(NB(window)):h-16<=0?e.intervalId.set(kB(window)):b+16>=window.innerWidth?e.intervalId.set(_B(window)):b-16<=0&&e.intervalId.set(xB(window)))})})(e.ghost,l,e.width,e.height,e.maxX,e.maxY,r.clientY,r.clientX,t.getContentAreaContainer(),t.getWin(),o,s),n.throttle(r.clientX,r.clientY)}var a,i})},TB=(e,t,n)=>{e.on(e=>{e.intervalId.clear(),e.dragging&&n.fold(()=>RB(t,"dragend",e.element,e.dataTransfer),n=>RB(t,"dragend",e.element,e.dataTransfer,n))}),OB(e)},OB=e=>{e.on(e=>{e.intervalId.clear(),AB(e.ghost)}),e.clear()},BB=e=>{const t=Ke(),n=gi.DOM,o=document,r=((e,t)=>n=>{if((e=>0===e.button)(n)){const o=Z(t.dom.getParents(n.target),wB).getOr(null);if(C(o)&&((e,t,n)=>CB(n)&&n!==t&&e.isEditable(n.parentElement))(t.dom,t.getBody(),o)){const r=t.dom.getPos(o),s=t.getBody(),a=t.getDoc().documentElement;e.set({element:o,dataTransfer:mD(),dragging:!1,screenX:n.screenX,screenY:n.screenY,maxX:(t.inline?s.scrollWidth:a.offsetWidth)-2,maxY:(t.inline?s.scrollHeight:a.offsetHeight)-2,relX:n.pageX-r.x,relY:n.pageY-r.y,width:o.offsetWidth,height:o.offsetHeight,ghost:SB(t,o,o.offsetWidth,o.offsetHeight),intervalId:We(100)})}}})(t,e),s=DB(t,e),a=((e,t)=>n=>{e.on(e=>{if(e.intervalId.clear(),e.dragging){if(((e,t,n)=>!v(t)&&t!==n&&!e.dom.isChildOf(t,n)&&e.dom.isEditable(t))(t,(e=>{const t=e.getSel();if(C(t)){const e=t.getRangeAt(0).startContainer;return cs(e)?e.parentNode:e}return null})(t.selection),e.element)){const o=t.getDoc().elementFromPoint(n.clientX,n.clientY)??t.getBody();RB(t,"drop",o,e.dataTransfer,n).isDefaultPrevented()||t.undoManager.transact(()=>{((e,t)=>{const n=e.getParent(t.parentNode,e.isBlock);AB(t),n&&n!==e.getRoot()&&e.isEmpty(n)&&Wi(un.fromDom(n))})(t.dom,e.element),(e=>{const t=e.getData("text/html");return""===t?I.none():I.some(t)})(e.dataTransfer).each(e=>t.insertContent(e)),t._selectionOverrides.hideFakeCaret()})}RB(t,"dragend",t.getBody(),e.dataTransfer,n)}}),OB(e)})(t,e),i=((e,t)=>n=>TB(e,t,I.some(n)))(t,e);e.on("mousedown",r),e.on("mousemove",s),e.on("mouseup",a),n.bind(o,"mousemove",s),n.bind(o,"mouseup",i),e.on("remove",()=>{n.unbind(o,"mousemove",s),n.unbind(o,"mouseup",i)}),e.on("keydown",n=>{n.keyCode===Tp.ESC&&TB(t,e,I.none())})},PB=vs,LB=(e,t)=>zy(e.getBody(),t),MB=e=>{const t=e.selection,n=e.dom,o=e.getBody(),r=Du(e,o,n.isBlock,()=>Ap(e)),s="sel-"+n.uniqueId(),a="data-mce-selected";let i;const l=e=>e!==o&&(PB(e)||xs(e))&&n.isChildOf(e,o)&&n.isEditable(e.parentNode),c=(n,o,s,a=!0)=>e.dispatch("ShowCaret",{target:o,direction:n,before:s}).isDefaultPrevented()?null:(a&&t.scrollIntoView(o,-1===n),r.show(s,o)),d=e=>el(e)||rl(e)||sl(e),m=e=>d(e.startContainer)||d(e.endContainer),u=t=>{const o=e.schema.getVoidElements(),r=n.createRng(),s=t.startContainer,a=t.startOffset,i=t.endContainer,l=t.endOffset;return _e(o,s.nodeName.toLowerCase())?0===a?r.setStartBefore(s):r.setStartAfter(s):r.setStart(s,a),_e(o,i.nodeName.toLowerCase())?0===l?r.setEndBefore(i):r.setEndAfter(i):r.setEnd(i,l),r},f=(r,d)=>{if(!r)return null;if(r.collapsed){if(!m(r)){const e=d?1:-1,t=of(e,o,r),s=t.getNode(!d);if(C(s)){if(Bu(s))return c(e,s,!!d&&!t.isAtEnd(),!1);if(Ji(s)&&vs(s.nextSibling)){const e=n.createRng();return e.setStart(s,0),e.setEnd(s,0),e}}const a=t.getNode(d);if(C(a)){if(Bu(a))return c(e,a,!d&&!t.isAtEnd(),!1);if(Ji(a)&&vs(a.previousSibling)){const e=n.createRng();return e.setStart(a,1),e.setEnd(a,1),e}}}return null}let u=r.startContainer,f=r.startOffset;const g=r.endOffset;if(cs(u)&&0===f&&PB(u.parentNode)&&(u=u.parentNode,f=n.nodeIndex(u),u=u.parentNode),!es(u))return null;if(g===f+1&&u===r.endContainer){const o=u.childNodes[f];if(l(o))return(o=>{const r=Rs(o)?(t=>{const n=e.getDoc().createElement("div");n.style.width=t.style.width,n.style.height=t.style.height;const o=t.getAttribute("width");o&&n.setAttribute("width",o);const r=t.getAttribute("height");return r&&n.setAttribute("height",r),n})(o):o.cloneNode(!0),l=e.dispatch("ObjectSelected",{target:o,targetClone:r});if(l.isDefaultPrevented())return null;const c=((o,r)=>{const a=un.fromDom(e.getBody()),i=e.getDoc(),l=ur(a,"#"+s).getOrThunk(()=>{const e=un.fromHtml('
    ',i);return vo(e,"id",s),go(a,e),e}),c=n.createRng();No(l),bo(l,[un.fromText(dt,i),un.fromDom(r),un.fromText(dt,i)]),c.setStart(l.dom.firstChild,1),c.setEnd(l.dom.lastChild,0),jo(l,{top:n.getPos(o,e.getBody()).y+"px"}),io(l);const d=t.getSel();return d&&(d.removeAllRanges(),d.addRange(c)),c})(o,l.targetClone),d=un.fromDom(o);return q(Ar(un.fromDom(e.getBody()),`*[${a}]`),e=>{vn(d,e)||xo(e,a)}),n.getAttrib(o,a)||o.setAttribute(a,"1"),i=o,p(),c})(o)}return null},g=()=>{i&&i.removeAttribute(a),ur(un.fromDom(e.getBody()),"#"+s).each(Ao),i=null},p=()=>{r.hide()};return BE(e)||(e.on("click",t=>{n.isEditable(t.target)||(t.preventDefault(),e.focus())}),e.on("blur NewBlock",g),e.on("ResizeWindow FullscreenStateChanged",r.reposition),e.on("tap",t=>{const n=t.target,o=LB(e,n);PB(o)?(t.preventDefault(),Kk(e,o).each(f)):l(n)&&Kk(e,n).each(f)},!0),e.on("mousedown",r=>{const s=r.target;if(s!==o&&"HTML"!==s.nodeName&&!n.isChildOf(s,o))return;if(!((e,t,n)=>{const o=un.fromDom(e.getBody()),r=e.inline?o:un.fromDom(Pn(o).dom.documentElement),s=((e,t,n,o)=>{const r=(e=>e.dom.getBoundingClientRect())(t);return{x:n-(e?r.left+t.dom.clientLeft+JE(t):0),y:o-(e?r.top+t.dom.clientTop+ZE(t):0)}})(e.inline,r,t,n);return((e,t,n)=>{const o=XE(e),r=QE(e);return t>=0&&n>=0&&t<=o&&n<=r})(r,s.x,s.y)})(e,r.clientX,r.clientY))return;g(),p();const a=LB(e,s);PB(a)?(r.preventDefault(),Kk(e,a).each(f)):hB(o,r.clientX,r.clientY).each(n=>{var o;r.preventDefault(),(o=c(1,n.node,n.position===dB.Before,!1))&&t.setRng(o),ts(a)?a.focus():e.getBody().focus()})}),e.on("keypress",e=>{Tp.modifierPressed(e)||PB(t.getNode())&&e.preventDefault()}),e.on("GetSelectionRange",e=>{let t=e.range;if(i){if(!i.parentNode)return void(i=null);t=t.cloneRange(),t.selectNode(i),e.range=t}}),e.on("focusin",t=>{if(!xs(t.target)&&e.getBody().contains(t.target)&&t.target!==e.getBody()&&!e.dom.isEditable(t.target.parentNode)){r.isShowing()&&r.hide(),t.target.contains(e.selection.getNode())||(e.selection.select(t.target,!0),e.selection.collapse(!0));const n=f(e.selection.getRng(),!0);n&&e.selection.setRng(n)}}),e.on("SetSelectionRange",e=>{e.range=u(e.range);const t=f(e.range,e.forward);t&&(e.range=t)}),e.on("AfterSetSelectionRange",e=>{const t=e.range,o=t.startContainer.parentElement;var r;m(t)||es(r=o)&&"mcepastebin"===r.id||p(),(e=>C(e)&&n.hasClass(e,"mce-offscreen-selection"))(o)||g()}),(e=>{BB(e),_m(e)&&(e=>{const t=t=>{if(!t.isDefaultPrevented()){const n=t.dataTransfer;n&&($(n.types,"Files")||n.files.length>0)&&(t.preventDefault(),"drop"===t.type&&sx(e,"Dropped file type is not supported"))}},n=n=>{Sp(e,n.target)&&t(n)},o=()=>{const o=gi.DOM,r=e.dom,s=document,a=e.inline?e.getBody():e.getDoc(),i=["drop","dragover"];q(i,e=>{o.bind(s,e,n),r.bind(a,e,t)}),e.on("remove",()=>{q(i,e=>{o.unbind(s,e,n),r.unbind(a,e,t)})})};e.on("init",()=>{yp.setEditorTimeout(e,o,0)})})(e)})(e),(e=>{const t=at(()=>{if(!e.removed&&e.getBody().contains(document.activeElement)){const t=e.selection.getRng();if(t.collapsed){const n=Yk(e,t,!1);e.selection.setRng(n)}}},0);e.on("focus",()=>{t.throttle()}),e.on("blur",()=>{t.cancel()})})(e),(e=>{e.on("init",()=>{e.on("focusin",t=>{const n=t.target;if(xs(n)){const t=zy(e.getBody(),n),o=vs(t)?t:n;e.selection.getNode()!==o&&Kk(e,o).each(t=>e.selection.setRng(t))}})})})(e)),{showCaret:c,showBlockCaretContainer:e=>{e.hasAttribute("data-mce-caret")&&(al(e),t.scrollIntoView(e))},hideFakeCaret:p,destroy:()=>{r.destroy(),i=null}}},IB=(e,t)=>{let n=t;for(let t=e.previousSibling;cs(t);t=t.previousSibling)n+=t.data.length;return n},FB=(e,t,n,o,r)=>{if(cs(n)&&(o<0||o>n.data.length))return[];const s=r&&cs(n)?[IB(n,o)]:[o];let a=n;for(;a!==t&&a.parentNode;)s.push(e.nodeIndex(a,r)),a=a.parentNode;return a===t?s.reverse():[]},UB=(e,t,n,o,r,s,a=!1)=>({start:FB(e,t,n,o,a),end:FB(e,t,r,s,a)}),zB=(e,t)=>{const n=t.slice(),o=n.pop();return S(o)?X(n,(e,t)=>e.bind(e=>I.from(e.childNodes[t])),I.some(e)).bind(e=>cs(e)&&(o<0||o>e.data.length)?I.none():I.some({node:e,offset:o})):I.none()},jB=(e,t)=>zB(e,t.start).bind(({node:n,offset:o})=>zB(e,t.end).map(({node:e,offset:t})=>{const r=document.createRange();return r.setStart(n,o),r.setEnd(e,t),r})),$B=(e,t,n)=>{if(t&&e.isEmpty(t)&&!n(t)){const o=t.parentNode;e.remove(t,cs(t.firstChild)&&Gr(t.firstChild.data)),$B(e,o,n)}},HB=(e,t,n,o=!0)=>{const r=t.startContainer.parentNode,s=t.endContainer.parentNode;t.deleteContents(),o&&!n(t.startContainer)&&(cs(t.startContainer)&&0===t.startContainer.data.length&&e.remove(t.startContainer),cs(t.endContainer)&&0===t.endContainer.data.length&&e.remove(t.endContainer),$B(e,r,n),r!==s&&$B(e,s,n))},VB=(e,t)=>I.from(e.dom.getParent(t.startContainer,e.dom.isBlock)),qB=(e,t,n)=>{const o=e.dynamicPatternsLookup({text:n,block:t});return{...e,blockPatterns:Zc(o).concat(e.blockPatterns),inlinePatterns:Jc(o).concat(e.inlinePatterns)}},WB=(e,t,n,o)=>{const r=e.createRng();return r.setStart(t,0),r.setEnd(n,o),r.toString()},KB=(e,t)=>e.create("span",{"data-mce-type":"bookmark",id:t}),YB=(e,t)=>{const n=e.createRng();return n.setStartAfter(t.start),n.setEndBefore(t.end),n},GB=(e,t,n)=>{const o=jB(e.getRoot(),n).getOrDie("Unable to resolve path range"),r=o.startContainer,s=o.endContainer,a=0===o.endOffset?s:s.splitText(o.endOffset),i=0===o.startOffset?r:r.splitText(o.startOffset),l=i.parentNode;return{prefix:t,end:a.parentNode.insertBefore(KB(e,t+"-end"),a),start:l.insertBefore(KB(e,t+"-start"),i)}},XB=(e,t,n)=>{$B(e,e.get(t.prefix+"-end"),n),$B(e,e.get(t.prefix+"-start"),n)},QB=e=>0===e.start.length,ZB=(e,t,n,o)=>{const r=t.start;var s;return FD(e,o.container,o.offset,(s=r,(e,t)=>{const n=e.data.substring(0,t),o=n.lastIndexOf(s.charAt(s.length-1)),r=n.lastIndexOf(s);return-1!==r?r+s.length:-1!==o?o+1:-1}),n).bind(o=>{const s=n.textContent?.indexOf(r)??-1;if(-1!==s&&o.offset>=s+r.length){const t=e.createRng();return t.setStart(o.container,o.offset-r.length),t.setEnd(o.container,o.offset),I.some(t)}{const s=o.offset-r.length;return MD(o.container,s,n).map(t=>{const n=e.createRng();return n.setStart(t.container,t.offset),n.setEnd(o.container,o.offset),n}).filter(e=>e.toString()===r).orThunk(()=>ZB(e,t,n,OD(o.container,0)))}})},JB=(e,t,n,o)=>{const r=e.dom,s=r.getRoot(),a=n.pattern,i=n.position.container,l=n.position.offset;return MD(i,l-n.pattern.end.length,t).bind(c=>{const d=UB(r,s,c.container,c.offset,i,l,o);if(QB(a))return I.some({matches:[{pattern:a,startRng:d,endRng:d}],position:c});{const i=eP(e,n.remainingPatterns,c.container,c.offset,t,o),l=i.getOr({matches:[],position:c}),m=l.position,u=((e,t,n,o,r,s=!1)=>{if(0===t.start.length&&!s){const t=e.createRng();return t.setStart(n,o),t.setEnd(n,o),I.some(t)}return LD(n,o,r).bind(n=>ZB(e,t,r,n).bind(e=>{if(s){if(e.endContainer===n.container&&e.endOffset===n.offset)return I.none();if(0===n.offset&&e.endContainer.textContent?.length===e.endOffset)return I.none()}return I.some(e)}))})(r,a,m.container,m.offset,t,i.isNone());return u.map(e=>{const t=((e,t,n,o=!1)=>UB(e,t,n.startContainer,n.startOffset,n.endContainer,n.endOffset,o))(r,s,e,o);return{matches:l.matches.concat([{pattern:a,startRng:t,endRng:d}]),position:OD(e.startContainer,e.startOffset)}})}})},eP=(e,t,n,o,r,s)=>{const a=e.dom;return LD(n,o,a.getRoot()).bind(i=>{const l=WB(a,r,n,o);for(let a=0;a0)return eP(e,t,n,o-1,r,s);if(m.isSome())return m}return I.none()})},tP=(e,t,n)=>{e.selection.setRng(n),"inline-format"===t.type?q(t.format,t=>{e.formatter.apply(t)}):e.execCommand(t.cmd,!1,t.value)},nP=(e,t,n,o,r,s)=>{var a;return((e,t)=>{const n=oe(e,e=>H(t,t=>e.pattern.start===t.pattern.start&&e.pattern.end===t.pattern.end));return e.length===t.length?n?e:t:e.length>t.length?e:t})(eP(e,r.inlinePatterns,n,o,t,s).fold(()=>[],e=>e.matches),eP(e,(a=r.inlinePatterns,ie(a,(e,t)=>t.end.length-e.end.length)),n,o,t,s).fold(()=>[],e=>e.matches))},oP=(e,t)=>{if(0===t.length)return;const n=e.dom,o=e.selection.getBookmark(),r=((e,t)=>{const n=Le("mce_textpattern"),o=G(t,(t,o)=>{const r=GB(e,n+`_end${t.length}`,o.endRng);return t.concat([{...o,endMarker:r}])},[]);return G(o,(t,r)=>{const s=o.length-t.length-1,a=QB(r.pattern)?r.endMarker:GB(e,n+`_start${s}`,r.startRng);return t.concat([{...r,startMarker:a}])},[])})(n,t);q(r,t=>{const o=n.getParent(t.startMarker.start,n.isBlock),r=e=>e===o;QB(t.pattern)?((e,t,n,o)=>{const r=YB(e.dom,n);HB(e.dom,r,o),tP(e,t,r)})(e,t.pattern,t.endMarker,r):((e,t,n,o,r)=>{const s=e.dom,a=YB(s,o),i=YB(s,n);HB(s,i,r),HB(s,a,r);const l={prefix:n.prefix,start:n.end,end:o.start},c=YB(s,l);tP(e,t,c)})(e,t.pattern,t.startMarker,t.endMarker,r),XB(n,t.endMarker,r),XB(n,t.startMarker,r)}),e.selection.moveToBookmark(o)},rP=(e,t,n)=>((e,t,n)=>{if(cs(e)&&0>=e.length)return I.some(OD(e,0));{const t=Pi(BD);return I.from(t.forwards(e,0,PD(e),n)).map(e=>OD(e.container,0))}})(t,0,t).map(o=>{const r=o.container;return ID(r,n.start.length,t).each(n=>{const o=e.createRng();o.setStart(r,0),o.setEnd(n.container,n.offset),HB(e,o,e=>e===t)}),r}),sP=e=>(t,n)=>{const o=t.dom,r=n.pattern,s=jB(o.getRoot(),n.range).getOrDie("Unable to resolve path range");return VB(t,s).each(n=>{"block-format"===r.type?((e,t)=>{const n=t.get(e);return p(n)&&ce(n).exists(e=>_e(e,"block"))})(r.format,t.formatter)&&t.undoManager.transact(()=>{e(t.dom,n,r),t.formatter.apply(r.format)}):"block-command"===r.type&&t.undoManager.transact(()=>{e(t.dom,n,r),t.execCommand(r.cmd,!1,r.value)})}),!0},aP=e=>(t,n)=>{const o=(e=>ie(e,(e,t)=>t.start.length-e.start.length))(t),r=n.replace(dt," ");return Z(o,t=>e(t,n,r))},iP=(e,t)=>(n,o,r,s,a=o.textContent??"")=>{const i=n.dom,l=Ed(n);return i.is(o,l)?e(r.blockPatterns,a).map(e=>t&&dn.trim(a).length===e.start.length?[]:[{pattern:e,range:UB(i,i.getRoot(),o,0,o,0,s)}]).getOr([]):[]},lP=sP((e,t,n)=>{rP(e,t,n).each(e=>{const t=un.fromDom(e),n=or(t);/^\s[^\s]/.test(n)&&rr(t,n.slice(1))})}),cP=aP((e,t,n)=>0===t.indexOf(e.start)||0===n.indexOf(e.start)),dP=iP(cP,!0),mP=sP(rP),uP=aP((e,t,n)=>t===e.start||n===e.start),fP=iP(uP,!1),gP=(e,t,n)=>{for(let o=0;o{const t=[",",".",";",":","!","?"],n=[32],o=()=>{return t=Ym(e).filter(t=>"inline-command"!==t.type&&"block-command"!==t.type||e.queryCommandSupported(t.cmd)),n=Gm(e),{inlinePatterns:Jc(t),blockPatterns:Zc(t),dynamicPatternsLookup:n};var t,n},r=()=>(e=>e.options.isSet("text_patterns_lookup"))(e);e.on("keydown",t=>{if(13===t.keyCode&&!Tp.modifierPressed(t)&&e.selection.isCollapsed()&&e.selection.isEditable()){const n=ed(o(),"enter");(n.inlinePatterns.length>0||n.blockPatterns.length>0||r())&&((e,t)=>((e,t)=>{const n=e.selection.getRng();return VB(e,n).map(o=>{const r=Math.max(0,n.startOffset),s=qB(t,o,o.textContent??"");return{inlineMatches:nP(e,o,n.startContainer,r,s,!0),blockMatches:dP(e,o,s,!0)}}).filter(({inlineMatches:e,blockMatches:t})=>t.length>0||e.length>0)})(e,t).fold(L,({inlineMatches:t,blockMatches:n})=>(e.undoManager.add(),e.undoManager.extra(()=>{e.execCommand("mceInsertNewLine")},()=>{(e=>{e.insertContent(Ki,{preserve_zwsp:!0})})(e),oP(e,t),((e,t)=>{if(0===t.length)return;const n=e.selection.getBookmark();q(t,t=>lP(e,t)),e.selection.moveToBookmark(n)})(e,n);const o=e.selection.getRng(),r=LD(o.startContainer,o.startOffset,e.dom.getRoot());e.execCommand("mceInsertNewLine"),r.each(t=>{const n=t.container;n.data.charAt(t.offset-1)===ct&&(n.deleteData(t.offset-1,1),$B(e.dom,n.parentNode,t=>t===e.dom.getRoot()))})}),!0)))(e,n)&&t.preventDefault()}},!0),e.on("keydown",t=>{if(32===t.keyCode&&e.selection.isCollapsed()&&e.selection.isEditable()){const n=ed(o(),"space");(n.blockPatterns.length>0||r())&&((e,t)=>((e,t)=>{const n=e.selection.getRng();return VB(e,n).map(o=>{const r=Math.max(0,n.startOffset),s=WB(e.dom,o,n.startContainer,r),a=qB(t,o,s);return fP(e,o,a,!1,s)}).filter(e=>e.length>0)})(e,t).fold(L,t=>(e.undoManager.transact(()=>{((e,t)=>{q(t,t=>mP(e,t))})(e,t)}),!0)))(e,n)&&t.preventDefault()}},!0);const s=()=>{if(e.selection.isCollapsed()&&e.selection.isEditable()){const t=ed(o(),"space");(t.inlinePatterns.length>0||r())&&((e,t)=>{const n=e.selection.getRng();VB(e,n).map(o=>{const r=Math.max(0,n.startOffset-1),s=WB(e.dom,o,n.startContainer,r),a=qB(t,o,s),i=nP(e,o,n.startContainer,r,a,!1);i.length>0&&e.undoManager.transact(()=>{oP(e,i)})})})(e,t)}};e.on("keyup",e=>{gP(n,e,(e,t)=>e===t.keyCode&&!Tp.modifierPressed(t))&&s()}),e.on("keypress",n=>{gP(t,n,(e,t)=>e.charCodeAt(0)===t.charCode)&&yp.setEditorTimeout(e,s)})},hP=e=>{const t=dn.each,n=Tp.BACKSPACE,o=Tp.DELETE,r=e.dom,s=e.selection,a=e.parser,i=sn.browser,l=i.isFirefox(),c=i.isChromium()||i.isSafari(),d=i.isSafari(),m=sn.deviceType.isiPhone()||sn.deviceType.isiPad(),u=sn.os.isMacOS()||sn.os.isiOS(),f=(t,n)=>{try{e.getDoc().execCommand(t,!1,String(n))}catch{}},g=e=>e.isDefaultPrevented(),p=()=>{e.shortcuts.add("meta+a",null,"SelectAll")},h=()=>{e.inline||r.bind(e.getDoc(),"mousedown mouseup",t=>{let n;if(t.target===e.getDoc().documentElement)if(n=s.getRng(),null!==e.getDoc().getSelection()?.anchorNode&&e.getBody().focus(),"mousedown"===t.type){if(el(n.startContainer))return;s.placeCaretAt(t.clientX,t.clientY)}else s.setRng(n)})},b=()=>{Range.prototype.getClientRects||e.on("mousedown",t=>{if(!g(t)&&"HTML"===t.target.nodeName){const t=e.getBody();t.blur(),yp.setEditorTimeout(e,()=>{t.focus()})}})},y=()=>{const t=Am(e);e.on("click",n=>{const o=n.target;/^(IMG|HR)$/.test(o.nodeName)&&r.isEditable(o)&&(n.preventDefault(),e.selection.select(o),e.nodeChanged()),"A"===o.nodeName&&r.hasClass(o,t)&&0===o.childNodes.length&&r.isEditable(o.parentNode)&&(n.preventDefault(),s.select(o))})},v=()=>{e.on("keydown",e=>{if(!g(e)&&e.keyCode===n&&s.isCollapsed()&&0===s.getRng().startOffset){const t=s.getNode().previousSibling;if(t&&t.nodeName&&"table"===t.nodeName.toLowerCase())return e.preventDefault(),!1}return!0})},w=()=>{Cm(e)||e.on("BeforeExecCommand mousedown",()=>{f("StyleWithCSS",!1),f("enableInlineTableEditing",!1),Zd(e)||f("enableObjectResizing",!1)})},S=()=>{e.contentStyles.push("img:-moz-broken {-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}")},E=()=>{e.inline||e.on("keydown",()=>{document.activeElement===document.body&&e.getWin().focus()})},_=()=>{e.inline||(e.contentStyles.push("body {min-height: 150px}"),e.on("click",t=>{let n;"HTML"===t.target.nodeName&&(n=e.selection.getRng(),e.getBody().focus(),e.selection.setRng(n),e.selection.normalize(),e.nodeChanged())}))},k=()=>{u&&e.on("keydown",t=>{!Tp.metaKeyPressed(t)||t.shiftKey||37!==t.keyCode&&39!==t.keyCode||(t.preventDefault(),e.selection.getSel().modify("move",37===t.keyCode?"backward":"forward","lineboundary"))})},N=()=>{e.on("click",e=>{let t=e.target;do{if("A"===t.tagName)return void e.preventDefault()}while(t=t.parentNode)}),e.contentStyles.push(".mce-content-body {-webkit-touch-callout: none}")},A=()=>{e.on("init",()=>{e.dom.bind(e.getBody(),"submit",e=>{e.preventDefault()})})},R=e=>sA([e.dom]).length>0,D=(e,t,n)=>le(sA([n.dom]),0).exists(n=>e>=n.right&&t>=n.top&&t<=n.bottom),T=(e,t,n)=>{t.preventDefault(),e.focus(),e.selection.setRng(n.toRange())},O=x;return BE(e)?(c&&(h(),y(),A(),p(),m&&(E(),_(),N())),l&&(b(),w(),S(),k())):(e.on("keydown",t=>{if(g(t)||t.keyCode!==Tp.BACKSPACE)return;let n=s.getRng();const o=n.startContainer,a=n.startOffset,i=r.getRoot();let l=o;if(n.collapsed&&0===a){for(;l.parentNode&&l.parentNode.firstChild===l&&l.parentNode!==i;)l=l.parentNode;"BLOCKQUOTE"===l.nodeName&&(e.formatter.toggle("blockquote",void 0,l),n=r.createRng(),n.setStart(o,0),n.setEnd(o,0),s.setRng(n))}}),(()=>{const t=e=>{const t=r.create("body"),n=e.cloneContents();return t.appendChild(n),s.serializer.serialize(t,{format:"html"})};e.on("keydown",s=>{const a=s.keyCode;if(!g(s)&&(a===o||a===n)&&e.selection.isEditable()){const n=e.selection.isCollapsed(),i=e.getBody();if(n&&!Ps(e.schema,i))return;if(!n&&!(n=>{const o=t(n),s=r.createRng();return s.selectNode(e.getBody()),o===t(s)})(e.selection.getRng()))return;s.preventDefault(),l_(e,a===o,()=>e.setContent(""))&&(i.firstChild&&r.isBlock(i.firstChild)?e.selection.setCursorLocation(i.firstChild,0):e.selection.setCursorLocation(i,0))}})})(),sn.windowsPhone||e.on("keyup focusin mouseup",t=>{Tp.modifierPressed(t)||(e=>{const t=e.getBody(),n=e.selection.getRng();return n.startContainer===n.endContainer&&n.startContainer===t&&0===n.startOffset&&n.endOffset===t.childNodes.length})(e)||s.normalize()},!0),c&&(h(),y(),e.on("init",()=>{f("DefaultParagraphSeparator",Ed(e))}),A(),v(),a.addNodeFilter("br",e=>{let t=e.length;for(;t--;)"Apple-interchange-newline"===e[t].attr("class")&&e[t].remove()}),d||e.on("mousedown",t=>{const n=un.fromDom(t.target);ji(n)&&(e=>cr(e,e=>Mi(e)||An(e)&&"block"===$o(e,"display")))(n).fold(()=>{Kn(n).each(o=>{D(t.clientX,t.clientY,o)&&Rf(n.dom).each(n=>T(e,t,n))})},o=>{var r,s;(r=$n(o),s=R,ee(r,s).map(e=>e.v)).each(r=>{D(t.clientX,t.clientY,r)&&Nf(n.dom,Kl(o.dom,0)).each(n=>T(e,t,n))})})}),m?(E(),_(),N()):p()),l&&((()=>{const t=On("figcaption");e.on("keydown",n=>{if(n.keyCode===Tp.LEFT||n.keyCode===Tp.RIGHT){const o=un.fromDom(e.selection.getNode());t(o)&&e.selection.isCollapsed()&&Mn(o).bind(t=>0===e.selection.getRng().startOffset&&n.keyCode===Tp.LEFT?zn(t):e.selection.getRng().endOffset===o.dom.textContent?.length&&n.keyCode===Tp.RIGHT?jn(t):I.none()).each(t=>{e.selection.setCursorLocation(t.dom,0)})}})})(),e.on("mousedown",t=>{$e(I.from(t.clientX),I.from(t.clientY),(n,o)=>{const r=e.getDoc().caretPositionFromPoint(n,o),s=r?.offsetNode?.childNodes[r.offset-(r.offset>0?1:0)]||r?.offsetNode;if(C(s)&&"IMG"===(a=s).nodeName&&e.dom.isEditable(a)){const n=s.getBoundingClientRect();t.preventDefault(),e.hasFocus()||e.focus(),e.selection.select(s),t.clientXn.right||t.clientY>n.bottom)&&e.selection.collapse(!1)}var a})}),e.on("keydown",t=>{if(!g(t)&&t.keyCode===n){if(!e.getBody().getElementsByTagName("hr").length)return;if(s.isCollapsed()&&0===s.getRng().startOffset){const e=s.getNode(),n=e.previousSibling;if("HR"===e.nodeName)return r.remove(e),void t.preventDefault();n&&n.nodeName&&"hr"===n.nodeName.toLowerCase()&&(r.remove(n),t.preventDefault())}}}),b(),(()=>{const n=()=>{const n=r.getAttribs(s.getStart().cloneNode(!1));return()=>{const o=s.getStart();o!==e.getBody()&&(r.setAttrib(o,"style",null),t(n,e=>{o.setAttributeNode(e.cloneNode(!0))}))}},o=()=>!s.isCollapsed()&&r.getParent(s.getStart(),r.isBlock)!==r.getParent(s.getEnd(),r.isBlock);e.on("keypress",t=>{let r;return!(!(g(t)||8!==t.keyCode&&46!==t.keyCode)&&o()&&(r=n(),e.getDoc().execCommand("delete",!1),r(),t.preventDefault(),1))}),r.bind(e.getDoc(),"cut",t=>{if(!g(t)&&o()){const t=n();yp.setEditorTimeout(e,()=>{t()})}})})(),w(),e.on("SetContent ExecCommand",e=>{"setcontent"!==e.type&&"mceInsertLink"!==e.command||t(r.select("a:not([data-mce-block])"),e=>{let t=e.parentNode;const n=r.getRoot();if(t?.lastChild===e){for(;t&&!r.isBlock(t);){if(t.parentNode?.lastChild!==t||t===n)return;t=t.parentNode}r.add(t,"br",{"data-mce-bogus":1})}})}),S(),k(),v())),{refreshContentEditable:O,isHidden:()=>{if(!l||e.removed)return!1;const t=e.selection.getSel();return!t||!t.rangeCount||0===t.rangeCount}}};class bP extends Error{url;constructor(e,t){super(e),this.url=t}}const yP={},vP=async(e,t)=>{const n=hi.ScriptLoader.getScriptAttributes(e);return await((e,t,n)=>new Promise((o,r)=>{const s=un.fromTag("script");Co(s,{type:"text/javascript",src:e,...n});const a=()=>{Ao(s)};so(s,"load",()=>{a(),o()}),so(s,"error",()=>{a(),r(new Error(`Failed to load script url: ${e}`))}),go(Gn(t),s)}))(e,t,n).catch(()=>Promise.reject(new bP(`Failed to load component url: ${e}`,e))),e},CP=async e=>{const t=(e=>{const t=e.schema.getComponentUrls();return e.inline?(e=>Se(e,(e,t)=>xe(yP,e).getOrThunk(()=>{if(v(window.customElements.get(t))){const t=vP(e,ao());return yP[e]=t,t}return Promise.resolve(e)}).catch(t=>(delete yP[e],Promise.reject(t)))))(t):((e,t)=>{const n=fe(Ee(e));return V(n,e=>vP(e,un.fromDom(t)))})(t,e.getDoc())})(e),n=Y(await Promise.allSettled(t),e=>"rejected"===e.status);n.length>0&&q(n,t=>{if(t.reason instanceof bP){const{url:n}=t.reason;((e,t)=>{ax(e,"ComponentLoadError",ix("component",t))})(e,n)}})},wP=gi.DOM,SP=e=>e.inline?e.getElement().nodeName.toLowerCase():void 0,EP=e=>we(e,e=>!1===y(e)),xP=e=>{const t=e.options.get,n=e.editorUpload.blobCache;return EP({allow_conditional_comments:t("allow_conditional_comments"),allow_html_data_urls:t("allow_html_data_urls"),allow_svg_data_urls:t("allow_svg_data_urls"),allow_html_in_named_anchor:t("allow_html_in_named_anchor"),allow_script_urls:t("allow_script_urls"),allow_html_in_comments:t("allow_html_in_comments"),allow_mathml_annotation_encodings:t("allow_mathml_annotation_encodings"),allow_unsafe_link_target:t("allow_unsafe_link_target"),convert_unsafe_embeds:t("convert_unsafe_embeds"),convert_fonts_to_spans:t("convert_fonts_to_spans"),extended_mathml_attributes:t("extended_mathml_attributes"),extended_mathml_elements:t("extended_mathml_elements"),fix_list_elements:t("fix_list_elements"),font_size_legacy_values:t("font_size_legacy_values"),forced_root_block:t("forced_root_block"),forced_root_block_attrs:t("forced_root_block_attrs"),preserve_cdata:t("preserve_cdata"),inline_styles:t("inline_styles"),root_name:SP(e),sandbox_iframes:t("sandbox_iframes"),sandbox_iframes_exclusions:cu(e),sanitize:t("xss_sanitization"),validate:!0,blob_cache:n,document:e.getDoc()})},_P=e=>{const t=e.options.get;return EP({custom_elements:t("custom_elements"),extended_valid_elements:t("extended_valid_elements"),invalid_elements:t("invalid_elements"),invalid_styles:t("invalid_styles"),schema:t("schema"),valid_children:t("valid_children"),valid_classes:t("valid_classes"),valid_elements:t("valid_elements"),valid_styles:t("valid_styles"),verify_html:t("verify_html"),padd_empty_block_inline_children:t("format_empty_lines")})},kP=e=>e.inline?e.ui.styleSheetLoader:e.dom.styleSheetLoader,NP=e=>{const t=kP(e),n=Gd(e),o=e.contentCSS,r=()=>{t.unloadAll(o),e.inline||e.ui.styleSheetLoader.unloadAll(n)},s=()=>{e.removed?r():e.on("remove",r)};if(e.contentStyles.length>0){let t="";dn.each(e.contentStyles,e=>{t+=e+"\r\n"}),e.dom.addStyle(t)}const a=Promise.all(((e,t,n)=>{const{pass:o,fail:r}=K(t,e=>tinymce.Resource.has(e)),s=o.map(t=>{const n=tinymce.Resource.get(t);return u(n)?Promise.resolve(kP(e).loadRawCss(t,n)):Promise.resolve()}),a=[...s,kP(e).loadAll(r)];return e.inline?a:a.concat([e.ui.styleSheetLoader.loadAll(n)])})(e,o,n)).then(s).catch(s),i=Kd(e);return i&&((e,t)=>{const n=un.fromDom(e.getBody()),o=Zn(Qn(n)),r=un.fromTag("style");vo(r,"type","text/css"),go(r,un.fromText(t)),go(o,r),e.on("remove",()=>{Ao(r)})})(e,i),a},AP=e=>{!0!==e.removed&&((e=>{BE(e)||e.load({initial:!0,format:"html"}),e.startContent=e.getContent({format:"raw"})})(e),(e=>{e.bindPendingEventDelegates(),e.initialized=!0,(e=>{e.dispatch("Init")})(e),e.focus(!0),(e=>{const t=e.dom.getRoot();e.inline||og(e)&&e.selection.getStart(!0)!==t||Af(t).each(t=>{const n=t.getNode(),o=as(n)?Af(n).getOr(t):t;e.selection.setRng(o.toRange())})})(e),e.nodeChanged({initial:!0});const t=Tm(e);w(t)&&t.call(e,e),(e=>{const t=Bm(e);t&&yp.setEditorTimeout(e,()=>{let n;n=!0===t?e:e.editorManager.get(t),n&&!n.destroyed&&(n.focus(),n.selection.scrollIntoView())},100)})(e),Nx(e)&&Rx(e,!0)})(e))},RP=e=>{const t=e.getElement();let n=e.getDoc();e.inline&&(wP.addClass(t,"mce-content-body"),e.contentDocument=n=document,e.contentWindow=window,e.bodyElement=t,e.contentAreaContainer=t);const o=Yd(e);if(o){const r=e.inline?t:n.documentElement;wP.setAttrib(r,"lang",o)}const r=e.getBody();r.disabled=!0,e.readonly=Cm(e),e._editableRoot=wm(e),!fu(e)&&e.hasEditableRoot()&&(e.inline&&"static"===wP.getStyle(r,"position",!0)&&(r.style.position="relative"),r.contentEditable="true"),r.disabled=!1,e.editorUpload=jx(e),e.schema=Ua(_P(e)),e.dom=gi(n,{keep_values:!0,url_converter:e.convertURL,url_converter_scope:e,update_styles:!0,root_element:e.inline?e.getBody():null,collect:e.inline,schema:e.schema,contentCssCors:Ud(e),referrerPolicy:zd(e),crossOrigin:jd(e),onSetAttrib:t=>{e.dispatch("SetAttrib",t)}}),e.parser=(e=>{const t=pS(xP(e),e.schema);return t.addAttributeFilter("data-mce-src,data-mce-href,data-mce-style",(e,t)=>{for(let n=0;n{const o=e.dom,r="data-mce-"+n;let s=t.length;for(;s--;){const a=t[s];let i=a.attr(n);if(i&&!a.attr(r)){if(0===i.indexOf("data:")||0===i.indexOf("blob:"))continue;"style"===n?(i=o.serializeStyle(o.parseStyle(i),a.name),i.length||(i=null),a.attr(r,i),a.attr(n,i)):"tabindex"===n?(a.attr(r,i),a.attr(n,null)):a.attr(r,e.convertURL(i,n,a.name))}}}),t.addNodeFilter("script",e=>{let t=e.length;for(;t--;){const n=e[t],o=n.attr("type")||"no/type";0!==o.indexOf("mce-")&&n.attr("type","mce-"+o)}}),eu(e)&&t.addNodeFilter("#cdata",t=>{let n=t.length;for(;n--;){const o=t[n];o.type=8,o.name="#comment",o.value="[CDATA["+e.dom.encode(o.value??"")+"]]"}}),t.addNodeFilter("p,h1,h2,h3,h4,h5,h6,div",t=>{let n=t.length;const o=e.schema.getNonEmptyElements();for(;n--;){const e=t[n];e.isEmpty(o)&&0===e.getAll("br").length&&e.append(new xh("br",1))}}),t})(e),e.serializer=$E((e=>{const t=e.options.get;return{...xP(e),..._P(e),...EP({remove_trailing_brs:t("remove_trailing_brs"),pad_empty_with_br:t("pad_empty_with_br"),url_converter:t("url_converter"),url_converter_scope:t("url_converter_scope"),element_format:t("element_format"),entities:t("entities"),entity_encoding:t("entity_encoding"),indent:t("indent"),indent_after:t("indent_after"),indent_before:t("indent_before")})}})(e),e),e.selection=UE(e.dom,e.getWin(),e.serializer,e),e.annotator=Jg(e),e.formatter=Zx(e),e.undoManager=e_(e),e._nodeChangeDispatcher=new yO(e),e._selectionOverrides=MB(e),bO(e),(e=>{const t=Ke(),n=Ae(!1),o=it(t=>{e.dispatch("longpress",{...t,type:"longpress"}),n.set(!0)},400);e.on("touchstart",e=>{rR(e).each(r=>{o.cancel();const s={x:r.clientX,y:r.clientY,target:e.target};o.throttle(e),n.set(!1),t.set(s)})},!0),e.on("touchmove",r=>{o.cancel(),rR(r).each(o=>{t.on(r=>{((e,t)=>{const n=Math.abs(e.clientX-t.x),o=Math.abs(e.clientY-t.y);return n>5||o>5})(o,r)&&(t.clear(),n.set(!1),e.dispatch("longpresscancel"))})})},!0),e.on("touchend touchcancel",r=>{o.cancel(),"touchcancel"!==r.type&&t.get().filter(e=>e.target.isEqualNode(r.target)).each(()=>{n.get()?r.preventDefault():e.dispatch("tap",{...r,type:"tap"})})},!0)})(e),(e=>{(e=>{e.on("click",t=>{e.dom.getParent(t.target,"details")&&t.preventDefault()})})(e),(e=>{e.parser.addNodeFilter("details",t=>{const n=au(e);q(t,e=>{"expanded"===n?e.attr("open","open"):"collapsed"===n&&e.attr("open",null)})}),e.serializer.addNodeFilter("details",t=>{const n=iu(e);q(t,e=>{"expanded"===n?e.attr("open","open"):"collapsed"===n&&e.attr("open",null)})})})(e)})(e),Xm(e)&&(e=>{const t="contenteditable",n=" "+dn.trim(Zm(e))+" ",o=" "+dn.trim(Qm(e))+" ",r=dR(n),s=dR(o),a=Jm(e);a.length>0&&e.on("BeforeSetContent",t=>{((e,t,n)=>{let o=t.length,r=n.content;if("raw"!==n.format){for(;o--;)r=r.replace(t[o],mR(e,r,Qm(e)));n.content=r}})(e,a,t)}),e.parser.addAttributeFilter("class",e=>{let n=e.length;for(;n--;){const o=e[n];r(o)?o.attr(t,"true"):s(o)&&o.attr(t,"false")}}),e.serializer.addAttributeFilter(t,e=>{let n=e.length;for(;n--;){const o=e[n];if(!r(o)&&!s(o))continue;const i=o.attr("data-mce-content");a.length>0&&i?uR(a,i)?(o.name="#text",o.type=3,o.raw=!0,o.value=i):o.remove():o.attr(t,null)}})})(e),BE(e)||((e=>{e.on("mousedown",t=>{t.detail>=3&&(t.preventDefault(),cB(e))})})(e),(e=>{pP(e)})(e));const s=uO(e);((e,t)=>{e.addCommand("delete",()=>{oR(e,t)}),e.addCommand("forwardDelete",()=>{((e,t)=>{nR(e,t,!0).fold(()=>{e.selection.isEditable()&&iy(e)},P),Dk(e)&&x_(e.dom,e.getBody())})(e,t)})})(e,s),(e=>{e.on("NodeChange",()=>(e=>{const t=e.dom,n=e.selection,o=e.schema,r=o.getBlockElements(),s=n.getStart(),a=e.getBody();let i,l,c=null;const d=Ed(e);if(!s||!es(s))return;const m=a.nodeName.toLowerCase();if(!o.isValidChild(m,d.toLowerCase())||((e,t,n)=>H(db(un.fromDom(n),un.fromDom(t)),t=>sR(e,t.dom)))(r,a,s))return;if(a.firstChild===a.lastChild&&ps(a.firstChild))return i=lR(e),i.appendChild(qi().dom),a.replaceChild(i,a.firstChild),e.selection.setCursorLocation(i,0),void e.nodeChanged();let u=a.firstChild;for(;u;)if(es(u)&&Ys(o,u),aR(o,u)){if(iR(r,u)){l=u,u=u.nextSibling,t.remove(l);continue}if(!i){if(!c&&e.hasFocus()&&(c=Xy(e.selection.getRng(),()=>document.createElement("span"))),!u.parentNode){u=null;break}i=lR(e),a.insertBefore(i,u)}l=u,u=u.nextSibling,i.appendChild(l)}else i=null,u=u.nextSibling;c&&(e.selection.setRng(Qy(c)),e.nodeChanged())})(e))})(e),(e=>{const t=e.dom,n=Ed(e),o=em(e)??"",r=(s,a)=>{if((e=>{if(o_(e)){const t=e.keyCode;return!r_(e)&&(Tp.metaKeyPressed(e)||e.altKey||t>=112&&t<=123||$(t_,t))}return!1})(s))return;const i=e.getBody(),l=!(e=>o_(e)&&!(r_(e)||"keyup"===e.type&&229===e.keyCode))(s)&&((e,t,n)=>{if(e.isEmpty(t,void 0,{skipBogus:!1,includeZwsp:!0})){const o=t.firstElementChild;return!o||!e.getStyle(t.firstElementChild,"padding-left")&&!e.getStyle(t.firstElementChild,"padding-right")&&n===o.nodeName.toLowerCase()}return!1})(t,i,n);(""!==t.getAttrib(i,n_)!==l||a)&&(t.setAttrib(i,n_,l?o:null),((e,t)=>{e.dispatch("PlaceholderToggle",{state:t})})(e,l),e.on(l?"keydown":"keyup",r),e.off(l?"keyup":"keydown",r))};ot(o)&&e.on("init",t=>{r(t,!0),e.on("change SetContent ExecCommand",r),e.on("paste",t=>yp.setEditorTimeout(e,()=>r(t)))})})(e),nB(e,s);const a=(e=>{const t=e;return(e=>xe(e.plugins,"rtc").bind(e=>I.from(e.setup)))(e).fold(()=>(t.rtcInstance=OE(e),I.none()),e=>(t.rtcInstance=(()=>{const e=N(null),t=N("");return{init:{bindEvents:x},undoManager:{beforeChange:x,add:e,undo:e,redo:e,clear:x,reset:x,hasUndo:L,hasRedo:L,transact:e,ignore:x,extra:x},formatter:{match:L,matchAll:N([]),matchNode:N(void 0),canApply:L,closest:t,apply:x,remove:x,toggle:x,formatChanged:N({unbind:x})},editor:{getContent:t,setContent:N({content:"",html:""}),insertContent:N(""),addVisual:x},selection:{getContent:t},autocompleter:{addDecoration:x,removeDecoration:x},raw:{getModel:N(I.none())}}})(),I.some(()=>e().then(e=>(t.rtcInstance=(e=>{const t=e=>f(e)?e:{},{init:n,undoManager:o,formatter:r,editor:s,selection:a,autocompleter:i,raw:l}=e;return{init:{bindEvents:n.bindEvents},undoManager:{beforeChange:o.beforeChange,add:o.add,undo:o.undo,redo:o.redo,clear:o.clear,reset:o.reset,hasUndo:o.hasUndo,hasRedo:o.hasRedo,transact:(e,t,n)=>o.transact(n),ignore:(e,t)=>o.ignore(t),extra:(e,t,n,r)=>o.extra(n,r)},formatter:{match:(e,n,o,s)=>r.match(e,t(n),s),matchAll:r.matchAll,matchNode:r.matchNode,canApply:e=>r.canApply(e),closest:e=>r.closest(e),apply:(e,n,o)=>r.apply(e,t(n)),remove:(e,n,o,s)=>r.remove(e,t(n)),toggle:(e,n,o)=>r.toggle(e,t(n)),formatChanged:(e,t,n,o,s)=>r.formatChanged(t,n,o,s)},editor:{getContent:e=>s.getContent(e),setContent:(e,t)=>({content:s.setContent(e,t),html:""}),insertContent:(e,t)=>(s.insertContent(e),""),addVisual:s.addVisual},selection:{getContent:(e,t)=>a.getContent(t)},autocompleter:{addDecoration:i.addDecoration,removeDecoration:i.removeDecoration},raw:{getModel:()=>I.some(l.getRawModel())}}})(e),e.rtc.isRemote)))))})(e);(e=>{const t=e.getDoc(),n=e.getBody();(e=>{e.dispatch("PreInit")})(e),Pm(e)||(t.body.spellcheck=!1,wP.setAttrib(n,"spellcheck","false")),e.quirks=hP(e),(e=>{e.dispatch("PostRender")})(e);const o=Xd(e);void 0!==o&&(n.dir=o);const r=Lm(e);r&&((e,t)=>{((e,t)=>{e.on("BeforeSetContent",e=>{q(t,t=>{e.content=e.content.replace(t,e=>"\x3c!--mce:protected "+escape(e)+"--\x3e")})})})(e,t),((e,t)=>{e.serializer.addNodeFilter("#comment",e=>{let n=e.length;for(;n--;){const o=e[n],r=o.value;if(0===r?.indexOf("mce:protected ")){const e=unescape(r).substr(14);H(t,t=>{const n=e.match(t);return null!==n&&n[0].length===e.length})?(o.name="#text",o.type=3,o.raw=!0,o.value=e):o.remove()}}})})(e,t)})(e,r),e.on("SetContent",()=>{e.addVisual(e.getBody())}),e.on("compositionstart compositionend",t=>{e.composing="compositionstart"===t.type})})(e),(e=>{CP(e)})(e),a.fold(()=>{const t=(e=>{let t=!1;const n=setTimeout(()=>{t||e.setProgressState(!0)},500);return()=>{clearTimeout(n),t=!0,e.setProgressState(!1)}})(e);NP(e).then(()=>{AP(e),t()})},t=>{e.setProgressState(!0),NP(e).then(()=>{t().then(t=>{e.setProgressState(!1),AP(e),ME(e)},t=>{e.notificationManager.open({type:"error",text:String(t)}),AP(e),ME(e)})})})},DP=gi.DOM,TP=(e,t)=>{((e,t)=>{const n=Rm(e),o=e.translate(n),r=So(un.fromDom(e.getElement()),"tabindex").bind(st),s=((e,t,n,o)=>{const r=un.fromTag("iframe");return o.each(e=>vo(r,"tabindex",e)),Co(r,n),Co(r,{id:e+"_ifr",frameBorder:"0",allowTransparency:"true",...sn.browser.isFirefox()?{title:t}:{}}),yr(r,"tox-edit-area__iframe"),r})(e.id,o,hd(e),r).dom;s.onload=()=>{s.onload=null,e.dispatch("load")},e.contentAreaContainer=t.iframeContainer,e.iframeElement=s,e.iframeHTML=(e=>{let t=bd(e)+"";yd(e)!==e.editorManager.documentBaseURL&&(t+=''),t+='';const n=vd(e),o=Cd(e),r=e.translate(Rm(e)),s=sn.browser.isFirefox()?"":`aria-label="${r}"`;return wd(e)&&(t+=''),t+=`
    `,t})(e),DP.add(t.iframeContainer,s)})(e,t),t.editorContainer&&(t.editorContainer.style.display=e.orgDisplay,e.hidden=DP.isHidden(t.editorContainer)),e.getElement().style.display="none",DP.setAttrib(e.id,"aria-hidden","true"),e.getElement().style.visibility=e.orgVisibility,(e=>{const t=e.iframeElement,n=()=>{e.contentDocument=t.contentDocument,RP(e)};if(ou(e)||sn.browser.isFirefox()){const t=e.getDoc();t.open(),t.write(e.iframeHTML),t.close(),n()}else{const o=so(un.fromDom(t),"load",()=>{o.unbind(),n()});t.srcdoc=e.iframeHTML}})(e)},OP=gi.DOM,BP=(e,t)=>({editorContainer:e,iframeContainer:t,api:{}}),PP=e=>{const t=e.getElement();return e.inline?BP(null):(e=>{const t=OP.create("div");return OP.insertAfter(t,e),BP(t,t)})(t)},LP=async e=>{e.dispatch("ScriptsLoaded"),(e=>{const t=dn.trim(Bd(e)),n=e.ui.registry.getAll().icons,o={...WE.get("default").icons,...WE.get(t).icons};he(o,(t,o)=>{_e(n,o)||e.ui.registry.addIcon(o,t)})})(e),(e=>{const t=t=>{t.keyCode!==Tp.ESC||t.defaultPrevented||(e=>e.dispatch("CloseActiveTooltips"))(e).isDefaultPrevented()&&t.preventDefault()};document.addEventListener("keyup",t),e.inline||e.on("keyup",t),e.on("remove",()=>{document.removeEventListener("keyup",t),e.inline||e.off("keyup",t)})})(e),(e=>{const t=om(e);if(u(t)){const n=nx.get(t);e.theme=n(e,nx.urls[t])||{},w(e.theme.init)&&e.theme.init(e,nx.urls[t]||e.editorManager.documentBaseURL.replace(/\/$/,""))}else e.theme={}})(e),(e=>{const t=sm(e),n=KE.get(t);e.model=n(e,KE.urls[t])})(e),(e=>{Sx.init(e)})(e),(e=>{const t=[];q(Em(e),n=>{((e,t,n)=>{const o=tx.get(n),r=tx.urls[n]||e.editorManager.documentBaseURL.replace(/\/$/,"");if(n=dn.trim(n),o&&-1===dn.inArray(t,n)){if(e.plugins[n])return;try{const s=o(e,r)||{};e.plugins[n]=s,w(s.init)&&(s.init(e,r),t.push(n))}catch(t){((e,t,n)=>{const o=Ci.translate(["Failed to initialize plugin: {0}",t]);nd(e,"PluginLoadError",{message:o}),lx(o,n),sx(e,o)})(e,n,t)}}})(e,t,(e=>e.replace(/^\-/,""))(n))})})(e);const t=await(e=>{const t=e.getElement();return e.orgDisplay=t.style.display,u(om(e))?(e=>{const t=e.theme.renderUI;return t?t():PP(e)})(e):w(om(e))?(e=>{const t=e.getElement(),n=om(e)(e,t);return n.editorContainer.nodeType&&(n.editorContainer.id=n.editorContainer.id||e.id+"_parent"),n.iframeContainer&&n.iframeContainer.nodeType&&(n.iframeContainer.id=n.iframeContainer.id||e.id+"_iframecontainer"),n.height=n.iframeHeight?n.iframeHeight:t.offsetHeight,n})(e):PP(e)})(e);((e,t)=>{const n={show:I.from(t.show).getOr(x),hide:I.from(t.hide).getOr(x),isEnabled:I.from(t.isEnabled).getOr(M),setEnabled:n=>{n&&("readonly"===e.mode.get()||Nx(e))||I.from(t.setEnabled).each(e=>e(n))}};e.ui={...e.ui,...n}})(e,I.from(t.api).getOr({})),e.editorContainer=t.editorContainer,(e=>{e.contentCSS=e.contentCSS.concat((e=>Px(e,Wd(e)))(e),(e=>Px(e,Gd(e)))(e))})(e),e.inline?RP(e):TP(e,{editorContainer:t.editorContainer,iframeContainer:t.iframeContainer})},MP=gi.DOM,IP=e=>"-"===e.charAt(0),FP=(e,t,n)=>I.from(t).filter(e=>ot(e)&&!WE.has(e)).map(t=>({url:`${e.editorManager.baseURL}/icons/${t}/icons${n}.js`,name:I.some(t)})),UP=(e,t)=>{const n=hi.ScriptLoader,o=()=>{!e.removed&&(e=>{const t=om(e);return!u(t)||C(nx.get(t))})(e)&&(e=>{const t=sm(e);return C(KE.get(t))})(e)&&LP(e)};((e,t)=>{const n=om(e);if(u(n)&&!IP(n)&&!_e(nx.urls,n)){const o=rm(e),r=o?e.documentBaseURI.toAbsolute(o):`themes/${n}/theme${t}.js`;nx.load(n,r).catch(()=>{((e,t,n)=>{ax(e,"ThemeLoadError",ix("theme",t,n))})(e,r,n)})}})(e,t),((e,t)=>{const n=sm(e);if("plugin"!==n&&!_e(KE.urls,n)){const o=am(e),r=u(o)?e.documentBaseURI.toAbsolute(o):`models/${n}/model${t}.js`;KE.load(n,r).catch(()=>{((e,t,n)=>{ax(e,"ModelLoadError",ix("model",t,n))})(e,r,n)})}})(e,t),((e,t)=>{Sx.load(e,t)})(e,t),((e,t)=>{const n=$d(t),o=Hd(t);if(!Ci.hasCode(n)&&"en"!==n){const r=ot(o)?o:`${t.editorManager.baseURL}/langs/${n}.js`;e.add(r).catch(()=>{((e,t,n)=>{ax(e,"LanguageLoadError",ix("language",t,n))})(t,r,n)})}})(n,e),((e,t,n)=>{const o=FP(t,"default",n),r=(e=>I.from(Pd(e)).filter(ot).map(e=>({url:e,name:I.none()})))(t).orThunk(()=>FP(t,Bd(t),""));q((e=>{const t=[],n=e=>{t.push(e)};for(let t=0;t{e.add(n.url).catch(()=>{((e,t,n)=>{ax(e,"IconsLoadError",ix("icons",t,n))})(t,n.url,n.name.getOrUndefined())})})})(n,e,t),((e,t)=>{const n=(t,n)=>{"licensekeymanager"!==t&&tx.load(t,n).catch(()=>{((e,t,n)=>{ax(e,"PluginLoadError",ix("plugin",t,n))})(e,n,t)})};he(xm(e),(t,o)=>{n(o,t),e.options.set("plugins",Em(e).concat(o))}),q(Em(e),e=>{!(e=dn.trim(e))||tx.urls[e]||IP(e)||n(e,`plugins/${e}/plugin${t}.js`)})})(e,t),n.loadQueue().then(o,o)},zP=["#E41B60","#AD1457","#1939EC","#001CB5","#648000","#465B00","#006CE7","#0054B4","#00838F","#006064","#00866F","#004D40","#51742F","#385021","#CF4900","#A84600","#CC0000","#6A1B9A","#9C27B0","#6A00AB","#3041BA","#0A1877","#774433","#452B24","#607D8B","#455A64"],jP=(e,t={size:36})=>{return n=(e=>{if(Intl.Segmenter){const t=(new Intl.Segmenter).segment(e)[Symbol.iterator]();return`${t.next().value?.segment}`}return e.trim()[0]})(e.name),o=(e=>{const t=((e,t)=>{let n=5381;for(let t=0;t>>0)%(t+1)})(e??"",zP.length-1);return zP[t]})(e.id),r=t.size,"data:image/svg+xml,"+encodeURIComponent(((e,t,n)=>{const o=n/2;return``+e+""})(n,o,r));var n,o,r},$P=Mc([jc("id","id",{tag:"required",process:{}},kc()),Wc("name"),Wc("avatar"),(e=>jc(e,e,{tag:"option",process:{}},kc()))("custom")]),HP=e=>{const t={};return he(e,(e,n)=>{e.each(e=>{t[n]=e})}),t},VP=e=>{if(!Array.isArray(e))throw new Error("fetch_users must return an array");const t=V(e,e=>Uc("Invalid user object",$P,e)),{errors:n,values:o}=qe(t);if(n.length>0){const e=V(n,(e,t)=>`User at index ${t}: ${zc(e)}`);console.warn("User validation errors:\n"+e.join("\n"))}return V(o,e=>{const{id:t,name:n,avatar:o,...r}=e;return{id:t,name:n.getOr(t),avatar:o.getOr(jP({id:t,name:n.getOr(t)})),...HP(r)}})},qP=Xt().deviceType,WP=qP.isPhone(),KP=qP.isTablet(),YP=e=>{if(v(e))return[];{const t=p(e)?e:e.split(/[ ,]/),n=V(t,et);return Y(n,ot)}},GP=(e,t)=>{const n=(t=>{const n={},o={};return Ce(t,(t,n)=>$(e,n),ve(n),ve(o)),{t:n,f:o}})(t);return o=n.t,r=n.f,{sections:N(o),options:N(r)};var o,r},XP=(e,t)=>_e(e.sections(),t),QP=(e,t)=>({table_grid:!1,object_resizing:!1,resize:!1,toolbar_mode:xe(e,"toolbar_mode").getOr("scrolling"),toolbar_sticky:!1,...t?{menubar:!1}:{}}),ZP=(e,t)=>{const n=t.external_plugins??{};return e&&e.external_plugins?dn.extend({},e.external_plugins,n):n},JP=(e,t,n,o,r)=>{const s=e?{mobile:QP(r.mobile??{},t)}:{},a=GP(["mobile"],Fe(s,r)),i=dn.extend(n,o,a.options(),((e,t)=>e&&XP(t,"mobile"))(e,a)?((e,t,n={})=>{const o=e.sections(),r=xe(o,t).getOr({});return dn.extend({},n,r)})(a,"mobile"):{},{external_plugins:ZP(o,a.options())});return((e,t,n,o)=>{const r=YP(n.forced_plugins),s=YP(o.plugins),a=((e,t)=>XP(e,t)?e.sections()[t]:{})(t,"mobile"),i=((e,t,n,o)=>e&&XP(t,"mobile")?o:n)(e,t,s,a.plugins?YP(a.plugins):s),l=((e,t)=>[...YP(e),...YP(t)])(r,i);return dn.extend(o,{forced_plugins:r,plugins:l})})(e,a,o,i)},eL=e=>{(e=>{const t=t=>()=>{q("left,center,right,justify".split(","),n=>{t!==n&&e.formatter.remove("align"+n)}),"none"!==t&&(t=>{e.formatter.toggle(t,void 0),e.nodeChanged()})("align"+t)};e.editorCommands.addCommands({JustifyLeft:t("left"),JustifyCenter:t("center"),JustifyRight:t("right"),JustifyFull:t("justify"),JustifyNone:t("none")})})(e),(e=>{const t=t=>()=>{const n=e.selection,o=n.isCollapsed()?[e.dom.getParent(n.getNode(),e.dom.isBlock)]:n.getSelectedBlocks();return H(o,n=>C(e.formatter.matchNode(n,t)))};e.editorCommands.addCommands({JustifyLeft:t("alignleft"),JustifyCenter:t("aligncenter"),JustifyRight:t("alignright"),JustifyFull:t("alignjustify")},"state")})(e)},tL=(e,t)=>{const n=e.selection,o=e.dom;return/^ | $/.test(t)?((e,t,n,o)=>{const r=un.fromDom(e.getRoot());return n=Bb(r,Kl.fromRangeStart(t),o)?n.replace(/^ /," "):n.replace(/^ /," "),Pb(r,Kl.fromRangeEnd(t),o)?n.replace(/( | )()?$/," "):n.replace(/ ()?$/," ")})(o,n.getRng(),t,e.schema):t},nL=(e,t)=>{if(e.selection.isEditable()){const{content:n,details:o}=(e=>{if("string"!=typeof e){const t=dn.extend({paste:e.paste,data:{paste:e.paste}},e);return{content:e.content,details:t}}return{content:e,details:{}}})(t);wS(e,{...o,content:tL(e,n),format:"html",set:!1,selection:!0}).each(t=>{const n=((e,t,n)=>PE(e).editor.insertContent(t,n))(e,t.content,o);SS(e,n,t),e.addVisual()})}},oL={"font-size":"size","font-family":"face"},rL=On("font"),sL=e=>(t,n)=>I.from(n).map(un.fromDom).filter(An).bind(n=>((e,t,n)=>Or(un.fromDom(n),t=>(t=>Vo(t,e).orThunk(()=>rL(t)?xe(oL,e).bind(e=>So(t,e)):I.none()))(t),e=>vn(un.fromDom(t),e)))(e,t,n.dom).or(((e,t)=>I.from(gi.DOM.getStyle(t,e,!0)))(e,n.dom))).getOr(""),aL=sL("font-size"),iL=_(e=>e.replace(/[\'\"\\]/g,"").replace(/,\s+/g,","),sL("font-family")),lL=e=>Af(e.getBody()).bind(e=>{const t=e.container();return I.from(cs(t)?t.parentNode:t)}),cL=(e,t)=>((e,t)=>(e=>I.from(e.selection.getRng()).bind(t=>{const n=e.getBody();return t.startContainer===n&&0===t.startOffset?I.none():I.from(e.selection.getStart(!0))}))(e).orThunk(D(lL,e)).map(un.fromDom).filter(An).bind(t))(e,k(I.some,t)),dL=(e,t)=>{if(/^[0-9.]+$/.test(t)){const n=parseInt(t,10);if(n>=1&&n<=7){const o=(e=>dn.explode(e.options.get("font_size_style_values")))(e),r=(e=>dn.explode(e.options.get("font_size_classes")))(e);return r.length>0?r[n-1]||t:o[n-1]||t}return t}return t},mL=e=>{const t=e.split(/\s*,\s*/);return V(t,e=>-1===e.indexOf(" ")||Qe(e,'"')||Qe(e,"'")?e:`'${e}'`).join(",")},uL=e=>{e.editorCommands.addCommands({Indent:()=>{(e=>{ZA(e,"indent")})(e)},Outdent:()=>{JA(e)}}),e.editorCommands.addCommands({Outdent:()=>GA(e),Indent:()=>(e=>!e.mode.isReadOnly()&&(e=>bu(e).forall(t=>{const n=e.selection.getSelectedBlocks();return H(n,e=>fr(un.fromDom(e),"li").forall(e=>{return(n=e,_r(n,e=>bn(e,"ol,ul"),void 0)).length<=t;var n}))}))(e))(e)},"state")},fL=(e,t)=>{if(e.mode.isReadOnly())return;const n=e.dom,o=e.selection.getRng(),r=t?e.selection.getStart():e.selection.getEnd(),s=t?o.startContainer:o.endContainer,a=uT(n,s);if(!a||!a.isContentEditable)return;const i=t?mo:uo,l=Ed(e);((e,t,n,o)=>{const r=e.dom,s=e=>r.isBlock(e)&&e.parentElement===n,a=s(t)?t:r.getParent(o,s,n);return I.from(a).map(un.fromDom)})(e,r,a,s).each(t=>{const n=hT(e,s,t.dom,a,!1,l);i(t,un.fromDom(n)),e.selection.setCursorLocation(n,0),e.dispatch("NewBlock",{newBlock:n}),a_(e,"insertParagraph")})},gL=e=>{eL(e),(e=>{e.editorCommands.addCommands({"Cut,Copy,Paste":t=>{const n=e.getDoc();let o;try{n.execCommand(t)}catch{o=!0}if("paste"!==t||n.queryCommandEnabled(t)||(o=!0),o||!n.queryCommandSupported(t)){let t=e.translate("Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X/C/V keyboard shortcuts instead.");(sn.os.isMacOS()||sn.os.isiOS())&&(t=t.replace(/Ctrl\+/g,"\u2318+")),e.notificationManager.open({text:t,type:"error"})}}})})(e),(e=>{e.editorCommands.addCommands({mceAddUndoLevel:()=>{e.undoManager.add()},mceEndUndoLevel:()=>{e.undoManager.add()},Undo:()=>{e.undoManager.undo()},Redo:()=>{e.undoManager.redo()}})})(e),(e=>{e.editorCommands.addCommands({mceSelectNodeDepth:(t,n,o)=>{let r=0;e.dom.getParent(e.selection.getNode(),t=>!es(t)||r++!==o||(e.selection.select(t),!1),e.getBody())},mceSelectNode:(t,n,o)=>{e.selection.select(o)},selectAll:()=>{const t=e.dom.getParent(e.selection.getStart(),ys);if(t){const n=e.dom.createRng();n.selectNodeContents(t),e.selection.setRng(n)}}})})(e),(e=>{e.editorCommands.addCommands({mceCleanup:()=>{const t=e.selection.getBookmark();e.setContent(e.getContent()),e.selection.moveToBookmark(t)},insertImage:(t,n,o)=>{nL(e,e.dom.createHTML("img",{src:o}))},insertHorizontalRule:()=>{e.execCommand("mceInsertContent",!1,"
    ")},insertText:(t,n,o)=>{nL(e,e.dom.encode(o))},insertHTML:(t,n,o)=>{nL(e,o)},mceInsertContent:(t,n,o)=>{nL(e,o)},mceSetContent:(t,n,o)=>{e.setContent(o)},mceReplaceContent:(t,n,o)=>{e.execCommand("mceInsertContent",!1,o.replace(/\{\$selection\}/g,e.selection.getContent({format:"text"})))},mceNewDocument:()=>{e.setContent(zm(e))}})})(e),(e=>{const t=(t,n,o)=>{if(e.mode.isReadOnly())return;const r=u(o)?{href:o}:o,s=e.dom.getParent(e.selection.getNode(),"a");f(r)&&u(r.href)&&(r.href=r.href.replace(/ /g,"%20").replace(/&/g,"&"),s&&r.href||e.formatter.remove("link"),r.href&&e.formatter.apply("link",r,s))};e.editorCommands.addCommands({unlink:()=>{if(e.selection.isEditable()){if(e.selection.isCollapsed()){const t=e.dom.getParent(e.selection.getStart(),"a");return void(t&&e.dom.remove(t,!0))}e.formatter.remove("link")}},mceInsertLink:t,createLink:t})})(e),uL(e),(e=>{e.editorCommands.addCommands({InsertNewBlockBefore:()=>{(e=>{fL(e,!0)})(e)},InsertNewBlockAfter:()=>{(e=>{fL(e,!1)})(e)}})})(e),(e=>{e.editorCommands.addCommands({insertParagraph:()=>{GT(NT,e)},mceInsertNewLine:(t,n,o)=>{XT(e,o)},InsertLineBreak:(t,n,o)=>{GT(LT,e)}})})(e),(e=>{(e=>{const t=(t,n)=>{e.formatter.toggle(t,n),e.nodeChanged()};e.editorCommands.addCommands({"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":e=>{t(e)},"ForeColor,HiliteColor":(e,n,o)=>{t(e,{value:o})},BackColor:(e,n,o)=>{t("hilitecolor",{value:o})},FontName:(t,n,o)=>{((e,t)=>{const n=dL(e,t);e.formatter.toggle("fontname",{value:mL(n)}),e.nodeChanged()})(e,o)},FontSize:(t,n,o)=>{((e,t)=>{e.formatter.toggle("fontsize",{value:dL(e,t)}),e.nodeChanged()})(e,o)},LineHeight:(t,n,o)=>{((e,t)=>{e.formatter.toggle("lineheight",{value:String(t)}),e.nodeChanged()})(e,o)},Lang:(e,n,o)=>{t(e,{value:o.code,customValue:o.customCode??null})},RemoveFormat:t=>{e.formatter.remove(t)},mceBlockQuote:()=>{t("blockquote")},FormatBlock:(e,n,o)=>{t(u(o)?o:"p")},mceToggleFormat:(e,n,o)=>{t(o)}})})(e),(e=>{const t=t=>e.formatter.match(t);e.editorCommands.addCommands({"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":e=>t(e),mceBlockQuote:()=>t("blockquote")},"state"),e.editorCommands.addQueryValueHandler("FontName",()=>(e=>cL(e,t=>iL(e.getBody(),t.dom)).getOr(""))(e)),e.editorCommands.addQueryValueHandler("FontSize",()=>(e=>cL(e,t=>aL(e.getBody(),t.dom)).getOr(""))(e)),e.editorCommands.addQueryValueHandler("LineHeight",()=>(e=>cL(e,t=>{const n=un.fromDom(e.getBody()),o=Or(t,e=>Vo(e,"line-height"),D(vn,n));return o.getOrThunk(()=>{const e=parseFloat($o(t,"line-height")),n=parseFloat($o(t,"font-size"));return String(e/n)})}).getOr(""))(e))})(e)})(e),(e=>{e.editorCommands.addCommands({mceRemoveNode:(t,n,o)=>{const r=o??e.selection.getNode();if(r!==e.getBody()){const t=e.selection.getBookmark();e.dom.remove(r,!0),e.selection.moveToBookmark(t)}},mcePrint:()=>{e.getWin().print()},mceFocus:(t,n,o)=>{((e,t)=>{e.removed||(t?Dp(e):(e=>{const t=e.selection,n=e.getBody();let o=t.getRng();e.quirks.refreshContentEditable();const r=e=>{hp(e).each(t=>{e.selection.setRng(t),o=t})};!Ap(e)&&e.hasEditableRoot()&&r(e);const s=((e,t)=>e.dom.getParent(t,t=>"true"===e.dom.getContentEditable(t)))(e,t.getNode());if(s&&e.dom.isChildOf(s,n))return((e,t)=>null!==e.dom.getParent(t,t=>"false"===e.dom.getContentEditable(t)))(e,s)||Np(n),Np(s),e.hasEditableRoot()||r(e),kp(e,o),void Dp(e);e.inline||(sn.browser.isOpera()||Np(n),e.getWin().focus()),(sn.browser.isFirefox()||e.inline)&&(Np(n),kp(e,o)),Dp(e)})(e))})(e,!0===o)},mceToggleVisualAid:()=>{e.hasVisual=!e.hasVisual,e.addVisual()}})})(e)},pL=["toggleview"],hL=e=>$(pL,e.toLowerCase());class bL{editor;commands={state:{},exec:{},value:{}};constructor(e){this.editor=e}execCommand(e,t=!1,n,o){const r=this.editor,s=e.toLowerCase(),a=o?.skip_focus;if(r.removed)return!1;if("mcefocus"!==s&&(/^(mceAddUndoLevel|mceEndUndoLevel)$/i.test(s)||a?(e=>{hp(e).each(t=>e.selection.setRng(t))})(r):r.focus()),r.dispatch("BeforeExecCommand",{command:e,ui:t,value:n}).isDefaultPrevented())return!1;const i=this.commands.exec[s];return!!w(i)&&(i(s,t,n,o),r.dispatch("ExecCommand",{command:e,ui:t,value:n,args:o}),!0)}queryCommandState(e){if(!hL(e)&&this.editor.quirks.isHidden()||this.editor.removed)return!1;const t=e.toLowerCase(),n=this.commands.state[t];return!!w(n)&&n(t)}queryCommandValue(e){if(!hL(e)&&this.editor.quirks.isHidden()||this.editor.removed)return"";const t=e.toLowerCase(),n=this.commands.value[t];return w(n)?n(t):""}addCommands(e,t="exec"){const n=this.commands;he(e,(e,o)=>{q(o.toLowerCase().split(","),o=>{n[t][o]=e})})}addCommand(e,t,n){const o=e.toLowerCase();this.commands.exec[o]=(e,o,r,s)=>t.call(n??this.editor,o,r,s)}removeCommand(e,t){const n=e.toLowerCase();t?delete this.commands[t][n]:(delete this.commands.exec[n],delete this.commands.state[n],delete this.commands.value[n])}queryCommandSupported(e){const t=e.toLowerCase();return!!this.commands.exec[t]}addQueryStateHandler(e,t,n){this.commands.state[e.toLowerCase()]=()=>t.call(n??this.editor)}addQueryValueHandler(e,t,n){this.commands.value[e.toLowerCase()]=()=>t.call(n??this.editor)}}const yL=dn.makeMap("focus blur focusin focusout click dblclick mousedown mouseup mousemove mouseover beforepaste paste cut copy selectionchange mouseout mouseenter mouseleave wheel keydown keypress keyup input beforeinput contextmenu dragstart dragend dragover draggesture dragdrop drop drag submit compositionstart compositionend compositionupdate touchstart touchmove touchend touchcancel"," ");class vL{static isNative(e){return!!yL[e.toLowerCase()]}settings;scope;toggleEvent;bindings={};constructor(e){this.settings=e||{},this.scope=this.settings.scope||this,this.toggleEvent=this.settings.toggleEvent||L}fire(e,t){return this.dispatch(e,t)}dispatch(e,t){const n=e.toLowerCase(),o=Za(n,t??{},this.scope);this.settings.beforeFire&&this.settings.beforeFire(o);const r=this.bindings[n];if(r)for(let e=0,t=r.length;e{this.toggleEvent(t,!1),delete this.bindings[t]}),this;if(s){if(t){const e=K(s,e=>e.func===t);s=e.fail,this.bindings[r]=s,q(e.pass,e=>{e.removed=!0})}else s.length=0;s.length||(this.toggleEvent(e,!1),delete this.bindings[r])}}}else he(this.bindings,(e,t)=>{this.toggleEvent(t,!1)}),this.bindings={};return this}once(e,t,n){return this.on(e,t,n,{once:!0})}has(e){e=e.toLowerCase();const t=this.bindings[e];return!(!t||0===t.length)}}const CL=e=>(e._eventDispatcher||(e._eventDispatcher=new vL({scope:e,toggleEvent:(t,n)=>{vL.isNative(t)&&e.toggleNativeEvent&&e.toggleNativeEvent(t,n)}})),e._eventDispatcher),wL={fire(e,t,n){return LS("fire"),this.dispatch(e,t,n)},dispatch(e,t,n){const o=this;if(o.removed&&"remove"!==e&&"detach"!==e)return Za(e.toLowerCase(),t??{},o);const r=CL(o).dispatch(e,t);if(!1!==n&&o.parent){let t=o.parent();for(;t&&!r.isPropagationStopped();)t.dispatch(e,r,!1),t=t.parent?t.parent():void 0}return r},on(e,t,n){return CL(this).on(e,t,n)},off(e,t){return CL(this).off(e,t)},once(e,t){return CL(this).once(e,t)},hasEventListeners(e){return CL(this).has(e)}},SL=gi.DOM;let EL;const xL=(e,t)=>{if("selectionchange"===t)return e.getDoc();if(!e.inline&&/^(?:mouse|touch|click|contextmenu|drop|dragover|dragend)/.test(t))return e.getDoc().documentElement;const n=tm(e);return n?(e.eventRoot||(e.eventRoot=SL.select(n)[0]),e.eventRoot):e.getBody()},_L=(e,t,n)=>{(e=>!e.hidden&&!Nx(e))(e)?e.dispatch(t,n):Nx(e)&&((e,t)=>{if((e=>"click"===e.type)(t)&&!Tp.metaKeyPressed(t)){const n=un.fromDom(t.target);((e,t)=>fr(t,"a",t=>vn(t,un.fromDom(e.getBody()))).bind(e=>So(e,"href")))(e,n).fold(()=>{Ox(e,n)&&t.preventDefault()},n=>{if(t.preventDefault(),/^#/.test(n)){const t=Ge(n,"#"),o=e.dom.select(`[id="${t}"],[name="${t}"]`);o.length&&e.selection.scrollIntoView(o[0],!0)}else window.open(n,"_blank","rel=noopener noreferrer,menubar=yes,toolbar=yes,location=yes,status=yes,resizable=yes,scrollbars=yes")})}else(e=>$(Tx,e.type))(t)&&e.dispatch(t.type,t)})(e,n)},kL=(e,t)=>{if(e.delegates||(e.delegates={}),e.delegates[t]||e.removed)return;const n=xL(e,t);if(tm(e)){if(EL||(EL={},e.editorManager.on("removeEditor",()=>{e.editorManager.activeEditor||EL&&(he(EL,(t,n)=>{e.dom.unbind(xL(e,n))}),EL=null)})),EL[t])return;const o=n=>{const o=n.target,r=e.editorManager.get();let s=r.length;for(;s--;){const e=r[s].getBody();(e===o||SL.isChildOf(o,e))&&_L(r[s],t,n)}};EL[t]=o,SL.bind(n,t,o)}else{const o=n=>{_L(e,t,n)};SL.bind(n,t,o),e.delegates[t]=o}},NL={...wL,bindPendingEventDelegates(){const e=this;dn.each(e._pendingNativeEvents,t=>{kL(e,t)})},toggleNativeEvent(e,t){const n=this;"focus"!==e&&"blur"!==e&&(n.removed||(t?n.initialized?kL(n,e):n._pendingNativeEvents?n._pendingNativeEvents.push(e):n._pendingNativeEvents=[e]:n.initialized&&n.delegates&&(n.dom.unbind(xL(n,e),e,n.delegates[e]),delete n.delegates[e])))},unbindAllNativeEvents(){const e=this,t=e.getBody(),n=e.dom;e.delegates&&(he(e.delegates,(t,n)=>{e.dom.unbind(xL(e,n),n,t)}),delete e.delegates),!e.inline&&t&&n&&(t.onload=null,n.unbind(e.getWin()),n.unbind(e.getDoc())),n&&(n.unbind(t),n.unbind(e.getContainer()))}},AL=e=>u(e)?{value:e.split(/[ ,]/),valid:!0}:E(e,u)?{value:e,valid:!0}:{valid:!1,message:"The value must be a string[] or a comma/space separated string."},RL=(e,t)=>e+(rt(t.message)?"":`. ${t.message}`),DL=e=>e.valid,TL=(e,t,n="")=>{const o=t(e);return b(o)?o?{value:e,valid:!0}:{valid:!1,message:n}:o},OL=e=>e.readonly,BL=["design","readonly"],PL=(e,t,n,o)=>{const r=n[t.get()],s=n[o];try{s.activate()}catch(e){return void console.error(`problem while activating editor mode ${o}:`,e)}r.deactivate(),r.editorReadOnly!==s.editorReadOnly&&((e,t)=>{const n=un.fromDom(e.getBody());t?(e.readonly=!0,e.hasEditableRoot()&&(n.dom.contentEditable="true"),_x(e)):(e.readonly=!1,kx(e))})(e,s.editorReadOnly),t.set(o),((e,t)=>{e.dispatch("SwitchMode",{mode:t})})(e,o)},LL=e=>{const t=Ae("design"),n=Ae({design:{activate:x,deactivate:x,editorReadOnly:!1},readonly:{activate:x,deactivate:x,editorReadOnly:!0}});return(e=>{const t=t=>{OL(e)&&(e=>H(e,e=>"characterData"===e.type||"childList"===e.type))(t)&&(e=>{const t=e.undoManager.add();C(t)&&(e.undoManager.undo(),e.undoManager.reset())})(e)},n=new MutationObserver(t);e.on("beforeinput paste cut dragend dragover draggesture dragdrop drop drag",t=>{OL(e)&&t.preventDefault()}),e.on("BeforeExecCommand",t=>{"Undo"!==t.command&&"Redo"!==t.command||!OL(e)||t.preventDefault()}),e.on("compositionstart",()=>{OL(e)&&n.observe(e.getBody(),{characterData:!0,childList:!0,subtree:!0})}),e.on("compositionend",()=>{if(OL(e)){const e=n.takeRecords();t(e)}n.disconnect()})})(e),(e=>{(e=>{e.serializer?Dx(e):e.on("PreInit",()=>{Dx(e)})})(e),(e=>{e.on("ShowCaret ObjectSelected",t=>{Nx(e)&&t.preventDefault()}),e.on("DisabledStateChange",t=>{t.isDefaultPrevented()||Rx(e,t.state)})})(e)})(e),{isReadOnly:()=>OL(e),set:o=>((e,t,n,o)=>{if(!(o===n.get()||e.initialized&&Nx(e))){if(!_e(t,o))throw new Error(`Editor mode '${o}' is invalid`);e.initialized?PL(e,n,t,o):e.on("init",()=>PL(e,n,t,o))}})(e,n.get(),t,o),get:()=>t.get(),register:(e,t)=>{n.set(((e,t,n)=>{if($(BL,t))throw new Error(`Cannot override default mode ${t}`);return{...e,[t]:{...n,deactivate:()=>{try{n.deactivate()}catch(e){console.error(`problem while deactivating editor mode ${t}:`,e)}}}}})(n.get(),e,t))}}},ML=dn.each,IL=dn.explode,FL={f1:112,f2:113,f3:114,f4:115,f5:116,f6:117,f7:118,f8:119,f9:120,f10:121,f11:122,f12:123},UL=dn.makeMap("alt,ctrl,shift,meta,access"),zL=e=>{const t={},n=sn.os.isMacOS()||sn.os.isiOS();ML(IL(e.toLowerCase(),"+"),e=>{(e=>e in UL)(e)?t[e]=!0:/^[0-9]{2,}$/.test(e)?t.keyCode=parseInt(e,10):(t.charCode=e.charCodeAt(0),t.keyCode=FL[e]||e.toUpperCase().charCodeAt(0))});const o=[t.keyCode];let r;for(r in UL)t[r]?o.push(r):t[r]=!1;return t.id=o.join(","),t.access&&(t.alt=!0,n?t.ctrl=!0:t.shift=!0),t.meta&&(n?t.meta=!0:(t.ctrl=!0,t.meta=!1)),t};class jL{editor;shortcuts={};pendingPatterns=[];constructor(e){this.editor=e;const t=this;e.on("keyup keypress keydown",e=>{!t.hasModifier(e)&&!t.isFunctionKey(e)||e.isDefaultPrevented()||(ML(t.shortcuts,n=>{t.matchShortcut(e,n)&&(t.pendingPatterns=n.subpatterns.slice(0),"keydown"===e.type&&t.executeShortcutAction(n))}),t.matchShortcut(e,t.pendingPatterns[0])&&(1===t.pendingPatterns.length&&"keydown"===e.type&&t.executeShortcutAction(t.pendingPatterns[0]),t.pendingPatterns.shift()))})}add(e,t,n,o){const r=this,s=r.normalizeCommandFunc(n);return ML(IL(dn.trim(e)),e=>{const n=r.createShortcut(e,t,s,o);r.shortcuts[n.id]=n}),!0}remove(e){const t=this.createShortcut(e);return!!this.shortcuts[t.id]&&(delete this.shortcuts[t.id],!0)}normalizeCommandFunc(e){const t=this,n=e;return"string"==typeof n?()=>{t.editor.execCommand(n,!1,null)}:dn.isArray(n)?()=>{t.editor.execCommand(n[0],n[1],n[2])}:n}createShortcut(e,t,n,o){const r=dn.map(IL(e,">"),zL);return r[r.length-1]=dn.extend(r[r.length-1],{func:n,scope:o||this.editor}),dn.extend(r[0],{desc:this.editor.translate(t),subpatterns:r.slice(1)})}hasModifier(e){return e.altKey||e.ctrlKey||e.metaKey}isFunctionKey(e){return"keydown"===e.type&&e.keyCode>=112&&e.keyCode<=123}matchShortcut(e,t){return!!t&&t.ctrl===e.ctrlKey&&t.meta===e.metaKey&&t.alt===e.altKey&&t.shift===e.shiftKey&&!!(e.keyCode===t.keyCode||e.charCode&&e.charCode===t.charCode)&&(e.preventDefault(),!0)}executeShortcutAction(e){return e.func?e.func.call(e.scope):null}}const $L=()=>{const e=(()=>{const e={},t={},n={},o={},r={},s={},a={},i={},l={},c=(e,t)=>(n,o)=>{e[n.toLowerCase()]={...o,type:t}};return{addButton:c(e,"button"),addGroupToolbarButton:c(e,"grouptoolbarbutton"),addToggleButton:c(e,"togglebutton"),addMenuButton:c(e,"menubutton"),addSplitButton:c(e,"splitbutton"),addMenuItem:c(t,"menuitem"),addNestedMenuItem:c(t,"nestedmenuitem"),addToggleMenuItem:c(t,"togglemenuitem"),addAutocompleter:c(n,"autocompleter"),addContextMenu:c(r,"contextmenu"),addContextToolbar:c(s,"contexttoolbar"),addContextForm:(d=s,(e,t)=>{d[e.toLowerCase()]={type:"contextform",...t}}),addSidebar:c(i,"sidebar"),addView:c(l,"views"),addIcon:(e,t)=>o[e.toLowerCase()]=t,addContext:(e,t)=>a[e.toLowerCase()]=t,getAll:()=>({buttons:e,menuItems:t,icons:o,popups:n,contextMenus:r,contextToolbars:s,sidebars:i,views:l,contexts:a})};var d})();return{addAutocompleter:e.addAutocompleter,addButton:e.addButton,addContextForm:e.addContextForm,addContextMenu:e.addContextMenu,addContextToolbar:e.addContextToolbar,addIcon:e.addIcon,addMenuButton:e.addMenuButton,addMenuItem:e.addMenuItem,addNestedMenuItem:e.addNestedMenuItem,addSidebar:e.addSidebar,addSplitButton:e.addSplitButton,addToggleButton:e.addToggleButton,addGroupToolbarButton:e.addGroupToolbarButton,addToggleMenuItem:e.addToggleMenuItem,addView:e.addView,addContext:e.addContext,getAll:e.getAll}},HL=gi.DOM,VL=dn.extend,qL=dn.each;class WL{baseUri;id;editorUid;plugins={};documentBaseURI;baseURI;contentCSS=[];contentStyles=[];ui;mode;options;editorUpload;userLookup;shortcuts;loadedCSS={};editorCommands;suffix;editorManager;hidden;inline;hasVisual;isNotDirty=!1;annotator;bodyElement;bookmark;composing=!1;container;contentAreaContainer;contentDocument;contentWindow;delegates;destroyed=!1;dom;editorContainer;eventRoot;formatter;formElement;formEventDelegate;hasHiddenInput=!1;iframeElement=null;iframeHTML;initialized=!1;notificationManager;orgDisplay;orgVisibility;parser;quirks;readonly=!1;removed=!1;schema;selection;serializer;startContent="";targetElm;theme;model;undoManager;windowManager;licenseKeyManager;_beforeUnload;_eventDispatcher;_nodeChangeDispatcher;_pendingNativeEvents=[];_selectionOverrides;_skinLoaded=!1;_editableRoot=!0;bindPendingEventDelegates;toggleNativeEvent;unbindAllNativeEvents;fire;dispatch;on;off;once;hasEventListeners;constructor(e,t,n){this.editorManager=n,VL(this,NL);const o=this;this.id=e,this.editorUid=Me(),this.hidden=!1;const r=((e,t)=>{const n=Ue(t);return JP(WP||KP,WP,n,e,n)})(n.defaultOptions,t);this.options=((e,t,n=t)=>{const o={},r={},s=(e,t,n)=>{const o=TL(t,n);return DL(o)?(r[e]=o.value,!0):(console.warn(RL(`Invalid value passed for the ${e} option`,o)),!1)},a=e=>_e(o,e);return{register:(e,n)=>{const a=(e=>u(e.processor))(n)?(e=>{const t=(()=>{switch(e){case"array":return p;case"boolean":return b;case"function":return w;case"number":return S;case"object":return f;case"string":return u;case"string[]":return AL;case"object[]":return e=>E(e,f);case"regexp":return e=>m(e,RegExp);default:return M}})();return n=>TL(n,t,`The value must be a ${e}.`)})(n.processor):n.processor,i=((e,t,n)=>{if(!y(t)){const o=TL(t,n);if(DL(o))return o.value;console.error(RL(`Invalid default value passed for the "${e}" option`,o))}})(e,n.default,a);o[e]={...n,default:i,processor:a},xe(r,e).orThunk(()=>xe(t,e)).each(t=>s(e,t,a))},isRegistered:a,get:e=>xe(r,e).orThunk(()=>xe(o,e).map(e=>e.default)).getOrUndefined(),set:(e,t)=>{if(a(e)){const n=o[e];return n.immutable?(console.error(`"${e}" is an immutable option and cannot be updated`),!1):s(e,t,n.processor)}return console.warn(`"${e}" is not a registered option. Ensure the option has been registered before setting a value.`),!1},unset:e=>{const t=a(e);return t&&delete r[e],t},isSet:e=>_e(r,e),debug:()=>{try{console.log(JSON.parse(JSON.stringify(n,(e,t)=>b(t)||S(t)||u(t)||h(t)||p(t)||g(t)?t:Object.prototype.toString.call(t))))}catch(e){console.error(e)}}}})(0,r,t),(e=>{const t=e.options.register;t("id",{processor:"string",default:e.id}),t("selector",{processor:"string"}),t("target",{processor:"object"}),t("suffix",{processor:"string"}),t("cache_suffix",{processor:"string"}),t("base_url",{processor:"string"}),t("referrer_policy",{processor:"string",default:""}),t("crossorigin",{processor:"function",default:N(void 0)}),t("language_load",{processor:"boolean",default:!0}),t("inline",{processor:"boolean",default:!1}),t("iframe_attrs",{processor:"object",default:{}}),t("doctype",{processor:"string",default:""}),t("document_base_url",{processor:"string",default:e.editorManager.documentBaseURL}),t("body_id",{processor:pd(e,"tinymce"),default:"tinymce"}),t("body_class",{processor:pd(e),default:""}),t("content_security_policy",{processor:"string",default:""}),t("br_in_pre",{processor:"boolean",default:!0}),t("forced_root_block",{processor:e=>{const t=u(e)&&ot(e);return t?{value:e,valid:t}:{valid:!1,message:"Must be a non-empty string."}},default:"p"}),t("forced_root_block_attrs",{processor:"object",default:{}}),t("newline_behavior",{processor:e=>{const t=$(["block","linebreak","invert","default"],e);return t?{value:e,valid:t}:{valid:!1,message:"Must be one of: block, linebreak, invert or default."}},default:"default"}),t("br_newline_selector",{processor:"string",default:".mce-toc h2,figcaption,caption"}),t("no_newline_selector",{processor:"string",default:""}),t("keep_styles",{processor:"boolean",default:!0}),t("end_container_on_empty_block",{processor:e=>b(e)||u(e)?{valid:!0,value:e}:{valid:!1,message:"Must be boolean or a string"},default:"blockquote"}),t("font_size_style_values",{processor:"string",default:"xx-small,x-small,small,medium,large,x-large,xx-large"}),t("font_size_legacy_values",{processor:"string",default:"xx-small,small,medium,large,x-large,xx-large,300%"}),t("font_size_classes",{processor:"string",default:""}),t("automatic_uploads",{processor:"boolean",default:!0}),t("images_reuse_filename",{processor:"boolean",default:!1}),t("images_replace_blob_uris",{processor:"boolean",default:!0}),t("icons",{processor:"string",default:""}),t("icons_url",{processor:"string",default:""}),t("images_upload_url",{processor:"string",default:""}),t("images_upload_base_path",{processor:"string",default:""}),t("images_upload_credentials",{processor:"boolean",default:!1}),t("images_upload_handler",{processor:"function"}),t("language",{processor:"string",default:"en"}),t("language_url",{processor:"string",default:""}),t("entity_encoding",{processor:"string",default:"named"}),t("indent",{processor:"boolean",default:!0}),t("indent_before",{processor:"string",default:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,details,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist"}),t("indent_after",{processor:"string",default:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,details,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist"}),t("indent_use_margin",{processor:"boolean",default:!1}),t("indentation",{processor:"string",default:"40px"}),t("content_css",{processor:e=>{const t=!1===e||u(e)||E(e,u);return t?u(e)?{value:V(e.split(","),et),valid:t}:p(e)?{value:e,valid:t}:!1===e?{value:[],valid:t}:{value:e,valid:t}:{valid:!1,message:"Must be false, a string or an array of strings."}},default:fm(e)?[]:["default"]}),t("content_style",{processor:"string"}),t("content_language",{processor:"string"}),t("content_css_cors",{processor:"boolean",default:!1}),t("font_css",{processor:e=>{const t=u(e)||E(e,u);return t?{value:p(e)?e:V(e.split(","),et),valid:t}:{valid:!1,message:"Must be a string or an array of strings."}},default:[]}),t("extended_mathml_attributes",{processor:"string[]"}),t("extended_mathml_elements",{processor:"string[]"}),t("inline_boundaries",{processor:"boolean",default:!0}),t("inline_boundaries_selector",{processor:"string",default:"a[href],code,span.mce-annotation"}),t("object_resizing",{processor:e=>{const t=b(e)||u(e);return t?!1===e||cd.isiPhone()||cd.isiPad()?{value:"",valid:t}:{value:!0===e?"table,img,figure.image,div,video,iframe":e,valid:t}:{valid:!1,message:"Must be boolean or a string"}},default:!dd}),t("resize_img_proportional",{processor:"boolean",default:!0}),t("event_root",{processor:"string"}),t("service_message",{processor:"string"}),t("onboarding",{processor:"boolean",default:!0}),t("tiny_cloud_entry_url",{processor:"string"}),t("theme",{processor:e=>!1===e||u(e)||w(e),default:"silver"}),t("theme_url",{processor:"string"}),t("formats",{processor:"object"}),t("format_empty_lines",{processor:"boolean",default:!1}),t("format_noneditable_selector",{processor:"string",default:""}),t("preview_styles",{processor:e=>{const t=!1===e||u(e);return t?{value:!1===e?"":e,valid:t}:{valid:!1,message:"Must be false or a string"}},default:"font-family font-size font-weight font-style text-decoration text-transform color background-color border border-radius outline text-shadow"}),t("custom_ui_selector",{processor:"string",default:""}),t("hidden_input",{processor:"boolean",default:!0}),t("submit_patch",{processor:"boolean",default:!0}),t("encoding",{processor:"string"}),t("add_form_submit_trigger",{processor:"boolean",default:!0}),t("add_unload_trigger",{processor:"boolean",default:!0}),t("custom_undo_redo_levels",{processor:"number",default:0}),t("disable_nodechange",{processor:"boolean",default:!1}),t("disabled",{processor:t=>b(t)?(e.initialized&&fu(e)!==t&&Promise.resolve().then(()=>{((e,t)=>{e.dispatch("DisabledStateChange",{state:t})})(e,t)}),{valid:!0,value:t}):{valid:!1,message:"The value must be a boolean."},default:!1}),t("readonly",{processor:"boolean",default:!1}),t("editable_root",{processor:"boolean",default:!0}),t("plugins",{processor:"string[]",default:[]}),t("external_plugins",{processor:"object"}),t("forced_plugins",{processor:"string[]"}),t("model",{processor:"string",default:e.hasPlugin("rtc")?"plugin":"dom"}),t("model_url",{processor:"string"}),t("block_unsupported_drop",{processor:"boolean",default:!0}),t("visual",{processor:"boolean",default:!0}),t("visual_table_class",{processor:"string",default:"mce-item-table"}),t("visual_anchor_class",{processor:"string",default:"mce-item-anchor"}),t("iframe_aria_text",{processor:"string",default:"Rich Text Area".concat(e.hasPlugin("help")?". Press ALT-0 for help.":"")}),t("setup",{processor:"function"}),t("init_instance_callback",{processor:"function"}),t("url_converter",{processor:"function",default:e.convertURL}),t("url_converter_scope",{processor:"object",default:e}),t("urlconverter_callback",{processor:"function"}),t("allow_conditional_comments",{processor:"boolean",default:!1}),t("allow_html_data_urls",{processor:"boolean",default:!1}),t("allow_svg_data_urls",{processor:"boolean"}),t("allow_html_in_named_anchor",{processor:"boolean",default:!1}),t("allow_html_in_comments",{processor:"boolean",default:!1}),t("allow_script_urls",{processor:"boolean",default:!1}),t("allow_unsafe_link_target",{processor:"boolean",default:!1}),t("allow_mathml_annotation_encodings",{processor:e=>{const t=E(e,u);return t?{value:e,valid:t}:{valid:!1,message:"Must be an array of strings."}},default:[]}),t("convert_fonts_to_spans",{processor:"boolean",default:!0,deprecated:!0}),t("fix_list_elements",{processor:"boolean",default:!1}),t("preserve_cdata",{processor:"boolean",default:!1}),t("remove_trailing_brs",{processor:"boolean",default:!0}),t("pad_empty_with_br",{processor:"boolean",default:!1}),t("inline_styles",{processor:"boolean",default:!0,deprecated:!0}),t("element_format",{processor:"string",default:"html"}),t("entities",{processor:"string"}),t("schema",{processor:"string",default:"html5"}),t("convert_urls",{processor:"boolean",default:!0}),t("relative_urls",{processor:"boolean",default:!0}),t("remove_script_host",{processor:"boolean",default:!0}),t("custom_elements",{processor:gd}),t("extended_valid_elements",{processor:"string"}),t("invalid_elements",{processor:"string"}),t("invalid_styles",{processor:gd}),t("valid_children",{processor:"string"}),t("valid_classes",{processor:gd}),t("valid_elements",{processor:"string"}),t("valid_styles",{processor:gd}),t("verify_html",{processor:"boolean",default:!0}),t("auto_focus",{processor:e=>u(e)||!0===e}),t("browser_spellcheck",{processor:"boolean",default:!1}),t("protect",{processor:"array"}),t("images_file_types",{processor:"string",default:"jpeg,jpg,jpe,jfi,jif,jfif,png,gif,bmp,webp"}),t("deprecation_warnings",{processor:"boolean",default:!0}),t("a11y_advanced_options",{processor:"boolean",default:!1}),t("api_key",{processor:"string"}),t("license_key",{processor:"string"}),t("paste_block_drop",{processor:"boolean",default:!1}),t("paste_data_images",{processor:"boolean",default:!0}),t("paste_preprocess",{processor:"function"}),t("paste_postprocess",{processor:"function"}),t("paste_webkit_styles",{processor:"string",default:"none"}),t("paste_remove_styles_if_webkit",{processor:"boolean",default:!0}),t("paste_merge_formats",{processor:"boolean",default:!0}),t("smart_paste",{processor:"boolean",default:!0}),t("paste_as_text",{processor:"boolean",default:!1}),t("paste_tab_spaces",{processor:"number",default:4}),t("text_patterns",{processor:e=>E(e,f)||!1===e?{value:td(!1===e?[]:e),valid:!0}:{valid:!1,message:"Must be an array of objects or false."},default:[{start:"*",end:"*",format:"italic"},{start:"**",end:"**",format:"bold"},{start:"#",format:"h1",trigger:"space"},{start:"##",format:"h2",trigger:"space"},{start:"###",format:"h3",trigger:"space"},{start:"####",format:"h4",trigger:"space"},{start:"#####",format:"h5",trigger:"space"},{start:"######",format:"h6",trigger:"space"},{start:"1.",cmd:"InsertOrderedList",trigger:"space"},{start:"*",cmd:"InsertUnorderedList",trigger:"space"},{start:"-",cmd:"InsertUnorderedList",trigger:"space"},{start:">",cmd:"mceBlockQuote",trigger:"space"},{start:"---",cmd:"InsertHorizontalRule",trigger:"space"}]}),t("text_patterns_lookup",{processor:e=>{return w(e)?{value:(t=e,e=>{const n=t(e);return td(n)}),valid:!0}:{valid:!1,message:"Must be a single function"};var t},default:e=>[]}),t("allow_noneditable",{processor:"boolean",default:!0}),t("noneditable_class",{processor:"string",default:"mceNonEditable"}),t("editable_class",{processor:"string",default:"mceEditable"}),t("noneditable_regexp",{processor:e=>E(e,ud)?{value:e,valid:!0}:ud(e)?{value:[e],valid:!0}:{valid:!1,message:"Must be a RegExp or an array of RegExp."},default:[]}),t("table_tab_navigation",{processor:"boolean",default:!0}),t("highlight_on_focus",{processor:"boolean",default:!0}),t("xss_sanitization",{processor:"boolean",default:!0}),t("details_initial_state",{processor:e=>{const t=$(["inherited","collapsed","expanded"],e);return t?{value:e,valid:t}:{valid:!1,message:"Must be one of: inherited, collapsed, or expanded."}},default:"inherited"}),t("details_serialized_state",{processor:e=>{const t=$(["inherited","collapsed","expanded"],e);return t?{value:e,valid:t}:{valid:!1,message:"Must be one of: inherited, collapsed, or expanded."}},default:"inherited"}),t("init_content_sync",{processor:"boolean",default:!1}),t("newdocument_content",{processor:"string",default:""}),t("sandbox_iframes",{processor:"boolean",default:!0}),t("sandbox_iframes_exclusions",{processor:"string[]",default:["youtube.com","youtu.be","vimeo.com","player.vimeo.com","dailymotion.com","embed.music.apple.com","open.spotify.com","giphy.com","dai.ly","codepen.io"]}),t("convert_unsafe_embeds",{processor:"boolean",default:!0}),t("user_id",{processor:"string",default:"Anonymous"}),t("content_id",{processor:"string"}),t("fetch_users",{processor:e=>void 0===e?{valid:!0,value:void 0}:w(e)?{valid:!0,value:e}:{valid:!1,message:"fetch_users must be a function that returns a Promise"}});const n=Fc([Hc("mimeType"),(o="extensions",s=e=>u(e)?Te.value(e):Te.error("Extensions must be an array of strings"),r=xc(e=>s(e).fold(Cc,vc)),jc(o,o,{tag:"required",process:{}},Ic(r)))]);var o,r,s;t("documents_file_types",{processor:e=>Uc("documents_file_types",n,e).fold(e=>({valid:!1,message:"Must be a non-empty array of objects matching the configuration schema: https://www.tiny.cloud/docs/tinymce/latest/uploadcare-documents/#documents-file-types"}),e=>({valid:!0,value:e}))}),e.on("ScriptsLoaded",()=>{t("directionality",{processor:"string",default:Ci.isRtl()?"rtl":void 0}),t("placeholder",{processor:"string",default:md.getAttrib(e.getElement(),"placeholder")})}),t("lists_indent_on_tab",{processor:"boolean",default:!0}),t("list_max_depth",{processor:e=>{const t=S(e);if(t){if(e<0)throw new Error("list_max_depth cannot be set to lower than 0");return{value:e,valid:t}}return{valid:!1,message:"Must be a number"}}})})(o),this.userLookup=(e=>{const t=new Map,n=new Map,o=e=>I.from(t.get(e)),r=(e,t)=>I.from(n.get(e)).each(({reject:o})=>{o(t),n.delete(e)}),s=gu(e);return Object.freeze({userId:s,fetchUsers:s=>{const a=pu(e);if(!Array.isArray(s))return{};if(!a)return ae(s,e=>Promise.resolve({id:e,name:e,avatar:jP({id:e,name:e})}));const i=fe(Y(s,e=>!o(e).isSome()));return q(i,e=>{const o=new Promise((t,o)=>{n.set(e,{resolve:t,reject:o})});((e,n)=>{t.set(n,e)})(o,e)}),i.length>0&&a(i).then(VP).then(e=>{const t=new Set(V(e,e=>e.id));q(e,e=>((e,t)=>I.from(n.get(e)).each(({resolve:o})=>{o(t),n.delete(e)}))(e.id,e)),q(i,e=>{t.has(e)||r(e,new Error(`User ${e} not found`))})}).catch(e=>{q(i,t=>r(t,e instanceof Error?e:new Error("Network error")))}),X(s,(e,t)=>(e[t]=o(t).getOr(Promise.resolve({id:t,name:t,avatar:jP({id:t,name:t})})),e),{})}})})(this);const s=this.options.get;s("deprecation_warnings")&&((e,t)=>{((e,t)=>{const n=AS(e),o=TS(t),r=o.length>0,s=n.length>0,a="mobile"===t.theme;if(r||s||a){const e="\n- ",t=a?`\n\nThemes:${e}mobile`:"",i=r?`\n\nPlugins:${e}${o.join(e)}`:"",l=s?`\n\nOptions:${e}${n.join(e)}`:"";console.warn("The following deprecated features are currently enabled and have been removed in TinyMCE 8.0. These features will no longer work and should be removed from the TinyMCE configuration. See https://www.tiny.cloud/docs/tinymce/8/migration-from-7x/ for more information."+t+i+l)}})(e,t),((e,t)=>{const n=RS(e),o=OS(t),r=o.length>0,s=n.length>0;if(r||s){const e="\n- ",t=r?`\n\nPlugins:${e}${o.map(BS).join(e)}`:"",a=s?`\n\nOptions:${e}${n.join(e)}`:"";console.warn("The following deprecated features are currently enabled but will be removed soon."+t+a)}})(e,t)})(t,r);const a=s("suffix");a&&(n.suffix=a),this.suffix=n.suffix;const i=s("base_url");i&&n._setBaseUrl(i),this.baseUri=n.baseURI;const l=zd(o);l&&(hi.ScriptLoader._setReferrerPolicy(l),gi.DOM.styleSheetLoader._setReferrerPolicy(l)),hi.ScriptLoader._setCrossOrigin(e=>jd(o)(e,"script")),gi.DOM.styleSheetLoader._setCrossOrigin(e=>jd(o)(e,"stylesheet"));const c=Sm(o);C(c)&&gi.DOM.styleSheetLoader._setContentCssCors(c),wi.languageLoad=s("language_load"),wi.baseURL=n.baseURL,this.setDirty(!1),this.documentBaseURI=new Zw(yd(o),{base_uri:this.baseUri}),this.baseURI=this.baseUri,this.inline=fm(o),this.hasVisual=km(o),this.shortcuts=new jL(this),this.editorCommands=new bL(this),gL(this);const d=s("cache_suffix");d&&(sn.cacheSuffix=d.replace(/^[\?\&]+/,"")),this.ui={registry:$L(),styleSheetLoader:void 0,show:x,hide:x,setEnabled:x,isEnabled:M},this.mode=LL(o),Object.defineProperty(this,"editorUid",{writable:!1,configurable:!1,enumerable:!0}),n.dispatch("SetupEditor",{editor:this});const v=Dm(o);w(v)&&v.call(o,o)}render(){(e=>{const t=e.id;Ci.setCode($d(e));const n=()=>{MP.unbind(window,"ready",n),e.render()};if(!ri.Event.domLoaded)return void MP.bind(window,"ready",n);if(!e.getElement())return;const o=un.fromDom(e.getElement()),r=ko(o);e.on("remove",()=>{W(o.dom.attributes,e=>xo(o,e.name)),Co(o,r)}),e.ui.styleSheetLoader=((e,t)=>sa.forElement(e,{contentCssCors:Sm(t),referrerPolicy:zd(t)}))(o,e),fm(e)?e.inline=!0:(e.orgVisibility=e.getElement().style.visibility,e.getElement().style.visibility="hidden");const s=e.getElement().form||MP.getParent(t,"form");s&&(e.formElement=s,gm(e)&&!ls(e.getElement())&&(MP.insertAfter(MP.create("input",{type:"hidden",name:t}),t),e.hasHiddenInput=!0),e.formEventDelegate=t=>{e.dispatch(t.type,t)},MP.bind(s,"submit reset",e.formEventDelegate),e.on("reset",()=>{e.resetContent()}),!pm(e)||s.submit.nodeType||s.submit.length||s._mceOldSubmit||(s._mceOldSubmit=s.submit,s.submit=()=>(e.editorManager.triggerSave(),e.setDirty(!1),s._mceOldSubmit(s)))),e.windowManager=ox(e),e.notificationManager=ex(e),(e=>"xml"===e.options.get("encoding"))(e)&&e.on("GetContent",e=>{e.save&&(e.content=MP.encode(e.content))}),hm(e)&&e.on("submit",()=>{e.initialized&&e.save()}),bm(e)&&(e._beforeUnload=()=>{!e.initialized||e.destroyed||e.isHidden()||e.save({format:"raw",no_events:!0,set_dirty:!1})},e.editorManager.on("BeforeUnload",e._beforeUnload)),e.editorManager.add(e),UP(e,e.suffix)})(this)}focus(e){this.execCommand("mceFocus",!1,e)}hasFocus(){return Ap(this)}translate(e){return Ci.translate(e)}getParam(e,t,n){const o=this.options;return o.isRegistered(e)||(C(n)?o.register(e,{processor:n,default:t}):o.register(e,{processor:M,default:t})),o.isSet(e)||y(t)?o.get(e):t}hasPlugin(e,t){return!(!$(Em(this),e)||t&&void 0===tx.get(e))}nodeChanged(e){this._nodeChangeDispatcher.nodeChanged(e)}addCommand(e,t,n){this.editorCommands.addCommand(e,t,n)}addQueryStateHandler(e,t,n){this.editorCommands.addQueryStateHandler(e,t,n)}addQueryValueHandler(e,t,n){this.editorCommands.addQueryValueHandler(e,t,n)}addShortcut(e,t,n,o){this.shortcuts.add(e,t,n,o)}execCommand(e,t,n,o){return this.editorCommands.execCommand(e,t,n,o)}queryCommandState(e){return this.editorCommands.queryCommandState(e)}queryCommandValue(e){return this.editorCommands.queryCommandValue(e)}queryCommandSupported(e){return this.editorCommands.queryCommandSupported(e)}show(){const e=this;e.hidden&&(e.hidden=!1,e.inline?e.getBody().contentEditable="true":(HL.show(e.getContainer()),HL.hide(e.id)),e.load(),e.dispatch("show"))}hide(){const e=this;e.hidden||(e.save(),e.inline?(e.getBody().contentEditable="false",e===e.editorManager.focusedEditor&&(e.editorManager.focusedEditor=null)):(HL.hide(e.getContainer()),HL.setStyle(e.id,"display",e.orgDisplay)),e.hidden=!0,e.dispatch("hide"))}isHidden(){return this.hidden}setProgressState(e,t){this.dispatch("ProgressState",{state:e,time:t})}load(e={}){const t=this,n=t.getElement();if(!t.removed&&n){const o={...e,load:!0},r=ls(n)?n.value:n.innerHTML;t.setContent(r,o),o.no_events||t.dispatch("LoadContent",{...o,element:n})}}save(e={}){const t=this;let n=t.getElement();if(!n||!t.initialized||t.removed)return"";const o={...e,save:!0,element:n};let r=t.getContent(o);const s={...o,content:r};if(s.no_events||t.dispatch("SaveContent",s),"raw"===s.format&&t.dispatch("RawSaveContent",s),r=s.content,ls(n))n.value=r;else{!e.is_removing&&t.inline||(n.innerHTML=r);const o=HL.getParent(t.id,"form");o&&qL(o.elements,e=>e.name!==t.id||(e.value=r,!1))}return s.element=o.element=n=null,!1!==s.set_dirty&&t.setDirty(!1),r}setContent(e,t){HE(this,e,t)}getContent(e){return((e,t={})=>{const n=((e,t)=>({...e,format:t,get:!0,getInner:!0}))(t,t.format?t.format:"html");return vS(e,n).fold(A,t=>{const n=((e,t)=>PE(e).editor.getContent(t))(e,t);return CS(e,n,t)})})(this,e)}insertContent(e,t){t&&(e=VL({content:e},t)),this.execCommand("mceInsertContent",!1,e)}resetContent(e){void 0===e?HE(this,this.startContent,{initial:!0,format:"raw"}):HE(this,e,{initial:!0}),this.undoManager.reset(),this.setDirty(!1),this.nodeChanged()}isDirty(){return!this.isNotDirty}setDirty(e){const t=!this.isNotDirty;this.isNotDirty=!e,e&&e!==t&&this.dispatch("dirty")}getContainer(){const e=this;return e.container||(e.container=e.editorContainer||HL.get(e.id+"_parent")),e.container}getContentAreaContainer(){return this.contentAreaContainer}getElement(){return this.targetElm||(this.targetElm=HL.get(this.id)),this.targetElm}getWin(){const e=this;if(!e.contentWindow){const t=e.iframeElement;t&&(e.contentWindow=t.contentWindow)}return e.contentWindow}getDoc(){const e=this;if(!e.contentDocument){const t=e.getWin();t&&(e.contentDocument=t.document)}return e.contentDocument}getBody(){const e=this.getDoc();return this.bodyElement??e?.body??null}convertURL(e,t,n){const o=this,r=o.options.get,s=Om(o);if(w(s))return s.call(o,e,n,!0,t);if(!r("convert_urls")||"link"===n||f(n)&&"LINK"===n.nodeName||0===e.indexOf("file:")||0===e.length)return e;const a=new Zw(e);return"http"!==a.protocol&&"https"!==a.protocol&&""!==a.protocol?e:r("relative_urls")?o.documentBaseURI.toRelative(e):e=o.documentBaseURI.toAbsolute(e,r("remove_script_host"))}addVisual(e){((e,t)=>{((e,t)=>{LE(e).editor.addVisual(t)})(e,t)})(this,e)}setEditableRoot(e){((e,t)=>{e._editableRoot!==t&&(e._editableRoot=t,Nx(e)||(e.getBody().contentEditable=String(e.hasEditableRoot()),e.nodeChanged()),((e,t)=>{e.dispatch("EditableRootStateChange",{state:t})})(e,t))})(this,e)}hasEditableRoot(){return this._editableRoot}announce(e,t){ap.announce(e,t)}remove(){(e=>{if(!e.removed){const{_selectionOverrides:t,editorUpload:n}=e,o=e.getBody(),r=e.getElement();o&&e.save({is_removing:!0}),e.removed=!0,e.unbindAllNativeEvents(),e.hasHiddenInput&&C(r?.nextSibling)&&VE.remove(r.nextSibling),(e=>{e.dispatch("remove")})(e),e.editorManager.remove(e),!e.inline&&o&&(e=>{VE.setStyle(e.id,"display",e.orgDisplay)})(e),(e=>{e.dispatch("detach")})(e),VE.remove(e.getContainer()),qE(t),qE(n),e.destroy()}})(this)}destroy(e){((e,t)=>{const{selection:n,dom:o}=e;e.destroyed||(t||e.removed?(t||(e.editorManager.off("beforeunload",e._beforeUnload),e.theme&&e.theme.destroy&&e.theme.destroy(),qE(n),qE(o)),(e=>{const t=e.formElement;t&&(t._mceOldSubmit&&(t.submit=t._mceOldSubmit,delete t._mceOldSubmit),VE.unbind(t,"submit reset",e.formEventDelegate))})(e),(e=>{const t=e;t.contentAreaContainer=t.formElement=t.container=t.editorContainer=null,t.bodyElement=t.contentDocument=t.contentWindow=null,t.iframeElement=t.targetElm=null;const n=e.selection;if(n){const e=n.dom;t.selection=n.win=n.dom=e.doc=null}})(e),e.destroyed=!0):e.remove())})(this,e)}uploadImages(){return this.editorUpload.uploadImages()}_scanForImages(){return this.editorUpload.scanForImages()}}const KL=gi.DOM,YL=dn.each;let GL,XL=!1,QL=[];const ZL=e=>{const t=e.type;YL(nM.get(),n=>{switch(t){case"scroll":n.dispatch("ScrollWindow",e);break;case"resize":n.dispatch("ResizeWindow",e)}})},JL=e=>{if(e!==XL){const t=gi.DOM;e?(t.bind(window,"resize",ZL),t.bind(window,"scroll",ZL)):(t.unbind(window,"resize",ZL),t.unbind(window,"scroll",ZL)),XL=e}},eM=e=>{const t=QL;return QL=Y(QL,t=>e!==t),nM.activeEditor===e&&(nM.activeEditor=QL.length>0?QL[0]:null),nM.focusedEditor===e&&(nM.focusedEditor=null),t.length!==QL.length},tM="CSS1Compat"!==document.compatMode,nM={...wL,baseURI:null,baseURL:null,defaultOptions:{},documentBaseURL:null,suffix:null,pageUid:Me(),majorVersion:"8",minorVersion:"8.2",releaseDate:"2026-07-27",i18n:Ci,activeEditor:null,focusedEditor:null,setup(){const e=this;let t="",n="",o=Zw.getDocumentBaseUrl(document.location);/^[^:]+:\/\/\/?[^\/]+\//.test(o)&&(o=o.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,""),/[\/\\]$/.test(o)||(o+="/"));const r=window.tinymce||window.tinyMCEPreInit;if(r)t=r.base||r.baseURL,n=r.suffix;else{const e=document.getElementsByTagName("script");for(let o=0;oObject.defineProperty(e,t,{writable:!1,configurable:!1,enumerable:!0}))},overrideDefaults(e){const t=e.base_url;t&&this._setBaseUrl(t);const n=e.suffix;n&&(this.suffix=n),this.defaultOptions=e;const o=e.plugin_base_urls;void 0!==o&&he(o,(e,t)=>{wi.PluginManager.urls[t]=e})},init(e){const t=this;let n;const o=dn.makeMap("area base basefont br col frame hr img input isindex link meta param embed source wbr track colgroup option table tbody tfoot thead tr th td script noscript style textarea video audio iframe object menu"," ");let r=e=>{n=e};const s=()=>{let n=0;const a=[];let i;KL.unbind(window,"ready",s),(()=>{const n=e.onpageload;n&&n.apply(t,[])})(),i=fe((e=>sn.browser.isIE()||sn.browser.isEdge()?(lx("TinyMCE does not support the browser you are using. For a list of supported browsers please see: https://www.tiny.cloud/docs/tinymce/8/support/#supportedwebbrowsers"),[]):tM?(lx("Failed to initialize the editor as the document is not in standards mode. TinyMCE requires standards mode."),[]):u(e.selector)?KL.select(e.selector):C(e.target)?[e.target]:[])(e)),dn.each(i,e=>{var n;(n=t.get(e.id))&&n.initialized&&!(n.getContainer()||n.getBody()).parentNode&&(eM(n),n.unbindAllNativeEvents(),n.destroy(!0),n.removed=!0)}),i=dn.grep(i,e=>!t.get(e.id)),0===i.length?r([]):YL(i,s=>{((e,t)=>e.inline&&t.tagName.toLowerCase()in o)(e,s)?lx("Could not initialize inline editor on invalid inline target element",s):((e,o,s)=>{const l=new WL(e,o,t);a.push(l),l.on("init",()=>{++n===i.length&&r(a)}),l.targetElm=l.targetElm||s,l.render()})((e=>{let t=e.id;return t||(t=xe(e,"name").filter(e=>!KL.get(e)).getOrThunk(KL.uniqueId),e.setAttribute("id",t)),t})(s),e,s)})};return KL.bind(window,"ready",s),new Promise(e=>{n?e(n):r=t=>{e(t)}})},get(e){return 0===arguments.length?QL.slice(0):u(e)?Z(QL,t=>t.id===e).getOr(null):S(e)&&QL[e]?QL[e]:null},add(e){const t=this,n=t.get(e.id);return n===e||(null===n&&QL.push(e),JL(!0),t.activeEditor=e,t.dispatch("AddEditor",{editor:e}),GL||(GL=e=>{const n=t.dispatch("BeforeUnload");if(n.returnValue)return e.preventDefault(),e.returnValue=n.returnValue,n.returnValue},window.addEventListener("beforeunload",GL))),e},createEditor(e,t){return this.add(new WL(e,t,this))},remove(e){const t=this;let n;if(e){if(!u(e))return n=e,h(t.get(n.id))?null:(eM(n)&&t.dispatch("RemoveEditor",{editor:n}),0===QL.length&&window.removeEventListener("beforeunload",GL),n.remove(),JL(QL.length>0),n);YL(KL.select(e),e=>{n=t.get(e.id),n&&t.remove(n)})}else for(let e=QL.length-1;e>=0;e--)t.remove(QL[e])},execCommand(e,t,n){const o=this,r=f(n)?n.id??n.index:n;switch(e){case"mceAddEditor":if(!o.get(r)){const e=n.options;new WL(r,e,o).render()}return!0;case"mceRemoveEditor":{const e=o.get(r);return e&&e.remove(),!0}case"mceToggleEditor":{const e=o.get(r);return e?(e.isHidden()?e.show():e.hide(),!0):(o.execCommand("mceAddEditor",!1,n),!0)}}return!!o.activeEditor&&o.activeEditor.execCommand(e,t,n)},triggerSave:()=>{YL(QL,e=>{e.save()})},addI18n:(e,t)=>{Ci.add(e,t)},translate:e=>Ci.translate(e),setActive(e){const t=this.activeEditor;this.activeEditor!==e&&(t&&t.dispatch("deactivate",{relatedTarget:e}),e.dispatch("activate",{relatedTarget:t})),this.activeEditor=e},_setBaseUrl(e){this.baseURL=new Zw(this.documentBaseURL).toAbsolute(e.replace(/\/+$/,"")),this.baseURI=new Zw(this.baseURL)},_addLicenseKeyManager:e=>Sx.add(e)};nM.setup();const oM=(()=>{const e=Ke();return{FakeClipboardItem:e=>({items:e,types:ge(e),getType:t=>xe(e,t).getOrUndefined()}),write:t=>{e.set(t)},read:()=>e.get().getOrUndefined(),clear:e.clear}})(),rM=Math.min,sM=Math.max,aM=Math.round,iM=(e,t,n)=>{let o=t.x,r=t.y;const s=e.w,a=e.h,i=t.w,l=t.h,c=(n||"").split("");return"b"===c[0]&&(r+=l),"r"===c[1]&&(o+=i),"c"===c[0]&&(r+=aM(l/2)),"c"===c[1]&&(o+=aM(i/2)),"b"===c[3]&&(r-=a),"r"===c[4]&&(o-=s),"c"===c[3]&&(r-=aM(a/2)),"c"===c[4]&&(o-=aM(s/2)),lM(o,r,s,a)},lM=(e,t,n,o)=>({x:e,y:t,w:n,h:o}),cM={inflate:(e,t,n)=>lM(e.x-t,e.y-n,e.w+2*t,e.h+2*n),relativePosition:iM,findBestRelativePosition:(e,t,n,o)=>{for(let r=0;r=n.x&&s.x+s.w<=n.w+n.x&&s.y>=n.y&&s.y+s.h<=n.h+n.y)return o[r]}return null},intersect:(e,t)=>{const n=sM(e.x,t.x),o=sM(e.y,t.y),r=rM(e.x+e.w,t.x+t.w),s=rM(e.y+e.h,t.y+t.h);return r-n<0||s-o<0?null:lM(n,o,r-n,s-o)},clamp:(e,t,n)=>{let o=e.x,r=e.y,s=e.x+e.w,a=e.y+e.h;const i=t.x+t.w,l=t.y+t.h,c=sM(0,t.x-o),d=sM(0,t.y-r),m=sM(0,s-i),u=sM(0,a-l);return o+=c,r+=d,n&&(s+=c,a+=d,o-=m,r-=u),s-=m,a-=u,lM(o,r,s-o,a-r)},create:lM,fromClientRect:e=>lM(e.left,e.top,e.width,e.height)},dM=(()=>{const e={},t={},n={};return{load:(n,o)=>{const r=`Script at URL "${o}" failed to load`,s=`Script at URL "${o}" did not call \`tinymce.Resource.add('${n}', data)\` within 1 second`;if(void 0!==e[n])return e[n];{const a=new Promise((e,a)=>{const i=((e,t,n=1e3)=>{let o=!1,r=null;const s=e=>(...t)=>{o||(o=!0,null!==r&&(window.clearTimeout(r),r=null),e.apply(null,t))},a=s(e),i=s(t);return{start:(...e)=>{o||null!==r||(r=window.setTimeout(()=>i.apply(null,e),n))},resolve:a,reject:i}})(e,a);t[n]=i.resolve,hi.ScriptLoader.loadScript(o).then(()=>i.start(s),()=>i.reject(r))});return e[n]=a,a}},add:(o,r)=>{void 0!==t[o]&&(t[o](r),delete t[o]),e[o]=Promise.resolve(r),n[o]=r},has:e=>e in n,get:e=>n[e],unload:t=>{delete e[t],delete n[t]}}})();let mM;try{const e="__storage_test__";mM=window.localStorage,mM.setItem(e,e),mM.removeItem(e)}catch{mM=(()=>{let e={},t=[];const n={getItem:t=>e[t]||null,setItem:(n,o)=>{t.push(n),e[n]=String(o)},key:e=>t[e],removeItem:n=>{t=t.filter(e=>e===n),delete e[n]},clear:()=>{t=[],e={}},length:0};return Object.defineProperty(n,"length",{get:()=>t.length,configurable:!1,enumerable:!1}),n})()}const uM={geom:{Rect:cM},util:{Delay:yp,Tools:dn,VK:Tp,URI:Zw,EventDispatcher:vL,Observable:wL,I18n:Ci,LocalStorage:mM,ImageUploader:e=>{const t=Mx(),n=zx(e,t);return{upload:(t,o=!0)=>n.upload(t,o?Ux(e):void 0)}}},dom:{EventUtils:ri,TreeWalker:Kr,TextSeeker:Pi,DOMUtils:gi,ScriptLoader:hi,RangeUtils:Gp,Serializer:$E,StyleSheetLoader:ra,ControlSelection:Ip,BookmarkManager:ip,Selection:UE,AriaAnnouncer:ap,Event:ri.Event},html:{Styles:Ga,Entities:Sa,Node:xh,Schema:Ua,DomParser:pS,Writer:$h,Serializer:Hh},Env:sn,AddOnManager:wi,Annotator:Jg,Formatter:Zx,UndoManager:e_,EditorCommands:bL,WindowManager:ox,NotificationManager:ex,EditorObservable:NL,Shortcuts:jL,Editor:WL,FocusManager:bp,EditorManager:nM,DOM:gi.DOM,ScriptLoader:hi.ScriptLoader,PluginManager:tx,ThemeManager:nx,ModelManager:KE,IconManager:WE,Resource:dM,FakeClipboard:oM,trim:dn.trim,isArray:dn.isArray,is:dn.is,toArray:dn.toArray,makeMap:dn.makeMap,each:dn.each,map:dn.map,grep:dn.grep,inArray:dn.inArray,extend:dn.extend,walk:dn.walk,resolve:dn.resolve,explode:dn.explode,_addCacheSuffix:dn._addCacheSuffix},fM=dn.extend(nM,uM);(e=>{window.tinymce=e,window.tinyMCE=e})(fM),(e=>{if("object"==typeof module)try{module.exports=e}catch{}})(fM)}(); \ No newline at end of file From 1b386567faa3456ac6f0f7fe68683635f729afd9 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Tue, 4 Aug 2026 12:12:42 -0400 Subject: [PATCH 237/241] Bump DataTables from 2.3.7 to 3.0.1 --- libs/DataTables/datatables.min.css | 12 +++++++++--- libs/DataTables/datatables.min.js | 12 ++++++------ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/libs/DataTables/datatables.min.css b/libs/DataTables/datatables.min.css index 24798611a..53e1e2c1a 100644 --- a/libs/DataTables/datatables.min.css +++ b/libs/DataTables/datatables.min.css @@ -4,12 +4,18 @@ * * To rebuild or modify this file with the latest versions of the included * software please visit: - * https://datatables.net/download/#bs4/dt-2.3.7 + * https://datatables.net/download/#bs4/dt-3.0.1 * * Included libraries: - * DataTables 2.3.7 + * DataTables 3.0.1 */ -:root{--dt-row-selected: 2, 117, 216;--dt-row-selected-text: 255, 255, 255;--dt-row-selected-link: 228, 228, 228;--dt-row-stripe: 0, 0, 0;--dt-row-hover: 0, 0, 0;--dt-column-ordering: 0, 0, 0;--dt-header-align-items: center;--dt-header-vertical-align: middle;--dt-html-background: white}:root.dark{--dt-html-background: rgb(33, 37, 41)}table.dataTable tbody td.dt-control{text-align:center;cursor:pointer}table.dataTable tbody td.dt-control:before{display:inline-block;box-sizing:border-box;content:"";border-top:5px solid transparent;border-left:10px solid rgba(0, 0, 0, 0.5);border-bottom:5px solid transparent;border-right:0px solid transparent}table.dataTable tbody tr.dt-hasChild td.dt-control:before{border-top:10px solid rgba(0, 0, 0, 0.5);border-left:5px solid transparent;border-bottom:0px solid transparent;border-right:5px solid transparent}table.dataTable tfoot:empty{display:none}html.dark table.dataTable td.dt-control:before,:root[data-bs-theme=dark] table.dataTable td.dt-control:before,:root[data-theme=dark] table.dataTable td.dt-control:before{border-left-color:rgba(255, 255, 255, 0.5)}html.dark table.dataTable tr.dt-hasChild td.dt-control:before,:root[data-bs-theme=dark] table.dataTable tr.dt-hasChild td.dt-control:before,:root[data-theme=dark] table.dataTable tr.dt-hasChild td.dt-control:before{border-top-color:rgba(255, 255, 255, 0.5);border-left-color:transparent}div.dt-scroll{width:100%}div.dt-scroll-body thead tr,div.dt-scroll-body tfoot tr{height:0}div.dt-scroll-body thead tr th,div.dt-scroll-body thead tr td,div.dt-scroll-body tfoot tr th,div.dt-scroll-body tfoot tr td{height:0 !important;padding-top:0px !important;padding-bottom:0px !important;border-top-width:0px !important;border-bottom-width:0px !important}div.dt-scroll-body thead tr th div.dt-scroll-sizing,div.dt-scroll-body thead tr td div.dt-scroll-sizing,div.dt-scroll-body tfoot tr th div.dt-scroll-sizing,div.dt-scroll-body tfoot tr td div.dt-scroll-sizing{height:0 !important;overflow:hidden !important}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead>tr>th.dt-orderable-asc .dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order:before{position:absolute;display:block;bottom:50%;content:"▲";content:"▲"/""}table.dataTable thead>tr>th.dt-orderable-desc .dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order:after{position:absolute;display:block;top:50%;content:"▼";content:"▼"/""}table.dataTable thead>tr>th.dt-orderable-asc .dt-column-order,table.dataTable thead>tr>th.dt-orderable-desc .dt-column-order,table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order,table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order,table.dataTable thead>tr>td.dt-orderable-asc .dt-column-order,table.dataTable thead>tr>td.dt-orderable-desc .dt-column-order,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order{position:relative;width:12px;height:20px}table.dataTable thead>tr>th.dt-orderable-asc .dt-column-order:before,table.dataTable thead>tr>th.dt-orderable-asc .dt-column-order:after,table.dataTable thead>tr>th.dt-orderable-desc .dt-column-order:before,table.dataTable thead>tr>th.dt-orderable-desc .dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-asc .dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-desc .dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order:after{left:0;opacity:.125;line-height:9px;font-size:.8em}table.dataTable thead>tr>th.dt-orderable-asc,table.dataTable thead>tr>th.dt-orderable-desc,table.dataTable thead>tr>td.dt-orderable-asc,table.dataTable thead>tr>td.dt-orderable-desc{cursor:pointer}table.dataTable thead>tr>th.dt-orderable-asc:hover,table.dataTable thead>tr>th.dt-orderable-desc:hover,table.dataTable thead>tr>td.dt-orderable-asc:hover,table.dataTable thead>tr>td.dt-orderable-desc:hover{outline:2px solid rgba(0, 0, 0, 0.05);outline-offset:-2px}table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order:after{opacity:.6}table.dataTable thead>tr>th.dt-orderable-none:not(.dt-ordering-asc,.dt-ordering-desc) .dt-column-order:empty,table.dataTable thead>tr>th.sorting_desc_disabled .dt-column-order:after,table.dataTable thead>tr>th.sorting_asc_disabled .dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-none:not(.dt-ordering-asc,.dt-ordering-desc) .dt-column-order:empty,table.dataTable thead>tr>td.sorting_desc_disabled .dt-column-order:after,table.dataTable thead>tr>td.sorting_asc_disabled .dt-column-order:before{display:none}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead>tr>th div.dt-column-header,table.dataTable thead>tr>th div.dt-column-footer,table.dataTable thead>tr>td div.dt-column-header,table.dataTable thead>tr>td div.dt-column-footer,table.dataTable tfoot>tr>th div.dt-column-header,table.dataTable tfoot>tr>th div.dt-column-footer,table.dataTable tfoot>tr>td div.dt-column-header,table.dataTable tfoot>tr>td div.dt-column-footer{display:flex;justify-content:space-between;align-items:var(--dt-header-align-items);gap:4px}table.dataTable thead>tr>th div.dt-column-header .dt-column-title,table.dataTable thead>tr>th div.dt-column-footer .dt-column-title,table.dataTable thead>tr>td div.dt-column-header .dt-column-title,table.dataTable thead>tr>td div.dt-column-footer .dt-column-title,table.dataTable tfoot>tr>th div.dt-column-header .dt-column-title,table.dataTable tfoot>tr>th div.dt-column-footer .dt-column-title,table.dataTable tfoot>tr>td div.dt-column-header .dt-column-title,table.dataTable tfoot>tr>td div.dt-column-footer .dt-column-title{flex-grow:1}table.dataTable thead>tr>th div.dt-column-header .dt-column-title:empty,table.dataTable thead>tr>th div.dt-column-footer .dt-column-title:empty,table.dataTable thead>tr>td div.dt-column-header .dt-column-title:empty,table.dataTable thead>tr>td div.dt-column-footer .dt-column-title:empty,table.dataTable tfoot>tr>th div.dt-column-header .dt-column-title:empty,table.dataTable tfoot>tr>th div.dt-column-footer .dt-column-title:empty,table.dataTable tfoot>tr>td div.dt-column-header .dt-column-title:empty,table.dataTable tfoot>tr>td div.dt-column-footer .dt-column-title:empty{display:none}div.dt-scroll-body>table.dataTable>thead>tr>th,div.dt-scroll-body>table.dataTable>thead>tr>td{overflow:hidden}:root.dark table.dataTable thead>tr>th.dt-orderable-asc:hover,:root.dark table.dataTable thead>tr>th.dt-orderable-desc:hover,:root.dark table.dataTable thead>tr>td.dt-orderable-asc:hover,:root.dark table.dataTable thead>tr>td.dt-orderable-desc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>th.dt-orderable-asc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>th.dt-orderable-desc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>td.dt-orderable-asc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>td.dt-orderable-desc:hover{outline:2px solid rgba(255, 255, 255, 0.05)}div.dt-processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-22px;text-align:center;padding:2px;z-index:10}div.dt-processing>div:last-child{position:relative;width:80px;height:15px;margin:1em auto}div.dt-processing>div:last-child>div{position:absolute;top:0;width:13px;height:13px;border-radius:50%;background:rgb(2, 117, 216);background:rgb(var(--dt-row-selected));animation-timing-function:cubic-bezier(0, 1, 1, 0)}div.dt-processing>div:last-child>div:nth-child(1){left:8px;animation:datatables-loader-1 .6s infinite}div.dt-processing>div:last-child>div:nth-child(2){left:8px;animation:datatables-loader-2 .6s infinite}div.dt-processing>div:last-child>div:nth-child(3){left:32px;animation:datatables-loader-2 .6s infinite}div.dt-processing>div:last-child>div:nth-child(4){left:56px;animation:datatables-loader-3 .6s infinite}@keyframes datatables-loader-1{0%{transform:scale(0)}100%{transform:scale(1)}}@keyframes datatables-loader-3{0%{transform:scale(1)}100%{transform:scale(0)}}@keyframes datatables-loader-2{0%{transform:translate(0, 0)}100%{transform:translate(24px, 0)}}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable th,table.dataTable td{box-sizing:border-box}table.dataTable th.dt-type-numeric,table.dataTable th.dt-type-date,table.dataTable td.dt-type-numeric,table.dataTable td.dt-type-date{text-align:right}table.dataTable th.dt-type-numeric div.dt-column-header,table.dataTable th.dt-type-numeric div.dt-column-footer,table.dataTable th.dt-type-date div.dt-column-header,table.dataTable th.dt-type-date div.dt-column-footer,table.dataTable td.dt-type-numeric div.dt-column-header,table.dataTable td.dt-type-numeric div.dt-column-footer,table.dataTable td.dt-type-date div.dt-column-header,table.dataTable td.dt-type-date div.dt-column-footer{flex-direction:row-reverse}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-left div.dt-column-header,table.dataTable th.dt-left div.dt-column-footer,table.dataTable td.dt-left div.dt-column-header,table.dataTable td.dt-left div.dt-column-footer{flex-direction:row}table.dataTable th.dt-center,table.dataTable td.dt-center{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-right div.dt-column-header,table.dataTable th.dt-right div.dt-column-footer,table.dataTable td.dt-right div.dt-column-header,table.dataTable td.dt-right div.dt-column-footer{flex-direction:row-reverse}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-justify div.dt-column-header,table.dataTable th.dt-justify div.dt-column-footer,table.dataTable td.dt-justify div.dt-column-header,table.dataTable td.dt-justify div.dt-column-footer{flex-direction:row}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable th.dt-empty,table.dataTable td.dt-empty{text-align:center;vertical-align:top}table.dataTable thead th,table.dataTable thead td,table.dataTable tfoot th,table.dataTable tfoot td{text-align:left;vertical-align:var(--dt-header-vertical-align)}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-left div.dt-column-header,table.dataTable thead th.dt-head-left div.dt-column-footer,table.dataTable thead td.dt-head-left div.dt-column-header,table.dataTable thead td.dt-head-left div.dt-column-footer,table.dataTable tfoot th.dt-head-left div.dt-column-header,table.dataTable tfoot th.dt-head-left div.dt-column-footer,table.dataTable tfoot td.dt-head-left div.dt-column-header,table.dataTable tfoot td.dt-head-left div.dt-column-footer{flex-direction:row}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-right div.dt-column-header,table.dataTable thead th.dt-head-right div.dt-column-footer,table.dataTable thead td.dt-head-right div.dt-column-header,table.dataTable thead td.dt-head-right div.dt-column-footer,table.dataTable tfoot th.dt-head-right div.dt-column-header,table.dataTable tfoot th.dt-head-right div.dt-column-footer,table.dataTable tfoot td.dt-head-right div.dt-column-header,table.dataTable tfoot td.dt-head-right div.dt-column-footer{flex-direction:row-reverse}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-justify div.dt-column-header,table.dataTable thead th.dt-head-justify div.dt-column-footer,table.dataTable thead td.dt-head-justify div.dt-column-header,table.dataTable thead td.dt-head-justify div.dt-column-footer,table.dataTable tfoot th.dt-head-justify div.dt-column-header,table.dataTable tfoot th.dt-head-justify div.dt-column-footer,table.dataTable tfoot td.dt-head-justify div.dt-column-header,table.dataTable tfoot td.dt-head-justify div.dt-column-footer{flex-direction:row}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable.table{clear:both;max-width:none;border-spacing:0;margin-bottom:0}table.dataTable.table.table-striped>tbody>tr:nth-of-type(2n+1){background-color:transparent}table.dataTable.table>tbody>tr{background-color:transparent}table.dataTable.table>tbody>tr.selected>*{box-shadow:inset 0 0 0 9999px rgb(2, 117, 216);box-shadow:inset 0 0 0 9999px rgb(var(--dt-row-selected));color:rgb(255, 255, 255);color:rgb(var(--dt-row-selected-text))}table.dataTable.table>tbody>tr.selected a{color:rgb(228, 228, 228);color:rgb(var(--dt-row-selected-link))}table.dataTable.table.table-striped>tbody>tr:nth-of-type(2n+1)>*{box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-stripe), 0.05)}table.dataTable.table.table-striped>tbody>tr:nth-of-type(2n+1).selected>*{box-shadow:inset 0 0 0 9999px rgba(2, 117, 216, 0.95);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.95)}table.dataTable.table.table-hover>tbody>tr:hover>*{box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.075)}table.dataTable.table.table-hover>tbody>tr.selected:hover>*{box-shadow:inset 0 0 0 9999px rgba(2, 117, 216, 0.975);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.975)}div.dt-container div.dt-layout-start>*:not(:last-child){margin-right:1em}div.dt-container div.dt-layout-end>*:not(:first-child){margin-left:1em}div.dt-container div.dt-layout-full{width:100%}div.dt-container div.dt-layout-full>*:only-child{margin-left:auto;margin-right:auto}div.dt-container div.dt-layout-table>div{display:block !important}@media screen and (max-width: 767px){div.dt-container div.dt-layout-start>*:not(:last-child){margin-right:0}div.dt-container div.dt-layout-end>*:not(:first-child){margin-left:0}}div.dt-container{position:relative}div.dt-container>div.row{margin-bottom:.5rem}div.dt-container>div.row:last-child{margin-bottom:0}div.dt-container div.dt-length label{font-weight:normal;text-align:left;white-space:nowrap;margin-bottom:0}div.dt-container div.dt-length select{width:auto;display:inline-block;margin-right:.5em}div.dt-container div.dt-search label{font-weight:normal;white-space:nowrap;text-align:left;margin-bottom:0}div.dt-container div.dt-search input{margin-left:.5em;display:inline-block;width:auto}div.dt-container div.dt-info{white-space:nowrap}div.dt-container div.dt-paging{margin:0}div.dt-container div.dt-paging ul.pagination{margin:0;flex-wrap:wrap}div.dt-container div.dt-processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}div.dt-container div.dt-scroll-body{border-bottom:1px solid #dee2e6}div.dt-container div.dt-scroll-body table,div.dt-container div.dt-scroll-body tbody>tr:last-child>*{border-bottom:none}div.dt-scroll-head table.dataTable{margin-bottom:0 !important}div.dt-scroll-body>table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dt-scroll-body>table thead .dt-orderable-asc:before,div.dt-scroll-body>table thead .dt-orderable-desc:after{display:none}div.dt-scroll-body>table>tbody tr:first-child th,div.dt-scroll-body>table>tbody tr:first-child td{border-top:none}div.dt-scroll-foot>.dt-scroll-footInner{box-sizing:content-box}div.dt-scroll-foot>.dt-scroll-footInner>table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dt-container div.dt-length,div.dt-container div.dt-search,div.dt-container div.dt-info,div.dt-container div.dt-paging{text-align:center}div.dt-container div.row{margin-bottom:0}div.dt-container div.row>*{margin-bottom:.5rem}div.dt-container div.dt-paging ul.pagination{justify-content:center !important}}table.dataTable.table-sm>thead>tr th.dt-orderable-asc,table.dataTable.table-sm>thead>tr th.dt-orderable-desc,table.dataTable.table-sm>thead>tr th.dt-ordering-asc,table.dataTable.table-sm>thead>tr th.dt-ordering-desc,table.dataTable.table-sm>thead>tr td.dt-orderable-asc,table.dataTable.table-sm>thead>tr td.dt-orderable-desc,table.dataTable.table-sm>thead>tr td.dt-ordering-asc,table.dataTable.table-sm>thead>tr td.dt-ordering-desc{padding-right:4px}table.dataTable.table-sm>thead>tr th.dt-orderable-asc .dt-column-order,table.dataTable.table-sm>thead>tr th.dt-orderable-desc .dt-column-order,table.dataTable.table-sm>thead>tr th.dt-ordering-asc .dt-column-order,table.dataTable.table-sm>thead>tr th.dt-ordering-desc .dt-column-order,table.dataTable.table-sm>thead>tr td.dt-orderable-asc .dt-column-order,table.dataTable.table-sm>thead>tr td.dt-orderable-desc .dt-column-order,table.dataTable.table-sm>thead>tr td.dt-ordering-asc .dt-column-order,table.dataTable.table-sm>thead>tr td.dt-ordering-desc .dt-column-order{right:4px}table.dataTable.table-sm>thead>tr th.dt-type-date .dt-column-order,table.dataTable.table-sm>thead>tr th.dt-type-numeric .dt-column-order,table.dataTable.table-sm>thead>tr td.dt-type-date .dt-column-order,table.dataTable.table-sm>thead>tr td.dt-type-numeric .dt-column-order{left:4px}div.dt-scroll-head table.table-bordered{border-bottom-width:0}div.table-responsive>div.dt-container>div.row{margin:0}div.table-responsive>div.dt-container>div.row>div[class^=col-]:first-child{padding-left:0}div.table-responsive>div.dt-container>div.row>div[class^=col-]:last-child{padding-right:0} +/*! DataTables Bootstrap 4 integration + * © SpryMedia Ltd - datatables.net/license + */:root{--dt_background-selected: 13, 110, 253;--dt_color-selected: 255, 255, 255;--dt_link_color-selected: 228, 228, 228;--dt-row_background: transparent;--dt-row_background-selected: var(--dt_background-selected);--dt-row-text_color-selected: var(--dt_color-selected);--dt-row-link_color-selected: var(--dt_link_color-selected);--dt-row_background-stripe: 0, 0, 0;--dt-row_background-hover: 0, 0, 0;--dt-column-ordering_background: 0, 0, 0;--dt-header-cell_align-items: center;--dt-header-cell_vertical-align: middle;--dt-html_background: white}:root.dark{--dt-html_background: rgb(33, 37, 41)}table.dataTable tbody td.dt-control{text-align:center;cursor:pointer}table.dataTable tbody td.dt-control:before{display:inline-block;box-sizing:border-box;content:"";border-top:5px solid transparent;border-left:10px solid rgba(0, 0, 0, 0.5);border-bottom:5px solid transparent;border-right:0px solid transparent}table.dataTable tbody tr.dt-hasChild td.dt-control:before{border-top:10px solid rgba(0, 0, 0, 0.5);border-left:5px solid transparent;border-bottom:0px solid transparent;border-right:5px solid transparent}:root.dark table.dataTable td.dt-control:before,:root[data-bs-theme=dark] table.dataTable td.dt-control:before,:root[data-theme=dark] table.dataTable td.dt-control:before{border-left-color:rgba(255, 255, 255, 0.5)}:root.dark table.dataTable tr.dt-hasChild td.dt-control:before,:root[data-bs-theme=dark] table.dataTable tr.dt-hasChild td.dt-control:before,:root[data-theme=dark] table.dataTable tr.dt-hasChild td.dt-control:before{border-top-color:rgba(255, 255, 255, 0.5);border-left-color:transparent}div.dt-scroll{width:100%}div.dt-scroll-body thead tr,div.dt-scroll-body tfoot tr{height:0}div.dt-scroll-body thead tr th,div.dt-scroll-body thead tr td,div.dt-scroll-body tfoot tr th,div.dt-scroll-body tfoot tr td{height:0 !important;padding-top:0px !important;padding-bottom:0px !important;border-top-width:0px !important;border-bottom-width:0px !important}div.dt-scroll-body thead tr th div.dt-scroll-sizing,div.dt-scroll-body thead tr td div.dt-scroll-sizing,div.dt-scroll-body tfoot tr th div.dt-scroll-sizing,div.dt-scroll-body tfoot tr td div.dt-scroll-sizing{height:0 !important;overflow:hidden !important}/*! DataTables Bootstrap 4 integration + * © SpryMedia Ltd - datatables.net/license + */:root{--dt-order-arrow_color: rgb(51, 51, 51);--dt-order-arrow_color-current: rgb(51, 51, 51);--dt-order-arrow-height: 7px;--dt-order-arrow_opacity: 0.125;--dt-order-arrow_opacity-current: 0.65;--dt-order-arrow-width: 8px;--dt-order-arrow-gap: 1px;--dt-order-header_outline-hover: 2px solid rgba(0, 0, 0, 0.05)}:root.dark,:root[data-bs-theme=dark],:root[data-theme=dark]{--dt-order-arrow_color: rgb(229, 233, 238);--dt-order-arrow_color-current: rgb(229, 233, 238);--dt-order-header_outline-hover: 2px solid rgba(255, 255, 255, 0.05)}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead>tr>th.dt-orderable-asc .dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order:before{bottom:calc(50% + var(--dt-order-arrow-gap));border-bottom:var(--dt-order-arrow-height) solid var(--dt-order-arrow_color);border-left:calc(var(--dt-order-arrow-width)/2) solid transparent;border-right:calc(var(--dt-order-arrow-width)/2) solid transparent}table.dataTable thead>tr>th.dt-orderable-desc .dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order:after{top:calc(50% + 1px);border-top:var(--dt-order-arrow-height) solid var(--dt-order-arrow_color);border-left:calc(var(--dt-order-arrow-width)/2) solid transparent;border-right:calc(var(--dt-order-arrow-width)/2) solid transparent}table.dataTable thead>tr>th.dt-orderable-asc .dt-column-order,table.dataTable thead>tr>th.dt-orderable-desc .dt-column-order,table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order,table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order,table.dataTable thead>tr>td.dt-orderable-asc .dt-column-order,table.dataTable thead>tr>td.dt-orderable-desc .dt-column-order,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order{position:relative;width:var(--dt-order-arrow-width);align-self:stretch}table.dataTable thead>tr>th.dt-orderable-asc .dt-column-order:before,table.dataTable thead>tr>th.dt-orderable-asc .dt-column-order:after,table.dataTable thead>tr>th.dt-orderable-desc .dt-column-order:before,table.dataTable thead>tr>th.dt-orderable-desc .dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-asc .dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-desc .dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order:after{position:absolute;display:block;content:" ";height:0;width:0;left:0;color:var(--dt-order-arrow_color);opacity:var(--dt-order-arrow_opacity)}table.dataTable thead>tr>th.dt-orderable-asc,table.dataTable thead>tr>th.dt-orderable-desc,table.dataTable thead>tr>td.dt-orderable-asc,table.dataTable thead>tr>td.dt-orderable-desc{cursor:pointer}table.dataTable thead>tr>th.dt-orderable-asc:hover,table.dataTable thead>tr>th.dt-orderable-desc:hover,table.dataTable thead>tr>td.dt-orderable-asc:hover,table.dataTable thead>tr>td.dt-orderable-desc:hover{outline:var(--dt-order-header_outline-hover);outline-offset:-2px}table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order:before{border-bottom-color:var(--dt-order-arrow_color-current);opacity:var(--dt-order-arrow_opacity-current)}table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order:after{border-top-color:var(--dt-order-arrow_color-current);opacity:var(--dt-order-arrow_opacity-current)}table.dataTable thead>tr>th.dt-orderable-none:not(.dt-ordering-asc,.dt-ordering-desc) .dt-column-order:empty,table.dataTable thead>tr>th.sorting_desc_disabled .dt-column-order:after,table.dataTable thead>tr>th.sorting_asc_disabled .dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-none:not(.dt-ordering-asc,.dt-ordering-desc) .dt-column-order:empty,table.dataTable thead>tr>td.sorting_desc_disabled .dt-column-order:after,table.dataTable thead>tr>td.sorting_asc_disabled .dt-column-order:before{display:none}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead>tr>th div.dt-column-header,table.dataTable thead>tr>th div.dt-column-footer,table.dataTable thead>tr>td div.dt-column-header,table.dataTable thead>tr>td div.dt-column-footer,table.dataTable tfoot>tr>th div.dt-column-header,table.dataTable tfoot>tr>th div.dt-column-footer,table.dataTable tfoot>tr>td div.dt-column-header,table.dataTable tfoot>tr>td div.dt-column-footer{display:flex;justify-content:space-between;align-items:var(--dt-header-cell_align-items);gap:4px}table.dataTable thead>tr>th div.dt-column-header .dt-column-title,table.dataTable thead>tr>th div.dt-column-footer .dt-column-title,table.dataTable thead>tr>td div.dt-column-header .dt-column-title,table.dataTable thead>tr>td div.dt-column-footer .dt-column-title,table.dataTable tfoot>tr>th div.dt-column-header .dt-column-title,table.dataTable tfoot>tr>th div.dt-column-footer .dt-column-title,table.dataTable tfoot>tr>td div.dt-column-header .dt-column-title,table.dataTable tfoot>tr>td div.dt-column-footer .dt-column-title{flex-grow:1}table.dataTable thead>tr>th div.dt-column-header .dt-column-title:empty,table.dataTable thead>tr>th div.dt-column-footer .dt-column-title:empty,table.dataTable thead>tr>td div.dt-column-header .dt-column-title:empty,table.dataTable thead>tr>td div.dt-column-footer .dt-column-title:empty,table.dataTable tfoot>tr>th div.dt-column-header .dt-column-title:empty,table.dataTable tfoot>tr>th div.dt-column-footer .dt-column-title:empty,table.dataTable tfoot>tr>td div.dt-column-header .dt-column-title:empty,table.dataTable tfoot>tr>td div.dt-column-footer .dt-column-title:empty{display:none}div.dt-scroll-body>table.dataTable>thead>tr>th,div.dt-scroll-body>table.dataTable>thead>tr>td{overflow:hidden}:root.dark table.dataTable thead>tr>th.dt-orderable-asc:hover,:root.dark table.dataTable thead>tr>th.dt-orderable-desc:hover,:root.dark table.dataTable thead>tr>td.dt-orderable-asc:hover,:root.dark table.dataTable thead>tr>td.dt-orderable-desc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>th.dt-orderable-asc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>th.dt-orderable-desc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>td.dt-orderable-asc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>td.dt-orderable-desc:hover{outline:var(--dt-order-header_outline-hover)}/*! DataTables Bootstrap 4 integration + * © SpryMedia Ltd - datatables.net/license + */:root{--dt-processing-circle_background: var(--dt_background-selected)}div.dt-processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-22px;text-align:center;padding:2px;z-index:10}div.dt-processing>div:last-child{position:relative;width:80px;height:15px;margin:1em auto}div.dt-processing>div:last-child>div{position:absolute;top:0;width:13px;height:13px;border-radius:50%;background:rgb(var(--dt-processing-circle_background));animation-timing-function:cubic-bezier(0, 1, 1, 0)}div.dt-processing>div:last-child>div:nth-child(1){left:8px;animation:datatables-loader-1 .6s infinite}div.dt-processing>div:last-child>div:nth-child(2){left:8px;animation:datatables-loader-2 .6s infinite}div.dt-processing>div:last-child>div:nth-child(3){left:32px;animation:datatables-loader-2 .6s infinite}div.dt-processing>div:last-child>div:nth-child(4){left:56px;animation:datatables-loader-3 .6s infinite}@keyframes datatables-loader-1{0%{transform:scale(0)}100%{transform:scale(1)}}@keyframes datatables-loader-3{0%{transform:scale(1)}100%{transform:scale(0)}}@keyframes datatables-loader-2{0%{transform:translate(0, 0)}100%{transform:translate(24px, 0)}}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable th,table.dataTable td{box-sizing:border-box}table.dataTable th.dt-type-numeric,table.dataTable th.dt-type-date,table.dataTable td.dt-type-numeric,table.dataTable td.dt-type-date{text-align:right}table.dataTable th.dt-type-numeric div.dt-column-header,table.dataTable th.dt-type-numeric div.dt-column-footer,table.dataTable th.dt-type-date div.dt-column-header,table.dataTable th.dt-type-date div.dt-column-footer,table.dataTable td.dt-type-numeric div.dt-column-header,table.dataTable td.dt-type-numeric div.dt-column-footer,table.dataTable td.dt-type-date div.dt-column-header,table.dataTable td.dt-type-date div.dt-column-footer{flex-direction:row-reverse}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-left div.dt-column-header,table.dataTable th.dt-left div.dt-column-footer,table.dataTable td.dt-left div.dt-column-header,table.dataTable td.dt-left div.dt-column-footer{flex-direction:row}table.dataTable th.dt-center,table.dataTable td.dt-center{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-right div.dt-column-header,table.dataTable th.dt-right div.dt-column-footer,table.dataTable td.dt-right div.dt-column-header,table.dataTable td.dt-right div.dt-column-footer{flex-direction:row-reverse}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-justify div.dt-column-header,table.dataTable th.dt-justify div.dt-column-footer,table.dataTable td.dt-justify div.dt-column-header,table.dataTable td.dt-justify div.dt-column-footer{flex-direction:row}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable th.dt-empty,table.dataTable td.dt-empty{text-align:center;vertical-align:top}table.dataTable thead th,table.dataTable thead td,table.dataTable tfoot th,table.dataTable tfoot td{text-align:left;vertical-align:var(--dt-header-cell_vertical-align)}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-left div.dt-column-header,table.dataTable thead th.dt-head-left div.dt-column-footer,table.dataTable thead td.dt-head-left div.dt-column-header,table.dataTable thead td.dt-head-left div.dt-column-footer,table.dataTable tfoot th.dt-head-left div.dt-column-header,table.dataTable tfoot th.dt-head-left div.dt-column-footer,table.dataTable tfoot td.dt-head-left div.dt-column-header,table.dataTable tfoot td.dt-head-left div.dt-column-footer{flex-direction:row}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-right div.dt-column-header,table.dataTable thead th.dt-head-right div.dt-column-footer,table.dataTable thead td.dt-head-right div.dt-column-header,table.dataTable thead td.dt-head-right div.dt-column-footer,table.dataTable tfoot th.dt-head-right div.dt-column-header,table.dataTable tfoot th.dt-head-right div.dt-column-footer,table.dataTable tfoot td.dt-head-right div.dt-column-header,table.dataTable tfoot td.dt-head-right div.dt-column-footer{flex-direction:row-reverse}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-justify div.dt-column-header,table.dataTable thead th.dt-head-justify div.dt-column-footer,table.dataTable thead td.dt-head-justify div.dt-column-header,table.dataTable thead td.dt-head-justify div.dt-column-footer,table.dataTable tfoot th.dt-head-justify div.dt-column-header,table.dataTable tfoot th.dt-head-justify div.dt-column-footer,table.dataTable tfoot td.dt-head-justify div.dt-column-header,table.dataTable tfoot td.dt-head-justify div.dt-column-footer{flex-direction:row}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}:root{--dt_background-selected: 2, 117, 216}table.dataTable.table{clear:both;max-width:none;border-spacing:0;margin-bottom:0}table.dataTable.table.table-striped>tbody>tr:nth-of-type(2n+1){background-color:transparent}table.dataTable.table>tbody>tr{background-color:var(--dt-row_background)}table.dataTable.table>tbody>tr.selected>*{box-shadow:inset 0 0 0 9999px rgb(var(--dt-row_background-selected));color:rgb(var(--dt-row-text_color-selected))}table.dataTable.table>tbody>tr.selected a{color:rgb(var(--dt-row-link_color-selected))}table.dataTable.table.table-striped>tbody>tr:nth-of-type(2n+1)>*{box-shadow:inset 0 0 0 9999px rgba(var(--dt-row_background-stripe), 0.05)}table.dataTable.table.table-striped>tbody>tr:nth-of-type(2n+1).selected>*{box-shadow:inset 0 0 0 9999px rgba(var(--dt-row_background-selected), 0.95)}table.dataTable.table.table-hover>tbody>tr:hover>*{box-shadow:inset 0 0 0 9999px rgba(var(--dt-row_background-hover), 0.075)}table.dataTable.table.table-hover>tbody>tr.selected:hover>*{box-shadow:inset 0 0 0 9999px rgba(var(--dt-row_background-selected), 0.975)}div.dt-container div.dt-layout-start>*:not(:last-child){margin-right:1em}div.dt-container div.dt-layout-end>*:not(:first-child){margin-left:1em}div.dt-container div.dt-layout-full{width:100%}div.dt-container div.dt-layout-full>*:only-child{margin-left:auto;margin-right:auto}div.dt-container div.dt-layout-table>div{display:block !important}@media screen and (max-width: 767px){div.dt-container div.dt-layout-start>*:not(:last-child){margin-right:0}div.dt-container div.dt-layout-end>*:not(:first-child){margin-left:0}}div.dt-container{position:relative}div.dt-container>div.row{margin-bottom:.5rem}div.dt-container>div.row:last-child{margin-bottom:0}div.dt-container div.dt-length label{font-weight:normal;text-align:left;white-space:nowrap;margin-bottom:0}div.dt-container div.dt-length select{width:auto;display:inline-block;margin-right:.5em}div.dt-container div.dt-search label{font-weight:normal;white-space:nowrap;text-align:left;margin-bottom:0}div.dt-container div.dt-search input{margin-left:.5em;display:inline-block;width:auto}div.dt-container div.dt-info{white-space:nowrap}div.dt-container div.dt-paging{margin:0}div.dt-container div.dt-paging ul.pagination{margin:0;flex-wrap:wrap}div.dt-container div.dt-processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}div.dt-container div.dt-scroll-body{border-bottom:1px solid #dee2e6}div.dt-container div.dt-scroll-body table,div.dt-container div.dt-scroll-body tbody>tr:last-child>*{border-bottom:none}div.dt-scroll-head table.dataTable{margin-bottom:0 !important}div.dt-scroll-body>table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dt-scroll-body>table thead .dt-orderable-asc:before,div.dt-scroll-body>table thead .dt-orderable-desc:after{display:none}div.dt-scroll-body>table>tbody tr:first-child th,div.dt-scroll-body>table>tbody tr:first-child td{border-top:none}div.dt-scroll-foot>.dt-scroll-footInner{box-sizing:content-box}div.dt-scroll-foot>.dt-scroll-footInner>table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dt-container div.dt-length,div.dt-container div.dt-search,div.dt-container div.dt-info,div.dt-container div.dt-paging{text-align:center}div.dt-container div.row{margin-bottom:0}div.dt-container div.row>*{margin-bottom:.5rem}div.dt-container div.dt-paging ul.pagination{justify-content:center !important}}table.dataTable.table-sm>thead>tr th.dt-orderable-asc,table.dataTable.table-sm>thead>tr th.dt-orderable-desc,table.dataTable.table-sm>thead>tr th.dt-ordering-asc,table.dataTable.table-sm>thead>tr th.dt-ordering-desc,table.dataTable.table-sm>thead>tr td.dt-orderable-asc,table.dataTable.table-sm>thead>tr td.dt-orderable-desc,table.dataTable.table-sm>thead>tr td.dt-ordering-asc,table.dataTable.table-sm>thead>tr td.dt-ordering-desc{padding-right:4px}table.dataTable.table-sm>thead>tr th.dt-orderable-asc .dt-column-order,table.dataTable.table-sm>thead>tr th.dt-orderable-desc .dt-column-order,table.dataTable.table-sm>thead>tr th.dt-ordering-asc .dt-column-order,table.dataTable.table-sm>thead>tr th.dt-ordering-desc .dt-column-order,table.dataTable.table-sm>thead>tr td.dt-orderable-asc .dt-column-order,table.dataTable.table-sm>thead>tr td.dt-orderable-desc .dt-column-order,table.dataTable.table-sm>thead>tr td.dt-ordering-asc .dt-column-order,table.dataTable.table-sm>thead>tr td.dt-ordering-desc .dt-column-order{right:4px}table.dataTable.table-sm>thead>tr th.dt-type-date .dt-column-order,table.dataTable.table-sm>thead>tr th.dt-type-numeric .dt-column-order,table.dataTable.table-sm>thead>tr td.dt-type-date .dt-column-order,table.dataTable.table-sm>thead>tr td.dt-type-numeric .dt-column-order{left:4px}div.dt-scroll-head table.table-bordered{border-bottom-width:0}div.table-responsive>div.dt-container>div.row{margin:0}div.table-responsive>div.dt-container>div.row>div[class^=col-]:first-child{padding-left:0}div.table-responsive>div.dt-container>div.row>div[class^=col-]:last-child{padding-right:0} diff --git a/libs/DataTables/datatables.min.js b/libs/DataTables/datatables.min.js index 6b8f3f93c..14adcd47e 100644 --- a/libs/DataTables/datatables.min.js +++ b/libs/DataTables/datatables.min.js @@ -4,19 +4,19 @@ * * To rebuild or modify this file with the latest versions of the included * software please visit: - * https://datatables.net/download/#bs4/dt-2.3.7 + * https://datatables.net/download/#bs4/dt-3.0.1 * * Included libraries: - * DataTables 2.3.7 + * DataTables 3.0.1 */ -/*! DataTables 2.3.7 - * © SpryMedia Ltd - datatables.net/license +/*! DataTables 3.0.1 + * Copyright (c) SpryMedia Ltd - datatables.net/license */ -(n=>{var r;"function"==typeof define&&define.amd?define(["jquery"],function(e){return n(e,window,document)}):"object"==typeof exports?(r=require("jquery"),"undefined"==typeof window?module.exports=function(e,t){return e=e||window,t=t||r(e),n(t,e,e.document)}:module.exports=n(r,window,window.document)):window.DataTable=n(jQuery,window,document)})(function(H,W,_){function f(e){var t=parseInt(e,10);return!isNaN(t)&&isFinite(e)?t:null}function c(e,t,n,r){var a=typeof e,o="string"==a;return"number"==a||"bigint"==a||!(!r||!T(e))||(t&&o&&(e=k(e,t)),n&&o&&(e=e.replace(E,"")),!isNaN(parseFloat(e))&&isFinite(e))}function n(e,t,n,r){var a;return!(!r||!T(e))||("string"!=typeof e||!e.match(/<(input|select)/i))&&(T(a=e)||"string"==typeof a)&&!!c(I(e),t,n,r)||null}function v(e,t,n,r){var a=[],o=0,i=t.length;if(void 0!==r)for(;o"),fastData:function(e,t,n){return q(c,e,t,n)}}),n=(c.nTable=this,c.oInit=t,o.push(c),c.api=new X(c),c.oInstance=1===E.length?E:a.dataTable(),K(t),t.aLengthMenu&&!t.iDisplayLength&&(t.iDisplayLength=Array.isArray(t.aLengthMenu[0])?t.aLengthMenu[0][0]:H.isPlainObject(t.aLengthMenu[0])?t.aLengthMenu[0].value:t.aLengthMenu[0]),t=nt(H.extend(!0,{},r),t),$(c.oFeatures,t,["bPaginate","bLengthChange","bFilter","bSort","bSortMulti","bInfo","bProcessing","bAutoWidth","bSortClasses","bServerSide","bDeferRender"]),$(c,t,["ajax","fnFormatNumber","sServerMethod","aaSorting","aaSortingFixed","aLengthMenu","sPaginationType","iStateDuration","bSortCellsTop","iTabIndex","sDom","fnStateLoadCallback","fnStateSaveCallback","renderer","searchDelay","rowId","caption","layout","orderDescReverse","orderIndicators","orderHandler","titleRow","typeDetect","columnTitleTag",["iCookieDuration","iStateDuration"],["oSearch","oPreviousSearch"],["aoSearchCols","aoPreSearchCols"],["iDisplayLength","_iDisplayLength"]]),$(c.oScroll,t,[["sScrollX","sX"],["sScrollXInner","sXInner"],["sScrollY","sY"],["bScrollCollapse","bCollapse"]]),$(c.oLanguage,t,"fnInfoCallback"),Y(c,"aoDrawCallback",t.fnDrawCallback),Y(c,"aoStateSaveParams",t.fnStateSaveParams),Y(c,"aoStateLoadParams",t.fnStateLoadParams),Y(c,"aoStateLoaded",t.fnStateLoaded),Y(c,"aoRowCallback",t.fnRowCallback),Y(c,"aoRowCreatedCallback",t.fnCreatedRow),Y(c,"aoHeaderCallback",t.fnHeaderCallback),Y(c,"aoFooterCallback",t.fnFooterCallback),Y(c,"aoInitComplete",t.fnInitComplete),Y(c,"aoPreDrawCallback",t.fnPreDrawCallback),c.rowIdFn=U(t.rowId),t.on&&Object.keys(t.on).forEach(function(e){st(a,e,t.on[e])}),c),d=(V.__browser||(f={},V.__browser=f,p=H("
    ").css({position:"fixed",top:0,left:-1*W.pageXOffset,height:1,width:1,overflow:"hidden"}).append(H("
    ").css({position:"absolute",top:1,left:1,width:100,overflow:"scroll"}).append(H("
    ").css({width:"100%",height:10}))).appendTo("body"),d=p.children(),u=d.children(),f.barWidth=d[0].offsetWidth-d[0].clientWidth,f.bScrollbarLeft=1!==Math.round(u.offset().left),p.remove()),H.extend(n.oBrowser,V.__browser),n.oScroll.iBarWidth=V.__browser.barWidth,c.oClasses),f=(H.extend(d,V.ext.classes,t.oClasses),a.addClass(d.table),c.oFeatures.bPaginate||(t.iDisplayStart=0),void 0===c.iInitDisplayStart&&(c.iInitDisplayStart=t.iDisplayStart,c._iDisplayStart=t.iDisplayStart),t.iDeferLoading),h=(null!==f&&(c.deferLoading=!0,u=Array.isArray(f),c._iRecordsDisplay=u?f[0]:f,c._iRecordsTotal=u?f[1]:f),[]),p=this.getElementsByTagName("thead"),n=Fe(c,p[0]);if(t.aoColumns)h=t.aoColumns;else if(n.length)for(j=n[e=0].length;e").prependTo(a):n).html(c.caption),n.length&&(n[0]._captionSide=n.css("caption-side"),c.captionNode=n[0]),n.length?c.colgroup.insertAfter(n):c.colgroup.prependTo(c.nTable),0===p.length&&(p=H("").appendTo(a)),c.nTHead=p[0],a.children("tbody")),n=(0===n.length&&(n=H("").insertAfter(p)),c.nTBody=n[0],a.children("tfoot")),R=(0===n.length&&(n=H("").appendTo(a)),c.nTFoot=n[0],c.aiDisplay=c.aiDisplayMaster.slice(),c.bInitialised=!0,c.oLanguage);H.extend(!0,R,t.oLanguage),R.sUrl?H.ajax({dataType:"json",url:R.sUrl,success:function(e){B(r.oLanguage,e),H.extend(!0,R,e,c.oInit.oLanguage),G(c,null,"i18n",[c],!0),We(c)},error:function(){z(c,0,"i18n file loading error",21),We(c)}}):(G(c,null,"i18n",[c],!0),We(c))}}),E=null,this)},N=(V.ext=C={builder:"bs4/dt-2.3.7",buttons:{},ccContent:{},classes:{},errMode:"alert",escape:{attributes:!1},feature:[],features:{},search:[],selector:{cell:[],column:[],row:[]},legacy:{ajax:null},pager:{},renderer:{pageButton:{},header:{}},order:{},type:{className:{},detect:[],render:{},search:{},order:{}},_unique:0,fnVersionCheck:V.fnVersionCheck,iApiIndex:0,sVersion:V.version},H.extend(C,{afnFiltering:C.search,aTypes:C.type.detect,ofnSearch:C.type.search,oSort:C.type.order,afnSortData:C.order,aoFeatures:C.feature,oStdClasses:C.classes,oPagination:C.pager}),H.extend(V.ext.classes,{container:"dt-container",empty:{row:"dt-empty"},info:{container:"dt-info"},layout:{row:"dt-layout-row",cell:"dt-layout-cell",tableRow:"dt-layout-table",tableCell:"",start:"dt-layout-start",end:"dt-layout-end",full:"dt-layout-full"},length:{container:"dt-length",select:"dt-input"},order:{canAsc:"dt-orderable-asc",canDesc:"dt-orderable-desc",isAsc:"dt-ordering-asc",isDesc:"dt-ordering-desc",none:"dt-orderable-none",position:"sorting_"},processing:{container:"dt-processing"},scrolling:{body:"dt-scroll-body",container:"dt-scroll",footer:{self:"dt-scroll-foot",inner:"dt-scroll-footInner"},header:{self:"dt-scroll-head",inner:"dt-scroll-headInner"}},search:{container:"dt-search",input:"dt-input"},table:"dataTable",tbody:{cell:"",row:""},thead:{cell:"",row:""},tfoot:{cell:"",row:""},paging:{active:"current",button:"dt-paging-button",container:"dt-paging",disabled:"disabled",nav:""}}),{}),F=/[\r\n\u2028]/g,O=/<([^>]*>)/g,j=Math.pow(2,28),R=/^\d{2,4}[./-]\d{1,2}[./-]\d{1,2}([T ]{1}\d{1,2}[:.]\d{2}([.:]\d{2})?)?$/,P=new RegExp("(\\"+["/",".","*","+","?","|","(",")","[","]","{","}","\\","$","^","-"].join("|\\")+")","g"),E=/['\u00A0,$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfkɃΞ]/gi,T=function(e){return!e||!0===e||"-"===e},k=function(e,t){return N[t]||(N[t]=new RegExp(ke(t),"g")),"string"==typeof e&&"."!==t?e.replace(/\./g,"").replace(N[t],"."):e},b=function(e,t,n){var r=[],a=0,o=e.length;if(void 0!==n)for(;aj)throw new Error("Exceeded max str len");var n;for(e=e.replace(O,t||"");(e=(n=e).replace(/