onboardconnect-agent 1.1.50 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +40 -15
- package/dist/index.js.map +1 -1
- package/dist/ldap.d.ts.map +1 -1
- package/dist/ldap.js +45 -4
- package/dist/ldap.js.map +1 -1
- package/dist/store.d.ts +0 -12
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +0 -12
- package/dist/store.js.map +1 -1
- package/dist/uninstall.d.ts.map +1 -1
- package/dist/uninstall.js +82 -36
- package/dist/uninstall.js.map +1 -1
- package/package.json +64 -64
- package/ui/assets/index-BfxhjG2Q.css +1 -0
- package/ui/assets/{index-BoNwz7M-.js → index-BnqKvq_1.js} +62 -62
- package/ui/index.html +24 -24
- package/ui/assets/index-CNIiqfks.css +0 -1
package/dist/uninstall.js
CHANGED
|
@@ -42,9 +42,14 @@ async function ocForceRemoveWithRetry(target, timeoutMs) {
|
|
|
42
42
|
const OC_CONFIG_DIR = process.platform === "win32"
|
|
43
43
|
? join(process.env["PROGRAMDATA"] ?? "C:\\ProgramData", "OnboardConnect")
|
|
44
44
|
: "/etc/onboardconnect";
|
|
45
|
+
// MUST match logger.ts's OC_LOG_DIR — Windows logs land under
|
|
46
|
+
// %PROGRAMDATA%\OnboardConnect\logs, NOT under %USERPROFILE%\.oc-agent. The
|
|
47
|
+
// previous (wrong) path here meant log files were never deleted AND the
|
|
48
|
+
// recursive rmSync of OC_CONFIG_DIR hit ENOTEMPTY when it tripped over the
|
|
49
|
+
// still-locked log file inside it.
|
|
45
50
|
const OC_LOG_DIR = process.platform === "win32"
|
|
46
|
-
? join(process.env["
|
|
47
|
-
: join(process.env["HOME"] ?? "/root", ".oc-agent");
|
|
51
|
+
? join(process.env["PROGRAMDATA"] ?? "C:\\ProgramData", "OnboardConnect", "logs")
|
|
52
|
+
: join(process.env["HOME"] ?? "/root", ".oc-agent", "logs");
|
|
48
53
|
async function ocStopAndRemoveService() {
|
|
49
54
|
const spinner = ora("Removing OnboardConnect Agent service...").start();
|
|
50
55
|
if (process.platform === "win32") {
|
|
@@ -55,14 +60,42 @@ async function ocStopAndRemoveService() {
|
|
|
55
60
|
// Remove any legacy Task Scheduler task from older installs
|
|
56
61
|
spawnSync("schtasks", ["/end", "/tn", name], { stdio: "pipe" });
|
|
57
62
|
spawnSync("schtasks", ["/delete", "/tn", name, "/f"], { stdio: "pipe" });
|
|
58
|
-
// Stop the service and wait until it actually reports STOPPED (or is
|
|
59
|
-
// gone).
|
|
60
|
-
//
|
|
61
|
-
|
|
63
|
+
// Stop the service and wait until it actually reports STOPPED (or is
|
|
64
|
+
// already gone). `sc stop` requires SERVICE_STOP rights, which a
|
|
65
|
+
// non-elevated shell does not have — the call returns "Access denied"
|
|
66
|
+
// and we wait 30s for a transition that will never happen. Detect that
|
|
67
|
+
// up-front and fall back to PowerShell's Stop-Service -Force (still
|
|
68
|
+
// requires admin, but emits a clearer message) and finally taskkill
|
|
69
|
+
// against the winsw wrapper PID for the truly stuck cases.
|
|
70
|
+
const scStop = spawnSync("sc", ["stop", name], { encoding: "utf8" });
|
|
71
|
+
const scStopOutput = `${scStop.stdout ?? ""}${scStop.stderr ?? ""}`;
|
|
72
|
+
const accessDenied = /access is denied|5:/i.test(scStopOutput);
|
|
73
|
+
if (accessDenied) {
|
|
74
|
+
spinner.fail(`Cannot stop service: access denied. Re-run from an ELEVATED prompt ` +
|
|
75
|
+
`(Right-click → "Run as administrator"), then run \`onboardconnect-agent uninstall\` again.`);
|
|
76
|
+
throw new Error("Service stop requires administrator privileges");
|
|
77
|
+
}
|
|
62
78
|
const stopDeadline = Date.now() + 30000;
|
|
63
79
|
while (Date.now() < stopDeadline && ocWinServiceState(name) === "running") {
|
|
64
80
|
await ocSleep(1000);
|
|
65
81
|
}
|
|
82
|
+
// Stuck in STOP_PENDING? Force via PowerShell.
|
|
83
|
+
if (ocWinServiceState(name) === "running") {
|
|
84
|
+
spawnSync("powershell", [
|
|
85
|
+
"-NoProfile",
|
|
86
|
+
"-Command",
|
|
87
|
+
`Stop-Service -Name '${name}' -Force -ErrorAction SilentlyContinue`,
|
|
88
|
+
], { stdio: "pipe" });
|
|
89
|
+
const forceDeadline = Date.now() + 15000;
|
|
90
|
+
while (Date.now() < forceDeadline && ocWinServiceState(name) === "running") {
|
|
91
|
+
await ocSleep(1000);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Last resort: kill the winsw wrapper process that holds the service.
|
|
95
|
+
if (ocWinServiceState(name) === "running") {
|
|
96
|
+
spawnSync("taskkill", ["/F", "/FI", `SERVICES eq ${name}`], { stdio: "pipe" });
|
|
97
|
+
await ocSleep(2000);
|
|
98
|
+
}
|
|
66
99
|
// Deregister via sc.exe. Unlike node-windows' uninstall (which unlinks the
|
|
67
100
|
// daemon .out/.err/.wrapper logs and throws an *uncaught* EBUSY when winsw
|
|
68
101
|
// still holds them), sc delete removes the registration without touching any
|
|
@@ -106,45 +139,58 @@ async function ocStopAndRemoveService() {
|
|
|
106
139
|
}
|
|
107
140
|
}
|
|
108
141
|
async function ocDeleteConfigDir(removeLogs) {
|
|
142
|
+
// ORDER MATTERS: on Windows the log files inside OC_CONFIG_DIR\logs are
|
|
143
|
+
// often still held open for a few seconds after the service stops (the
|
|
144
|
+
// service process releases the handle async, and winston's daily-rotate
|
|
145
|
+
// transport keeps its own file handle). Deleting the parent OC_CONFIG_DIR
|
|
146
|
+
// first hits ENOTEMPTY on the locked logs subdir. We always remove the
|
|
147
|
+
// logs subdir FIRST (with retry, regardless of `removeLogs`) so the parent
|
|
148
|
+
// can succeed; the `removeLogs` flag only controls whether we surface a
|
|
149
|
+
// warning vs an info note when logs can't be removed.
|
|
150
|
+
if (process.platform === "win32" && existsSync(OC_LOG_DIR)) {
|
|
151
|
+
const spinner = ora(`Removing log directory: ${OC_LOG_DIR}`).start();
|
|
152
|
+
// Try PowerShell force-remove first (handles transient locks better than rmSync)
|
|
153
|
+
const { spawnSync } = await import("child_process");
|
|
154
|
+
spawnSync("powershell", [
|
|
155
|
+
"-NoProfile",
|
|
156
|
+
"-Command",
|
|
157
|
+
`Remove-Item -Recurse -Force -Path '${OC_LOG_DIR}' -ErrorAction SilentlyContinue`,
|
|
158
|
+
], { stdio: "pipe" });
|
|
159
|
+
// Fall back to our retry helper for stubborn handles.
|
|
160
|
+
const removed = existsSync(OC_LOG_DIR)
|
|
161
|
+
? await ocForceRemoveWithRetry(OC_LOG_DIR, 20000)
|
|
162
|
+
: true;
|
|
163
|
+
if (removed)
|
|
164
|
+
spinner.succeed("Log directory deleted ✓");
|
|
165
|
+
else if (removeLogs)
|
|
166
|
+
spinner.warn(`Log files still locked — delete manually: ${OC_LOG_DIR}`);
|
|
167
|
+
else
|
|
168
|
+
spinner.info("Log directory present but could not be removed (locked); parent deletion will skip it");
|
|
169
|
+
}
|
|
170
|
+
else if (removeLogs && existsSync(OC_LOG_DIR)) {
|
|
171
|
+
const spinner = ora(`Deleting log directory: ${OC_LOG_DIR}`).start();
|
|
172
|
+
try {
|
|
173
|
+
rmSync(OC_LOG_DIR, { recursive: true, force: true });
|
|
174
|
+
spinner.succeed("Log directory deleted ✓");
|
|
175
|
+
}
|
|
176
|
+
catch (err) {
|
|
177
|
+
spinner.warn(`Could not delete logs: ${err instanceof Error ? err.message : String(err)}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
109
180
|
if (existsSync(OC_CONFIG_DIR)) {
|
|
110
181
|
const spinner = ora(`Deleting config directory: ${OC_CONFIG_DIR}`).start();
|
|
111
|
-
|
|
112
|
-
|
|
182
|
+
const removed = await ocForceRemoveWithRetry(OC_CONFIG_DIR, 15000);
|
|
183
|
+
if (removed) {
|
|
113
184
|
spinner.succeed("Config directory deleted ✓");
|
|
114
185
|
}
|
|
115
|
-
|
|
116
|
-
spinner.
|
|
186
|
+
else {
|
|
187
|
+
spinner.warn(`Some files in ${OC_CONFIG_DIR} are still locked (likely the active log file). ` +
|
|
188
|
+
`Reboot to release the handles, then delete the folder manually.`);
|
|
117
189
|
}
|
|
118
190
|
}
|
|
119
191
|
else {
|
|
120
192
|
console.log(chalk.gray(` Config directory not found, skipping: ${OC_CONFIG_DIR}`));
|
|
121
193
|
}
|
|
122
|
-
if (removeLogs && existsSync(OC_LOG_DIR)) {
|
|
123
|
-
const spinner = ora(`Deleting log directory: ${OC_LOG_DIR}`).start();
|
|
124
|
-
try {
|
|
125
|
-
if (process.platform === "win32") {
|
|
126
|
-
// Use PowerShell to force-remove; Node rmSync can fail on locked log files
|
|
127
|
-
const { spawnSync } = await import("child_process");
|
|
128
|
-
spawnSync("powershell", [
|
|
129
|
-
"-Command",
|
|
130
|
-
`Remove-Item -Recurse -Force -Path '${OC_LOG_DIR}' -ErrorAction SilentlyContinue`,
|
|
131
|
-
], { stdio: "pipe" });
|
|
132
|
-
if (!existsSync(OC_LOG_DIR)) {
|
|
133
|
-
spinner.succeed("Log directory deleted ✓");
|
|
134
|
-
}
|
|
135
|
-
else {
|
|
136
|
-
spinner.warn(`Log files still locked — delete manually: ${OC_LOG_DIR}`);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
else {
|
|
140
|
-
rmSync(OC_LOG_DIR, { recursive: true, force: true });
|
|
141
|
-
spinner.succeed("Log directory deleted ✓");
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
catch (err) {
|
|
145
|
-
spinner.warn(`Could not delete logs: ${err instanceof Error ? err.message : String(err)}`);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
194
|
}
|
|
149
195
|
function ocUninstallPackage() {
|
|
150
196
|
const spinner = ora("Removing npm global package...").start();
|
package/dist/uninstall.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../src/uninstall.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAErC,SAAS,OAAO,CAAC,EAAU;IACzB,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,8CAA8C;AAC9C,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;IACtD,IAAI,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IACvD,IAAI,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9D,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,+EAA+E;AAC/E,iFAAiF;AACjF,kFAAkF;AAClF,+DAA+D;AAC/D,KAAK,UAAU,sBAAsB,CAAC,MAAc,EAAE,SAAiB;IACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,SAAS,CAAC;QACR,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;YACjF,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;gBAAE,OAAO,IAAI,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,yCAAyC;QAC3C,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ;YAAE,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED,MAAM,aAAa,GACjB,OAAO,CAAC,QAAQ,KAAK,OAAO;IAC1B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,iBAAiB,EAAE,gBAAgB,CAAC;IACzE,CAAC,CAAC,qBAAqB,CAAC;AAE5B,MAAM,UAAU,GACd,OAAO,CAAC,QAAQ,KAAK,OAAO;IAC1B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../src/uninstall.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,64 +1,64 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "onboardconnect-agent",
|
|
3
|
-
"version": "1.1
|
|
4
|
-
"description": "OnboardConnect On-Prem Agent — LDAP provisioning bridge for on-premises Active Directory",
|
|
5
|
-
"keywords": [
|
|
6
|
-
"onboardconnect",
|
|
7
|
-
"active-directory",
|
|
8
|
-
"ldap",
|
|
9
|
-
"provisioning",
|
|
10
|
-
"slate-crm"
|
|
11
|
-
],
|
|
12
|
-
"homepage": "https://onboardconnectapp.com/docs/agent",
|
|
13
|
-
"license": "UNLICENSED",
|
|
14
|
-
"type": "module",
|
|
15
|
-
"bin": {
|
|
16
|
-
"oc-agent": "dist/index.js",
|
|
17
|
-
"onboardconnect-agent": "dist/index.js"
|
|
18
|
-
},
|
|
19
|
-
"main": "./dist/index.js",
|
|
20
|
-
"files": [
|
|
21
|
-
"dist",
|
|
22
|
-
"scripts",
|
|
23
|
-
"ui"
|
|
24
|
-
],
|
|
25
|
-
"scripts": {
|
|
26
|
-
"build": "tsc",
|
|
27
|
-
"dev": "tsx watch src/index.ts",
|
|
28
|
-
"setup": "tsx src/setup.ts",
|
|
29
|
-
"start": "node dist/index.js",
|
|
30
|
-
"typecheck": "tsc --noEmit",
|
|
31
|
-
"test:unit": "vitest run",
|
|
32
|
-
"clean": "rimraf dist *.tsbuildinfo",
|
|
33
|
-
"uninstall": "tsx src/uninstall.ts",
|
|
34
|
-
"postinstall": "node scripts/postinstall.js"
|
|
35
|
-
},
|
|
36
|
-
"dependencies": {
|
|
37
|
-
"node-windows": "^1.0.0-beta.8",
|
|
38
|
-
"ldapts": "^7.2.0",
|
|
39
|
-
"ssh2": "^1.16.0",
|
|
40
|
-
"winston": "^3.17.0",
|
|
41
|
-
"winston-daily-rotate-file": "^5.0.0",
|
|
42
|
-
"lru-cache": "^11.0.0",
|
|
43
|
-
"inquirer": "^12.0.0",
|
|
44
|
-
"chalk": "^5.4.0",
|
|
45
|
-
"ora": "^8.0.0",
|
|
46
|
-
"ws": "^8.18.0",
|
|
47
|
-
"zod": "^3.24.0",
|
|
48
|
-
"semver": "^7.7.0"
|
|
49
|
-
},
|
|
50
|
-
"devDependencies": {
|
|
51
|
-
"@oc/types": "workspace:*",
|
|
52
|
-
"@types/node": "^22.0.0",
|
|
53
|
-
"@types/ssh2": "^1.15.0",
|
|
54
|
-
"@types/ws": "^8.5.0",
|
|
55
|
-
"@types/semver": "^7.5.0",
|
|
56
|
-
"tsx": "^4.19.0",
|
|
57
|
-
"typescript": "^5.7.0",
|
|
58
|
-
"vitest": "^2.0.0",
|
|
59
|
-
"rimraf": "^6.0.0"
|
|
60
|
-
},
|
|
61
|
-
"engines": {
|
|
62
|
-
"node": ">=18"
|
|
63
|
-
}
|
|
64
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "onboardconnect-agent",
|
|
3
|
+
"version": "1.2.1",
|
|
4
|
+
"description": "OnboardConnect On-Prem Agent — LDAP provisioning bridge for on-premises Active Directory",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"onboardconnect",
|
|
7
|
+
"active-directory",
|
|
8
|
+
"ldap",
|
|
9
|
+
"provisioning",
|
|
10
|
+
"slate-crm"
|
|
11
|
+
],
|
|
12
|
+
"homepage": "https://onboardconnectapp.com/docs/agent",
|
|
13
|
+
"license": "UNLICENSED",
|
|
14
|
+
"type": "module",
|
|
15
|
+
"bin": {
|
|
16
|
+
"oc-agent": "dist/index.js",
|
|
17
|
+
"onboardconnect-agent": "dist/index.js"
|
|
18
|
+
},
|
|
19
|
+
"main": "./dist/index.js",
|
|
20
|
+
"files": [
|
|
21
|
+
"dist",
|
|
22
|
+
"scripts",
|
|
23
|
+
"ui"
|
|
24
|
+
],
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "tsc",
|
|
27
|
+
"dev": "tsx watch src/index.ts",
|
|
28
|
+
"setup": "tsx src/setup.ts",
|
|
29
|
+
"start": "node dist/index.js",
|
|
30
|
+
"typecheck": "tsc --noEmit",
|
|
31
|
+
"test:unit": "vitest run",
|
|
32
|
+
"clean": "rimraf dist *.tsbuildinfo",
|
|
33
|
+
"uninstall": "tsx src/uninstall.ts",
|
|
34
|
+
"postinstall": "node scripts/postinstall.js"
|
|
35
|
+
},
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"node-windows": "^1.0.0-beta.8",
|
|
38
|
+
"ldapts": "^7.2.0",
|
|
39
|
+
"ssh2": "^1.16.0",
|
|
40
|
+
"winston": "^3.17.0",
|
|
41
|
+
"winston-daily-rotate-file": "^5.0.0",
|
|
42
|
+
"lru-cache": "^11.0.0",
|
|
43
|
+
"inquirer": "^12.0.0",
|
|
44
|
+
"chalk": "^5.4.0",
|
|
45
|
+
"ora": "^8.0.0",
|
|
46
|
+
"ws": "^8.18.0",
|
|
47
|
+
"zod": "^3.24.0",
|
|
48
|
+
"semver": "^7.7.0"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@oc/types": "workspace:*",
|
|
52
|
+
"@types/node": "^22.0.0",
|
|
53
|
+
"@types/ssh2": "^1.15.0",
|
|
54
|
+
"@types/ws": "^8.5.0",
|
|
55
|
+
"@types/semver": "^7.5.0",
|
|
56
|
+
"tsx": "^4.19.0",
|
|
57
|
+
"typescript": "^5.7.0",
|
|
58
|
+
"vitest": "^2.0.0",
|
|
59
|
+
"rimraf": "^6.0.0"
|
|
60
|
+
},
|
|
61
|
+
"engines": {
|
|
62
|
+
"node": ">=18"
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@import"https://fonts.googleapis.com/css2?family=Outfit:wght@400;500;600;700;800&display=swap";@import"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap";*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Outfit,system-ui,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:JetBrains Mono,Fira Code,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.pointer-events-none{pointer-events:none}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.bottom-0{bottom:0}.left-0{left:0}.right-3\.5{right:.875rem}.top-0{top:0}.top-1\/2{top:50%}.top-14{top:3.5rem}.z-20{z-index:20}.z-30{z-index:30}.mx-5{margin-left:1.25rem;margin-right:1.25rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-2\.5{margin-bottom:.625rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.mr-1{margin-right:.25rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-24{height:6rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-8{height:2rem}.min-h-screen{min-height:100vh}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-full{width:100%}.min-w-0{min-width:0px}.max-w-5xl{max-width:64rem}.max-w-\[420px\]{max-width:420px}.max-w-md{max-width:28rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-4{--tw-translate-x: 1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-4{row-gap:1rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-y-0>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(0px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(0px * var(--tw-divide-y-reverse))}.divide-oc-navy-700>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(26 45 71 / var(--tw-divide-opacity, 1))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-\[3px\]{border-width:3px}.border-b{border-bottom-width:1px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-amber-400\/40{border-color:#fbbf2466}.border-amber-500\/20{border-color:#f59e0b33}.border-amber-500\/30{border-color:#f59e0b4d}.border-amber-500\/40{border-color:#f59e0b66}.border-blue-500\/20{border-color:#3b82f633}.border-green-400\/40{border-color:#4ade8066}.border-green-500\/20{border-color:#22c55e33}.border-green-500\/30{border-color:#22c55e4d}.border-oc-navy-600{--tw-border-opacity: 1;border-color:rgb(35 59 92 / var(--tw-border-opacity, 1))}.border-oc-navy-700{--tw-border-opacity: 1;border-color:rgb(26 45 71 / var(--tw-border-opacity, 1))}.border-oc-navy-700\/60{border-color:#1a2d4799}.border-oc-navy-800{--tw-border-opacity: 1;border-color:rgb(15 27 45 / var(--tw-border-opacity, 1))}.border-red-500{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.border-red-500\/20{border-color:#ef444433}.border-red-500\/30{border-color:#ef44444d}.border-red-500\/40{border-color:#ef444466}.border-slate-500\/30{border-color:#64748b4d}.border-slate-600{--tw-border-opacity: 1;border-color:rgb(71 85 105 / var(--tw-border-opacity, 1))}.border-slate-600\/40{border-color:#47556966}.border-teal-400{--tw-border-opacity: 1;border-color:rgb(45 212 191 / var(--tw-border-opacity, 1))}.border-teal-500{--tw-border-opacity: 1;border-color:rgb(20 184 166 / var(--tw-border-opacity, 1))}.border-teal-500\/20{border-color:#14b8a633}.border-teal-600\/40{border-color:#0d948866}.border-transparent{border-color:transparent}.border-yellow-400\/40{border-color:#facc1566}.border-yellow-500\/40{border-color:#eab30866}.bg-amber-400{--tw-bg-opacity: 1;background-color:rgb(251 191 36 / var(--tw-bg-opacity, 1))}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-amber-500\/15{background-color:#f59e0b26}.bg-black\/60{background-color:#0009}.bg-blue-500\/10{background-color:#3b82f61a}.bg-green-400{--tw-bg-opacity: 1;background-color:rgb(74 222 128 / var(--tw-bg-opacity, 1))}.bg-green-500\/10{background-color:#22c55e1a}.bg-green-500\/15{background-color:#22c55e26}.bg-oc-navy-600{--tw-bg-opacity: 1;background-color:rgb(35 59 92 / var(--tw-bg-opacity, 1))}.bg-oc-navy-700{--tw-bg-opacity: 1;background-color:rgb(26 45 71 / var(--tw-bg-opacity, 1))}.bg-oc-navy-800{--tw-bg-opacity: 1;background-color:rgb(15 27 45 / var(--tw-bg-opacity, 1))}.bg-oc-navy-900{--tw-bg-opacity: 1;background-color:rgb(10 22 40 / var(--tw-bg-opacity, 1))}.bg-oc-navy-900\/20{background-color:#0a162833}.bg-oc-navy-900\/40{background-color:#0a162866}.bg-oc-navy-900\/50{background-color:#0a162880}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-red-500\/10{background-color:#ef44441a}.bg-red-500\/15{background-color:#ef444426}.bg-slate-500{--tw-bg-opacity: 1;background-color:rgb(100 116 139 / var(--tw-bg-opacity, 1))}.bg-slate-500\/15{background-color:#64748b26}.bg-slate-600{--tw-bg-opacity: 1;background-color:rgb(71 85 105 / var(--tw-bg-opacity, 1))}.bg-teal-400{--tw-bg-opacity: 1;background-color:rgb(45 212 191 / var(--tw-bg-opacity, 1))}.bg-teal-500\/10{background-color:#14b8a61a}.bg-teal-600{--tw-bg-opacity: 1;background-color:rgb(13 148 136 / var(--tw-bg-opacity, 1))}.bg-teal-600\/20{background-color:#0d948833}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-yellow-400{--tw-bg-opacity: 1;background-color:rgb(250 204 21 / var(--tw-bg-opacity, 1))}.bg-yellow-500{--tw-bg-opacity: 1;background-color:rgb(234 179 8 / var(--tw-bg-opacity, 1))}.p-2{padding:.5rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-7{padding-top:1.75rem;padding-bottom:1.75rem}.pr-10{padding-right:2.5rem}.pr-12{padding-right:3rem}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:JetBrains Mono,Fira Code,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-amber-300{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.text-amber-300\/90{color:#fcd34de6}.text-amber-400{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.text-amber-400\/80{color:#fbbf24cc}.text-blue-300\/90{color:#93c5fde6}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-red-300{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-red-400\/80{color:#f87171cc}.text-red-500\/60{color:#ef444499}.text-slate-100{--tw-text-opacity: 1;color:rgb(241 245 249 / var(--tw-text-opacity, 1))}.text-slate-200{--tw-text-opacity: 1;color:rgb(226 232 240 / var(--tw-text-opacity, 1))}.text-slate-300{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.text-slate-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.text-slate-600{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.text-slate-700{--tw-text-opacity: 1;color:rgb(51 65 85 / var(--tw-text-opacity, 1))}.text-teal-300{--tw-text-opacity: 1;color:rgb(94 234 212 / var(--tw-text-opacity, 1))}.text-teal-400{--tw-text-opacity: 1;color:rgb(45 212 191 / var(--tw-text-opacity, 1))}.text-violet-400{--tw-text-opacity: 1;color:rgb(167 139 250 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-300{--tw-text-opacity: 1;color:rgb(253 224 71 / var(--tw-text-opacity, 1))}.text-yellow-400{--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}.text-yellow-500{--tw-text-opacity: 1;color:rgb(234 179 8 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.decoration-dashed{text-decoration-style:dashed}.underline-offset-2{text-underline-offset:2px}.placeholder-slate-600::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(71 85 105 / var(--tw-placeholder-opacity, 1))}.placeholder-slate-600::placeholder{--tw-placeholder-opacity: 1;color:rgb(71 85 105 / var(--tw-placeholder-opacity, 1))}.opacity-30{opacity:.3}.opacity-55{opacity:.55}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-black\/40{--tw-shadow-color: rgb(0 0 0 / .4);--tw-shadow: var(--tw-shadow-colored)}.shadow-teal-900\/40{--tw-shadow-color: rgb(19 78 74 / .4);--tw-shadow: var(--tw-shadow-colored)}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-teal-500\/20{--tw-ring-color: rgb(20 184 166 / .2)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}:root{--oc-navy-900: #0a1628;--oc-teal-500: #14b8a6;--oc-teal-600: #0d9488}*{box-sizing:border-box}body{background-color:var(--oc-navy-900);color:#e2e8f0;font-family:Outfit,system-ui,sans-serif;margin:0}.light body,body.light{background-color:#f9fafb;color:#111827}html{color-scheme:dark}html.light{color-scheme:light}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#1a2d47;border-radius:3px}::-webkit-scrollbar-thumb:hover{background:#233b5c}:focus-visible{outline:2px solid var(--oc-teal-500);outline-offset:2px}@keyframes oc-spin{to{transform:rotate(360deg)}}.oc-spinner{display:inline-block;width:16px;height:16px;border:2px solid rgba(20,184,166,.3);border-top-color:#14b8a6;border-radius:50%;animation:oc-spin .7s linear infinite}@keyframes oc-pulse-dot{0%,to{opacity:1}50%{opacity:.4}}.oc-pulse-dot{animation:oc-pulse-dot 2s ease-in-out infinite}@keyframes oc-ping{0%{transform:scale(1);opacity:.75}75%,to{transform:scale(1.6);opacity:0}}.oc-ping{animation:oc-ping 1.5s cubic-bezier(0,0,.2,1) infinite}.last\:border-0:last-child{border-width:0px}.hover\:bg-oc-navy-700:hover{--tw-bg-opacity: 1;background-color:rgb(26 45 71 / var(--tw-bg-opacity, 1))}.hover\:bg-oc-navy-700\/30:hover{background-color:#1a2d474d}.hover\:bg-red-500\/5:hover{background-color:#ef44440d}.hover\:bg-teal-500:hover{--tw-bg-opacity: 1;background-color:rgb(20 184 166 / var(--tw-bg-opacity, 1))}.hover\:text-red-300:hover{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.hover\:text-red-400:hover{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.hover\:text-slate-100:hover{--tw-text-opacity: 1;color:rgb(241 245 249 / var(--tw-text-opacity, 1))}.hover\:text-slate-200:hover{--tw-text-opacity: 1;color:rgb(226 232 240 / var(--tw-text-opacity, 1))}.hover\:text-slate-300:hover{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.hover\:text-teal-400:hover{--tw-text-opacity: 1;color:rgb(45 212 191 / var(--tw-text-opacity, 1))}.focus\:border-red-400:focus{--tw-border-opacity: 1;border-color:rgb(248 113 113 / var(--tw-border-opacity, 1))}.focus\:border-teal-500:focus{--tw-border-opacity: 1;border-color:rgb(20 184 166 / var(--tw-border-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-teal-400:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(45 212 191 / var(--tw-ring-opacity, 1))}.focus\:ring-teal-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(20 184 166 / var(--tw-ring-opacity, 1))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus\:ring-offset-oc-navy-800:focus{--tw-ring-offset-color: #0f1b2d}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:640px){.sm\:inline-block{display:inline-block}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}}@media(min-width:1024px){.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:py-8{padding-top:2rem;padding-bottom:2rem}}
|