Varnish
tcp/80
openresty
tcp/443
Open service 151.101.3.7:80 · changenode.com
2026-01-26 10:01
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://changenode.com/ Accept-Ranges: bytes Date: Mon, 26 Jan 2026 10:01:35 GMT Via: 1.1 varnish X-Served-By: cache-bom-vanm7210042-BOM X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1769421695.393953,VS0,VE0 x-request-id: 86b9e07c-3aa1-4d0d-bacb-a1c8ab422371 Ghost-Fastly: true;production Alt-Svc: clear
Open service 2a04:4e42::775:80 · changenode.com
2026-01-26 10:01
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://changenode.com/ Accept-Ranges: bytes Date: Mon, 26 Jan 2026 10:01:35 GMT Via: 1.1 varnish X-Served-By: cache-fra-eddf8230194-FRA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1769421695.295490,VS0,VE1 x-request-id: 4f1f1132-a497-407e-b727-1c6754b48f0f Ghost-Fastly: true;production Alt-Svc: clear
Open service 2a04:4e42:600::775:443 · changenode.com
2026-01-26 10:01
HTTP/1.1 200 OK
Connection: close
Content-Length: 111073
via: 1.1 varnish, 1.1 varnish, 1.1 varnish
content-type: text/html; charset=utf-8
status: 200 OK
server: openresty
etag: W/"1b1e1-TlXKP19sFA1yfe/d0RC50igRlzI"
cache-control: public, max-age=0
Accept-Ranges: bytes
Date: Mon, 26 Jan 2026 10:01:35 GMT
Age: 97791
X-Served-By: cache-ams21082-AMS, cache-ams21026-AMS, cache-fra-eddf8230057-FRA
X-Cache: MISS, HIT, HIT
X-Cache-Hits: 0, 9, 1
X-Timer: S1769421695.383415,VS0,VE3
Vary: Cookie, Accept-Encoding
x-request-id: 1dbfd35c-3076-48cd-bf68-237bad0ef0c9
Ghost-Fastly: true;production
Alt-Svc: clear
Page title: ChangeNode
<!DOCTYPE html>
<html
lang="en"
class="group/html min-h-screen has-inline-code-block
dark
has-sidebar-transparent
has-gray-scale-Gray
"
data-prismjs-copy="Copy"
data-prismjs-copy-error="Error"
data-prismjs-copy-success="Copied">
<head>
<meta charset="UTF-8">
<meta name="HandheldFriendly" content="True" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ChangeNode</title>
<link rel="preload" as="style" href="https://changenode.com/assets/built/main.min.css?v=34e7a2bdc2" />
<link rel="preload" as="script" href="https://changenode.com/assets/built/main.min.js?v=34e7a2bdc2" />
<script>
// Namespace
window.Spiritix = window.Spiritix || {};
// Translations
window.Spiritix.t = {
"Toggle menu": 'Toggle menu'
};
// Color functions
window.Spiritix.hexToRgb = (hex) => {
hex = hex.replace('#', '');
hex = hex.length === 3 ? hex.split().map(c => c + c).join() : hex;
return [
parseInt(hex.substring(0,2), 16),
parseInt(hex.substring(2,4), 16),
parseInt(hex.substring(4,6), 16),
];
};
window.Spiritix.getContrastColor = (hex) => {
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const yiq = ((r*299) + (g*587) + (b*114)) / 1000;
return (yiq >= 128) ? '#000' : '#fff';
};
</script>
<script>
if (localStorage && localStorage.theme) {
document.documentElement.classList.toggle('dark', localStorage.theme === 'dark');
} else if ("Dark" === "System") {
document.documentElement.classList.toggle('dark', window.matchMedia('(prefers-color-scheme: dark)').matches);
}
</script>
<script>
(function() {
const hex = "#000000".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const contrastColor = window.Spiritix.getContrastColor(hex);
document.documentElement.style.setProperty('--ghost-accent-color-light-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-light', contrastColor);
window.Spiritix.ghostAccentColorLightRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root {
--color-contrast: var(--color-contrast-light);
--ghost-accent-color-rgb: var(--ghost-accent-color-light-rgb);
}
</style>
<script>
(function() {
const hexDark = "#ffffff".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hexDark);
const contrastColor = window.Spiritix.getContrastColor(hexDark);
document.documentElement.style.setProperty('--ghost-accent-color-dark-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-dark', contrastColor);
window.Spiritix.ghostAccentColorDarkRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root.dark {
--color-contrast: var(--color-contrast-dark);
--ghost-accent-color-rgb: var(--ghost-accent-color-dark-rgb);
--ghost-accent-color: #ffffff;
}
</style>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,wght@0,400..900;1,400..900&display=swap" rel="stylesheet">
<style>
:root {
--font-body: 'Nunito Sans';
}
</style>
<style>
:root {
--font-headings: 'Nunito Sans';
}
</style>
<link href="https://changenode.com/assets/built/main.min.css?v=34e7a2bdc2" rel="stylesheet" type="text/css" />
Open service 2a04:4e42:200::775:80 · changenode.com
2026-01-26 10:01
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://changenode.com/ Accept-Ranges: bytes Date: Mon, 26 Jan 2026 10:01:35 GMT Via: 1.1 varnish X-Served-By: cache-fra-eddf8230160-FRA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1769421695.325614,VS0,VE1 x-request-id: fdf2c8df-766c-4fc1-98e8-687385d0a3de Ghost-Fastly: true;production Alt-Svc: clear
Open service 2a04:4e42::775:443 · changenode.com
2026-01-26 10:01
HTTP/1.1 200 OK
Connection: close
Content-Length: 111073
via: 1.1 varnish, 1.1 varnish, 1.1 varnish
content-type: text/html; charset=utf-8
status: 200 OK
server: openresty
etag: W/"1b1e1-TlXKP19sFA1yfe/d0RC50igRlzI"
cache-control: public, max-age=0
Accept-Ranges: bytes
Date: Mon, 26 Jan 2026 10:01:35 GMT
Age: 97791
X-Served-By: cache-ams21082-AMS, cache-ams21026-AMS, cache-fra-eddf8230119-FRA
X-Cache: MISS, HIT, HIT
X-Cache-Hits: 0, 9, 1
X-Timer: S1769421695.386007,VS0,VE5
Vary: Cookie, Accept-Encoding
x-request-id: a2391431-5b52-427a-bb58-a7811bf9ca4c
Ghost-Fastly: true;production
Alt-Svc: clear
Page title: ChangeNode
<!DOCTYPE html>
<html
lang="en"
class="group/html min-h-screen has-inline-code-block
dark
has-sidebar-transparent
has-gray-scale-Gray
"
data-prismjs-copy="Copy"
data-prismjs-copy-error="Error"
data-prismjs-copy-success="Copied">
<head>
<meta charset="UTF-8">
<meta name="HandheldFriendly" content="True" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ChangeNode</title>
<link rel="preload" as="style" href="https://changenode.com/assets/built/main.min.css?v=34e7a2bdc2" />
<link rel="preload" as="script" href="https://changenode.com/assets/built/main.min.js?v=34e7a2bdc2" />
<script>
// Namespace
window.Spiritix = window.Spiritix || {};
// Translations
window.Spiritix.t = {
"Toggle menu": 'Toggle menu'
};
// Color functions
window.Spiritix.hexToRgb = (hex) => {
hex = hex.replace('#', '');
hex = hex.length === 3 ? hex.split().map(c => c + c).join() : hex;
return [
parseInt(hex.substring(0,2), 16),
parseInt(hex.substring(2,4), 16),
parseInt(hex.substring(4,6), 16),
];
};
window.Spiritix.getContrastColor = (hex) => {
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const yiq = ((r*299) + (g*587) + (b*114)) / 1000;
return (yiq >= 128) ? '#000' : '#fff';
};
</script>
<script>
if (localStorage && localStorage.theme) {
document.documentElement.classList.toggle('dark', localStorage.theme === 'dark');
} else if ("Dark" === "System") {
document.documentElement.classList.toggle('dark', window.matchMedia('(prefers-color-scheme: dark)').matches);
}
</script>
<script>
(function() {
const hex = "#000000".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const contrastColor = window.Spiritix.getContrastColor(hex);
document.documentElement.style.setProperty('--ghost-accent-color-light-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-light', contrastColor);
window.Spiritix.ghostAccentColorLightRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root {
--color-contrast: var(--color-contrast-light);
--ghost-accent-color-rgb: var(--ghost-accent-color-light-rgb);
}
</style>
<script>
(function() {
const hexDark = "#ffffff".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hexDark);
const contrastColor = window.Spiritix.getContrastColor(hexDark);
document.documentElement.style.setProperty('--ghost-accent-color-dark-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-dark', contrastColor);
window.Spiritix.ghostAccentColorDarkRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root.dark {
--color-contrast: var(--color-contrast-dark);
--ghost-accent-color-rgb: var(--ghost-accent-color-dark-rgb);
--ghost-accent-color: #ffffff;
}
</style>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,wght@0,400..900;1,400..900&display=swap" rel="stylesheet">
<style>
:root {
--font-body: 'Nunito Sans';
}
</style>
<style>
:root {
--font-headings: 'Nunito Sans';
}
</style>
<link href="https://changenode.com/assets/built/main.min.css?v=34e7a2bdc2" rel="stylesheet" type="text/css" />
Open service 2a04:4e42:400::775:80 · changenode.com
2026-01-26 10:01
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://changenode.com/ Accept-Ranges: bytes Date: Mon, 26 Jan 2026 10:01:35 GMT Via: 1.1 varnish X-Served-By: cache-fra-eddf8230072-FRA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1769421695.292197,VS0,VE1 x-request-id: 3e0ce659-9a89-4e0c-8fd1-fa9c98f46d15 Ghost-Fastly: true;production Alt-Svc: clear
Open service 2a04:4e42:400::775:443 · changenode.com
2026-01-26 10:01
HTTP/1.1 200 OK
Connection: close
Content-Length: 111073
via: 1.1 varnish, 1.1 varnish, 1.1 varnish
content-type: text/html; charset=utf-8
status: 200 OK
server: openresty
etag: W/"1b1e1-TlXKP19sFA1yfe/d0RC50igRlzI"
cache-control: public, max-age=0
Accept-Ranges: bytes
Date: Mon, 26 Jan 2026 10:01:35 GMT
Age: 97791
X-Served-By: cache-ams21082-AMS, cache-ams21026-AMS, cache-fra-eddf8230146-FRA
X-Cache: MISS, HIT, HIT
X-Cache-Hits: 0, 9, 1
X-Timer: S1769421695.306800,VS0,VE4
Vary: Cookie, Accept-Encoding
x-request-id: 61bf7f6d-8d98-4c8b-a2cd-1b5236583a09
Ghost-Fastly: true;production
Alt-Svc: clear
Page title: ChangeNode
<!DOCTYPE html>
<html
lang="en"
class="group/html min-h-screen has-inline-code-block
dark
has-sidebar-transparent
has-gray-scale-Gray
"
data-prismjs-copy="Copy"
data-prismjs-copy-error="Error"
data-prismjs-copy-success="Copied">
<head>
<meta charset="UTF-8">
<meta name="HandheldFriendly" content="True" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ChangeNode</title>
<link rel="preload" as="style" href="https://changenode.com/assets/built/main.min.css?v=34e7a2bdc2" />
<link rel="preload" as="script" href="https://changenode.com/assets/built/main.min.js?v=34e7a2bdc2" />
<script>
// Namespace
window.Spiritix = window.Spiritix || {};
// Translations
window.Spiritix.t = {
"Toggle menu": 'Toggle menu'
};
// Color functions
window.Spiritix.hexToRgb = (hex) => {
hex = hex.replace('#', '');
hex = hex.length === 3 ? hex.split().map(c => c + c).join() : hex;
return [
parseInt(hex.substring(0,2), 16),
parseInt(hex.substring(2,4), 16),
parseInt(hex.substring(4,6), 16),
];
};
window.Spiritix.getContrastColor = (hex) => {
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const yiq = ((r*299) + (g*587) + (b*114)) / 1000;
return (yiq >= 128) ? '#000' : '#fff';
};
</script>
<script>
if (localStorage && localStorage.theme) {
document.documentElement.classList.toggle('dark', localStorage.theme === 'dark');
} else if ("Dark" === "System") {
document.documentElement.classList.toggle('dark', window.matchMedia('(prefers-color-scheme: dark)').matches);
}
</script>
<script>
(function() {
const hex = "#000000".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const contrastColor = window.Spiritix.getContrastColor(hex);
document.documentElement.style.setProperty('--ghost-accent-color-light-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-light', contrastColor);
window.Spiritix.ghostAccentColorLightRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root {
--color-contrast: var(--color-contrast-light);
--ghost-accent-color-rgb: var(--ghost-accent-color-light-rgb);
}
</style>
<script>
(function() {
const hexDark = "#ffffff".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hexDark);
const contrastColor = window.Spiritix.getContrastColor(hexDark);
document.documentElement.style.setProperty('--ghost-accent-color-dark-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-dark', contrastColor);
window.Spiritix.ghostAccentColorDarkRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root.dark {
--color-contrast: var(--color-contrast-dark);
--ghost-accent-color-rgb: var(--ghost-accent-color-dark-rgb);
--ghost-accent-color: #ffffff;
}
</style>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,wght@0,400..900;1,400..900&display=swap" rel="stylesheet">
<style>
:root {
--font-body: 'Nunito Sans';
}
</style>
<style>
:root {
--font-headings: 'Nunito Sans';
}
</style>
<link href="https://changenode.com/assets/built/main.min.css?v=34e7a2bdc2" rel="stylesheet" type="text/css" />
Open service 2a04:4e42:200::775:443 · changenode.com
2026-01-26 10:01
HTTP/1.1 200 OK
Connection: close
Content-Length: 111073
via: 1.1 varnish, 1.1 varnish, 1.1 varnish
content-type: text/html; charset=utf-8
status: 200 OK
server: openresty
etag: W/"1b1e1-TlXKP19sFA1yfe/d0RC50igRlzI"
cache-control: public, max-age=0
Accept-Ranges: bytes
Date: Mon, 26 Jan 2026 10:01:35 GMT
Age: 97791
X-Served-By: cache-ams21082-AMS, cache-ams21026-AMS, cache-fra-eddf8230142-FRA
X-Cache: MISS, HIT, HIT
X-Cache-Hits: 0, 9, 1
X-Timer: S1769421695.316555,VS0,VE2
Vary: Cookie, Accept-Encoding
x-request-id: 30239404-35bc-4392-9d08-4fcdf955757f
Ghost-Fastly: true;production
Alt-Svc: clear
Page title: ChangeNode
<!DOCTYPE html>
<html
lang="en"
class="group/html min-h-screen has-inline-code-block
dark
has-sidebar-transparent
has-gray-scale-Gray
"
data-prismjs-copy="Copy"
data-prismjs-copy-error="Error"
data-prismjs-copy-success="Copied">
<head>
<meta charset="UTF-8">
<meta name="HandheldFriendly" content="True" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ChangeNode</title>
<link rel="preload" as="style" href="https://changenode.com/assets/built/main.min.css?v=34e7a2bdc2" />
<link rel="preload" as="script" href="https://changenode.com/assets/built/main.min.js?v=34e7a2bdc2" />
<script>
// Namespace
window.Spiritix = window.Spiritix || {};
// Translations
window.Spiritix.t = {
"Toggle menu": 'Toggle menu'
};
// Color functions
window.Spiritix.hexToRgb = (hex) => {
hex = hex.replace('#', '');
hex = hex.length === 3 ? hex.split().map(c => c + c).join() : hex;
return [
parseInt(hex.substring(0,2), 16),
parseInt(hex.substring(2,4), 16),
parseInt(hex.substring(4,6), 16),
];
};
window.Spiritix.getContrastColor = (hex) => {
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const yiq = ((r*299) + (g*587) + (b*114)) / 1000;
return (yiq >= 128) ? '#000' : '#fff';
};
</script>
<script>
if (localStorage && localStorage.theme) {
document.documentElement.classList.toggle('dark', localStorage.theme === 'dark');
} else if ("Dark" === "System") {
document.documentElement.classList.toggle('dark', window.matchMedia('(prefers-color-scheme: dark)').matches);
}
</script>
<script>
(function() {
const hex = "#000000".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const contrastColor = window.Spiritix.getContrastColor(hex);
document.documentElement.style.setProperty('--ghost-accent-color-light-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-light', contrastColor);
window.Spiritix.ghostAccentColorLightRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root {
--color-contrast: var(--color-contrast-light);
--ghost-accent-color-rgb: var(--ghost-accent-color-light-rgb);
}
</style>
<script>
(function() {
const hexDark = "#ffffff".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hexDark);
const contrastColor = window.Spiritix.getContrastColor(hexDark);
document.documentElement.style.setProperty('--ghost-accent-color-dark-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-dark', contrastColor);
window.Spiritix.ghostAccentColorDarkRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root.dark {
--color-contrast: var(--color-contrast-dark);
--ghost-accent-color-rgb: var(--ghost-accent-color-dark-rgb);
--ghost-accent-color: #ffffff;
}
</style>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,wght@0,400..900;1,400..900&display=swap" rel="stylesheet">
<style>
:root {
--font-body: 'Nunito Sans';
}
</style>
<style>
:root {
--font-headings: 'Nunito Sans';
}
</style>
<link href="https://changenode.com/assets/built/main.min.css?v=34e7a2bdc2" rel="stylesheet" type="text/css" />
Open service 151.101.3.7:443 · changenode.com
2026-01-26 10:01
HTTP/1.1 200 OK
Connection: close
Content-Length: 111073
via: 1.1 varnish, 1.1 varnish, 1.1 varnish
content-type: text/html; charset=utf-8
status: 200 OK
server: openresty
etag: W/"1b1e1-TlXKP19sFA1yfe/d0RC50igRlzI"
cache-control: public, max-age=0
Accept-Ranges: bytes
Date: Mon, 26 Jan 2026 10:01:35 GMT
Age: 97790
X-Served-By: cache-ams21082-AMS, cache-ams21026-AMS, cache-lga21956-LGA
X-Cache: MISS, HIT, HIT
X-Cache-Hits: 0, 10, 2
X-Timer: S1769421695.289879,VS0,VE1
Vary: Cookie, Accept-Encoding
x-request-id: ed25dfe0-a7e8-4a54-aabb-ef76b714bb34
Ghost-Fastly: true;production
Alt-Svc: clear
Page title: ChangeNode
<!DOCTYPE html>
<html
lang="en"
class="group/html min-h-screen has-inline-code-block
dark
has-sidebar-transparent
has-gray-scale-Gray
"
data-prismjs-copy="Copy"
data-prismjs-copy-error="Error"
data-prismjs-copy-success="Copied">
<head>
<meta charset="UTF-8">
<meta name="HandheldFriendly" content="True" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ChangeNode</title>
<link rel="preload" as="style" href="https://changenode.com/assets/built/main.min.css?v=34e7a2bdc2" />
<link rel="preload" as="script" href="https://changenode.com/assets/built/main.min.js?v=34e7a2bdc2" />
<script>
// Namespace
window.Spiritix = window.Spiritix || {};
// Translations
window.Spiritix.t = {
"Toggle menu": 'Toggle menu'
};
// Color functions
window.Spiritix.hexToRgb = (hex) => {
hex = hex.replace('#', '');
hex = hex.length === 3 ? hex.split().map(c => c + c).join() : hex;
return [
parseInt(hex.substring(0,2), 16),
parseInt(hex.substring(2,4), 16),
parseInt(hex.substring(4,6), 16),
];
};
window.Spiritix.getContrastColor = (hex) => {
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const yiq = ((r*299) + (g*587) + (b*114)) / 1000;
return (yiq >= 128) ? '#000' : '#fff';
};
</script>
<script>
if (localStorage && localStorage.theme) {
document.documentElement.classList.toggle('dark', localStorage.theme === 'dark');
} else if ("Dark" === "System") {
document.documentElement.classList.toggle('dark', window.matchMedia('(prefers-color-scheme: dark)').matches);
}
</script>
<script>
(function() {
const hex = "#000000".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const contrastColor = window.Spiritix.getContrastColor(hex);
document.documentElement.style.setProperty('--ghost-accent-color-light-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-light', contrastColor);
window.Spiritix.ghostAccentColorLightRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root {
--color-contrast: var(--color-contrast-light);
--ghost-accent-color-rgb: var(--ghost-accent-color-light-rgb);
}
</style>
<script>
(function() {
const hexDark = "#ffffff".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hexDark);
const contrastColor = window.Spiritix.getContrastColor(hexDark);
document.documentElement.style.setProperty('--ghost-accent-color-dark-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-dark', contrastColor);
window.Spiritix.ghostAccentColorDarkRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root.dark {
--color-contrast: var(--color-contrast-dark);
--ghost-accent-color-rgb: var(--ghost-accent-color-dark-rgb);
--ghost-accent-color: #ffffff;
}
</style>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,wght@0,400..900;1,400..900&display=swap" rel="stylesheet">
<style>
:root {
--font-body: 'Nunito Sans';
}
</style>
<style>
:root {
--font-headings: 'Nunito Sans';
}
</style>
<link href="https://changenode.com/assets/built/main.min.css?v=34e7a2bdc2" rel="stylesheet" type="text/css" />
Open service 151.101.131.7:443 · changenode.com
2026-01-26 10:01
HTTP/1.1 200 OK
Connection: close
Content-Length: 111073
via: 1.1 varnish, 1.1 varnish, 1.1 varnish
content-type: text/html; charset=utf-8
status: 200 OK
server: openresty
etag: W/"1b1e1-TlXKP19sFA1yfe/d0RC50igRlzI"
cache-control: public, max-age=0
Accept-Ranges: bytes
Date: Mon, 26 Jan 2026 10:01:35 GMT
Age: 97791
X-Served-By: cache-ams21082-AMS, cache-ams21026-AMS, cache-lga21964-LGA
X-Cache: MISS, HIT, HIT
X-Cache-Hits: 0, 10, 1
X-Timer: S1769421695.364718,VS0,VE1
Vary: Cookie, Accept-Encoding
x-request-id: f0aeb06e-8466-4488-88ec-d5d381301e48
Ghost-Fastly: true;production
Alt-Svc: clear
Page title: ChangeNode
<!DOCTYPE html>
<html
lang="en"
class="group/html min-h-screen has-inline-code-block
dark
has-sidebar-transparent
has-gray-scale-Gray
"
data-prismjs-copy="Copy"
data-prismjs-copy-error="Error"
data-prismjs-copy-success="Copied">
<head>
<meta charset="UTF-8">
<meta name="HandheldFriendly" content="True" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ChangeNode</title>
<link rel="preload" as="style" href="https://changenode.com/assets/built/main.min.css?v=34e7a2bdc2" />
<link rel="preload" as="script" href="https://changenode.com/assets/built/main.min.js?v=34e7a2bdc2" />
<script>
// Namespace
window.Spiritix = window.Spiritix || {};
// Translations
window.Spiritix.t = {
"Toggle menu": 'Toggle menu'
};
// Color functions
window.Spiritix.hexToRgb = (hex) => {
hex = hex.replace('#', '');
hex = hex.length === 3 ? hex.split().map(c => c + c).join() : hex;
return [
parseInt(hex.substring(0,2), 16),
parseInt(hex.substring(2,4), 16),
parseInt(hex.substring(4,6), 16),
];
};
window.Spiritix.getContrastColor = (hex) => {
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const yiq = ((r*299) + (g*587) + (b*114)) / 1000;
return (yiq >= 128) ? '#000' : '#fff';
};
</script>
<script>
if (localStorage && localStorage.theme) {
document.documentElement.classList.toggle('dark', localStorage.theme === 'dark');
} else if ("Dark" === "System") {
document.documentElement.classList.toggle('dark', window.matchMedia('(prefers-color-scheme: dark)').matches);
}
</script>
<script>
(function() {
const hex = "#000000".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const contrastColor = window.Spiritix.getContrastColor(hex);
document.documentElement.style.setProperty('--ghost-accent-color-light-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-light', contrastColor);
window.Spiritix.ghostAccentColorLightRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root {
--color-contrast: var(--color-contrast-light);
--ghost-accent-color-rgb: var(--ghost-accent-color-light-rgb);
}
</style>
<script>
(function() {
const hexDark = "#ffffff".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hexDark);
const contrastColor = window.Spiritix.getContrastColor(hexDark);
document.documentElement.style.setProperty('--ghost-accent-color-dark-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-dark', contrastColor);
window.Spiritix.ghostAccentColorDarkRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root.dark {
--color-contrast: var(--color-contrast-dark);
--ghost-accent-color-rgb: var(--ghost-accent-color-dark-rgb);
--ghost-accent-color: #ffffff;
}
</style>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,wght@0,400..900;1,400..900&display=swap" rel="stylesheet">
<style>
:root {
--font-body: 'Nunito Sans';
}
</style>
<style>
:root {
--font-headings: 'Nunito Sans';
}
</style>
<link href="https://changenode.com/assets/built/main.min.css?v=34e7a2bdc2" rel="stylesheet" type="text/css" />
Open service 151.101.195.7:80 · changenode.com
2026-01-26 10:01
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://changenode.com/ Accept-Ranges: bytes Date: Mon, 26 Jan 2026 10:01:35 GMT Via: 1.1 varnish X-Served-By: cache-sin-wsat1880094-SIN X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1769421695.264426,VS0,VE1 x-request-id: 25aa2144-93db-401b-90af-41f9935406fc Ghost-Fastly: true;production Alt-Svc: clear
Open service 151.101.131.7:80 · changenode.com
2026-01-26 10:01
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://changenode.com/ Accept-Ranges: bytes Date: Mon, 26 Jan 2026 10:01:35 GMT Via: 1.1 varnish X-Served-By: cache-yyz4576-YYZ X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1769421695.264327,VS0,VE0 x-request-id: c4fa1082-cf89-49c0-a859-65e644f8f17f Ghost-Fastly: true;production Alt-Svc: clear
Open service 151.101.195.7:443 · changenode.com
2026-01-26 10:01
HTTP/1.1 200 OK
Connection: close
Content-Length: 111073
via: 1.1 varnish, 1.1 varnish, 1.1 varnish
content-type: text/html; charset=utf-8
status: 200 OK
server: openresty
etag: W/"1b1e1-TlXKP19sFA1yfe/d0RC50igRlzI"
cache-control: public, max-age=0
Accept-Ranges: bytes
Age: 97791
Date: Mon, 26 Jan 2026 10:01:35 GMT
X-Served-By: cache-ams21082-AMS, cache-ams21026-AMS, cache-sjc1000108-SJC
X-Cache: MISS, HIT, HIT
X-Cache-Hits: 0, 1, 0
X-Timer: S1769421695.413185,VS0,VE1
Vary: Cookie, Accept-Encoding
x-request-id: 962d3657-7c8f-40d0-99d9-addb441d921d
Ghost-Fastly: true;production
Alt-Svc: clear
Page title: ChangeNode
<!DOCTYPE html>
<html
lang="en"
class="group/html min-h-screen has-inline-code-block
dark
has-sidebar-transparent
has-gray-scale-Gray
"
data-prismjs-copy="Copy"
data-prismjs-copy-error="Error"
data-prismjs-copy-success="Copied">
<head>
<meta charset="UTF-8">
<meta name="HandheldFriendly" content="True" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ChangeNode</title>
<link rel="preload" as="style" href="https://changenode.com/assets/built/main.min.css?v=34e7a2bdc2" />
<link rel="preload" as="script" href="https://changenode.com/assets/built/main.min.js?v=34e7a2bdc2" />
<script>
// Namespace
window.Spiritix = window.Spiritix || {};
// Translations
window.Spiritix.t = {
"Toggle menu": 'Toggle menu'
};
// Color functions
window.Spiritix.hexToRgb = (hex) => {
hex = hex.replace('#', '');
hex = hex.length === 3 ? hex.split().map(c => c + c).join() : hex;
return [
parseInt(hex.substring(0,2), 16),
parseInt(hex.substring(2,4), 16),
parseInt(hex.substring(4,6), 16),
];
};
window.Spiritix.getContrastColor = (hex) => {
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const yiq = ((r*299) + (g*587) + (b*114)) / 1000;
return (yiq >= 128) ? '#000' : '#fff';
};
</script>
<script>
if (localStorage && localStorage.theme) {
document.documentElement.classList.toggle('dark', localStorage.theme === 'dark');
} else if ("Dark" === "System") {
document.documentElement.classList.toggle('dark', window.matchMedia('(prefers-color-scheme: dark)').matches);
}
</script>
<script>
(function() {
const hex = "#000000".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const contrastColor = window.Spiritix.getContrastColor(hex);
document.documentElement.style.setProperty('--ghost-accent-color-light-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-light', contrastColor);
window.Spiritix.ghostAccentColorLightRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root {
--color-contrast: var(--color-contrast-light);
--ghost-accent-color-rgb: var(--ghost-accent-color-light-rgb);
}
</style>
<script>
(function() {
const hexDark = "#ffffff".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hexDark);
const contrastColor = window.Spiritix.getContrastColor(hexDark);
document.documentElement.style.setProperty('--ghost-accent-color-dark-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-dark', contrastColor);
window.Spiritix.ghostAccentColorDarkRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root.dark {
--color-contrast: var(--color-contrast-dark);
--ghost-accent-color-rgb: var(--ghost-accent-color-dark-rgb);
--ghost-accent-color: #ffffff;
}
</style>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,wght@0,400..900;1,400..900&display=swap" rel="stylesheet">
<style>
:root {
--font-body: 'Nunito Sans';
}
</style>
<style>
:root {
--font-headings: 'Nunito Sans';
}
</style>
<link href="https://changenode.com/assets/built/main.min.css?v=34e7a2bdc2" rel="stylesheet" type="text/css" />
Open service 151.101.67.7:80 · changenode.com
2026-01-26 10:01
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://changenode.com/ Accept-Ranges: bytes Date: Mon, 26 Jan 2026 10:01:35 GMT Via: 1.1 varnish X-Served-By: cache-pao-kpao1770031-PAO X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1769421695.255122,VS0,VE0 x-request-id: 16def653-0bb2-4056-9499-0512f76ca074 Ghost-Fastly: true;production Alt-Svc: clear
Open service 2a04:4e42:600::775:80 · changenode.com
2026-01-26 10:01
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://changenode.com/ Accept-Ranges: bytes Date: Mon, 26 Jan 2026 10:01:35 GMT Via: 1.1 varnish X-Served-By: cache-fra-eddf8230062-FRA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1769421695.248659,VS0,VE1 x-request-id: 9bdfe9dd-a1dc-4515-8396-bad5e0d76037 Ghost-Fastly: true;production Alt-Svc: clear
Open service 151.101.67.7:443 · changenode.com
2026-01-26 10:01
HTTP/1.1 200 OK
Connection: close
Content-Length: 111073
via: 1.1 varnish, 1.1 varnish, 1.1 varnish
content-type: text/html; charset=utf-8
status: 200 OK
server: openresty
etag: W/"1b1e1-TlXKP19sFA1yfe/d0RC50igRlzI"
cache-control: public, max-age=0
Accept-Ranges: bytes
Date: Mon, 26 Jan 2026 10:01:35 GMT
Age: 97791
X-Served-By: cache-ams21082-AMS, cache-ams21026-AMS, cache-yyz4545-YYZ
X-Cache: MISS, HIT, HIT
X-Cache-Hits: 0, 11, 1
X-Timer: S1769421695.353264,VS0,VE2
Vary: Cookie, Accept-Encoding
x-request-id: a5217d94-3cc9-4836-a47a-f15d407460cb
Ghost-Fastly: true;production
Alt-Svc: clear
Page title: ChangeNode
<!DOCTYPE html>
<html
lang="en"
class="group/html min-h-screen has-inline-code-block
dark
has-sidebar-transparent
has-gray-scale-Gray
"
data-prismjs-copy="Copy"
data-prismjs-copy-error="Error"
data-prismjs-copy-success="Copied">
<head>
<meta charset="UTF-8">
<meta name="HandheldFriendly" content="True" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ChangeNode</title>
<link rel="preload" as="style" href="https://changenode.com/assets/built/main.min.css?v=34e7a2bdc2" />
<link rel="preload" as="script" href="https://changenode.com/assets/built/main.min.js?v=34e7a2bdc2" />
<script>
// Namespace
window.Spiritix = window.Spiritix || {};
// Translations
window.Spiritix.t = {
"Toggle menu": 'Toggle menu'
};
// Color functions
window.Spiritix.hexToRgb = (hex) => {
hex = hex.replace('#', '');
hex = hex.length === 3 ? hex.split().map(c => c + c).join() : hex;
return [
parseInt(hex.substring(0,2), 16),
parseInt(hex.substring(2,4), 16),
parseInt(hex.substring(4,6), 16),
];
};
window.Spiritix.getContrastColor = (hex) => {
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const yiq = ((r*299) + (g*587) + (b*114)) / 1000;
return (yiq >= 128) ? '#000' : '#fff';
};
</script>
<script>
if (localStorage && localStorage.theme) {
document.documentElement.classList.toggle('dark', localStorage.theme === 'dark');
} else if ("Dark" === "System") {
document.documentElement.classList.toggle('dark', window.matchMedia('(prefers-color-scheme: dark)').matches);
}
</script>
<script>
(function() {
const hex = "#000000".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const contrastColor = window.Spiritix.getContrastColor(hex);
document.documentElement.style.setProperty('--ghost-accent-color-light-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-light', contrastColor);
window.Spiritix.ghostAccentColorLightRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root {
--color-contrast: var(--color-contrast-light);
--ghost-accent-color-rgb: var(--ghost-accent-color-light-rgb);
}
</style>
<script>
(function() {
const hexDark = "#ffffff".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hexDark);
const contrastColor = window.Spiritix.getContrastColor(hexDark);
document.documentElement.style.setProperty('--ghost-accent-color-dark-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-dark', contrastColor);
window.Spiritix.ghostAccentColorDarkRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root.dark {
--color-contrast: var(--color-contrast-dark);
--ghost-accent-color-rgb: var(--ghost-accent-color-dark-rgb);
--ghost-accent-color: #ffffff;
}
</style>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,wght@0,400..900;1,400..900&display=swap" rel="stylesheet">
<style>
:root {
--font-body: 'Nunito Sans';
}
</style>
<style>
:root {
--font-headings: 'Nunito Sans';
}
</style>
<link href="https://changenode.com/assets/built/main.min.css?v=34e7a2bdc2" rel="stylesheet" type="text/css" />
Open service 2a04:4e42:200::775:80 · changenode.com
2026-01-08 00:06
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://changenode.com/ Accept-Ranges: bytes Date: Thu, 08 Jan 2026 00:06:34 GMT Via: 1.1 varnish X-Served-By: cache-lga21976-LGA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1767830795.668639,VS0,VE1 x-request-id: e0b5225b-becc-4569-a804-25f4c6f8c604 Ghost-Fastly: true;production Alt-Svc: clear
Open service 2a04:4e42:200::775:443 · changenode.com
2026-01-08 00:06
HTTP/1.1 200 OK
Connection: close
Content-Length: 108376
Server: openresty
Content-Type: text/html; charset=utf-8
Status: 200 OK
cache-control: public, max-age=0
etag: W/"1a758-2lDE+wVeswaGG6vMfgMCb1NG55U"
Fastly-Restarts: 2
Via: 1.1 varnish, 1.1 varnish
Accept-Ranges: bytes
Date: Thu, 08 Jan 2026 00:06:34 GMT
Age: 26775
X-Served-By: cache-ams21026-AMS, cache-sin-wsat1880075-SIN
X-Cache: HIT, HIT
X-Cache-Hits: 13, 1
X-Timer: S1767830795.852253,VS0,VE1
Vary: Cookie, Accept-Encoding
x-request-id: bafc34c9-122f-4d1d-98b2-28ba39951189
Ghost-Fastly: true;production
Alt-Svc: clear
Page title: ChangeNode
<!DOCTYPE html>
<html
lang="en"
class="group/html min-h-screen has-inline-code-block
dark
has-sidebar-transparent
has-gray-scale-Gray
"
data-prismjs-copy="Copy"
data-prismjs-copy-error="Error"
data-prismjs-copy-success="Copied">
<head>
<meta charset="UTF-8">
<meta name="HandheldFriendly" content="True" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ChangeNode</title>
<link rel="preload" as="style" href="https://changenode.com/assets/built/main.min.css?v=22031f1f56" />
<link rel="preload" as="script" href="https://changenode.com/assets/built/main.min.js?v=22031f1f56" />
<script>
// Namespace
window.Spiritix = window.Spiritix || {};
// Translations
window.Spiritix.t = {
"Toggle menu": 'Toggle menu'
};
// Color functions
window.Spiritix.hexToRgb = (hex) => {
hex = hex.replace('#', '');
hex = hex.length === 3 ? hex.split().map(c => c + c).join() : hex;
return [
parseInt(hex.substring(0,2), 16),
parseInt(hex.substring(2,4), 16),
parseInt(hex.substring(4,6), 16),
];
};
window.Spiritix.getContrastColor = (hex) => {
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const yiq = ((r*299) + (g*587) + (b*114)) / 1000;
return (yiq >= 128) ? '#000' : '#fff';
};
</script>
<script>
if (localStorage && localStorage.theme) {
document.documentElement.classList.toggle('dark', localStorage.theme === 'dark');
} else if ("Dark" === "System") {
document.documentElement.classList.toggle('dark', window.matchMedia('(prefers-color-scheme: dark)').matches);
}
</script>
<script>
(function() {
const hex = "#000000".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const contrastColor = window.Spiritix.getContrastColor(hex);
document.documentElement.style.setProperty('--ghost-accent-color-light-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-light', contrastColor);
window.Spiritix.ghostAccentColorLightRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root {
--color-contrast: var(--color-contrast-light);
--ghost-accent-color-rgb: var(--ghost-accent-color-light-rgb);
}
</style>
<script>
(function() {
const hexDark = "#ffffff".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hexDark);
const contrastColor = window.Spiritix.getContrastColor(hexDark);
document.documentElement.style.setProperty('--ghost-accent-color-dark-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-dark', contrastColor);
window.Spiritix.ghostAccentColorDarkRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root.dark {
--color-contrast: var(--color-contrast-dark);
--ghost-accent-color-rgb: var(--ghost-accent-color-dark-rgb);
--ghost-accent-color: #ffffff;
}
</style>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,wght@0,400..900;1,400..900&display=swap" rel="stylesheet">
<style>
:root {
--font-body: 'Nunito Sans';
}
</style>
<style>
:root {
--font-headings: 'Nunito Sans';
}
</style>
<link href="https://changenode.com/assets/built/main.min.css?v=22031f1f56" rel="stylesheet" type="text/css" />
Open service 151.101.67.7:443 · changenode.com
2026-01-08 00:06
HTTP/1.1 200 OK
Connection: close
Content-Length: 108376
Server: openresty
Content-Type: text/html; charset=utf-8
Status: 200 OK
cache-control: public, max-age=0
etag: W/"1a758-2lDE+wVeswaGG6vMfgMCb1NG55U"
Fastly-Restarts: 2
Via: 1.1 varnish, 1.1 varnish
Accept-Ranges: bytes
Date: Thu, 08 Jan 2026 00:06:34 GMT
Age: 26775
X-Served-By: cache-ams21026-AMS, cache-sin-wsat1880033-SIN
X-Cache: HIT, HIT
X-Cache-Hits: 13, 1
X-Timer: S1767830795.824381,VS0,VE2
Vary: Cookie, Accept-Encoding
x-request-id: a105fb4e-5b54-4450-adcc-6a56bba957d5
Ghost-Fastly: true;production
Alt-Svc: clear
Page title: ChangeNode
<!DOCTYPE html>
<html
lang="en"
class="group/html min-h-screen has-inline-code-block
dark
has-sidebar-transparent
has-gray-scale-Gray
"
data-prismjs-copy="Copy"
data-prismjs-copy-error="Error"
data-prismjs-copy-success="Copied">
<head>
<meta charset="UTF-8">
<meta name="HandheldFriendly" content="True" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ChangeNode</title>
<link rel="preload" as="style" href="https://changenode.com/assets/built/main.min.css?v=22031f1f56" />
<link rel="preload" as="script" href="https://changenode.com/assets/built/main.min.js?v=22031f1f56" />
<script>
// Namespace
window.Spiritix = window.Spiritix || {};
// Translations
window.Spiritix.t = {
"Toggle menu": 'Toggle menu'
};
// Color functions
window.Spiritix.hexToRgb = (hex) => {
hex = hex.replace('#', '');
hex = hex.length === 3 ? hex.split().map(c => c + c).join() : hex;
return [
parseInt(hex.substring(0,2), 16),
parseInt(hex.substring(2,4), 16),
parseInt(hex.substring(4,6), 16),
];
};
window.Spiritix.getContrastColor = (hex) => {
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const yiq = ((r*299) + (g*587) + (b*114)) / 1000;
return (yiq >= 128) ? '#000' : '#fff';
};
</script>
<script>
if (localStorage && localStorage.theme) {
document.documentElement.classList.toggle('dark', localStorage.theme === 'dark');
} else if ("Dark" === "System") {
document.documentElement.classList.toggle('dark', window.matchMedia('(prefers-color-scheme: dark)').matches);
}
</script>
<script>
(function() {
const hex = "#000000".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const contrastColor = window.Spiritix.getContrastColor(hex);
document.documentElement.style.setProperty('--ghost-accent-color-light-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-light', contrastColor);
window.Spiritix.ghostAccentColorLightRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root {
--color-contrast: var(--color-contrast-light);
--ghost-accent-color-rgb: var(--ghost-accent-color-light-rgb);
}
</style>
<script>
(function() {
const hexDark = "#ffffff".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hexDark);
const contrastColor = window.Spiritix.getContrastColor(hexDark);
document.documentElement.style.setProperty('--ghost-accent-color-dark-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-dark', contrastColor);
window.Spiritix.ghostAccentColorDarkRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root.dark {
--color-contrast: var(--color-contrast-dark);
--ghost-accent-color-rgb: var(--ghost-accent-color-dark-rgb);
--ghost-accent-color: #ffffff;
}
</style>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,wght@0,400..900;1,400..900&display=swap" rel="stylesheet">
<style>
:root {
--font-body: 'Nunito Sans';
}
</style>
<style>
:root {
--font-headings: 'Nunito Sans';
}
</style>
<link href="https://changenode.com/assets/built/main.min.css?v=22031f1f56" rel="stylesheet" type="text/css" />
Open service 151.101.3.7:443 · changenode.com
2026-01-08 00:06
HTTP/1.1 200 OK
Connection: close
Content-Length: 108376
Server: openresty
Content-Type: text/html; charset=utf-8
Status: 200 OK
cache-control: public, max-age=0
etag: W/"1a758-2lDE+wVeswaGG6vMfgMCb1NG55U"
Fastly-Restarts: 2
Via: 1.1 varnish, 1.1 varnish
Accept-Ranges: bytes
Date: Thu, 08 Jan 2026 00:06:34 GMT
Age: 26775
X-Served-By: cache-ams21026-AMS, cache-lga21920-LGA
X-Cache: HIT, HIT
X-Cache-Hits: 12, 1
X-Timer: S1767830795.667343,VS0,VE2
Vary: Cookie, Accept-Encoding
x-request-id: 33b49a4c-2a28-4260-84df-c84c8a05f6e4
Ghost-Fastly: true;production
Alt-Svc: clear
Page title: ChangeNode
<!DOCTYPE html>
<html
lang="en"
class="group/html min-h-screen has-inline-code-block
dark
has-sidebar-transparent
has-gray-scale-Gray
"
data-prismjs-copy="Copy"
data-prismjs-copy-error="Error"
data-prismjs-copy-success="Copied">
<head>
<meta charset="UTF-8">
<meta name="HandheldFriendly" content="True" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ChangeNode</title>
<link rel="preload" as="style" href="https://changenode.com/assets/built/main.min.css?v=22031f1f56" />
<link rel="preload" as="script" href="https://changenode.com/assets/built/main.min.js?v=22031f1f56" />
<script>
// Namespace
window.Spiritix = window.Spiritix || {};
// Translations
window.Spiritix.t = {
"Toggle menu": 'Toggle menu'
};
// Color functions
window.Spiritix.hexToRgb = (hex) => {
hex = hex.replace('#', '');
hex = hex.length === 3 ? hex.split().map(c => c + c).join() : hex;
return [
parseInt(hex.substring(0,2), 16),
parseInt(hex.substring(2,4), 16),
parseInt(hex.substring(4,6), 16),
];
};
window.Spiritix.getContrastColor = (hex) => {
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const yiq = ((r*299) + (g*587) + (b*114)) / 1000;
return (yiq >= 128) ? '#000' : '#fff';
};
</script>
<script>
if (localStorage && localStorage.theme) {
document.documentElement.classList.toggle('dark', localStorage.theme === 'dark');
} else if ("Dark" === "System") {
document.documentElement.classList.toggle('dark', window.matchMedia('(prefers-color-scheme: dark)').matches);
}
</script>
<script>
(function() {
const hex = "#000000".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const contrastColor = window.Spiritix.getContrastColor(hex);
document.documentElement.style.setProperty('--ghost-accent-color-light-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-light', contrastColor);
window.Spiritix.ghostAccentColorLightRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root {
--color-contrast: var(--color-contrast-light);
--ghost-accent-color-rgb: var(--ghost-accent-color-light-rgb);
}
</style>
<script>
(function() {
const hexDark = "#ffffff".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hexDark);
const contrastColor = window.Spiritix.getContrastColor(hexDark);
document.documentElement.style.setProperty('--ghost-accent-color-dark-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-dark', contrastColor);
window.Spiritix.ghostAccentColorDarkRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root.dark {
--color-contrast: var(--color-contrast-dark);
--ghost-accent-color-rgb: var(--ghost-accent-color-dark-rgb);
--ghost-accent-color: #ffffff;
}
</style>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,wght@0,400..900;1,400..900&display=swap" rel="stylesheet">
<style>
:root {
--font-body: 'Nunito Sans';
}
</style>
<style>
:root {
--font-headings: 'Nunito Sans';
}
</style>
<link href="https://changenode.com/assets/built/main.min.css?v=22031f1f56" rel="stylesheet" type="text/css" />
Open service 2a04:4e42:600::775:443 · changenode.com
2026-01-08 00:06
HTTP/1.1 200 OK
Connection: close
Content-Length: 108376
Server: openresty
Content-Type: text/html; charset=utf-8
Status: 200 OK
cache-control: public, max-age=0
etag: W/"1a758-2lDE+wVeswaGG6vMfgMCb1NG55U"
Fastly-Restarts: 2
Via: 1.1 varnish, 1.1 varnish
Accept-Ranges: bytes
Date: Thu, 08 Jan 2026 00:06:34 GMT
Age: 26775
X-Served-By: cache-ams21026-AMS, cache-fra-eddf8230187-FRA
X-Cache: HIT, HIT
X-Cache-Hits: 11, 1
X-Timer: S1767830795.627374,VS0,VE1
Vary: Cookie, Accept-Encoding
x-request-id: 525c14d8-e006-429b-82eb-49d1a34b148e
Ghost-Fastly: true;production
Alt-Svc: clear
Page title: ChangeNode
<!DOCTYPE html>
<html
lang="en"
class="group/html min-h-screen has-inline-code-block
dark
has-sidebar-transparent
has-gray-scale-Gray
"
data-prismjs-copy="Copy"
data-prismjs-copy-error="Error"
data-prismjs-copy-success="Copied">
<head>
<meta charset="UTF-8">
<meta name="HandheldFriendly" content="True" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ChangeNode</title>
<link rel="preload" as="style" href="https://changenode.com/assets/built/main.min.css?v=22031f1f56" />
<link rel="preload" as="script" href="https://changenode.com/assets/built/main.min.js?v=22031f1f56" />
<script>
// Namespace
window.Spiritix = window.Spiritix || {};
// Translations
window.Spiritix.t = {
"Toggle menu": 'Toggle menu'
};
// Color functions
window.Spiritix.hexToRgb = (hex) => {
hex = hex.replace('#', '');
hex = hex.length === 3 ? hex.split().map(c => c + c).join() : hex;
return [
parseInt(hex.substring(0,2), 16),
parseInt(hex.substring(2,4), 16),
parseInt(hex.substring(4,6), 16),
];
};
window.Spiritix.getContrastColor = (hex) => {
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const yiq = ((r*299) + (g*587) + (b*114)) / 1000;
return (yiq >= 128) ? '#000' : '#fff';
};
</script>
<script>
if (localStorage && localStorage.theme) {
document.documentElement.classList.toggle('dark', localStorage.theme === 'dark');
} else if ("Dark" === "System") {
document.documentElement.classList.toggle('dark', window.matchMedia('(prefers-color-scheme: dark)').matches);
}
</script>
<script>
(function() {
const hex = "#000000".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const contrastColor = window.Spiritix.getContrastColor(hex);
document.documentElement.style.setProperty('--ghost-accent-color-light-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-light', contrastColor);
window.Spiritix.ghostAccentColorLightRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root {
--color-contrast: var(--color-contrast-light);
--ghost-accent-color-rgb: var(--ghost-accent-color-light-rgb);
}
</style>
<script>
(function() {
const hexDark = "#ffffff".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hexDark);
const contrastColor = window.Spiritix.getContrastColor(hexDark);
document.documentElement.style.setProperty('--ghost-accent-color-dark-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-dark', contrastColor);
window.Spiritix.ghostAccentColorDarkRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root.dark {
--color-contrast: var(--color-contrast-dark);
--ghost-accent-color-rgb: var(--ghost-accent-color-dark-rgb);
--ghost-accent-color: #ffffff;
}
</style>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,wght@0,400..900;1,400..900&display=swap" rel="stylesheet">
<style>
:root {
--font-body: 'Nunito Sans';
}
</style>
<style>
:root {
--font-headings: 'Nunito Sans';
}
</style>
<link href="https://changenode.com/assets/built/main.min.css?v=22031f1f56" rel="stylesheet" type="text/css" />
Open service 2a04:4e42:600::775:80 · changenode.com
2026-01-08 00:06
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://changenode.com/ Accept-Ranges: bytes Date: Thu, 08 Jan 2026 00:06:34 GMT Via: 1.1 varnish X-Served-By: cache-fra-eddf8230096-FRA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1767830795.634803,VS0,VE0 x-request-id: afbc4c45-9739-4b5c-85ff-68b14680e194 Ghost-Fastly: true;production Alt-Svc: clear
Open service 2a04:4e42:400::775:80 · changenode.com
2026-01-08 00:06
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://changenode.com/ Accept-Ranges: bytes Date: Thu, 08 Jan 2026 00:06:34 GMT Via: 1.1 varnish X-Served-By: cache-rtm-ehrd2290057-RTM X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1767830795.593548,VS0,VE1 x-request-id: cd89bb29-711d-4e1c-ac37-973b4750fa21 Ghost-Fastly: true;production Alt-Svc: clear
Open service 151.101.195.7:443 · changenode.com
2026-01-08 00:06
HTTP/1.1 200 OK
Connection: close
Content-Length: 108376
Server: openresty
Content-Type: text/html; charset=utf-8
Status: 200 OK
cache-control: public, max-age=0
etag: W/"1a758-2lDE+wVeswaGG6vMfgMCb1NG55U"
Fastly-Restarts: 2
Via: 1.1 varnish, 1.1 varnish
Accept-Ranges: bytes
Date: Thu, 08 Jan 2026 00:06:34 GMT
Age: 26775
X-Served-By: cache-ams21026-AMS, cache-fra-eddf8230042-FRA
X-Cache: HIT, HIT
X-Cache-Hits: 11, 1
X-Timer: S1767830795.612343,VS0,VE2
Vary: Cookie, Accept-Encoding
x-request-id: 2d394d08-e6ad-4b7d-b1e6-0ba56bef472d
Ghost-Fastly: true;production
Alt-Svc: clear
Page title: ChangeNode
<!DOCTYPE html>
<html
lang="en"
class="group/html min-h-screen has-inline-code-block
dark
has-sidebar-transparent
has-gray-scale-Gray
"
data-prismjs-copy="Copy"
data-prismjs-copy-error="Error"
data-prismjs-copy-success="Copied">
<head>
<meta charset="UTF-8">
<meta name="HandheldFriendly" content="True" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ChangeNode</title>
<link rel="preload" as="style" href="https://changenode.com/assets/built/main.min.css?v=22031f1f56" />
<link rel="preload" as="script" href="https://changenode.com/assets/built/main.min.js?v=22031f1f56" />
<script>
// Namespace
window.Spiritix = window.Spiritix || {};
// Translations
window.Spiritix.t = {
"Toggle menu": 'Toggle menu'
};
// Color functions
window.Spiritix.hexToRgb = (hex) => {
hex = hex.replace('#', '');
hex = hex.length === 3 ? hex.split().map(c => c + c).join() : hex;
return [
parseInt(hex.substring(0,2), 16),
parseInt(hex.substring(2,4), 16),
parseInt(hex.substring(4,6), 16),
];
};
window.Spiritix.getContrastColor = (hex) => {
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const yiq = ((r*299) + (g*587) + (b*114)) / 1000;
return (yiq >= 128) ? '#000' : '#fff';
};
</script>
<script>
if (localStorage && localStorage.theme) {
document.documentElement.classList.toggle('dark', localStorage.theme === 'dark');
} else if ("Dark" === "System") {
document.documentElement.classList.toggle('dark', window.matchMedia('(prefers-color-scheme: dark)').matches);
}
</script>
<script>
(function() {
const hex = "#000000".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const contrastColor = window.Spiritix.getContrastColor(hex);
document.documentElement.style.setProperty('--ghost-accent-color-light-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-light', contrastColor);
window.Spiritix.ghostAccentColorLightRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root {
--color-contrast: var(--color-contrast-light);
--ghost-accent-color-rgb: var(--ghost-accent-color-light-rgb);
}
</style>
<script>
(function() {
const hexDark = "#ffffff".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hexDark);
const contrastColor = window.Spiritix.getContrastColor(hexDark);
document.documentElement.style.setProperty('--ghost-accent-color-dark-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-dark', contrastColor);
window.Spiritix.ghostAccentColorDarkRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root.dark {
--color-contrast: var(--color-contrast-dark);
--ghost-accent-color-rgb: var(--ghost-accent-color-dark-rgb);
--ghost-accent-color: #ffffff;
}
</style>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,wght@0,400..900;1,400..900&display=swap" rel="stylesheet">
<style>
:root {
--font-body: 'Nunito Sans';
}
</style>
<style>
:root {
--font-headings: 'Nunito Sans';
}
</style>
<link href="https://changenode.com/assets/built/main.min.css?v=22031f1f56" rel="stylesheet" type="text/css" />
Open service 151.101.131.7:443 · changenode.com
2026-01-08 00:06
HTTP/1.1 200 OK
Connection: close
Content-Length: 108376
Server: openresty
Content-Type: text/html; charset=utf-8
Status: 200 OK
cache-control: public, max-age=0
etag: W/"1a758-2lDE+wVeswaGG6vMfgMCb1NG55U"
Fastly-Restarts: 2
Via: 1.1 varnish, 1.1 varnish
Accept-Ranges: bytes
Date: Thu, 08 Jan 2026 00:06:34 GMT
Age: 26775
X-Served-By: cache-ams21026-AMS, cache-fra-eddf8230145-FRA
X-Cache: HIT, HIT
X-Cache-Hits: 11, 1
X-Timer: S1767830795.610825,VS0,VE1
Vary: Cookie, Accept-Encoding
x-request-id: 8c6fc689-825e-4f64-bc7a-f23069c73035
Ghost-Fastly: true;production
Alt-Svc: clear
Page title: ChangeNode
<!DOCTYPE html>
<html
lang="en"
class="group/html min-h-screen has-inline-code-block
dark
has-sidebar-transparent
has-gray-scale-Gray
"
data-prismjs-copy="Copy"
data-prismjs-copy-error="Error"
data-prismjs-copy-success="Copied">
<head>
<meta charset="UTF-8">
<meta name="HandheldFriendly" content="True" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ChangeNode</title>
<link rel="preload" as="style" href="https://changenode.com/assets/built/main.min.css?v=22031f1f56" />
<link rel="preload" as="script" href="https://changenode.com/assets/built/main.min.js?v=22031f1f56" />
<script>
// Namespace
window.Spiritix = window.Spiritix || {};
// Translations
window.Spiritix.t = {
"Toggle menu": 'Toggle menu'
};
// Color functions
window.Spiritix.hexToRgb = (hex) => {
hex = hex.replace('#', '');
hex = hex.length === 3 ? hex.split().map(c => c + c).join() : hex;
return [
parseInt(hex.substring(0,2), 16),
parseInt(hex.substring(2,4), 16),
parseInt(hex.substring(4,6), 16),
];
};
window.Spiritix.getContrastColor = (hex) => {
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const yiq = ((r*299) + (g*587) + (b*114)) / 1000;
return (yiq >= 128) ? '#000' : '#fff';
};
</script>
<script>
if (localStorage && localStorage.theme) {
document.documentElement.classList.toggle('dark', localStorage.theme === 'dark');
} else if ("Dark" === "System") {
document.documentElement.classList.toggle('dark', window.matchMedia('(prefers-color-scheme: dark)').matches);
}
</script>
<script>
(function() {
const hex = "#000000".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const contrastColor = window.Spiritix.getContrastColor(hex);
document.documentElement.style.setProperty('--ghost-accent-color-light-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-light', contrastColor);
window.Spiritix.ghostAccentColorLightRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root {
--color-contrast: var(--color-contrast-light);
--ghost-accent-color-rgb: var(--ghost-accent-color-light-rgb);
}
</style>
<script>
(function() {
const hexDark = "#ffffff".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hexDark);
const contrastColor = window.Spiritix.getContrastColor(hexDark);
document.documentElement.style.setProperty('--ghost-accent-color-dark-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-dark', contrastColor);
window.Spiritix.ghostAccentColorDarkRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root.dark {
--color-contrast: var(--color-contrast-dark);
--ghost-accent-color-rgb: var(--ghost-accent-color-dark-rgb);
--ghost-accent-color: #ffffff;
}
</style>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,wght@0,400..900;1,400..900&display=swap" rel="stylesheet">
<style>
:root {
--font-body: 'Nunito Sans';
}
</style>
<style>
:root {
--font-headings: 'Nunito Sans';
}
</style>
<link href="https://changenode.com/assets/built/main.min.css?v=22031f1f56" rel="stylesheet" type="text/css" />
Open service 151.101.67.7:80 · changenode.com
2026-01-08 00:06
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://changenode.com/ Accept-Ranges: bytes Date: Thu, 08 Jan 2026 00:06:34 GMT Via: 1.1 varnish X-Served-By: cache-rtm-ehrd2290041-RTM X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1767830795.573835,VS0,VE0 x-request-id: 95864ffc-1374-4336-8c6c-df520410ef47 Ghost-Fastly: true;production Alt-Svc: clear
Open service 2a04:4e42::775:443 · changenode.com
2026-01-08 00:06
HTTP/1.1 200 OK
Connection: close
Content-Length: 108376
Server: openresty
Content-Type: text/html; charset=utf-8
Status: 200 OK
cache-control: public, max-age=0
etag: W/"1a758-2lDE+wVeswaGG6vMfgMCb1NG55U"
Fastly-Restarts: 2
Via: 1.1 varnish, 1.1 varnish
Accept-Ranges: bytes
Date: Thu, 08 Jan 2026 00:06:34 GMT
Age: 26775
X-Served-By: cache-ams21026-AMS, cache-lga21979-LGA
X-Cache: HIT, HIT
X-Cache-Hits: 12, 1
X-Timer: S1767830795.668383,VS0,VE3
Vary: Cookie, Accept-Encoding
x-request-id: 1abaf6f8-7385-4ff0-af11-211331ff6d56
Ghost-Fastly: true;production
Alt-Svc: clear
Page title: ChangeNode
<!DOCTYPE html>
<html
lang="en"
class="group/html min-h-screen has-inline-code-block
dark
has-sidebar-transparent
has-gray-scale-Gray
"
data-prismjs-copy="Copy"
data-prismjs-copy-error="Error"
data-prismjs-copy-success="Copied">
<head>
<meta charset="UTF-8">
<meta name="HandheldFriendly" content="True" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ChangeNode</title>
<link rel="preload" as="style" href="https://changenode.com/assets/built/main.min.css?v=22031f1f56" />
<link rel="preload" as="script" href="https://changenode.com/assets/built/main.min.js?v=22031f1f56" />
<script>
// Namespace
window.Spiritix = window.Spiritix || {};
// Translations
window.Spiritix.t = {
"Toggle menu": 'Toggle menu'
};
// Color functions
window.Spiritix.hexToRgb = (hex) => {
hex = hex.replace('#', '');
hex = hex.length === 3 ? hex.split().map(c => c + c).join() : hex;
return [
parseInt(hex.substring(0,2), 16),
parseInt(hex.substring(2,4), 16),
parseInt(hex.substring(4,6), 16),
];
};
window.Spiritix.getContrastColor = (hex) => {
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const yiq = ((r*299) + (g*587) + (b*114)) / 1000;
return (yiq >= 128) ? '#000' : '#fff';
};
</script>
<script>
if (localStorage && localStorage.theme) {
document.documentElement.classList.toggle('dark', localStorage.theme === 'dark');
} else if ("Dark" === "System") {
document.documentElement.classList.toggle('dark', window.matchMedia('(prefers-color-scheme: dark)').matches);
}
</script>
<script>
(function() {
const hex = "#000000".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const contrastColor = window.Spiritix.getContrastColor(hex);
document.documentElement.style.setProperty('--ghost-accent-color-light-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-light', contrastColor);
window.Spiritix.ghostAccentColorLightRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root {
--color-contrast: var(--color-contrast-light);
--ghost-accent-color-rgb: var(--ghost-accent-color-light-rgb);
}
</style>
<script>
(function() {
const hexDark = "#ffffff".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hexDark);
const contrastColor = window.Spiritix.getContrastColor(hexDark);
document.documentElement.style.setProperty('--ghost-accent-color-dark-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-dark', contrastColor);
window.Spiritix.ghostAccentColorDarkRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root.dark {
--color-contrast: var(--color-contrast-dark);
--ghost-accent-color-rgb: var(--ghost-accent-color-dark-rgb);
--ghost-accent-color: #ffffff;
}
</style>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,wght@0,400..900;1,400..900&display=swap" rel="stylesheet">
<style>
:root {
--font-body: 'Nunito Sans';
}
</style>
<style>
:root {
--font-headings: 'Nunito Sans';
}
</style>
<link href="https://changenode.com/assets/built/main.min.css?v=22031f1f56" rel="stylesheet" type="text/css" />
Open service 2a04:4e42::775:80 · changenode.com
2026-01-08 00:06
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://changenode.com/ Accept-Ranges: bytes Date: Thu, 08 Jan 2026 00:06:34 GMT Via: 1.1 varnish X-Served-By: cache-vie6338-VIE X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1767830795.578070,VS0,VE1 x-request-id: c97dfee5-a35b-498c-9320-904eb7002ba5 Ghost-Fastly: true;production Alt-Svc: clear
Open service 151.101.195.7:80 · changenode.com
2026-01-08 00:06
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://changenode.com/ Accept-Ranges: bytes Date: Thu, 08 Jan 2026 00:06:34 GMT Via: 1.1 varnish X-Served-By: cache-lon4259-LON X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1767830795.514317,VS0,VE1 x-request-id: 812acefc-eca1-4019-a6a2-bee04bc50f1e Ghost-Fastly: true;production Alt-Svc: clear
Open service 151.101.3.7:80 · changenode.com
2026-01-08 00:06
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://changenode.com/ Accept-Ranges: bytes Date: Thu, 08 Jan 2026 00:06:34 GMT Via: 1.1 varnish X-Served-By: cache-fra-eddf8230042-FRA X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1767830794.479758,VS0,VE0 x-request-id: 8554483a-c600-424a-a4c5-275abd6cfaf4 Ghost-Fastly: true;production Alt-Svc: clear
Open service 151.101.131.7:80 · changenode.com
2026-01-08 00:06
HTTP/1.1 301 Moved Permanently Connection: close Content-Length: 0 Server: Varnish Retry-After: 0 Location: https://changenode.com/ Accept-Ranges: bytes Date: Thu, 08 Jan 2026 00:06:34 GMT Via: 1.1 varnish X-Served-By: cache-vie6364-VIE X-Cache: HIT X-Cache-Hits: 0 X-Timer: S1767830794.484749,VS0,VE1 x-request-id: 0feb5848-948e-400b-8dc3-3521ca3ec778 Ghost-Fastly: true;production Alt-Svc: clear
Open service 2a04:4e42:400::775:443 · changenode.com
2026-01-08 00:06
HTTP/1.1 200 OK
Connection: close
Content-Length: 108376
Server: openresty
Content-Type: text/html; charset=utf-8
Status: 200 OK
cache-control: public, max-age=0
etag: W/"1a758-2lDE+wVeswaGG6vMfgMCb1NG55U"
Fastly-Restarts: 2
Via: 1.1 varnish, 1.1 varnish
Accept-Ranges: bytes
Date: Thu, 08 Jan 2026 00:06:34 GMT
Age: 26775
X-Served-By: cache-ams21026-AMS, cache-vie6360-VIE
X-Cache: HIT, HIT
X-Cache-Hits: 10, 1
X-Timer: S1767830795.571023,VS0,VE33
Vary: Cookie, Accept-Encoding
x-request-id: e36ea548-928d-440d-b6bb-96f5bf88192c
Ghost-Fastly: true;production
Alt-Svc: clear
Page title: ChangeNode
<!DOCTYPE html>
<html
lang="en"
class="group/html min-h-screen has-inline-code-block
dark
has-sidebar-transparent
has-gray-scale-Gray
"
data-prismjs-copy="Copy"
data-prismjs-copy-error="Error"
data-prismjs-copy-success="Copied">
<head>
<meta charset="UTF-8">
<meta name="HandheldFriendly" content="True" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ChangeNode</title>
<link rel="preload" as="style" href="https://changenode.com/assets/built/main.min.css?v=22031f1f56" />
<link rel="preload" as="script" href="https://changenode.com/assets/built/main.min.js?v=22031f1f56" />
<script>
// Namespace
window.Spiritix = window.Spiritix || {};
// Translations
window.Spiritix.t = {
"Toggle menu": 'Toggle menu'
};
// Color functions
window.Spiritix.hexToRgb = (hex) => {
hex = hex.replace('#', '');
hex = hex.length === 3 ? hex.split().map(c => c + c).join() : hex;
return [
parseInt(hex.substring(0,2), 16),
parseInt(hex.substring(2,4), 16),
parseInt(hex.substring(4,6), 16),
];
};
window.Spiritix.getContrastColor = (hex) => {
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const yiq = ((r*299) + (g*587) + (b*114)) / 1000;
return (yiq >= 128) ? '#000' : '#fff';
};
</script>
<script>
if (localStorage && localStorage.theme) {
document.documentElement.classList.toggle('dark', localStorage.theme === 'dark');
} else if ("Dark" === "System") {
document.documentElement.classList.toggle('dark', window.matchMedia('(prefers-color-scheme: dark)').matches);
}
</script>
<script>
(function() {
const hex = "#000000".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hex);
const contrastColor = window.Spiritix.getContrastColor(hex);
document.documentElement.style.setProperty('--ghost-accent-color-light-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-light', contrastColor);
window.Spiritix.ghostAccentColorLightRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root {
--color-contrast: var(--color-contrast-light);
--ghost-accent-color-rgb: var(--ghost-accent-color-light-rgb);
}
</style>
<script>
(function() {
const hexDark = "#ffffff".trim();
const [r, g, b] = window.Spiritix.hexToRgb(hexDark);
const contrastColor = window.Spiritix.getContrastColor(hexDark);
document.documentElement.style.setProperty('--ghost-accent-color-dark-rgb', `${r} ${g} ${b}`);
document.documentElement.style.setProperty('--color-contrast-dark', contrastColor);
window.Spiritix.ghostAccentColorDarkRgb = `${r} ${g} ${b}`;
})();
</script>
<style>
:root.dark {
--color-contrast: var(--color-contrast-dark);
--ghost-accent-color-rgb: var(--ghost-accent-color-dark-rgb);
--ghost-accent-color: #ffffff;
}
</style>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,wght@0,400..900;1,400..900&display=swap" rel="stylesheet">
<style>
:root {
--font-body: 'Nunito Sans';
}
</style>
<style>
:root {
--font-headings: 'Nunito Sans';
}
</style>
<link href="https://changenode.com/assets/built/main.min.css?v=22031f1f56" rel="stylesheet" type="text/css" />