cnb-agentic-memory 2.0.2__tar.gz → 2.0.3__tar.gz
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.
- {cnb_agentic_memory-2.0.2 → cnb_agentic_memory-2.0.3}/PKG-INFO +4 -4
- {cnb_agentic_memory-2.0.2 → cnb_agentic_memory-2.0.3}/README.md +2 -2
- {cnb_agentic_memory-2.0.2 → cnb_agentic_memory-2.0.3}/docs/API.md +3 -3
- {cnb_agentic_memory-2.0.2 → cnb_agentic_memory-2.0.3}/docs/CLI.md +1 -1
- {cnb_agentic_memory-2.0.2 → cnb_agentic_memory-2.0.3}/docs/MCP.md +1 -1
- {cnb_agentic_memory-2.0.2 → cnb_agentic_memory-2.0.3}/pyproject.toml +2 -2
- cnb_agentic_memory-2.0.3/skills/SKILL.md +9 -0
- {cnb_agentic_memory-2.0.2 → cnb_agentic_memory-2.0.3}/skills/cnb-agentic-memory/SKILL.md +7 -5
- {cnb_agentic_memory-2.0.2 → cnb_agentic_memory-2.0.3}/src/cnb_agentic_memory/__init__.py +2 -2
- {cnb_agentic_memory-2.0.2 → cnb_agentic_memory-2.0.3}/src/cnb_agentic_memory/cli.py +1 -1
- {cnb_agentic_memory-2.0.2 → cnb_agentic_memory-2.0.3}/src/cnb_agentic_memory/mcp_server.py +6 -4
- {cnb_agentic_memory-2.0.2 → cnb_agentic_memory-2.0.3}/tests/test_guidance.py +4 -3
- {cnb_agentic_memory-2.0.2 → cnb_agentic_memory-2.0.3}/tests/test_mcp_server.py +1 -1
- cnb_agentic_memory-2.0.2/skills/SKILL.md +0 -9
- {cnb_agentic_memory-2.0.2 → cnb_agentic_memory-2.0.3}/.gitignore +0 -0
- {cnb_agentic_memory-2.0.2 → cnb_agentic_memory-2.0.3}/CONTRIBUTING.md +0 -0
- {cnb_agentic_memory-2.0.2 → cnb_agentic_memory-2.0.3}/LICENSE +0 -0
- {cnb_agentic_memory-2.0.2 → cnb_agentic_memory-2.0.3}/SECURITY.md +0 -0
- {cnb_agentic_memory-2.0.2 → cnb_agentic_memory-2.0.3}/src/cnb_agentic_memory/api.py +0 -0
- {cnb_agentic_memory-2.0.2 → cnb_agentic_memory-2.0.3}/src/cnb_agentic_memory/mcp_main.py +0 -0
- {cnb_agentic_memory-2.0.2 → cnb_agentic_memory-2.0.3}/src/cnb_agentic_memory/memory.py +0 -0
- {cnb_agentic_memory-2.0.2 → cnb_agentic_memory-2.0.3}/src/cnb_agentic_memory/models.py +0 -0
- {cnb_agentic_memory-2.0.2 → cnb_agentic_memory-2.0.3}/tests/__init__.py +0 -0
- {cnb_agentic_memory-2.0.2 → cnb_agentic_memory-2.0.3}/tests/conftest.py +0 -0
- {cnb_agentic_memory-2.0.2 → cnb_agentic_memory-2.0.3}/tests/test_api.py +0 -0
- {cnb_agentic_memory-2.0.2 → cnb_agentic_memory-2.0.3}/tests/test_cli.py +0 -0
- {cnb_agentic_memory-2.0.2 → cnb_agentic_memory-2.0.3}/tests/test_keyword_sort.py +0 -0
- {cnb_agentic_memory-2.0.2 → cnb_agentic_memory-2.0.3}/tests/test_mcp_main.py +0 -0
- {cnb_agentic_memory-2.0.2 → cnb_agentic_memory-2.0.3}/tests/test_memory.py +0 -0
- {cnb_agentic_memory-2.0.2 → cnb_agentic_memory-2.0.3}/tests/test_version.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: cnb-agentic-memory
|
|
3
|
-
Version: 2.0.
|
|
4
|
-
Summary: CNB
|
|
3
|
+
Version: 2.0.3
|
|
4
|
+
Summary: CNB Issue 智能体记忆系统(cnb-agentic-memory)是基于 CNB 平台构建的通用记忆工具,把 CNB 的 issue、知识库、检索能力组合成一个开箱即用的智能体记忆层。
|
|
5
5
|
Project-URL: Homepage, https://cnb.cool/xqitw/cnb-agentic-memory
|
|
6
6
|
Project-URL: Repository, https://cnb.cool/xqitw/cnb-agentic-memory
|
|
7
7
|
Project-URL: Issues, https://cnb.cool/xqitw/cnb-agentic-memory/-/issues
|
|
@@ -34,7 +34,7 @@ Provides-Extra: mcp
|
|
|
34
34
|
Requires-Dist: mcp<3,>=2.1.1; extra == 'mcp'
|
|
35
35
|
Description-Content-Type: text/markdown
|
|
36
36
|
|
|
37
|
-
# CNB
|
|
37
|
+
# CNB Issue 智能体记忆系统
|
|
38
38
|
|
|
39
39
|
[](https://cnb.cool/xqitw/cnb-agentic-memory/-/badge/release.link)
|
|
40
40
|
[](https://pypi.org/project/cnb-agentic-memory/)
|
|
@@ -59,7 +59,7 @@ Description-Content-Type: text/markdown
|
|
|
59
59
|
|
|
60
60
|
开始使用前需要准备三件事:
|
|
61
61
|
|
|
62
|
-
1.
|
|
62
|
+
1. **创建专用的 [CNB 平台](https://cnb.cool)私有仓库**——作为记忆仓库。必须是专用仓库(全部 Issue 均为记忆),检索与列表不做记忆/普通 Issue 区分
|
|
63
63
|
2. **获取 CNB 访问令牌**——在 CNB 个人设置中创建,需 `repo-issue:rw`(Issue 读写)+ `repo-code:r`(知识库检索)权限
|
|
64
64
|
3. **配置知识库入库流水线**——在记忆仓库的 `.cnb.yml` 挂载 `knowledge:update` 流水线(`$` 键下),语义检索依赖它;**必须先配置再写入**,错过事件的记忆不会被补录
|
|
65
65
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# CNB
|
|
1
|
+
# CNB Issue 智能体记忆系统
|
|
2
2
|
|
|
3
3
|
[](https://cnb.cool/xqitw/cnb-agentic-memory/-/badge/release.link)
|
|
4
4
|
[](https://pypi.org/project/cnb-agentic-memory/)
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
|
|
24
24
|
开始使用前需要准备三件事:
|
|
25
25
|
|
|
26
|
-
1.
|
|
26
|
+
1. **创建专用的 [CNB 平台](https://cnb.cool)私有仓库**——作为记忆仓库。必须是专用仓库(全部 Issue 均为记忆),检索与列表不做记忆/普通 Issue 区分
|
|
27
27
|
2. **获取 CNB 访问令牌**——在 CNB 个人设置中创建,需 `repo-issue:rw`(Issue 读写)+ `repo-code:r`(知识库检索)权限
|
|
28
28
|
3. **配置知识库入库流水线**——在记忆仓库的 `.cnb.yml` 挂载 `knowledge:update` 流水线(`$` 键下),语义检索依赖它;**必须先配置再写入**,错过事件的记忆不会被补录
|
|
29
29
|
|
|
@@ -98,7 +98,7 @@ except ApiError as err:
|
|
|
98
98
|
- **写后回读校验**:写操作 GET 回读确认,短重试(3 次 × 0.5s)后仍不一致才报错;`verify=False` 可跳过(仅测试)
|
|
99
99
|
- **超长拆分**:正文超过 30KB 自动按段落拆为多条,title 带 `(i/n)` 序号关联;`WriteResult.parts` 携带全部分片供循迹
|
|
100
100
|
- **软删除**:无硬删除接口(CNB DELETE 返回 404),`delete` 后可 `restore`
|
|
101
|
-
- **标签约定**:`category` 自动补 `category:` 前缀(对齐 CNB 平台分类约定,选择器中单选),`tags`
|
|
101
|
+
- **标签约定**:`category` 自动补 `category:` 前缀(对齐 CNB 平台分类约定,选择器中单选),`tags` 为普通标签原样保留;记忆仓库须为 CNB 平台私有仓库,且为专用仓库(全部 Issue 均为记忆)
|
|
102
102
|
- **检索分层**:语义检索走知识库向量召回(相关度受语料规模、查询内容与切分策略影响,PoC 实测样例中可达 0.98+);`keyword_search` 是与它并列的第二检索方法(标题检索,无需知识库),供 title 含确切关键词时精准直达
|
|
103
103
|
- **分页参数钳制**:limit / top_k 统一钳制到 1~100(CNB 服务端分页上限),SDK 与 CLI / MCP 入口层口径一致
|
|
104
104
|
|
|
@@ -118,7 +118,7 @@ except ApiError as err:
|
|
|
118
118
|
|
|
119
119
|
## 记忆仓库前置条件
|
|
120
120
|
|
|
121
|
-
|
|
121
|
+
**记忆仓库须为 CNB 平台私有仓库,且为专用仓库**:仓库中全部 Issue 均为记忆,不与普通 Issue 混用(检索与列表不做记忆/非记忆区分)。
|
|
122
122
|
|
|
123
123
|
知识库检索依赖仓库已配置 Issue 事件同步流水线。`.cnb.yml` 事件必须挂在 `$` 键下(顶层写法静默无效),且**先配置流水线再写入记忆**——错过事件的 Issue 不会被补录:
|
|
124
124
|
|
|
@@ -156,4 +156,4 @@ $:
|
|
|
156
156
|
issueSyncEnabled: true
|
|
157
157
|
```
|
|
158
158
|
|
|
159
|
-
|
|
159
|
+
写入到可检索的时延取决于仓库流水线配置:事件触发(实时)通常秒级到分钟级;定时触发(如每小时/每日入库)需等下次流水线运行。实际时延还受网络、记忆数量等因素影响。需立即确认写入结果时,按写入返回的 number 用 `memory_get`(CLI `get`)回查。
|
|
@@ -51,7 +51,7 @@ cnb-agentic-memory get 12
|
|
|
51
51
|
cnb-agentic-memory append 12 "追加了 pg_partman 配置示例"
|
|
52
52
|
cnb-agentic-memory delete 12 # 软删除,cnb-agentic-memory restore 12 可恢复
|
|
53
53
|
|
|
54
|
-
# 语义检索(需仓库配置 knowledge:update
|
|
54
|
+
# 语义检索(需仓库配置 knowledge:update 流水线;实时同步通常秒级到分钟级可检索,定时入库需等下次运行,需立即确认用 get 回查)
|
|
55
55
|
cnb-agentic-memory search "分区表 慢查询" --top-k 3
|
|
56
56
|
|
|
57
57
|
# 关键词标题检索(与 search 并列,无需知识库;title 含确切关键词时更精准)
|
|
@@ -84,4 +84,4 @@ pip install "cnb-agentic-memory[mcp]"
|
|
|
84
84
|
|
|
85
85
|
## 记忆仓库前置条件
|
|
86
86
|
|
|
87
|
-
`memory_search` 依赖仓库配置 Issue 事件同步流水线(`.cnb.yml` 的 `$` 键,见 [SDK 参考](API.md#记忆仓库前置条件)
|
|
87
|
+
`memory_search` 依赖仓库配置 Issue 事件同步流水线(`.cnb.yml` 的 `$` 键,见 [SDK 参考](API.md#记忆仓库前置条件)),且**先配置流水线再写入**——错过事件的记忆不会被补录。写入到可检索的时延取决于流水线配置:事件触发(实时)通常秒级到分钟级,定时入库(如每小时/每日)需等下次运行,还受网络、记忆数量影响;需立即确认时用 `memory_get` 按 number 回查。
|
|
@@ -4,8 +4,8 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "cnb-agentic-memory"
|
|
7
|
-
version = "2.0.
|
|
8
|
-
description = "CNB
|
|
7
|
+
version = "2.0.3"
|
|
8
|
+
description = "CNB Issue 智能体记忆系统(cnb-agentic-memory)是基于 CNB 平台构建的通用记忆工具,把 CNB 的 issue、知识库、检索能力组合成一个开箱即用的智能体记忆层。"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
11
11
|
license = { text = "MIT" }
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Skills 索引
|
|
2
|
+
|
|
3
|
+
根据用户的需求,匹配并调用最合适的子技能。
|
|
4
|
+
|
|
5
|
+
## 技能列表
|
|
6
|
+
|
|
7
|
+
### 智能体记忆
|
|
8
|
+
|
|
9
|
+
- **cnb-agentic-memory** — CNB Issue 智能体记忆系统(基于 CNB 平台,跨会话长期记忆)。把重要信息写入记忆仓库(一条记忆 = 一个 Issue),之后用语义检索(知识库向量,高相关度)、关键词标题检索(`cnb-agentic-memory keyword`,无需知识库)或分类/标签浏览找回。**写入时必须自己撰写 title**——提炼 3~8 个高区分度关键词短语,keyword 标题检索只匹配 title,title 质量决定记忆能否被找回。支持追加更新记录、全量替换正文、软删除与恢复。适合回答"记住这个"、"帮我记一下"、"之前说过什么"、"上次是怎么解决的"、"查一下我们的记忆库"这类跨会话请求。当用户提到记忆、记住、想起、之前、上次、经验、教训、备忘时使用,详见 [cnb-agentic-memory](./cnb-agentic-memory/SKILL.md)。
|
|
@@ -3,14 +3,14 @@ name: cnb-agentic-memory
|
|
|
3
3
|
description: 基于 CNB 平台的智能体记忆工具:跨会话写入/检索/管理记忆。写入时必须自己撰写 title(提炼 3~8 个高区分度关键词短语,keyword 检索只匹配 title)。当用户提到记忆、记住、之前、上次、经验、教训时使用。用法:cnb-agentic-memory CLI(write/get/append/update/delete/restore/list/recent/search/keyword)。
|
|
4
4
|
slug: cnb-agentic-memory
|
|
5
5
|
displayName: CNB Issue 智能体记忆系统
|
|
6
|
-
version: 2.0.
|
|
7
|
-
summary:
|
|
6
|
+
version: 2.0.3
|
|
7
|
+
summary: CNB Issue 智能体记忆系统:以 Issue 为存储、知识库为语义检索,CLI/MCP/SDK 三入口跨会话记忆。
|
|
8
8
|
license: MIT
|
|
9
9
|
homepage: https://cnb.cool/xqitw/cnb-agentic-memory
|
|
10
10
|
tags: [记忆, 智能体, MCP, 知识库, CLI]
|
|
11
11
|
---
|
|
12
12
|
|
|
13
|
-
# cnb-agentic-memory
|
|
13
|
+
# CNB Issue 智能体记忆系统(cnb-agentic-memory)
|
|
14
14
|
|
|
15
15
|
基于 CNB 平台的跨会话记忆:一条记忆 = 一个 Issue,`number` 是记忆唯一标识。写入即持久化,读取走语义检索(知识库向量,高相关度)。记忆仓库中全部 Issue 均为记忆,检索与列表结果不区分记忆与普通 Issue。
|
|
16
16
|
|
|
@@ -35,8 +35,10 @@ tags: [记忆, 智能体, MCP, 知识库, CLI]
|
|
|
35
35
|
append 续写 > delete 废弃(最后手段)。delete 是软删除——仅从默认检索
|
|
36
36
|
隐藏,内容仍留在知识库向量中(`--include-closed` 可召回),不是内容
|
|
37
37
|
清除;误删重建还会让向量库多一份重复内容。
|
|
38
|
-
5.
|
|
39
|
-
|
|
38
|
+
5. **写入后不能立即语义检索不代表失败**:能否/何时可检索取决于仓库流水线
|
|
39
|
+
配置(实时同步通常秒级到分钟级;定时入库如每小时/每日需等下次运行),
|
|
40
|
+
还受网络、记忆数量影响。写入成功返回的 number 就是永久凭据,可先记录;
|
|
41
|
+
需立即确认用 `get` 按 number 回查。
|
|
40
42
|
|
|
41
43
|
## 安装与调用
|
|
42
44
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""cnb-agentic-memory
|
|
1
|
+
"""cnb-agentic-memory(CNB Issue 智能体记忆系统):基于 CNB 平台的通用智能体记忆工具。
|
|
2
2
|
|
|
3
3
|
以 CNB Issue 为存储、知识库为语义检索,SDK / CLI / MCP / Skill 多形态对外服务。
|
|
4
4
|
一记忆 = 一 Issue,number 是记忆唯一标识。
|
|
@@ -8,7 +8,7 @@ from .api import ApiError, CNBApiClient, ConfigError
|
|
|
8
8
|
from .memory import Memory, MemoryRuleError, SearchResult, WriteResult, normalize_title
|
|
9
9
|
from .models import Comment, Issue, KbChunk, Label
|
|
10
10
|
|
|
11
|
-
__version__ = "2.0.
|
|
11
|
+
__version__ = "2.0.3"
|
|
12
12
|
|
|
13
13
|
__all__ = [
|
|
14
14
|
"__version__",
|
|
@@ -21,7 +21,7 @@ from .memory import STATE_CLOSED, STATE_OPEN, Memory, MemoryRuleError
|
|
|
21
21
|
|
|
22
22
|
app = typer.Typer(
|
|
23
23
|
name="cnb-agentic-memory",
|
|
24
|
-
help="CNB
|
|
24
|
+
help="CNB Issue 智能体记忆系统:基于 CNB 平台的通用智能体记忆工具",
|
|
25
25
|
no_args_is_help=False, # 无参数时由 callback 显示 help,避免拦截 --version
|
|
26
26
|
add_completion=False,
|
|
27
27
|
)
|
|
@@ -79,7 +79,7 @@ def _version() -> str:
|
|
|
79
79
|
|
|
80
80
|
mcp = MCPServer(
|
|
81
81
|
_DIST_NAME,
|
|
82
|
-
title="CNB
|
|
82
|
+
title="CNB Issue 智能体记忆系统", # pyproject 无人类可读标题字段,无法单一来源
|
|
83
83
|
description=_summary(),
|
|
84
84
|
version=_version(),
|
|
85
85
|
website_url=_homepage_url(),
|
|
@@ -91,8 +91,9 @@ mcp = MCPServer(
|
|
|
91
91
|
"2. 写入失败若返回已落盘分片编号,按错误信息中的建议处理:"
|
|
92
92
|
"update 补齐/修正,勿重复 write(会重复创建)。超长内容拆分为"
|
|
93
93
|
"多条时按返回的 parts 逐条处理,勿只处理首条。\n"
|
|
94
|
-
"3.
|
|
95
|
-
"
|
|
94
|
+
"3. 写入后能否立即被 memory_search 检索到取决于仓库知识库同步配置"
|
|
95
|
+
"(实时或定时入库,如每小时/每日),且受网络、记忆数量影响,"
|
|
96
|
+
"检索不到不是写入失败;需立即确认时用 memory_get 按 number 回查。\n"
|
|
96
97
|
"4. memory_list / memory_keyword_search 不回显正文(body 为 null),"
|
|
97
98
|
"需要全文用 memory_get。"
|
|
98
99
|
),
|
|
@@ -147,7 +148,8 @@ def _issue_out(issue: Any, *, body_echo: bool = True) -> dict:
|
|
|
147
148
|
"概括性描述;不传 title 则由工具兜底截取正文首行。tags 每个元素一个标签,"
|
|
148
149
|
"不要在一个元素里拼逗号。超长内容自动拆分为多条,返回的 parts 含"
|
|
149
150
|
"全部分片编号。写入失败若返回已落盘分片编号,按错误信息中的建议处理"
|
|
150
|
-
"(update 补齐/修正),勿重复 write
|
|
151
|
+
"(update 补齐/修正),勿重复 write。写入后需立即确认用 memory_get "
|
|
152
|
+
"按 number 回查(能否立即语义检索取决于仓库同步配置,可能是定时入库)。"
|
|
151
153
|
)
|
|
152
154
|
)
|
|
153
155
|
async def memory_write(
|
|
@@ -18,7 +18,8 @@ INSTRUCTIONS_ANCHORS = [
|
|
|
18
18
|
"memory_update",
|
|
19
19
|
"软删除",
|
|
20
20
|
"知识库向量",
|
|
21
|
-
"
|
|
21
|
+
"定时入库",
|
|
22
|
+
"回查",
|
|
22
23
|
"memory_get",
|
|
23
24
|
]
|
|
24
25
|
|
|
@@ -26,7 +27,7 @@ INSTRUCTIONS_ANCHORS = [
|
|
|
26
27
|
TOOL_DESCRIPTION_ANCHORS: dict[str, list[str]] = {
|
|
27
28
|
"memory_delete": ["知识库向量", "memory_update"],
|
|
28
29
|
"memory_update": ["勿删除重建"],
|
|
29
|
-
"memory_write": ["逗号", "重复 write"],
|
|
30
|
+
"memory_write": ["逗号", "重复 write", "回查"],
|
|
30
31
|
"memory_list": ["不回显正文", "memory_get"],
|
|
31
32
|
"memory_keyword_search": ["不回显正文", "memory_get"],
|
|
32
33
|
}
|
|
@@ -57,7 +58,7 @@ def test_tool_descriptions_contains_semantic_anchors() -> None:
|
|
|
57
58
|
def test_skill_md_contains_core_semantics() -> None:
|
|
58
59
|
"""SKILL.md(skill 通道)必须包含核心语义锚点(AGENTS.md 同步点 1)。"""
|
|
59
60
|
skill = Path("skills/cnb-agentic-memory/SKILL.md").read_text(encoding="utf-8")
|
|
60
|
-
for anchor in ["知识库向量", "update", "不回显正文", "逗号"]:
|
|
61
|
+
for anchor in ["知识库向量", "update", "不回显正文", "逗号", "回查"]:
|
|
61
62
|
assert anchor in skill, f"SKILL.md 缺少锚点:{anchor}"
|
|
62
63
|
|
|
63
64
|
|
|
@@ -51,7 +51,7 @@ def test_server_metadata() -> None:
|
|
|
51
51
|
from importlib.metadata import metadata
|
|
52
52
|
|
|
53
53
|
assert mcp.name == _DIST_NAME
|
|
54
|
-
assert mcp.title == "CNB
|
|
54
|
+
assert mcp.title == "CNB Issue 智能体记忆系统"
|
|
55
55
|
assert mcp.description == str(metadata(_DIST_NAME)["Summary"])
|
|
56
56
|
assert mcp.version == str(metadata(_DIST_NAME)["Version"])
|
|
57
57
|
assert mcp.website_url == "https://cnb.cool/xqitw/cnb-agentic-memory"
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
# Skills 索引
|
|
2
|
-
|
|
3
|
-
根据用户的需求,匹配并调用最合适的子技能。
|
|
4
|
-
|
|
5
|
-
## 技能列表
|
|
6
|
-
|
|
7
|
-
### 智能体记忆
|
|
8
|
-
|
|
9
|
-
- **cnb-agentic-memory** — 基于 CNB 平台的智能体记忆系统(跨会话长期记忆)。把重要信息写入记忆仓库(一条记忆 = 一个 Issue),之后用语义检索(知识库向量,高相关度)、关键词标题检索(`cnb-agentic-memory keyword`,无需知识库)或分类/标签浏览找回。**写入时必须自己撰写 title**——提炼 3~8 个高区分度关键词短语,keyword 标题检索只匹配 title,title 质量决定记忆能否被找回。支持追加更新记录、全量替换正文、软删除与恢复。适合回答"记住这个"、"帮我记一下"、"之前说过什么"、"上次是怎么解决的"、"查一下我们的记忆库"这类跨会话请求。当用户提到记忆、记住、想起、之前、上次、经验、教训、备忘时使用,详见 [cnb-agentic-memory](./cnb-agentic-memory/SKILL.md)。
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|