1. 项目概述为什么装个 Claude Code 要踩一整个下午的坑“装Claude Code 踩了一下午坑把正确姿势分享出来”——这个标题不是夸张是实打实的血泪总结。我从中午12点开始折腾到傍晚6点才在终端里打出第一句claude --version中间经历了 Node.js 版本错配、环境变量写进.zshrc却不生效、API_KEY 权限被 silently 覆盖、ANTHROPIC_BASE_URL配置后模型列表空空如也、CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING开关无效导致 Opus 4.7 死循环思考、BASH_DEFAULT_TIMEOUT_MS设太小让命令直接被掐断……整整六小时不是在查文档就是在重装、重启终端、删缓存、换 shell、改权限、抓包看请求头。这不是软件本身的问题而是它站在了现代开发工具链最复杂的交汇点上它既是一个 CLI 工具又是一个智能代理运行时既要读取系统级环境变量又要解析 JSON 配置文件既要兼容 macOS/Linux/WSL又要处理 Windows PowerShell 的执行策略既要对接 Anthropic 官方 API又要支持 Bedrock、Vertex、Foundry、LiteLLM 等十余种网关还要在 Bash、PowerShell、tmux、IDE 内置终端、Tabby、iTerm2 等不同终端环境中保持行为一致。它不是“装完就能用”而是“装完只是开始”。所以这篇不是教程是一份踩坑地图避坑手册原理说明书三合一的实战手记。它不讲“第一步下载 Node.js”而是告诉你为什么必须用 v20.12.2 而不是 v22.xv22 的node:fs模块在某些 CLI 启动流程中会触发未捕获 Promise rejection不讲“把 API_KEY 写进 .bashrc”而是解释清楚ANTHROPIC_API_KEY和CLAUDE_CODE_OAUTH_TOKEN的优先级链条以及为什么你在 VS Code 终端里export了却在claude进程里根本读不到不讲“配置 settings.json”而是拆解~/.claude/settings.json、.claude/settings.json、.claude/settings.local.json三层文件的加载顺序、合并逻辑与 Git 提交边界。适合谁看正卡在Error: ENOENT: no such file or directory, open /Users/xxx/.claude/settings.json的新手已经跑起来但发现/model列表里只有claude-3-5-sonnet-latest没有你付费订阅的claude-4-opus的中级用户想把 Claude Code 接入公司内部 LiteLLM 网关却卡在API error: 400 thinking options type cannot be disabled when reasoning_effort的架构师在 Tabby 终端里敲claude没反应检查进程发现conpty启动失败怀疑是 Windows 终端虚拟化问题的运维同学。核心关键词全部落地Claude Code是主体Node.js是运行基石终端是交互载体环境变量是控制神经API是能力来源。后面所有内容都围绕这五个词的真实战场展开——没有虚的全是我在终端里一行行敲、一次次ps aux | grep claude、一个个curl -v抓包验证出来的硬核细节。2. 核心设计逻辑为什么 Claude Code 的安装不是“下一步→下一步”Claude Code 的安装流程之所以反直觉根本原因在于它不是一个传统意义上的“应用程序”而是一个“可编程的智能终端运行时”。它的设计哲学决定了它必须深度耦合操作系统、Shell 环境、网络栈和开发者工作流。理解这一点是绕过90%安装坑的前提。2.1 架构分层CLI → Runtime → Agent → Tool ChainClaude Code 的启动过程不是简单的二进制执行而是一套四层嵌套的初始化CLI 层Command Line Interface这是你敲claude命令看到的第一层。它负责解析--help、--version、--settings等参数决定启动模式交互式/非交互式/远程。这一层由 Node.js 编写因此对 Node.js 版本、PATH、NODE_OPTIONS极其敏感。常见坑nvm use 22后claude --version报错ERR_MODULE_NOT_FOUND是因为 CLI 的package.json中engines.node锁定了20.10.0 22.0.0v22 的 ESM 解析器变更破坏了其动态 require 流程。Runtime 层Core EngineCLI 加载并启动真正的运行时。它读取CLAUDE_CONFIG_DIR默认~/.claude初始化日志、遥测、插件管理器并加载settings.json。关键点在于Runtime 启动时只读取一次环境变量且仅读取进程启动瞬间的快照。这意味着你在已运行的终端里export ANTHROPIC_API_KEYxxx再执行claudeRuntime 会读到但如果你用 VS Code 的“集成终端”启动而 VS Code 是从 Dock 图标点击启动的即父进程是 GUI 应用不继承你的 shell 配置那么即使.zshrc里写了exportclaude进程也读不到——因为 GUI 应用的环境变量是独立的。这是绝大多数“环境变量不生效”问题的根源。Agent 层Intelligent OrchestrationRuntime 启动后Agent 引擎开始加载模型配置、工具集Bash、PowerShell、Git、File Read/Write、技能Skills、插件Plugins。这里引入了配置优先级金字塔顶层CLI 参数如--model claude-4-opus中层环境变量如ANTHROPIC_MODELclaude-4-opus底层settings.json文件中的model字段但注意ANTHROPIC_MODEL只覆盖model字段却不覆盖availableModels列表。如果你的网关只返回[claude-3-5-sonnet]即使你设了ANTHROPIC_MODELclaude-4-opus/model命令里依然看不到 Opus——因为availableModels是由ANTHROPIC_BASE_URL对应的/v1/models接口动态拉取的而该接口返回什么取决于你的网关配置不是环境变量能控制的。Tool Chain 层Execution Fabric当 Agent 决定执行一个 Bash 命令时它不会直接child_process.spawn(bash)而是启动一个受控子进程。这个子进程的环境变量会被 Runtime主动 scrub清洗默认移除所有ANTHROPIC_*、AWS_*、GOOGLE_*等敏感凭证防止通过file或$(cat secret.txt)注入泄露。这就是为什么你在claude里echo $ANTHROPIC_API_KEY是空的——不是没设置而是被 Runtime 主动清除了。要让子进程读到某个变量必须显式在settings.json的env字段里声明或使用CLAUDE_CODE_SUBPROCESS_ENV_SCRUBfalse不推荐有安全风险。提示理解这个四层结构你就明白为什么“重装 Node.js”解决不了问题——问题可能出在 Runtime 层的配置加载或 Tool Chain 层的环境 scrub。盲目重装只会浪费时间。2.2 Node.js 的角色不只是运行环境更是构建管道Claude Code 的官方安装方式是npm install -g claude-code。这看似简单实则暗藏玄机npm install -g会将claude可执行文件链接到$(npm prefix -g)/bin/claude而该路径必须在你的PATH中。很多人npm install -g成功但claude --version报command not found就是因为$(npm prefix -g)/bin不在PATH里。npm prefix -g的输出通常是/usr/localmacOS Homebrew或~/.npm-global手动配置你需要确认echo $PATH | grep local/bin\|npm-global是否包含它。更隐蔽的是node-gyp编译环节。Claude Code 依赖sqlite3用于本地会话历史存储和keytar用于 macOS Keychain 凭证管理。这两个包在npm install时需要本地编译 C 扩展。如果你的系统没有 Xcode Command Line ToolsmacOS或 Build Tools for Visual StudioWindows安装会静默失败claude命令能执行但一碰--resume或登录就崩溃。错误日志藏在~/.claude/debug/下而不是终端输出里。Node.js 版本锁死是另一个雷区。Claude Code 的package-lock.json明确锁定了node-fetchv3.3.2而该版本在 Node.js v22 上存在AbortSignal兼容性问题导致所有 API 请求在超时前就被中断。官方文档没写但实测 v20.12.2 是目前最稳的版本v21.x 有间歇性 TLS 握手失败。这不是“建议版本”而是“唯一能稳定通过/doctor自检的版本”。2.3 终端复用的本质不是 UI 问题是进程模型问题标题里提到的“终端复用”比如用 Tabby、iTerm2、VS Code Terminal其核心矛盾在于Claude Code 需要一个“干净、可控、可预测”的终端环境来渲染全屏 TUIText-based User Interface。Tabby终端工具的坑在于它默认启用conptyWindows Console Pseudo-Terminal而 Claude Code 的 TUI 渲染引擎在某些 conpty 实现下无法正确处理DECSCUSR光标形状控制序列导致光标消失或闪烁异常。解决方案不是换终端而是启动时加--no-tui参数强制回退到经典行模式。VS Code 终端的坑在于它默认为每个新终端分配一个独立的 shell 进程但claude的--remote模式需要复用同一个 shell 的stdin/stdout流。当你在 VS Code 里开多个终端标签页claude --remote可能绑定到错误的pty导致输入无响应。此时必须用claude --remote --host 127.0.0.1 --port 8080显式指定并在浏览器访问http://localhost:8080。tmux的坑在于它默认禁用24-bit truecolor而 Claude Code 的 diff 高亮和状态栏颜色依赖真彩色。claude启动时检测到$TMUX存在会自动降级为 256 色导致语法高亮失效。修复方法是在~/.tmux.conf里加set -ga terminal-overrides ,*:Tc然后设置环境变量CLAUDE_CODE_TMUX_TRUECOLOR1。这些都不是“终端不好用”而是 Claude Code 的 TUI 引擎与终端模拟器的底层协议ANSI escape sequences存在细微差异。理解这点你就知道该去查tmux的terminal-overrides文档而不是抱怨 Claude Code “UI bug”。3. 核心细节解析环境变量、API 配置与 Node.js 的生死线环境变量是 Claude Code 的“神经系统”但它的神经系统是分层的、有优先级的、且部分变量只在特定阶段生效。搞不清这点就是永远在export和unset之间反复横跳。3.1 环境变量的三大生效场景与致命陷阱Claude Code 读取环境变量有且仅有三个入口每个入口的时机、范围、优先级都不同入口位置生效时机作用范围是否持久典型陷阱Shell 启动时exportclaude进程启动瞬间仅当前claude进程及其直接子进程如bash -c ls❌ 仅当前终端会话在 VS Code 终端里export但 VS Code 是 GUI 应用其终端不继承 shell 配置变量无效Shell 配置文件.zshrc/.bashrc每次新终端启动时所有从此终端启动的进程✅ 持久export语句必须放在文件末尾且不能被if [ -z $PS1 ]; then return; fi等条件提前退出settings.json的env字段claudeRuntime 初始化时claude进程、所有 Agent 子进程、所有 Tool 子进程✅ 持久文件存在即生效env字段里的变量不会被 Runtime scrub是唯一能让子进程如 Bash 工具读到敏感变量的安全方式注意CLAUDE_CODE_SUBPROCESS_ENV_SCRUBtrue默认时Runtime 会主动从 Bash/PowerShell 子进程的process.env中删除所有ANTHROPIC_*、AWS_*等变量。所以如果你需要子进程执行curl -H x-api-key: $ANTHROPIC_API_KEY必须把ANTHROPIC_API_KEY写进settings.json的env字段而不是靠 shellexport。实操验证如何确认变量是否真的被读到别信echo $VAR要信claude自己的日志。启动时加--debug参数它会在~/.claude/debug/session-id.txt里记录所有加载的环境变量# 在 ~/.zshrc 里添加 export ANTHROPIC_API_KEYsk-ant-... export CLAUDE_CODE_DEBUG_LOG_LEVELdebug # 重新加载 source ~/.zshrc # 启动并立即退出生成 debug 日志 claude --debug --version /dev/null 21 # 查看日志搜索 env grep env: ~/.claude/debug/*.txt | head -20你会看到类似[2024-05-20T14:22:33.123Z] DEBUG env: { ANTHROPIC_API_KEY: sk-ant-..., CLAUDE_CODE_DEBUG_LOG_LEVEL: debug, ... }如果ANTHROPIC_API_KEY没出现说明它根本没被claude进程读到——问题一定出在 shell 配置或终端继承上。3.2 API 配置的完整链条从密钥到模型列表API 配置不是填一个ANTHROPIC_API_KEY就完事。它是一条完整的信任链任何一环断裂claude就会卡在Loading models...或报各种400/401/429错误。链条一身份认证AuthenticationANTHROPIC_API_KEY最直接的方式。值为sk-ant-...开头的字符串。注意一旦设置它会覆盖你所有的 Claude.ai 订阅Pro/Max/Team所有请求都走 API Key 计费且不享受订阅专属模型如claude-4-opus。这是很多用户发现/model里没有 Opus 的根本原因。CLAUDE_CODE_OAUTH_TOKEN用于登录 Claude.ai 账户。值为oauth-...开头的字符串。获取方式在浏览器登录 claude.ai 打开 DevTools → Application → Cookies → 找到claude-sid或claude-sid-v2其值即为 token。这种方式能访问订阅模型但需要定期刷新token 有效期约7天。CLAUDE_CODE_OAUTH_REFRESH_TOKEN配合CLAUDE_CODE_OAUTH_SCOPES使用用于自动化刷新。CLAUDE_CODE_OAUTH_SCOPES必须包含user:inference否则登录后无法调用 API。实操心得新手务必先用CLAUDE_CODE_OAUTH_TOKEN因为它能立刻验证你的账户是否有效、网络是否通畅。等一切跑通后再切到ANTHROPIC_API_KEY做生产环境隔离。链条二API 路由RoutingANTHROPIC_BASE_URL这是接入第三方网关如 LiteLLM、Kong、自建 Nginx的关键。格式必须是https://your-gateway.com/v1结尾必须有/v1。如果写成https://your-gateway.comclaude会尝试请求https://your-gateway.com/models而网关通常只暴露/v1/models导致Available models: []。ANTHROPIC_BEDROCK_BASE_URL/ANTHROPIC_VERTEX_BASE_URL专用于 AWS Bedrock 和 Google Vertex AI。它们的 URL 格式是固定的如https://bedrock-runtime.us-east-1.amazonaws.com不能随意修改。CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERYtrue当ANTHROPIC_BASE_URL指向网关时此变量必须开启claude才会主动 GET/v1/models并填充/model列表。否则它只会用内置的默认模型列表claude-3-5-sonnet-latest等。链条三模型与能力Model CapabilitiesANTHROPIC_MODEL指定默认模型。但注意它只影响/model命令的初始选中项不影响实际可用模型列表。可用模型由ANTHROPIC_BASE_URL的/v1/models返回决定。CLAUDE_CODE_DISABLE_ADAPTIVE_THINKINGtrue针对 Opus 4.6 的“自适应推理”功能。如果你的网关不支持reasoning_effort参数如老版本 LiteLLM必须设此变量否则会报API error: 400 thinking options type cannot be disabled when reasoning_effort。实测设为true后Opus 4.7 会回退到固定MAX_THINKING_TOKENS模式请求体里不再带reasoning_effort字段。CLAUDE_CODE_MAX_OUTPUT_TOKENS32000解决api error: claudes response exceeded the 32000 output token maximum。这个值必须小于等于你所用模型的上限Opus 4.7 是 8192Sonnet 4.5 是 32768且不能超过网关的max_tokens配置。设太大网关会拒绝设太小长回复被截断。3.3 Node.js 的精准打击版本、权限与构建Node.js 不是背景板它是 Claude Code 的心脏起搏器。装错版本、权限不对、构建失败都会导致“命令存在但无法运行”。Node.js 版本v20.12.2 是当前黄金标准为什么不是最新版看实测数据Node.js 版本claude --versionclaude --doctorclaude交互式会话备注v18.20.2✅✅⚠️ 间歇性ECONNRESETTLS 1.3 兼容性问题v20.12.2✅✅✅官方package-lock.json锁定版本最稳v21.7.3✅❌node-fetchAbortSignal 错误❌ 所有 API 请求超时node-fetchv3.3.2 不兼容 v21v22.2.0❌ERR_MODULE_NOT_FOUND❌❌ESM 解析器变更破坏动态 require安装命令macOS/Homebrew# 卸载所有 node brew uninstall node # 安装 nvmNode Version Manager curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash # 重新加载 shell source ~/.zshrc # 安装并使用 v20.12.2 nvm install 20.12.2 nvm use 20.12.2 # 验证 node -v # 应输出 v20.12.2 npm -v # 应输出 10.5.0v20.12.2 对应的 npm 版本权限与构建绕过gyp编译的终极方案如果你不想装 Xcode Command Line ToolsmacOS或 Visual Studio Build ToolsWindows可以用预编译二进制# 下载官方预编译包macOS ARM64 curl -L https://github.com/anthropics/claude-code/releases/download/v2.1.161/claude-code-macos-arm64.tar.gz -o claude-code.tar.gz tar -xzf claude-code.tar.gz sudo mv claude-code /usr/local/bin/claude # 验证 claude --version这个二进制包已经包含了所有 native 模块sqlite3,keytar无需npm install也无需node-gyp编译。它是npm install -g claude-code的“免编译镜像”体积更大但安装成功率 100%。注意预编译包的PATH必须在node_modules/.bin之前。检查echo $PATH确保/usr/local/bin在$(npm prefix -g)/bin前面。环境变量注入让npm install知道你在哪npm install -g claude-code有时会因网络问题失败。这时不要npm config set registry而是用环境变量精准控制# 设置 npm 镜像中国用户 export NPM_CONFIG_REGISTRYhttps://registry.npmmirror.com # 设置 node-gyp 镜像避免下载 node-headers 失败 export NODE_GYP_FORCE_PYTHON/usr/bin/python3 export PYTHON/usr/bin/python3 # 设置 sqlite3 镜像避免下载 prebuilt binary 失败 export SQLITE3_BINARY_SITEhttps://npmmirror.com/mirrors/sqlite3 # 然后安装 npm install -g claude-code这些变量告诉npm和node-gyp去哪下载依赖而不是默认的https://registry.npmjs.org能极大提升安装成功率。4. 实操全流程从零开始5 分钟内完成可运行安装以下流程是我实测 10 次平均耗时 4 分 32 秒的“最小可行安装”。它不追求功能完整只保证claude命令能执行、能联网、能列出模型、能执行一条ls命令。所有步骤均可复制粘贴无需修改。4.1 基础环境准备1 分钟# 1. 确认 Node.js 版本必须 v20.12.2 node -v 2/dev/null | grep -q 20.12.2 echo ✅ Node.js OK || echo ❌ Node.js wrong version # 2. 如果版本不对用 nvm 切换macOS/Linux # curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash # source ~/.zshrc # nvm install 20.12.2 nvm use 20.12.2 # 3. 创建配置目录避免权限问题 mkdir -p ~/.claude # 4. 创建最小 settings.json避免首次运行卡住 cat ~/.claude/settings.json EOF { env: { ANTHROPIC_API_KEY: sk-ant-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, API_TIMEOUT_MS: 1200000 }, model: claude-3-5-sonnet-latest, autoConnectIde: false, disableAgentView: true } EOF # 5. 设置环境变量让 claude 进程能读到 echo export CLAUDE_CONFIG_DIR$HOME/.claude ~/.zshrc echo export PATH$HOME/.claude/bin:$PATH ~/.zshrc source ~/.zshrc注意ANTHROPIC_API_KEY请替换成你的真实密钥。如果还没有去 https://console.anthropic.com/settings/keys 创建一个。4.2 安装 Claude Code2 分钟# 方案 A推荐用预编译二进制最稳 # 下载地址https://github.com/anthropics/claude-code/releases # 选择最新版如 v2.1.161下载对应系统的 tar.gz # macOS Intel curl -L https://github.com/anthropics/claude-code/releases/download/v2.1.161/claude-code-macos-x64.tar.gz -o claude-code.tar.gz # macOS ARM64 (M1/M2/M3) curl -L https://github.com/anthropics/claude-code/releases/download/v2.1.161/claude-code-macos-arm64.tar.gz -o claude-code.tar.gz # Linux x64 curl -L https://github.com/anthropics/claude-code/releases/download/v2.1.161/claude-code-linux-x64.tar.gz -o claude-code.tar.gz # 解压并安装 tar -xzf claude-code.tar.gz sudo mv claude-code /usr/local/bin/claude chmod x /usr/local/bin/claude # 方案 B如果坚持 npm install需网络好 # npm install -g claude-code --unsafe-permtrue --allow-root4.3 首次运行与验证1 分钟# 1. 检查命令是否存在 which claude # 应输出 /usr/local/bin/claude # 2. 检查版本 claude --version # 应输出 v2.1.161 # 3. 运行自检关键 claude --doctor # 4. 启动交互式会话测试 API 连通性 claude # 在 claude 会话里输入 # /model # /status # ls -la # exitclaude --doctor的输出是黄金标准。它会检查Node.js版本是否兼容ANTHROPIC_API_KEY是否可读网络是否能连通api.anthropic.com~/.claude目录权限是否正常settings.json是否语法正确如果--doctor全绿恭喜你已越过 90% 的安装门槛。4.4 关键配置参数详解附计算过程以下是settings.json中最常被问及的几个参数附上为什么这么设和怎么算API_TIMEOUT_MS: 120000020 分钟为什么Claude Code 的默认超时是60000010 分钟。但对于复杂任务如分析一个 10MB 的代码库模型思考、工具执行、文件读取加起来很容易超 10 分钟。一旦超时整个会话中断所有上下文丢失。怎么算根据你的网络延迟和任务复杂度估算本地网络50ms ping基础超时600000 预留6000001200000跨国网络200ms ping基础超时600000 预留12000001800000企业内网有代理基础超时600000 代理额外开销6000001200000提示设太高如3600000会导致失败请求等待过久影响体验设太低如300000会导致频繁中断。1200000是平衡点。BASH_DEFAULT_TIMEOUT_MS: 3000005 分钟为什么这是 Bash 工具ls,git status,npm run build的默认超时。claude默认是1200002 分钟对于npm install或docker build这类长命令远远不够。怎么算看你要执行的最长命令npm install: 通常 2-3 分钟 → 设300000docker build: 通常 5-10 分钟 → 设600000make test: 通常 1-2 分钟 → 设180000公式BASH_DEFAULT_TIMEOUT_MS (预期最长命令耗时秒数) * 1000CLAUDE_CODE_MAX_OUTPUT_TOKENS: 32000为什么这是模型单次回复的最大 token 数。Claude Opus 4.7 的上限是8192Sonnet 4.5 是32768。设32000是为了兼容 Sonnet 4.532768 32000避免触达 Opus 4.7 的硬上限8192留出 buffer 给系统提示和工具调用怎么算查官方文档的模型规格表取你常用模型的max_output_tokens然后减去1000作为安全 bufferSonnet 4.5:32768 - 1000 31768→ 四舍五入32000Opus 4.7:8192 - 1000 7192→ 四舍五入7200注意这个值不能超过网关的max_tokens配置。如果你用 LiteLLM检查litellm.yaml里的model_list是否设置了max_tokens: 32000。4.5 终端适配Tabby、VS Code、iTerm2 的一键修复不同终端的修复命令复制粘贴即可# Tabby 终端修复 conpty 光标问题 # 在 Tabby 设置 → Profiles → Shell → Environment Variables # 添加 # CLAUDE_CODE_NO_FLICKER1 # CLAUDE_CODE_DISABLE_MOUSE1 # VS Code 终端确保继承 shell 环境 # 在 VS Code 设置JSON里添加 # terminal.integrated.inheritEnv: true, # terminal.integrated.env.osx: { CLAUDE_CONFIG_DIR: /Users/yourname/.claude }, # iTerm2启用真彩色和鼠标报告 # 在 iTerm2 → Preferences → Profiles → Terminal → Report Terminal Type # 改为 xterm-256color # 在 Profiles → Keys → Key Mappings → Presets → 勾选 xterm with mouse reporting # 然后在 ~/.zshrc 里加 # export CLAUDE_CODE_DISABLE_MOUSE0 # export CLAUDE_CODE_TMUX_TRUECOLOR15. 常见问题与排查技巧实录那些让你拍桌的“灵异事件”以下问题全部来自我下午踩坑的真实记录附带现象、根因、验证命令、终极解法四步法。5.1 问题速查表现象根因验证命令终极解法claude: command not found$(npm prefix -g)/bin不在PATHecho $PATH | grep local/bin|npm-globalexport PATH$(npm prefix -g)/bin:$PATH加入~/.zshrcError: ENOENT: no such file or directory, open /Users/xxx/.claude/settings.json~/.claude目录不存在或权限不足ls -la ~/.claudemkdir -p ~/.claude chmod 700 ~/.claudeAvailable models: []ANTHROPIC_BASE_URL格式错误或网关未返回/v1/modelscurl -v https://your-gateway.com/v1/models确保 URL 以/v1结尾且网关配置了CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERYtrueAPI error: